Jump to content

Firing Events from External VIs


Recommended Posts

I'm trying to create some monitoring software that can monitor 20-30 clones. Each clone does the reading and tracking of a particular unit.

I have a central VI that should launch and kill the various clones. I know it's nothing that hasn't been done before and it seems simple enough, but I've been having problems with "Error Code 1: Generate User Event in (name of VI)" which apparently means the Event isn't firing properly. I'm not seeing the error in this set of VIs though, which is good and bad because a) it works but b) I don't know what the problem is when it doesn't. I'm fairly positive that events aren't stored properly in functional global variables.

I've uploaded an example of the framework I'm using and I'm looking for some feedback on possible better solutions or how to fool-proof this approach. Obviously I haven't put the innards which monitor the UUT in there yet; baby steps.

To run the example all you have to do is open Controller.vi (after opening the project) and then set the Minion number to any number (this would be the UUT #) and set the enum to "Launch". If you click run, a clone will launch and if you click run again the original clone will close and a new one will run again. You can do this for however many minions you want open.

To kill a clone, set the enum to "Kill" with the minion # and click run. To kill all clones set the enum to "Mass Destruction" and click run. Mass Destruction only kills clones 0-16 at the moment, however it's easy enough to bump that up.

My main thought is that I should fire some sort of central server that each clone registers with and the controller controls that. Maybe I'll give that a go and post it up here later.

Dynamic Events With Clones.zip

Link to post
Share on other sites

I looks like when one clone is killed the FGV is reinitialized, meaning that the reference is lost. I haven't quite rationalized it in my head yet. But I have seen with other FGVs that if I just run it on its own and then run it again, the data is lost. I updated your VIs so that the controller handles maintaining the FGV and it worked just fine.

DEWC.zip

Link to post
Share on other sites

I haven't looked at the code, but this is a relevant general point in LV and refers to crossrulz's post - references in LV are "owned" by the hierarchy they were created in. The hierarchy is determined by the top level VI. So, if you're opening references, you will want to call the VI opening the reference from a hierarchy which will stay in memory.

Error 1 means invalid input, which usually refers to the reference in something like this, since it's the only input which can have invalid values, so it makes sense that this is your problem.

Link to post
Share on other sites

I looks like when one clone is killed the FGV is reinitialized, meaning that the reference is lost. I haven't quite rationalized it in my head yet. But I have seen with other FGVs that if I just run it on its own and then run it again, the data is lost. I updated your VIs so that the controller handles maintaining the FGV and it worked just fine.

DEWC.zip

I thought that I was only getting a new event on the first call hence why the dialog only comes up with "HI" on the first call. That was my fancy test to make sure it was only getting initialized once.

Link to post
Share on other sites

I haven't looked at the code, but this is a relevant general point in LV and refers to crossrulz's post - references in LV are "owned" by the hierarchy they were created in. The hierarchy is determined by the top level VI. So, if you're opening references, you will want to call the VI opening the reference from a hierarchy which will stay in memory.

Error 1 means invalid input, which usually refers to the reference in something like this, since it's the only input which can have invalid values, so it makes sense that this is your problem.

I guess the idea with my example is that the reference is "owned" by the first clone created. The reason that I'm not keeping it initialized in the launcher is that I'm not exactly sure how the launcher is going to be used at this point.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Similar Content

    • By Mode_Locked
      My code watches for an event where my Toshiba USB stick is unplugged. If the event does not occur within 30 secs, the code times out. However, in the case that there is no disconnection of the USB stick (no event generated), I can't end the program before the timeout period of 30 sec. Is there a way to end the program before the timeout period? Any help is appreciated. Thanks in advance!
      WMI_USBStorage_Event_withDeviceIDandTimeOut.vi
    • By _Mike_
      Hello!
      I am running a system with GigE camera with NI framegrabber  in continuous acquisition mode - in which I change some attributes every now and then.
      So far I have been using following scheme to assert I am getting correct image after attribute change:
      change attribute read "Last buffer number" property -> n run IMAQdx get image.vi set to "buffer' and parameter n+2 (+2 being due to the fact that i assumed attribute change arrives to camere during running exposure that will be unaffected by attribute change - hence i needed to discard "next" buffer) Unfortunately I still every now and then acquired image that obviously was aquired with previous attributes (e.g. I've dramatically increased.decreased exposure rate, while acquired image was very similar to previously acquired one). Guessing that it may have something to do with buffers I have increased "magic number" from +2 to +3. It indeed helped, but after longer usage I have discovered, that it only reduced the frequency of the error.
      Hence I needed to design more "bulletproof" solution that will satisfy my timing requirements (stoping and starting acquisition is out of question as it takes more than 100ms what is unacceptable for me)
      I would like to:
      change attribute acquire information from camera that will allow me to fetch image acquired with changed attribute For such purpose I have discovered IMAQdx events - especially "Attribute updated" and "frameDone". Unfortunately, I could not find any detailed documentation about those functions. Therefore I would like to ask you for help to determine when 'Attribute updated" is triggered. Is it when:
      driver receives the command and pushes it to camera? (pretty useless for me as I cannot relate it to any particular exposure) camera confirms getting it (then assuming it arrives during an ongoing exposure, I'll discard "next' image and expect second next to be correct camera confirms applying it (then I assume that next image should be obtained with correct settings) camera confirms it managed to acquire a frame with new parameter (pretty unlikely scenario - but the i'd expect correct image to reside in "last" buffer) Could you help me determine which case is true? Also should I be concerned about the fact that there may be a frame "in transition" between camera and IMAQdx driver which will desynchronize my efforts here?
       
    • By takanoha
      Hi
      I am writing an application to update the numeric value given user's input value and depending on the user's input value the program checks if it is greater than 10 if it is greater than 10 then the program waits for 1 second and then will have a popup message says "true".
      My intention was to call the conditional check, printing true every one second if the user's input value is greater than 10; in other words, the case structure was to be called regardless of the event structure in the same loop infinitely.
      But it doesn't seem to work the way I expected. Unless there is user's new input value, getting into the event structure, the program doesn't get to the case structure even though the case structure is in a loop.
      Is there any way to call the case structure not dependent to the event structure but I want to use a shift register for the numerical value and also having an event structure and a case structure in parallel ? 
      Thank you.
       
       


      test.vi
    • By CraigC
      Hello,
      Bit of an odd one and I am probably doing something fundamentally wrong however I am fairly new to OOP.  Essentially I have a hierarchy of 3 items say A, B and C.  I have a DD VI called "ModifyUI.vi" in each class and I am calling this VI and its parents in parrallel (Probably not a great idea but it is my end goal).  After each "ModifyUI.vi" has completed doing what it needs to I would then like to collect each VI's data as they were all run in parrallel back into the initial class that called them all.
      I have attached an overview of what I am trying to achieve in a mockup of my problem.  I am willing to change tack as long as the same goal is reached (Modify all class data in parrallel).
      Thanks in advance
      Craig
      Lava Temp.zip

    • By dhakkan
      Hello,
       
      I searched within this site and via Google for any related queries. Couldn't find any. Hence this post...
       
      Example of Situation:
      I configured an I8 Numeric with non-default limits in its 'Properties >> Data Entry' window...
      Minimum of -2 (coerced); Maximum of 2 (coerced). I set up a simple event that looks for 'Value Change' of this Numeric.
       
      Expectation:
      No matter what the 'Increment' value and 'Response to value outside limits' are set to, the 'Value Change' must NOT trigger if the numeric is already at the limit and cannot be changed further. To explain, If current value of Numeric is 2 and I try to increment it, its value must remain at 2 and no event should be triggered. Similarly, with current value of Numeric at -2, if I try to decrement it, its value must remain at -2 and no event should be triggered.
       
      What I found was that the value does remain at the limit, but an event is still triggered when the 'Increment' setting is non-zero. Is this normal behavior?
       
      Test Numeric Event Triggering.vi coded in LV2014
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.