Jump to content

Migrating from GOOP2 to modern

Recommended Posts

I started a topic on the NI GOOP forums today about running out of memory when running the GOOP2 to GOOP3 conversion tool.   I pared back my ambitions and got it to finish.   However my code is all quite broken so I must not be taking the right approach.



We have been developing electronic test systems for radio astronomy receivers and their sub-assemblies since 2005.   We started on LabVIEW 7.1 and settled on 8.6.1 with Endevo GOOP 3.0.5 as the production development environment.   We did not want to change platforms until the project was through its construction phase.   Now it is in operations/maintenance phase and we must, for obvious reasons, move to Windows 7 and therefore a more modern LabVIEW environment.   We chose LV2013 as a recent standard to build on.


I have 20-30 classes which are shared infrastructure for the different test systems, plus dozens more which implement specific devices or measurement sequences.    So I am loathe to rewrite all of this from first principles.


Does anyone here have experience with upgrading this scale of project to the latest / best tools to run under LV2013?


What is the path of least resistance to get this done as painlessly as possible?


What are the gotchas I should look out for along the way?   


Are there good resources I may have overlooked to help me understand the underlying architectural changes?


I've been reading everythign I can find on this forum and the NI GOOP forum for the last few days but I'm still not clear what the implications for my code are with regard to, for example, GOOP2 object references becoming their GOOP3 equivalent.


I can add specific examples of what I've found broken if that will help.


Thanks so much for reading.

Edited by Morgan McLeod
Link to post
  • 2 weeks later...

A quick follow-up for now:


The GOOP2 to GOOP3 conversion tool left a few things in an incorrect state.    All things I could correct most likely.    It failed to notice one parent-child relationship in the class hierarchy.  Also some of the NEW methods were not executable but I didn’t dig in to figure out exactly why.


However, the software framework I am porting relied upon some other tricky LabVIEW techniques, some of which also won’t port cleanly.   So I’m porting it using a “clean room†approach making new classes in GOOP4 and repackaging the existing code.   Also making some new design decisions to try to encapsulate the tricky bits better.


Specifically, the framework used Call By Reference pretty extensively.   The VIs which were called in this way were GOOP2 class members.   This doesn’t seem possible in LV OOP because you must use a strict type definition when loading and calling the VI.   I tried doing the same thing where the type def. was to the base class method but actually trying to load and run a derived-class member.   Unsurprisingly this did not work.   Instead I’m channeling all those calls through a dispatcher method declared in the base class and implemented in the derived.


It also makes heavy use of DataSockets for inter-module communication.   I’m going to try to retain that capability but encapsulate it behind a Publisher/Subscriber interface so that I can try other techniques without affecting the rest of the library.


Once I get the framework ported, it’s going to be a ton of work porting the actual applications, but it should be pretty cookbook and maybe I can partially automate it.   Deadline's still a month away!


I will show my work once I get further along.   This will look very familiar to at least one member here.   (Hi Mike!)

Link to post

Morgan, I converted the UML Modeller(>20 classes) from GOOP2 to GOOP3 using the conversion tool, but you are right it can’t convert everything automatically, I still had to do 20% manually.

You can always debug/fix the conversion  tool since all VIs are unlocked.

(LabVIEW 20XX\resource\Framework\Providers\Open_GDS\ClassProviders\Common\ConvertGoop2ToGoop3.vi)


If you have some sample classes in GOOP2, I can help you look into it.

I’m about to release a new version of OpenGDS.

In that version there is a new conversion tool that you got to try :-)



I most often use GOOP4 (DVR) now a days, but the biggest change I have to do in the design when going to GOOP4/DVRs, is that I can’t just read Attributes while someone has locked the access to the Attributes/DVR

That could be done in GOOP2/GOOP3. So when you have a class member SubVI that tries to read an attribute, and you place that inside a IPE structure that has locked the same object your code gets stuck, as you probably experienced.



Link to post

That could be done in GOOP2/GOOP3. So when you have a class member SubVI that tries to read an attribute, and you place that inside a IPE structure that has locked the same object your code gets stuck, as you probably experienced.



