Dr. rer. nat. Holger Brand, GSI Helmholtzzentrum für Schwerionenforschung GmbH
CS++ wird der Nachfolger des CS Framework, welches seit vielen Jahren weltweit bei etwa 15 Experimenten an zehn Instituten eingesetzt wird. Die auf dem NI Actor Framework basierende CS++-Klassenbibliothek soll ähnliche Funktionalitäten wie das CS implementieren und bei Experimentkontrollsystemen an FAIR eingesetzt werden. CS++ erweitert das Actor Framework um Basis- und konkrete Kindklassen zur Gerätesteuerung, Netzwerkkommunikation via Prozessvariablen, spezielle Umgebungsvariablen und DataSocket sowie zentrale Message-Logger. Es erlaubt das interaktive Starten von Aktor-Objekten, deren Konfigurationen in einer Datenbank gespeichert sind. Es unterstützt Introspektion, um Nachrichten zur Laufzeit interaktiv zu parametrieren und an ausgewählte Aktoren zu versenden.
Zu diesem Zweck wird die Nachrichtenbasisklasse erweitert. Der CS++MessageMaker erlaubt das programmatische Generieren solcher Nachrichtenklassen. Der Entwicklungsschwerpunkt liegt auf der Geräteebene und einer einfachen Inbetriebnahme. Dieser Artikel nimmt die Konfiguration und Kommunikation in den Fokus. Die CS++-Bibliotheken werden unter der EUPL v1.1 veröffentlicht.
Dr. rer. nat. Holger Brand - GSI Helmholtzzentrum für Schwerionenforschung GmbH
Dr. rer. nat. Dennis Neidherr - GSI Helmholtzzentrum für Schwerionenforschung GmbH
Diese Kundenlösung wurde im Tagungsband 2016 des Technologie- und Anwenderkongresses „Virtuelle Instrumente in der Praxis“ veröffentlicht.
Eingesetzte Produkte: LabVIEW
Bei CS++ handelt es sich um eine Klassenbibliothek, die das Actor Framework (AF) [3] von NI erweitert und bei kleinen und mittelgroßen Experimenten an FAIR sowie anderen internationalen Forschungsinstituten zum Einsatz kommt. Der Entwurf folgt dem Ansatz Modell-Präsentation-Steuerung (engl. Model View Controller).
CS++ erweitert das AF in Bezug auf Konfiguration und Kommunikation von Aktoren. Es erlaubt das Erzeugen von initialisierten Aktoren zur Laufzeit (Konfigurationsdaten sind in einer Datenbank gespeichert) und benutzt für die Kommunikation Prozessvariablen (PV) in heterogenen verteilten Kontrollsystemen.Jeder Aktor publiziert seinen Zustand und abonniert Sollwertvorgaben. Dieses Vorgehen ist nicht nur bei Inbetriebnahmen hilfreich, sondern essenzielle Anforderung für die Sicherstellung der notwendigen Flexibilität beim Betrieb von bestimmten Experimenten, z. B. Ionenfallen. Mithilfe der PV-Klassen lassen sich auch bereits existierende Applikationen leicht anbinden. Dedizierte Punkt-zu-Punkt-Verbindungen werden nur benutzt, wenn es die Applikation unbedingt erfordert.
Die Kommunikation mithilfe von Prozessvariablen ist der bevorzugte Mechanismus im CS++. Die abstrakte PVConnection-Klasse wird auf Anwendungsebene benutzt, um PV-Werte zu lesen oder zu schreiben. Kindklassen implementieren den Zugriff mithilfe der jeweiligen Protokolltreibermethoden und speichern notwendige Informationen in ihren eigenen Attributen. Das zu benutzende Kommunikationsprotokoll ist im URL-Präfix der PV hinterlegt und legt die zu instanziierende Klasse erst zur Laufzeit fest. Eine Änderung des Protokolls ist also ohne Änderung des Quellcodes möglich. Bild 1 zeigt das Öffnen einer Referenz zu einer Umgebungsvariablen.
Die Fähigkeit, Aktoren zur Laufzeit zu erzeugen, ist ein zentraler Aspekt des CS++. Während eines Experiments müssen oft Geräte hinzugefügt oder ersetzt werden. Aufgrund der begrenzten Messzeit müssen Änderungen im Experimentaufbau in kürzester Zeit in der Software reflektiert werden, sodass es notwendig ist, vorkonfigurierte Aktoren ohne Rekompilation zur Laufzeit laden zu können. Ein Objekt der Klasse CS++Base oder CS++BaseActor wird als Entität mit Name benutzt und seine Attribute mit Werten aus einer Konfigurationsdatenbank initialisiert. Diese Aufgabe übernimmt die Klasse CS++Factory. Sie liest die Werte als Zeichenketten in ein Variant, erzeugt ein Default-Objekt der gewünschten Klasse (LVClassPath) und fordert das Objekt im dynamischen Dispatch-VI Initialize Attributes.vi auf, seine eigenen Attribute zu initialisieren.
Die CS++BaseActor-Klasse erbt direkt vom Original-AF die Aktor-Klasse. Sie dient dem Zweck, dem AF Funktionen hinzuzufügen, die alle CS++-Aktoren haben sollen. Da innerhalb des Pre Launch Init.vi keine Aktoren gestartet werden können, wurde das After Launch Init.vi eingeführt. Dieses VI sollte als allererstes ausgeführt werden, wenn der Aktor in seiner Nachrichtschleife angekommen ist. In den korrespondierenden Override-Methoden sollen dynamisch Ressourcen alloziert werden, die dann im Stop Core.vi wieder freigegeben werden. Der statische Teil des After Launch Init.vi erlaubt optional, eine pseudo-periodische Aktion (Polling) oder weitere Hilfsaktoren, wie z. B. ein assoziiertes GUI, zu starten.
Mithilfe des Introspection.vi gibt ein CS++-Aktor bekannt, auf welche Nachrichten er reagiert. Die AF-Nachrichtenklasse wird um das dynamische Dispatch-VI Configure.vi erweitert, das das interaktive Parametrieren einer Nachricht ermöglicht. Der ObjectManager (er kennt alle CS++-Aktoren und ihre Enqueuer) kann benutzt werden, solche Nachricht zu versenden. Diese Funktionalität ist für die Inbetriebnahmephase sehr wichtig, weil dedizierte GUIs i. A. noch nicht zur Verfügung stehen, bzw. zur Entwicklung eines generischen Sequenz-Editors, der in Planung ist.
Prozessvariablenkommunikation ist die in CS++ bevorzugte Methode, um verteilte Systeme zu integrieren. Aktoren reagieren aber nur auf Nachrichten. Es wird also ein Bindeglied benötigt. Die Aktor-Klasse CS++PVMonitor dient diesem Zweck. Der PVMonitor abonniert Prozessvariablen und sendet zugeordnete Nachrichten an registrierte Beobachter-Aktoren (siehe Bild 5). Kindklassen implementieren wieder die speziellen Kommunikationsprotokolle und können z. B. auch ereignisgesteuert reagieren.
Durch diesen Ansatz werden Sender und Empfänger weitestgehend entkoppelt. Verteilte Systeme können ohne weitere Modifikation sehr flexibel zusammengestellt werden; sogar Echtzeitsysteme, wenn das Netzwerkprotokoll dies unterstützt.
Zur Zeit werden mithilfe der CS++-Klassen kleinere Anwendungen implementiert. Eine davon ist die Portierung einer CS-Motorsteuerung für ein Atomphysik-Experiment an der GSI . Die dreiteilige Struktur (Hardware-Abstraktion) dieser Anwendung dient auch als Vorlage für zukünftige Systeme. Eine Geräte-Basisklasse definiert die Schnittstelle und implementiert Standard-Eigenschaften. Eine Kindklasse überschreibt abstrakte Methoden und ruft darin konkrete Gerätetreiber-VIs auf. Mit dem zugehörigen Basisklassen-GUI kann das Gerät bedient werden.
Die Erstellung einer CS++-Basisklasse für einen neuen Gerätetyp ist relativ aufwendig. Sie wird aber nur einmal von einem erfahrenen Entwickler sorgfältig implementiert. Die Entwicklung von Kindklassen beschränkt sich i. A. auf das Implementieren der Override-Methoden mit einfachen Gerätetreibern. Das kann auch ein fortgeschrittener Anfänger bewältigen (CLAD-Level). Die Basisklasse für die Motorsteuerung wurde so implementiert, dass die Kindklasse für eine bestimme Motorsteuerung nur die konkreten Aktionen z. B. Move.vi or MoveReference.vi überschreiben muss.
CS++ wird langfristig das CS Framework ersetzen. Um die Überfrachtung von Basisklassen zu vermeiden, ist für die nahe Zukunft ein Redesign mit geeigneten Entwurfsmustern geplant. Das Strategie-Muster bietet sich an, um das System noch modularer zu gestalten und die
Dr. rer. nat. Holger Brand
GSI Helmholtzzentrum für Schwerionenforschung GmbH
Planckstraße 1
Darmstadt 64291
Germany
Tel: +49 (0)6159 71-2123
Fax: +49 (0)6159 71-2986
H.Brand@gsi.de