06-06-2011 08:08 AM - edited 06-06-2011 08:12 AM
Hello,
I have a working solution for my DAQ application that acuires data from 72 DSA PXI channels, streams it on disk (TDMS) with 1 kS/s and streams it on network eith 200 S/s. It works perfect on an obsolete P4 desktop. Attached is the DAQ sub VI that uses queues to sustain all operations. DAQ can last for longer periods so I'd like to also stream to a chart on the main panel (Main_VI). However this is not possible if the DAQ-SubVI is kept in a separate VI. I can stream data to a chart if everything is within a same VI - just wire the de-queued data to a chart inside the consumer (lower) loop.
I prefer to keep the DAQ in a separate VI and I'd like to ask if somebody knows how to achieve that. I tried to pass de-queued data chunks form the consumer loop to a chart in the Main-VI via a "single process" shared variable but DAQ_SubVI acquires and nothing comes to the chart (I have placed the chart and its sourcing shared variable inside a while loop).
Can this be done, and how?
Thanks in advance,
06-07-2011 12:18 PM
There are two things that come to mind off the bat. Have you tried having the producer loop in the subvi and and the consumer loop in the main vi, this way you can get your data while the sub vi runs. The other option is you could use a subpanel which will let you look at the graph that is updating in the subvi from the main vi. To employ this I would take a look at Loading a Front Panel in a Subpanel Control
06-08-2011 03:56 PM
Scott,
Thank you for replying.
(1) In the 1st solution - do you mean to move the consumer loop from the DAQ VI containing everything else? This DAQ Vi would be the SubVI, and the MainVI would be enriched wiht the consumer loop? How to pass the "queued" data? Would I still have 2 separate threads because this architecture puts my DAQ on the edge...?
(2) I do not fully understand this concept, can you suggest on my real VIs?
Thanks in advance,
06-09-2011 01:24 PM
You would move the consumer loop and all it contains to the Main VI, the queued data can pass between vi's no problem. You would just need to make sure to pass in the same Queue to the two loops, you can make the queue in the main and pass it into the sub-vi or create it in the Sub VI and pass it to the consumer loop.
The best way to play around with the subpanel method is to pull up Loading a Front Panel in a Subpanel Control in LabVIEW Help and there are examples there at the bottom of the article that will give you hands on experience with how they work.
I think for you the easiest solution will be to move the consumer loop into the main VI.
06-13-2011 04:13 AM
Scott,
I was away for few days. Thank you for helping me out again. I have done what you say (move the consumer loop to the main VI) and it works but I seem to have a kind of race condition. Namely, After the trigger is applied to the Sub VI, it waits for the STOP of DAQ and than the acquisiton is "played" on the Main VI's chart. In 20 attempts only once I got simultaneous DAQ and chart. What must I do so the consumer loop starts before the Sub_VI? Or is something else my problem?
Thanks in advance,
06-14-2011 09:41 AM
I would either use the error wire to enforce the proper execution order as you currently have it branching out near the start of the consumer loop, or you can look into using notifiers or semaphores.
06-14-2011 12:33 PM
Scott,
What would be your choce and how to do it?
R
06-15-2011 01:47 PM
In this case I would use the error wire to address this race condition.
06-15-2011 01:54 PM
Why use a notifier? Stuff the data acquisition subvi in the producer loop with the data from that subvi going into a queue, then analyze/save/display the data in the queue inside the consumer loop. Won't lose data, your code stays modular (easy to test/maintain), and the toplevel vi's nice and compact...
06-16-2011 03:22 AM
Scott,
I have played all wire-combinations, at no avail. I can see the problem is that I have to synchronize the producer and consumer loops. This way, the producer loop being packed in a VI containing the DAQ intialization seems to be the culprit - there has to be another way (if there is one). I have even tried to use a shared variable (single process)... If you know a solution I'd be gratefull to learn, but thank you anayway so far, I will get rid of the sub VI and chart from the consumer loop directly inside the main VI.
SnowMule,
Thank you for joining in, but Iwhat you say is actually my current status. The problem is that this (working) way, chart is presenting data AFTER the DAQ sub VI has completed acquisition. If you have an idea you are most wellcome.
Thank you both,