510 likes | 741 Views
LabVIEW Object Oriented Programming (LVOOP). Introduction of the HGF Base Class Library ( H elmholtz, G SI, F AIR) NI Big Physics Round Table February 2nd 2009 Holger Brand. Introduction to LVOOP What is LabVIEW? Why Object Oriented Programming? Why should use LVOOP?
E N D
LabVIEW Object Oriented Programming (LVOOP) Introduction of the HGF Base Class Library (Helmholtz, GSI, FAIR) NI Big Physics Round Table February 2nd 2009 Holger Brand
Introduction to LVOOP What is LabVIEW? Why Object Oriented Programming? Why should use LVOOP? Differences to conventional OO languages Some remarks on constructors, destructors and dataflow VI & Object Memory Simple classes, inheritance, examples LVOOP Design Patterns Focus of HGF Base Class Library Factory & HGF_Base Reference & Object Manager Functional Global Variable & Visitor Events & Thread Pool Network Communication Contents H.Brand@gsi.de, NI Big Physics Round Table 2009
LabVIEW is a development environment For development of Measurement- , Automation-, Test- and Control Systems. It includes an advanced math and analysis library. Provides interfaces to DAQ, many field busses, network communication, ActiveX, .Net, DLL, etc. LabVIEW is a graphical programming language Inherent multithreaded with easy to use synchronization methods VI: Virtual Instrument consists of frontpanel and blockdiagram subVI: VI to be used as function Express VI: configurable subVI LabVIEW Modules and Add-Ons extend the base functionality Refer to http://www.ni.com/labview What is LabVIEW? H.Brand@gsi.de, NI Big Physics Round Table 2009
LabVIEW 8.5 H.Brand@gsi.de, NI Big Physics Round Table 2009
LabVIEW is a data flow language. Data flows from data source to sink. It does not normally have variables. Wires are not variables. Front panel controls are not variables. Even local or global variables are not scoped or allocated the way variables are in other languages. Variables are part of a model that conflicts with data flow. Without variables and a scope defining the lifetime of those variables, construction and destruction are meaningless concepts, and therefore they are left out of the language design. Therefore: LabVIEW forbid LabVIEW classes in the interface of LV-built DLLs (shared libraries). Dataflow Paradigm H.Brand@gsi.de, NI Big Physics Round Table 2009
What is the scope of the C++ integer?It exists from the point it is declared until the closing brace. What is the scope of the LabVIEW integer?Unknown. Until the wire ends? Until the VI stops executing? Until probe is closed? Until front panel closes? … LabVIEW does not have “space scope”.LabVIEW has “temporal scope”. A piece of data exists as long as it is needed. If it is copied into front panel control, it stays there, even after execution finishes. Copies on the wires exist until the next execution of that wire. Another copy will be made for any probe on the wire. In a pure theoretical data flow language, there would be a separate copy on every individual wire, because every wire is an independent computation unit. Of course, that would be inefficient to actually implement, so LabVIEW's compiler optimizes the number of copies.But the principle is the same: data lives for a long time, sometimes outliving the program that generated that data. Scope and Live time H.Brand@gsi.de, NI Big Physics Round Table 2009
Classes Attribute data encapsulation Methods operating on attribute data Access scope (Multiple-) Inheritance Recipe, how to create objects Advantages Well defined public interface Well define responsibilities(class and developer) Easier to debug Better scalability Better maintenance Each object can be viewed as an independent little machine or actor with a distinct role or responsibility (object by reference). Leads to better software design and architecture (hopefully!) Why Object Oriented Programming? // C++ class example #include <iostream> using namespace std; class CRectangle { private: int x, y; public: void set_values (int,int); int area () {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b; } int main () { CRectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); return 0; } H.Brand@gsi.de, NI Big Physics Round Table 2009
Differences between C++ and LVOOP • OO for LV means strict encapsulation, simple inheritanceand dynamic dispatching (virtual methods) • Refer to http://zone.ni.com/devzone/cda/tut/p/id/3574 H.Brand@gsi.de, NI Big Physics Round Table 2009
LVOOP Naming A Class is Cluster of private data (C:struct) and Member VI’s operating on that data Access scope: public, protected and private VIs Class attribute is always private! Inheritance: Parent (ancestor) and child class LabVIEW Object is THE ultimate ancestor class No multiple inheritance Static member VI’s can not be overloaded Dynamic dispatch and overwrite VI’s (C++: virtual functions) No overloading! All dynamic VI’s with the same name in one inheritance line must have the same connector pane. No friends in this version Default constructor only Default class attribute values in case of frontpanel control or blockdiagram constant Current attribute data from caller No destructor LVOOP FAQ: http://zone.ni.com/devzone/cda/tut/p/id/3573 Some remarks H.Brand@gsi.de, NI Big Physics Round Table 2009
VI & Object Memory • LabVIEW allocates a “dataspace” for all the data needed to exectute a VI. • Therefore it is thread safe. • There is no need for mutex locking. • A LV class attribute is a cluster of clusters. • LabVIEW Object has an empty cluster that will be filled with child class attribute clusters. • The VI data space has a pointer to object info which refers to • Object data and • Class information H.Brand@gsi.de, NI Big Physics Round Table 2009
initialize Default object constant. Clone object. A Simple Class A simple example VI demonstrates: A LV object is just encapsulated structured data. H.Brand@gsi.de, NI Big Physics Round Table 2009
Introduction to LVOOP What is LabVIEW? Why Object Oriented Programming? Why should use LVOOP? Differences to conventional OO languages Some remarks on constructors, destructors and dataflow VI & Object Memory Simple classes, inheritance, examples LVOOP Design Patterns Focus of HGF Base Class Library Factory & HGF_Base Reference & Object Manager Functional Global Variable & Visitor Events & Thread Pool Network Communication Contents H.Brand@gsi.de, NI Big Physics Round Table 2009
http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29 In software engineering, a design pattern is a general reusable solution to a commonly occurring problem in software design. A design pattern is not a finished design that can be transformed directly into code. It is a description or template for how to solve a problem that can be used in many different situations. Object-oriented design patterns typically show relationships and interactions between classes or objects, without specifying the final application classes or objects that are involved. Algorithms are not thought of as design patterns, since they solve computational problems rather than design problems. Since LabVIEW objects follow the dataflow paradigm, many design pattern must be reinvented with respect to dataflow. LVOOP Design Patterns H.Brand@gsi.de, NI Big Physics Round Table 2009
How to deal with LabVIEW objects as entities? Factory Named and initialized objects Constructor and destructor How to prevent unintended copying of objects at wire forks? Reference, Singleton Object Manager Functional Global Variable & Visitor How to deal with Agents? Separation of passive object data and active threads –> Thread Pool Event handling Behaviour -> State Chart How to overcome some technical restrictions? Missing class information -> vi.lib\Utility\LVClass Missing overloading -> Variant Missing Multiple Inheritance -> Aggregation Missing Interfaces -> Delegation Focus of HGF Base Class Library H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF Class Hierarchy Blue: HGF Base Class library Red: Example classes H.Brand@gsi.de, NI Big Physics Round Table 2009
LVOOP Design Patterns Focus of HGF Base Class Library Factory & HGF_Base Reference & Object Manager Functional Global Variable & Visitor Events & Thread Pool Network Communication Contents H.Brand@gsi.de, NI Big Physics Round Table 2009
How to create initialized, named objects? (LabVIEW provides objects with default attribute values only!) HGF_Factory is a base class for Entities It creates initialized objects that remember their class and object names and whether it was created and initialized by a Factory. It defines two dynamic dispatch VIs (virtual methods) classes VI that returns a default object of a desired class. To be overwritten by child factories. initialize VI that uses variant attributes to initialize the default object. To be overwritten by child classes. HGF_Base is the base class Overwrites the initialize method. More common attributes could be added HGF_Factory & HGF_Base H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_Factory Implementation H.Brand@gsi.de, NI Big Physics Round Table 2009
LVOOP Design Patterns Focus of HGF Base Class Library HGF_Factory & HGF_Base Reference & Object Manager Functional Global Variable & Visitor Events & Thread Pool Network Communication Contents H.Brand@gsi.de, NI Big Physics Round Table 2009
How to create References to objects? Reference object should follow dataflow paradigm!(That means such reference objects become cloned at wire forks.) Reference? → Idea → Queue! Single element size queue Queues can be referenced in LV Size=1 → Object is in the queue or not → Mutual exclusion HGF_Reference H.Brand@gsi.de, NI Big Physics Round Table 2009
Reference object becomes cloned at wire fork, but not the object itself! HGF_Reference Example save public subVI H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_Singleton H.Brand@gsi.de, NI Big Physics Round Table 2009
FGV with object info HGF_ObjectManager H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_ObjectManager Example delete new Reference by name H.Brand@gsi.de, NI Big Physics Round Table 2009
LVOOP Design Patterns Focus of HGF Base Class Library Factory & HGF_Base Reference & Object Manager Functional Global Variable & Visitor Events & Thread Pool Network Communication Contents H.Brand@gsi.de, NI Big Physics Round Table 2009
An object oriented Functional Global Variable No direct access to objects Only Visitors are accepted HGF_FGV and its Visitors H.Brand@gsi.de, NI Big Physics Round Table 2009
Following HGF_FGV_Action classes are available: Object-Array manipulation Clear, Size Append, Insert, Replace, Delete Index, Subset, Selection SelectByName Object manipulationHGF_FGV_Visitor All, Subset, Selection ByName HGF_FGV_Action H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_FGV Example HB_SimpleVisitor FGV_Visitor create objects Same FGV_DB instance FGV_Action H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_Visitable HB_Simple HGF_Component HGF_Component HGF_Leaf HGF_DeviceBase HGF_VISADevice NInstrSim HGF_Visitor HGF_NetworkVisitor HGF_Stop HGF_DeviceVisitor NInstrSim_Visitor HGF_Visitable & HGF_Visitor H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_Visitable & HGF_Visitor H.Brand@gsi.de, NI Big Physics Round Table 2009
LVOOP Design Patterns Focus of HGF Base Class Library Factory & HGF_Base Reference & Object Manager Functional Global Variable & Visitor Events & Thread Pool Network Communication Towards Agents Questions? Comments? Starting Points for your own work http://wiki.gsi.de/cgi-bin/view/NIUser/LabVIEWObjectOrientedProgramming http://wiki.gsi.de/cgi-bin/view/NIUser/HGFBaseClassLibrary Contents (Break) H.Brand@gsi.de, NI Big Physics Round Table 2009
Separation of active generic threads, that perform tasks, that know when and what to do with passive objects that provide the functionality. The object knows how operate on its attribute data. Idea → Thread Pool Thread Manager → HGF_ThreadPool Worker → HGF_ThreadWorker Tasks → HGF_ThreadTask Events & Exceptions Diploma thesis about LabVIEW Agents started at GSI → Frederik Berck. Example for stationary Agent with behavior → Device Agent Agents with Dataflow Objects? H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_ThreadPool H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_Event (red) LabVIEW Object wait(timeout) send(LabVIEW Object) HGF_Timing HGF_InternalEvent HGF_Wait HGF_NextMultiple HGF_Rendezvous HGF_TriggeredEvent HGF_Occurrence HGF_Notifier HGF_Queue FAIR_StartEvent HGF_NetworkEvent HGF_DIMEvent HGF_SVEvent … Helper classes HGF_VariantDataObject HGF_PVDataConverter HGF_PVBase HGF_PVPublisher HGF_PVSubscriber HGF_Exception HGF_Events H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_ThreadWorker:startThread H.Brand@gsi.de, NI Big Physics Round Table 2009
Wait on Visitor from Event Apply Visitor’s action to all Visitables End task and return Demo HGF_TaskOnce:action.vi H.Brand@gsi.de, NI Big Physics Round Table 2009
Wait on Visitor, maybe timeout Apply Visitor’s action to all Visitables If (error) Send copy of task as ExceptionEvent If (not Stop-Visitor) goto 1 Else end task and return Demo HGF_TaskLoop:action.vi H.Brand@gsi.de, NI Big Physics Round Table 2009
Wait on Visitor, maybe timeout Get addressee from ObjectManager by name Apply Visitor’s action to addressee If (error) publish Exception If (not Stop-Visitor) goto 1 Else end task and return HGF_TaskEventListener:action H.Brand@gsi.de, NI Big Physics Round Table 2009
LVOOP Design Patterns Focus of HGF Base Class Library Factory & HGF_Base Reference & Object Manager Functional Global Variable & Visitor Events & Thread Pool Network Communication Towards Agents Contents H.Brand@gsi.de, NI Big Physics Round Table 2009
Distributed Information Management: www.cern.ch/dim originally developed at DELPHI@LEP/CERN around 1991 available for a multitude of platforms and languages light-weight, aiming at high performance, based on TCP/IP today: "backbone" of control systems for LHC experiments concept: named services, peer-to-peer connections Communication Layer: DIM DIM name server (negotiates connections) DIM client 1 command "iii" DIM server A service "i" DIM server B DIM client 2 service "ii" H.Brand@gsi.de, NI Big Physics Round Table 2009
ProcessVariable & DataConverter H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_DIM Example & Demo H.Brand@gsi.de, NI Big Physics Round Table 2009
LVOOP Design Patterns Focus of HGF Base Class Library Factory & HGF_Base Reference & Object Manager Functional Global Variable & Visitor Events & Thread Pool Network Communication Towards Agents Stationary Device Agent with Behavior Contents H.Brand@gsi.de, NI Big Physics Round Table 2009
A Device need to be an entity! → Maybe referenced A Device should have well defined behavior → State Chart A Device is maybe active → Thread Accessible via Network → Network Communication → We have already all necessary base classes defined HGF_Reference HGF_ThreadPool → HGF_ThreadWorker and HGF_ThreadTask HGF_Event → TriggeredEvent → NetworkEvent HGF_Visitable → HGF_DeviceBase HGF_Visitor → HGF_NetworkVisitor → HGF_DeviceVisitor → Need for Behavior: HGF_DeviceFSM.lvsc (Device Finite State Machine) Device State Chart Task: HGF_TaskDFSM.lvclass Stationary Device Agent H.Brand@gsi.de, NI Big Physics Round Table 2009
Device is copied to StateData during initialization. DeviceVisitors are accepted from Inputs with configure and visit triggers and returned via Outputs.ctl Return device via Outputs during deinitialization Device Agent: Behavior H.Brand@gsi.de, NI Big Physics Round Table 2009
HGF_DeviceBase.lvclass Specifies dynamic dispatch VI’s for every state Entry- and Exit-Action and Additionally a doAction, which becomes executed on NULL-Trigger Can be visited by DeviceVisitor HGF_DeviceFSM.lvsc HGF_DeviceBase.accept(DeviceVisitor)on configure and visit entry action HGF_DeviceFSM_Internals.ctl canbe changed within the override VI’sto trigger internal state changes Device Agent: State Actions & Visitor H.Brand@gsi.de, NI Big Physics Round Table 2009
Worker Device Agent: Task Publish Exception Publish Status of State Chart Wait on DFSM Visitor Trigger State Chart Set DeviceVisitor Send DeviceVisitor to its destination (from previous iteration) Run State Chart H.Brand@gsi.de, NI Big Physics Round Table 2009
Device Agent: Main.vi Dispatch TaskDFSM Destroy Device Prepare network events Prepare TaskDFSM Dispatch NetworkEvent(trigger DeviceFSM) Extract data fromreturning DeviceVisitor Monitor DFSM Status H.Brand@gsi.de, NI Big Physics Round Table 2009
Device Agent: Sequence Diagram • This diagram gives anoverview how all objects and threads work together • to implement the Stationary • Device Agent Pattern. • Thread color scheme • Main.vi thread • Agent thread (ThreadWorker) • DFSM thread (State Chart) • Command thread • Receiver thread • DFSM Monitor thread • Thin black line: device object data flow • Thick blue line: device visitor data flow H.Brand@gsi.de, NI Big Physics Round Table 2009