I have to develop an application and I would like some help designing the architecture.
The system controls a number of pumps and valves to create flow around a network of pipes. There are flow meters in the network which are used as feedback for PID to maintain a flow. The network of pipes is gradually opened up to get flow and then PID kicks in to maintain a flow. The test sequence is pretty much a big state machine. For example:
1. Open valve 1
2. Wait for pressure to build
3. Ensure temperature is not over limit
I will have a number of different screens which I want to load into a main sub-panel:
Â· Main SCADA screen (show state of all valves pumps etc)
Â· Test setup screen (configure tests)
Â· I/O screen
Â· Alarm screen
I will also have a number of I/O processes:
Â· Digital (valve sates)
Â· Analogue (flow meters, temperature etc)
Â· Modbus and serial devices (flow meters)
Â· Digital Output â€“ Valves etc
Â· Analogue - Proportional valves
I want to use the Actor Framework because Iâ€™ve used it 3 times now and it is easy to spawn processes, make popups, inter-process messaging, error handling etc. I can have all my processes separate (high cohesion) with separate user interfaces (if they have a UI) .
My problem is that AF and State machines donâ€™t really go that well together (correct me if Iâ€™m wrong).
What happens when I want to do PID or loop in the same state?
Time delayed message?
A a VI for each state and enqueue the next or same state from within that VI?
Does anybody know a good way to incorporate a state machine into AF or should I chose a different way of doing things?
Any thoughts will be appreciated.
I have done a few applications with the JKI State Machine, however I can never find a way to get into the "", "Idle" state in order to scan for Events.
I tried passing various strings such as "", Idle or use an intermediary case event. Also tried modifying the Timeout on the event case.
There's already an Event Case inside of JKI SM, so why would we need to add a another loop in order to control it as a Producer-Consumer for the front Panel to be responsive?
I don't think the implementation of the Producer-Consumer on http://forums.jki.net/topic/1347-jki-state-machine-producer-consumer-loop/ would work since it does requires detecting an event.
The only way I can think on how a P-C would work, it would require adding a "Add State(s) to Queue" between the "Parse State Queue" and the main case structure, where the data inserted would come from some kind of shared variable between the Procuder loop and the Consumer loop. Then you would still need to clear that variable and manage the new states to be added only on a change of the variable after it is added and cleared.
How can we force the scan for Events when we want with the standard JKI SM loop?
The only way that I see the JKI Events being useful is on single clicking applications, where the actions on the front panel always end up clearing the Queue. The while loop would only be used to keep the application active.
The only workaround that I found is to add all local variables within the states that would break the sequence if modified. Which is bad because you will need to track every interface item manually.
Here is an example:
(Not sure if the image is working as they are blocked where I work so I added it also to attached files)
This State loops on itself until an action is done to stop the loop, such as toggling the Read DMM or stopping the VI (I shouldn't even need to track those...). As you can see the issue remains that the front panel remains non responsive if I modify anything that is not one of those 2 buttons. I have tried forcing the Idle state through a Timeout case which sends "Idle" to the JKI SM.
I am trying to use NI-USB 6259(BNC) to send Pulse signal to conduct position control of a servo motor with labview. The position control of servo motor follows these rules:
1. The number of the pulse train determines how many degrees the motor rotate ;( e.g. the angular position of motor)
2. The frequency of pulses determines how fast the motor rotate; (e.g. the speed of motor rotating)
3. The digital determines the direction of rotation of motor e.g. clockwise or counterclockwise)
My question comes when I need to generate continuously a finite plus train signal in a period of time. Below is a sample:
Here is the explanation of this table, the motor keep rotating in clockwise direction during 0~1s. When the time reaches 1s, the motor just complete the rotation of 923 pulse signals. And then the motor starts to rotate in counterclockwise direction during 1s~2s. When the time reaches 2s, the motor just complete the rotation of 3540 pulse signals. So we can see that the rotating speed of motor in 0~1s is different from the speed in 1s~2s. Namely, the frequency of pulse signal in 0~1s is different from the frequency in 1s~2s.
I have already use the counter output of DAQmx, it just can generate pulse signal with certain numbers and certain frequency in one time. The attachment is the vi which demonstrates how to generate a finite digital pulse train from a Counter Output Channel and the Frequency, Duty Cycle, Initial Delay, and Idle State are all configurable.
How can I generate a series of pulse signal with varying numbers and frequencies during a certain period of time.
Thanks a lot!
Counter - Finite Output.vi
I downloaded the JKI state machine toolkit and it's quite neat. For eons, I have been using state machines following a very similar structure, but always with enums instead of strings. In simple state machine, each state would define the next one (no queue), and in more complex ones, a queue would be used to allow some states to enqueue several ones (and some wouldn't enqueue anything). But always with an enum or a queue of enums, since it seemed this would prevent typos, and allow renaming a state at only one place (the enum typedef).
However I am tempted to make the switch since I see the value in using a tool used by other advanced developer. Where do you stand on this? Is JKI's string-based design the best way for your state machines?
By Walter Gunter
I am working on some labview code that I really want to use OOP. I have some classes, ie, motor, relay, potentiometer, etc that I am using and wanted to incorporate in a state machine. I wonder if there are some good examples of this? I found a thread on here discussing it http://lavag.org/topic/13064-object-based-state-machine-pattern/ , but I am not clear if it answers my question.
1. When I try to wire a class into a state machine (while loop with a case structure), I always get a broken wire in the while loop. It says the wire type is different? Am I thinking of this incorrectly. I have a class object I put on the block diagram, i wire it to 'Initialize.Vi' and it breaks (there and on any vi from that class).