-
Posts
193 -
Joined
-
Last visited
-
Days Won
15
Content Type
Profiles
Forums
Downloads
Gallery
Posts posted by Fab
-
-
- Popular Post
- Popular Post
Hi LAVA friends,
We are pleased to announce that the Delacor Queued Message Handler (DQMH) is now available via the LabVIEW Tools Network:
http://sine.ni.com/nips/cds/view/p/lang/en/nid/213286
You can read about the thought process behind DQMH at our blog post: Ours is not better than yours (or YAF=Yet Another Framework) at WalkingTheWires.com
The DQMH is based on the NI QMH Project Template. The DQMH expands on the NI QMH by providing safe, event-based message handling and scripting tools to encourage same style between different developers in the same project and improve efficiency. The DQMH is ideal for applications where multiple modules must run in parallel, possibly at different rates, while communicating with each other. The DQMH can also be used for applications that have a single module, where the developer would benefit from having a Tester with the capability of eavesdropping on the different DQMH events and messages.
The DQMH integrates with TestStand since all development and troubleshooting can take place under LabVIEW, while calling the public API VIs as individual steps in the TestStand sequence. The tester can eavesdrop during the execution of the TestStand sequence. This is specially useful when the LabVIEW code is written during the research and development or prototyping phase, because the same code can be called by TestStand in production or manufacturing sequences without any changes.
The DQMH uses LVOOP for some internal functions, but developers need not be familiar with LVOOP to use or understand this architecture.
Try it out and let's us know what you think.
Fab and the Delacor team.
- 9
-
I don't know about you guys, but I miss VIShots... If you agree, feel free to retweet the following:
https://twitter.com/Fabiola31416/status/609325037661855745
#WeWantVIShotsBack
If you are not on Twitter, just reply to this post. If you have other ideas on getting this campaign going, just let me know.
Regards,
Fab
-
Mark,
I agree that posting to YouTube should be decided by each presenter. I have posted my videos to YouTube as well.
Thanks again for doing this!
Regards,
Fab
-
Maybe the customer VI contains multiple event structures and becomes somehow deadlocked?
See the thing is that if I turn highlight execution both the Event handler loop on top and the Message Handler loop on the bottom finish executing, the queues get destroyed, the events unregistered and destroyed, the whole code executes, gets to the very last node (in the extreme case the VI Server Abort VI method I added), seems to execute and then the running arrow never turns off.
I am just pushing this to the list of "we will never know". It is definitely not the code, because just changing the launching with start asynchronous call to using the old Run VI method just works. The VI stops right after it executes its last node. And I was able to remove the abort.
I will the customer if I can share the VI. I was just curious if anyone else had seen that weird behavior.
-
A wild guess but do you call any VIs in there that call into a DLL?
Nope, this is a VI that one of my customers has been using in a project that calls other similar VIs asynchronously. This is the only VI to have that strange behavior.
I tried desperate measures like calling the Abort VI method at the end of the code, and it would still continue to run after executing that last node. The only way to stop it was to press the abort control on the tools bar.
Once we replaced the call and forget code with the Run VI method, it did stop and I was able to remove the abort method.
-
I know this is an old thread.
But does anyone know what can cause an Asynchronous launched VI to stay running even though the entire code is done?
I ended up just switching back for that particular VI to using Run VI method and that worked.
Thanks,
Fab
-
Just posted about this package at the Unit Testing Group at NI: https://decibel.ni.com/content/thread/26693
I have done similar comparison math in the past, but your package is a lot more complete. Thanks for the post to Bruce Dawson's article.
Thanks,
Fab
-
Bump and here is the link for the Call for presentations for the European CLA Summit
I am getting excited about both Summits being around the corner.
-
I started saying Wife/Spouse in my message and then got lazy and only said wife. I hope it is understood that I meant it for spouses not just wives. If I remember I'll start a new thread next year to see if there is interest in a spouse ribbon.
Just pulling your leg
-
Since it currently looks like I won't be there on Thursday, go for Fab's presentation on Unit Testing.
You can see the recording here: https://decibel.ni.com/content/docs/DOC-39109
-
Thanks Mark for the recordings. This year was a lot harder for me to attend sessions.
I recorded my presentation slides and created a Unit Testing Group to continue the conversation.
I uploaded the recording, the pdf of the slides and see the demonstrations here:
https://decibel.ni.com/content/docs/DOC-39109
Regards,
Fab
- 1
-
Had a great time with you guys. Her comment about how the ribbon collection started did get me thinking. Would it be a good idea to have a "Wife/Spouse" ribbons made? On the one hand I don't like the idea of having ribbons made for every category, but I think the wives catch on to the fact that the length of your ribbons is something to show off. Wives probably feel left out with no ribbons of their own. I was the one that had the LAVA ribbons made this year so I feel like I could probably get something together and make some for the wives to have. I just feel like they should feel more welcomed, not isolated. It did seem like there were a good number of wives there this year.
EDIT: BTW I almost brought my wife but something came up. There is a good chance she'll be coming with me next year.
Hooovahh,
If you are going to do these ribbons have them say spouses, you don't want to leave some of your friends' spouses out
You can also have some fun with the ribbon and be more like "NI Week widow/er" LOL!
Loved meeting her! and definitely, she has to be here next year!
-
they were, they were!!
Delacor will add a little something to go with the NI myRIO the LabVIEW Tools Network team is giving away.
If the LabVIEW Tools Network team is OK with this, Delacor would like to add an extra little something to go with the NI myRIO they are giving away. I would love to give more details, but you will have to wait until NI Week to find out what I am talking about
Can't wait!
Fab
- 1
-
Jarobit,
It was my pleasure to guide you through your preparation.
Congratulations!!!
Fab
- 1
-
If the LabVIEW Tools Network team is OK with this, Delacor would like to add an extra little something to go with the NI myRIO they are giving away. I would love to give more details, but you will have to wait until NI Week to find out what I am talking about
Can't wait!
Fab
Looks like we're going to have some AWESOME door prizes this year. I've just received word that the LabVIEW Tools Network team will be donating a brand new NI myRIO! If you are unfamiliar with myRIO, specs and details can be found at ni.com/myrio
Can't wait to see everyone in a few weeks!
- 1
-
I will be there!
Can't wait!
Still working on the door prize from Delacor.
- 1
-
I didn't know about this, but haven't had a need to yet. Also XBMC Plugins? You must be doing some cool stuff.
Yes, I am doing some cool stuff... and just realized I forgot to remove that telling part
Anyway, now it is here if you need it in the future.
See you at NI Week!
Fab
-
- Popular Post
- Popular Post
I am sure that a lot of you already knew what the "add property" button does in the installer build specification, but I am so happy about this discovery and I couldn't find anything online that I decided to share my excitement with my friends in LAVA.
The application I am building works with a third party software that requires my installer to add things to the %appdata% folder, in Windows 8 this translates to C:Users<username>AppDataRoaming
The default destinations available in the installer build specification in LabVIEW includes the [Public App Data] but in Windows 8 that points to C:ProgramData
The help says that clicking on the Add property button under the Destination View lets you add a new MSI property to the Destination View tree. You can find a list of MSI properties here:
http://msdn.microsoft.com/en-us/library/aa370905.aspx#component_location_properties
and in particular there is one called AppDataFolder
http://msdn.microsoft.com/en-us/library/aa367565(v=vs.85).aspx
Well, adding the new property AppDataFolder was enough to set the destination for my ThirdPartyApp and the installer now successfully installs files in %appdata% folder.
I hope this helps others in search of this information.
Regards,
Fab
- 5
-
I was expecting to see the update for LAVA BBQ 2014, any updates yet?
I was expecting to see the update for LAVA BBQ 2014, any updates yet?by the way I got here by the traditional lavag.org/bbq link
-
In case you guys were still wondering what happened to our Tesla Museum...
here are some news on the matter:
Enjoy,
Fab
- 1
-
I know there has not been any activity on this thread for a long time, but thought I'd give my 2 cents on our recent experience. Our (FairlyFunctional and my) medium size Actor Framework (~70 classes total, including messages) project started getting bogged down and updates to class data started incrementally getting longer, as well as moving things around in classes and libraries. In reading through this forum we first moved all of our classes out of libraries, which didn't seem to help, and then recalled Daklu saying something in this forum about clearing the mutation history, which I had to look up.
It seems to me that many of the heartaches in this thread were due to mutation history. To delete the mutation history (see this Preserving LabVIEW Class Data whitepaper) you can either edit out the text of the .lvclass file, or rename the class and then name it back. FairlyFunctional added an add right-click option to delete class mutation history idea to the Exchange. We had a fairly large array of clusters that was initialized in the private class data, so every time we made a change to the private class data it was adding another copy of that array to the mutation history (at least that is my guess). If that is the case, another (and better) fix would be for LabVIEW to only update what changes in the class data for the mutation history instead of making a new copy of everything into the geneology.
My thought is that previously (pre LV2013?) moving a class out of a library would delete its mutation history, which is why that worked for many people. This idea to warn the user that the mutation history was being destroyed may have prompted the idea to not delete the history when moving it out of libraries?
-Sleepy Engineer
Thanks for adding this, what you are saying regarding mutation history makes sense. I tend not to put default data in clusters in the private data, just as I don't put type def cluster constants that do not have default values in a block diagram (see VI Analyzer test for this one).
Instead what I do is to add a method to my class that is called "Default.vi", and then generate the clusters there and return the default object that way. This way I don't have to worry about the mutation history and I don't have to worry about the organization of my private class changing. I can see now by your post why this practice inadvertently made things better for me.
Thanks,
Fab
- 1
-
I think this is the originally posted MCL, but with code to display symbols in a specified number of rows-columns.
MultiColumnListbox with MultiColumnSymbols.vi
/J
Thank you so much! I see what I did wrong, I was trying to set the symbols for the entire row at once and I was only getting the first 8 columns populated. Doh!
I needed to set one cell at a time inside the for loop.
Thanks again,
Fab
-
..or just use the old nice Picture control, lot of fun work though :-)
The problem is that I need it inside a table.
Thanks for replying, it was nice to see you at NI Week.
Fab
-
This is an old thread, so I understand if nobody answers
I need to be able to have check boxes in multiple columns, in my case 12 columns. I tried the MCL control that PJM found and I was able to get the symbols to show in 8 columns, more than that does not work. Any ideas how to get this done?
I could always go back to the hack of old days of using the Symbol font and show the check box this way, but I want to see if there is better way.
Thanks,
Fab
Delacor Queued Message Handler (DQMH) available via LVTN
in Application Design & Architecture
Posted
Glad you liked it, this has been a Delacor team effort: we had 3 CLAs involved in architectural design decisions, design reviews and implementation. We also have been using this in several projects and gathering feedback from customers and Delacor team members. I don't want to take all the credit.
I am sure there are lots of versions of this architecture out there. The community has been using variations of QMH architectures for a long, long, long time. Delacor team members have been using variations of the DQMH for at least 10 years. We decided to publish ours, because it is easier to ask our customers to use something available from the LabVIEW Tools Network that has the "LabVIEW compatible" logo and it is more convenient for us instead of having to reinvent the wheel for every project, or worse, a flatten tire, because we forgot one little detail here and there.
IMHO, the scripting tools are the biggest feature in DQMH. I still smile every time I create an event or add a DQMH module. BTW, if there are features missing or people would like to add similar scripting tools to their existing architectures, please talk to us, we might be able to make this happen for you.
We didn't think about adding global messages, we will give it some thought, although I believe this would go against our goal of keeping DQMH modules as stand alone modules to reduce coupling between modules.
We realized we were not covering 100% of the use cases for "Request and Wait for Reply" events. We went for the template that would answer 80% of the cases with a very short timeout. In the future we will have a blog post with some of the alternatives we have for this type of event. We even hesitated to include this type of event, because of the potential for deadlock. This type of event is very rare in our current applications. Some of the comments/feedback we got from the CLA summit was that we should have used a SEQ instead of a notifier, because for large data sets the notifier will result in a data copy and the Queue would not. We decided that the notifier was more readable and again it covered 80% of the usage. If the reply requires large datasets, the argument of the notifier reply could be wrapped in a DVR.
This is not always the case, when using the Tools>Delacor> Create New DQMH Event... menu, you will see that there is an option of creating a "Round Trip (Request + Broadcast)". This option creates the Request Event and the Broadcast Event both sharing the same typedef for their argument.
In a DQMH module, the Requests can be found as part of the Public API virtual folder in the DQMH Module.lvlib. When finding where these functions are called, we can find what other code is making requests of the module.
The Broadcasts can be found as part of the Broadcasts Private folder in the DQMH Module.lvlib. These VIs should only be called by functions within the DQMH Module.lvlib.
In our case, we found that keeping these functions separated in this fashion resulted in the best Developer Experience. Especially when dealing with different levels of proficiency. Some of the teams we work with, the architect would create the DQMH and a CLD or CLAD would just call the Public API VIs, they only care about using the Requests. In fact, some of our customers choose to lock the DQMH Module library so the junior developers have access only to the Public API VIs.
In a DQMH module the Queue is private to each module and it is used to send messages within the module itself. The Events are used for any external communication handling.
This is an interesting idea. It is really hard to draw the line on what is needed for every single application and what is needed only for some applications. We tried to keep the DQMH Project Template to the bare minimum we found ourselves and our customers using in all of their projects.
The DQMH Enqueue Message is a polymorphic VI that has the option of enqueing a single message or an array of messages.
Also, the DQMH is a Queued Message Handler, not a state machine. Implementing a State Machine with a module that is asynchronous and can receive messages from a lot of different points in the application leads to getting messages in between the state machine states. If a true state machine is needed where none of its states can be interrupted, then we would code that case in the Message Handling Loop to call an actual State Machine. See my blog post on the NI QMH the section on Using a QMH as a State Machine: http://www.walkingthewires.com/2015/05/08/ni-qmh-template/
This is another example of us deciding to keep things to a minimum. We do have a DQMH Configuration Editor module that we use internally and gets modified to fit the needs of every application. So far this module has changed so much depending on the requirements of each customer, that we decided we couldn't include a version generic enough in the DQMH Project Template. Depending on how many people end up using DQMH, we might make modules like this one available in the future. Or maybe other members of the community decide to share their DQMH modules with the rest of the community.
For debugging we went with the option of including a Test DQMH Module API.vi with every DQMH Module. It includes a status window that can be used to monitor what is going on with that particular DQMH module. This tester can be used to test the DQMH module or as a sniffer when the main application is running to eavesdrop on the communication for that DQMH module.
We kept the Singleton and Cloneable modules separate, because we agree with you that most of the time cloning actors is not needed and we didn't want to burden the 90% of developers with the clone management needed just a few times.
We wanted to make it possible to restart a module without having to restart the entire application.
The DQMH Module Public API VIs return an error if the module is not running. This can be tested via the Test DQMH Module API.vi, if any of the buttons are pressed before the Start Module is pressed, the error will be shown that the module is not running and the tester will stop.
The Test DQMH Module API.vi includes a "Show Block Diagram for Troubleshooting" button, this works both in the Singleton DQMH module and the Cloneable module. In the cloneable module, the developer can choose to send the request to All clones or to an individual clone at a time. This is one of my favorite features. One that I thought at the beginning it was not needed, because my workaround of holding the CTRL and double clicking kind of worked, but if you have a chance, give this button a try… this is another feature that makes me smile every time I use it and prove that having a team to review your decisions leads (hopefully) to a better developer experience for all.
Even longer now with all my replies I appreciate you taking the time to take a look at the DQMH toolkit. I am looking forward to meeting up with you next week and talking more about this.
Happy wiring,
Fab