While loop inside a timed loop

Hi everybody!
   I'm using:
       - LV 7.1 + RealTime;
       - compactFieldpoint;
   I've noticed a strange behaviour, when I put a while loop inside a timed loop.  Let's fix timed loop with these settings:
       - 1 KHz clock
       - 1 ms period (yes, I know it's short....)
       - offset 0 ms
       - Phase 0
       - Discard missed period (ON) and MAintain original Phase (ON);
       - Timeout: -1.
   If inside this loo, I put a traditional while loop, waiting (say) for an event to occur, and if this event does not arrive, my cFP-2020 hangs! I mean, it becomes unreachable for the debugger, and, more, if I run a ping to it's address, after some cycles it becomes unreachable also from ping!
   Clearly, this code statement lock the fieldPoint, because if I remove the inner while loop all works.
  I know that with 1 ms period, timed loop always finishes late, but I set to discard missed period and timeout to -1. 
   It seems to me that sometimes Timed Loop add heavi overhead to programs, I'm turning to all while loop based tasks, even if my application has to be real-time!
   Advices welcomed! Have a nice day!
graziano
Solved!
Go to Solution.

I think the issue here is that putting your while loop inside a Timed Loop increases the priority for that task. Timed Loops can have dynamic priorities set over eachother, but they all run between Above Normal and Time Critical priority. My guess is that the debugger and built-in TCP functions run at Above Normal priority or less. This means your cFP isn't hanging, it's doing what it thinks is best. It's trying to finish this task before handling any lower-priority tasks.
The suggestion to put a Wait function in your loop is an OK one. Keep in mind that you can actually set your wait time to zero instead of one and get the same positive benefit of handling other tasks. I would also suggest that you might look into waiting for this event in a lower priority (non-Timed) loop, and then transmit the appropriate data to your Timed Loop using an RT-FIFO or something. That might give you better handling. Just a thought....
Jarrod S.
National Instruments

Similar Messages

  • Fast loop inside a slow loop?

    I have an application reading data once every hour, and writing this reading to disk continously - this works fine, however it looks like LV runs one complete iteration (an hour!) before asking me for the filename to save data in, even though that operation is step 8 of a structure inside the while loop, and the long-time-period timer is at step 9 or 10.
    How do I get the vi to run at normal speed, asking for the filename and writing the first set of data, and THEN going into the long time wait before looping around and executing again. PS - it runs fine, but there is one complete iteration before it comes up asking for the filename. When I run it for xx seconds time period its ok, but not for a long time period.
    Thx! (Newbie here..)

    The problem is that you have made the all too common mistake of using a multiframe sequence. This is why so many experience LabVIEW programmers have abandoned the use of multiframe sequences.
    See, a multiframe sequence is exactly like a single function, or a subVI for that matter. The data from the sequence isn't available until all frames of the sequence have executed. So, you send the data "out" of the sequence, but it "holds" at the output terminal until the sequence has completed, and then is sent "out".
    The other problem is that you have the Write to File... outside of this inner loop, so only after this loop is done (it only iterates once, so I don't even know why you have it there) will the loop exit, and data from that loop b
    e available.
    If I may suggest, try encapsulating each frame of the sequence into a subVI (or something along those lines, such as using multiple single frame sequences in a line). You will need to remove the inner loop, as it is uneccessary.
    It always helps to diagram your code ahead of time. I prefer pseudo code. This is an extremely useful method of aiding in writing your code as it puts things in perspective, in a serial fashion, so that you can visualize what happens, and when, and then just "plop down" each function as they appear in the pseudo code document.
    I hope this helps.

  • For Loop Inside A For Loop

    Is it possible to execute all the iterations of the inside for loop for each iteration of the outside for loop? I have attached a screenshot of my program if it helps. If it is possible could you tell me how to do it plz?
    Solved!
    Go to Solution.
    Attachments:
    Capture.PNG ‏53 KB

    One thought I have is that I think you want those feedback nodes reinitializing for each iteration of the outter loop.  Personally, I would change them to be shift registers (it would clean up your diagram a little bit).
    There are only two ways to tell somebody thanks: Kudos and Marked Solutions
    Unofficial Forum Rules and Guidelines

  • Minimise front panel of vi containing timed loop = problem

    Is this expected behaviour...
    Run the attached VI.
    All it is supposed to do is beep every 10 cycles.
    When you minimise it and try to restore the front panel though... it locks up for a random amount of time.
    I don't think it is supposed to do that. (I'm running it on XP Pro.)
    Originally I was chasing this problem in a data acquisition loop. The buffer would overflow and exit the app with an error when it was minimised.
    It took all day to track it down to this.
    Hmmm... I just tried to save it back to a version 8.0 vi and it doesn't seem to have the same error!
    Message Edited by Troy K on 10-03-2008 05:26 PM
    Message Edited by Troy K on 10-03-2008 05:31 PM
    Troy
    CLDEach snowflake in an avalanche pleads not guilty. - Stanislaw J. Lec
    I haven't failed, I've found 10,000 ways that don't work - Thomas Edison
    Beware of the man who won't be bothered with details. - William Feather
    The greatest of faults is to be conscious of none. - Thomas Carlyle
    Attachments:
    Timed Loop minimised.vi ‏85 KB
    minimisetimedloop.png ‏7 KB

    I'm using LabVIEW 8.5.1 on two PCs and it does it on both of them.
    I just emailed the vi to a colleague and after a few minimise/maximises it locked up on him too.
    I've just found that if I remove the left and right data nodes inside the timed loop the bug seems to go away.
    Steps to repeat bug:
    1. Minimise all windows (Windows+m)
    2. Restore vi front panel and run it. (It should start beeping twice a second)
    3. Minimise / Restore it rapidly by repeatedly clicking on the vi's Front Panel 'task bar button' (down the bottom).
    After a while the beeping will stop when the front panel is minimised and it wont restore. Then after a while (with or without clicking on the task bar button) the front panel will restore and the missed periods will execute very quickly (as the timed loop does what it is configured to do).
    I think because of the simplicity of the example vi the bug doesn't show up as often. When I ran it in the real application (too many vi's to post) it crashed every time. In the real application there isn't much going on in the timed loop, it is just used to queue items into a separate consumer loop. The problem is that when the bug occurs, ALL LABVIEW CODE stops executing, not just the code inside the timed loop. So another vi running in parallel (in a daemon) that retrieves messages from a device queue stops and the device buffer overflows.
    Attached is a modified vi to demonstrate that code outside the timed loop stops executing too. The bug occurs here on three different PCs, the only common thing I can think of is LabVIEW 8.5.1.
    Troy
    CLDEach snowflake in an avalanche pleads not guilty. - Stanislaw J. Lec
    I haven't failed, I've found 10,000 ways that don't work - Thomas Edison
    Beware of the man who won't be bothered with details. - William Feather
    The greatest of faults is to be conscious of none. - Thomas Carlyle
    Attachments:
    Timed Loop minimised 2.vi ‏89 KB

  • Crash when calling dlll built by LV using timed loop.

    I have built a dll with Labview 7.1. Then I use VC++ 6.0 to call this dll. Everything is fine except that it will crash after the whole program finishes.  Without timed loop the program can exit normally. When built to exe file, it can also run normally. This happens in both Windows2000 and Windows XP.
    Anyone knows the reason for this?
    Thanks!

    Now the timed loop stops correctly everytime both in Labview environment and standalone exe. But when I call the dll version from C. The c program has no response after the program finishes.
    I built another small vi without timed loop to dll and called it. The c program exit normally. What is the problem?
    The period of timed loop is 50ms. Is it too short? I found from other post that maybe I should use while loop instead of timed loop. But i need very accurate controling of time.
    Any suggestions?
    Thanks!

  • DAQ and timed loop

    Hi,
    I have a question about DAQ and timed loop. I used timed loop while acquiring data. I need timed loop since I have tvo more loops in my application and ı need give some priority to them.
    Data acquisition should have a high priority. But the example codes about DAQ always use wlile loop. Is this wrong to use timed loop in DAQ application, or there is a unexpected result about
    this usage.

    You could use timed loops in Data acquisition operations as well
    But, one thing you will have to watch is the 'number of samples per channel' terminal of DAQmx Read function.
    Suppose you have rate as 1000 samples /sec, in your DAQmx timing vi
    In continuous acquisition, if you specify number of samples per channel as 500, instead of performing 2 iterations / sec to get your 1000 samples as your nor mal while loop would, your Timed loop will run for 1 sec and you will get an error that all samples could not be acquired

  • Sim. arb. signal within Timed Loop?

    Hi there,
    Is there any inherent reason I couldn't/shouldn't put a Sim Arb Signal VI within a timed loop? I have a scenario in which i need to modulate an arbitrary signal as the experiment is being run. I've placed the express vi inside a timed loop set to execute every millisecond. The express VI is setup to generate a single point of a arb signal with a dt=1. It seems however that it generates the whole signal each time the loop is called. Is there an appropriate example or tutorial somewhere out there in cyberspace?
    Apologize for not posting an example, but I am working from home tonight.
    Regards,
    Matthew Pausley
    NC State University
    Raleigh,NC

    Matthew,
    I have tried making the simulate arbitrary signal vi output a singal point using your suggestions and it worked.  Perhaps you need to compare the VI you are using with this one. 
    I hope this helps.
    Steven T.
    Message Edited by Steven T on 10-16-2006 11:46 AM
    Attachments:
    example2.vi ‏110 KB

  • Priority limits on a timed loop

    Hi,
    With reference to the value of priority in a timed loop, the help says that this value must be between 1 and 65,535.
    Anyone know what these limits are referred?
    Thanks for your time...
    Solved!
    Go to Solution.

    amflores wrote:
    Hi,
    With reference to the value of priority in a timed loop, the help says that this value must be between 1 and 65,535.
    Anyone know what these limits are referred?
    Thanks for your time...
    Timed loops run in a dedicated execution system at a priority above high priority but below "Time Critical"  if there is more than one timed loop running the timed loops priority value is used to signal the OS which loop should get the larger amount of processor time. The lower the number the higher the priority requested.  Some OS's even respect that number.  Some do their own scheduling anyway. 
    Jeff

  • Error -50103 occured with timed loop inside a while loop

    Hello everyone,
    i wrote an application to sample analog voltage from  DAQ6024E card (see the attachments).
    I have a big while loop in the VI because a I want to add some other functions later.
    In the "WHILE_Cont Acq&Graph Voltage-Int Clk.vi" I use a while loop inside the big while loop to read the samples. It's working properly.
    but when I use a timed loop inside the big while loop (see "TIMED_LOOP_Cont Acq&Graph Voltage-Int Clk.vi"), I get an error -50103 from the timed loop.  It seems that the first cycle is ok, but after the first cycle the error occurs.
    I don't know what happens with the timed loop, anyone can help me? what does the error -50103 mean? thanks a lot!
    PS: I am using LabVIEW 8.0
    Message Edited by molo511 on 10-22-2006 05:21 AM
    Message Edited by molo511 on 10-22-2006 05:23 AM
    Attachments:
    TIMED_LOOP_Cont Acq&Graph Voltage-Int Clk.vi ‏143 KB
    WHILE_Cont Acq&Graph Voltage-Int Clk.vi ‏75 KB

    hi molo511,
    I tested your program but only with simulated devices. I had to delete the wire to the timing, so that the timed while loop runs with 1kHz. Did you already try this? Because this works on my PC.
    I also found a link in our database that might be interesting for you.
    http://digital.ni.com/public.nsf/websearch/04BEDD9E9E91ED3486256D180048116D?OpenDocument
    Greets
    Philipp N.
    NI Application Engineer

  • How to stop a while loop which contains a timed loop

    Hi,
    I'm a new hand to labview, and I'm using labviw 7.1, NOT 8.x.  I'm trying to do a measurement, in which the flow would look like the attached file (I have stipped all hardware related components to make it easy to read).  My questions are:
    1. In Loop 3, when the comparison (x>20.85) is true, Loop1, Loop2 and Loop3 are stopped, why it won't quit the while loop (I have wired it to  while loop stop)?
    2. When it is running, I click on stop button, why it won't stop?
    Thanks!
    Attachments:
    SyncTimedLoop32.vi ‏228 KB

    hwm wrote:
    2. When it is running, I click on stop button, why it won't stop?
    The stop button is read outside of the inner while loops.  So the inner while loops will continue to run until their stop conditions are met.
    hwm wrote:
    1. In Loop 3, when the comparison (x>20.85) is true, Loop1, Loop2 and Loop3 are stopped, why it won't quit the while loop (I have wired it to  while loop stop)?
    It seemed to me like it would, but sometimes it seemed like I had to set change the numeric value one more time before it would.  You have a very odd structure there by placing the event structre inside the while loop with the other loops.  I think you may be running into issues where events are getting queued up in the event structure, or race conditions between when the event structure might execute relative to the other loops.  It is all very odd and difficult to predict all the ways these structures might interact and relative timing.  Usually event structures would belong in their own parallel while loop.  I think you need to rethink exactly what you are trying to do here.  It probably isn't event necessary to use the stop timed structure functions.  A local variable or a notified to pass the "Stop status" from loop 3 to the other loops (or the separate event structure loop to the other 3) would probably be better.

  • Timed loop inside a flat sequence not terminatin​g

    Inside a while loop there is an event structure.  Inside that there is a flat sequence.  On one of the frames there is a timed loop that quits after so many iterations.  The timed loop finishes but the flat sequence doesn't execute the next sequence.  What am I not doing right?

    First, you have too many local variables.  This could be leading to race conditions.
    I think you have a couple problems in the use of event structures.  It is a bad idea to put any long running code inside an event case.  It will prevent the Event Structure from handling any other events in the mean time.  You have several timed loops running that in that one sequence frame.
    But the bigger problem is the next sequence frame.  You have a while loop that only ends once all the queues are empty.  Can you guarantee that all the queues get emptied?
    You have laid out the code very neatly, but you have used a lot of odd things in there.  (Number to boolean array, to cluster, to unbundle the cluster to individual indicators.)  Why not just go from Boolean array to and index array function.  No need for the intermediate cluster conversion.  Why not set up the indicators as an indicator array and just write to them directly.
    The code is so much intertwined between when queues are created, filled, emptied, destroyed, events happen...  And this is all multiplied by at least 4 times for each camera.  And there are 4 major event structures going on.  This is a very ambitious project for an inexperience LabVIEW user.  You need to step back, get one thing working right, and design so that you can scale the architecture upward.  Many of the structures you have essentially duplicated and belong in subVI's.

  • I have a for loop inside of while loop.when i press stop for while loop, i also would like to stop for loop.how can i solve this problem?thanks

    i have a for loop inside of while loop.when i press stop for while loop, i also would like to stop for loop.how can i solve this problem?thanks

    Hi fais,
    Following through with what JB suggested. The steps involved in replacing the inner for loop with a while loop are outlined below.
    You can replace the inner for loop with a while by doing the following.
    1) Right-click of the for loop and select "Repalce" then navigate to the "while loop".
    2) Make sure the tunnels you where indexing on with the for loop are still indexing.
    3) Drop an "array size" node on your diagram. Wire the array that determines the number of iterations your for loop executes into this "array size".
    4) Wire the output of the array size into the new while loop.
    5) Set the condition terminal to "stop if true".
    6)Drop an "OR" gate inside the while loop and wire its output to the while loops condition terminal.
    7) C
    reate a local of the boolean "stop" button, and wire it into one of the inputs of your OR gate. This will allow you to stop the inner loop.
    8) Drop a "less than" node inside the inner while loop.
    9) Wire your iteration count into the bottom input of the "less than".
    10) Wire the count (see step 4 above) into the top input of the less than. This will stop the inner loop when ever the inner loop has processed the last element of your array.
    Provided I have not mixed up my tops and bottoms this should accomplish the replacement.
    I will let others explain how to takle this task using the "case solution".
    Ben
    Ben Rayner
    I am currently active on.. MainStream Preppers
    Rayner's Ridge is under construction

  • How do I break a for loop (inside) and a while loop (outside) at the same time by a control button

    I have a while loop (outside) and a for loop (inside) and a control button within the for loop.  I want to stop the program by click the botton without finishing the for loop.  How can I do that?
    Thank you in advance.

    HI Please find attached snapshot Regards, Santosh
    Message Edited by SanRac on 12-17-2009 05:12 AM
    Message Edited by SanRac on 12-17-2009 05:13 AM
    Attachments:
    Snap1.png ‏4 KB

  • Run once inside timed loop

    I have a timed loop that monitors equipment. Whenever there is a fault I have it send a notification email. My problem is how to stop it from sending email every single time the time loop is executed. I tried placing the send email inside a for loop but quickly realized that the entire loop itself is reiterted. Any help is much appreiciated.
    Solved!
    Go to Solution.

    Hi icemaker
    I'm not really sure what you mean. Wouldn't a case structure be a solution?
    Could you post some code so we can see what you are doing?
    Best Regards
    David
    NISW
    Message Edited by Davidek on 10-02-2009 09:58 AM
    Message Edited by Davidek on 10-02-2009 10:00 AM

  • Event controll: How to stop a running while loop inside a event structure

    Hello,
    I have some problems with controlling a while loop inside a event structure (see attached VI).
    I habe 3 buttons ("Start Measurement, Stop Measurement, Quit Program"). When a measurement is running, it should be possible to stop the measurement by clicking on "Stop Measurement", but this does not work.
    Has anyone an idea?
    Thanks a lot and best regards,
    Michael
    Message Edited by MichaGue_01 on 04-23-2010 04:37 AM
    Solved!
    Go to Solution.
    Attachments:
    Event_Controll.vi ‏27 KB

    Hello,
    Try not to use while loops inside a Event structure.
    My approach is using two While loops (one will have only the Event structure).
    I had to use to Flag buttons that make it a bit more complicated but i am sure somebody will come up with a better idea, or you might want to have a think about it yourself.
    Have a look on the modified version on the attachment.
    Once you are happy how it works then you can Hide the 2 flag buttons from the Front Pannel by going to Block diagram right-click the indicators and choose option "Hide Indicators/Controls"
    I did it in LV 8.6 so i hope you can open it on your PC if not i can downgrade it.
    If you have any problem let us know.
    Regards
    Dimitrios
    Test Systems Computing Engineer
    Cummins Turbo-Technologies
    Attachments:
    Event_Controll[1]_modified.vi ‏18 KB

Maybe you are looking for