I haven't run across that yet but I will keep watch for it.   So far I'm making my DVR locking sections as small as possible.   I'm thinking in some timing critical members I will have to hand-optimize by caching everything I need so I don't need to read the attributes at all.   Thankfully there are not very many of those.

Native LVOOP is Goop4? I haven't heard that term. Just checking.


I may not have my terminology all up to standard.   But GOOP4 is indeed implemented in terms of native LVOOP + Data Value References.

In that version there is a new conversion tool that you got to try :-)




Oh Wow.   Like C++ or Python to LabVIEW?

Link to post
Oh Wow.   Like C++ or Python to LabVIEW?


It supports java and c#, it's now available for testing: http://opengds.github.io/

Just click "Show untested versions".

Everything is Open Source, so have a look in the code if you want.

I've not had time to document it too much though :-(

(I even have a build for LV2015 Beta)


I've also added Interface classes (By VI Server calls), and I will create a video soon that shows how it works.

Remember that all features that the NI and Symbio version has, still exists in the OpenGDS version.

Have fun.

Link to post

You are right, it only creates the classes, attributes, methods (including the arguments and return values), data types such as enums and structs, so you have to do a little work yourself, but it does helps you out by adding this to the VI's block diagram:


  • Like 1
Link to post

Join the conversation

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

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 agilentvee
      hi all
      i use GOOP to design object 
      1.i download GOOP by VIPM refer to attachement 1
      2.i create two simple object ,and set relationship refer to attachement 2
      3.it show error message refer to attachement 3
      my question :how to solve the issue?

    • By Leif
      My test group has decided to start using OOP (beyond LVOOP I hope).
      The question is should we use an OOP tool and which one: GOOP/GDS or G#?
      I'm quite biased as I have used GOOP for a number of years, but I'm trying make fair investigation. I also realize that the StarUML plug-in in G# could be very useful.
      Has anyone made or seen a comparison between GOOP and G#?
      Or do you have an own opinion?
      (Searching for the text "G#" isn't that easy...)
    • By df_rob
      Recently I have been trying to develop a set of classes for data aquisition (as the encapsulation makes other tasks easier) however I keep running into several issues (described below). I was wondering what you guys did for your OO DAQ systems. I've found a few presentations lying around on the net but their implementations do not seem to work when using DAQmx based measurements.
      I am trying to measure the inputs from two seperate instruments: (1) Torque Sensor (2) Encoder. Sometimes these instruments might  be using a DAQmx analog input and other times a .DLL.
      My original thought was that I would have a parent class called Measurement with several functions (Initalize, Configure, Read Data, Close) that would be over-riden by its children Analog Input (DAQmx) and Digital Input (Seperate .DLL). There then would be (for example) an Analog Input object created called position and a digital Input object called torque. This seemed to look nice on paper, however it didnt work as my DAQs tasks need to be combined (you cant have several tasks on a single device.)
      As this didnt work, I approached it with a different setup. This time I had a parent class called Instrument that has two children Torque Sensor and Encoder. Again, things get tricky, as sometimes I might want to use an analog DAQmx task for both the Torque Sensor and Encoder. 
      What is your typical OOP class structure like for DAQ?
    • By MikaelH
      We have released GOOP Development Suite 4.7
      The main things are: 
      [*] LabVIEW 2013 support [*]The creation of Property Node methods. [*]UML Modeller fixes for analysing Actor Framework classes

      Download it from www.symbio.com/goop
      ...or here:
      GDS 4.7 LV2010
      GDS 4.7 LV2010-64
      GDS 4.7 LV2011
      GDS 4.7 LV2011-64
      GDS 4.7 LV2012
      GDS 4.7 LV2012-64
      GDS 4.7 LV2013
      GDS 4.7 LV2013-64
      And here are some videos:
      GDS(4.5) Features Video
      Other Videos
      Contatct goop@symbio.com for questions.

      Lars Persson and Mikael Holmström
      Symbio Sweden  
    • By spdavids
      We have released GOOP Developmente Suite v4.5.
      Most important feature are:
      - Support for Actor Framework.
      Download installers for LV 2010 up to LV2012 and read more : www.symbio.com/goop
      Contatct goop@symbio.com for questions.
      Stefan Davidsson and Mikael Holmström
      Symbio Sweden
  • Create New...

Important Information

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