Dipl.-Ing. Florian B.Wörter

Computer Science Professional



RIVE - Realtime Interactive  Visualization Engine

Ich hatte während meiner Ferialarbeiten bei der Firma Egger schon viele Erfahrungen mit speicherprogrammierbaren Steuerungen (SPS) sammeln können und habe mich auch immer für dieses Thema interessiert. So lag es nicht fern, dass ich mir für meine Diplomarbeit ein Thema aus diesem Themengebiet suchen würde.

Mit RIVE ist mir die Umsetzung eines Systems gelungen, das es so noch nicht gegeben hat. Interessant ist vorallem, dass ich ein völlig neues, von Windows losgelöstes, Fensterverwaltungssystem geschaffen habe und somit das Spezifizieren des Graphical User Interfaces (GUI) über XML möglich wurde. Das hat es bis zum damaligen Zeitpunkt noch nicht gegeben und wurde mittlerweile in der Form von WPF auch für Microsoft Windows implementiert. Etablierte Visualisierungshersteller bauten immer auf das Steuerelemente-System von Windows auf und waren so kaum in der Lage ein System optisch ansprechend zu visualisieren. RIVE durchbricht die Fesseln des Windows GUI-Systems und macht es zusätzlich möglcih mehrere Steuerungen auch unterschiedlicher Hersteller gemeinsam in einer Visualisierung  darzustellen und zu steuern.

 

Alle in weiterer Folge vorgestellten Lösungen sind nur sehr grob umschrieben und bei weitem nicht vollständig. Für Leute, die an den einzelnen Details interessiert sind, lohnt es sich auf alle Fälle die gesamte Arbeit (RIVE - Realtime Interactive Visualization Engine) zu lesen.

Rive Architektur

  

RIVE besteht aus den drei Grundmodulen RiveCore, RiveControlBase und RiveSpsProvider.

RiveCore

RiveCore stellt die Hauptkomponente des Systems dar und wird somit als ausführbare Datei übersetzt.

RiveControlBase

RiveControlBase bietet abstrakte Klassen an, mit deren Hilfe man eigene Steuerelemente implementieren kann.

RiveSpsProvider

RiveSpsProvider bietet abstrakte Basisklassen für eigene I/O Treiber an.

Prinzipielle Funktionsweise

RiveControlBase und RiveSpsProvider werden als DLL übersetzt und können von beliebigen anderen Programmen verwendet werden. Das obige Bild zeigt die prinzipielle Funktionsweise von RIVE und den einzelnen Komponenten. Nach dem Start von RIVE liest der ProjectLoader die Projektdaten, überprüft diese, und initialisiert alle benötigten Steuerelemente und I/O Treiber. Nach der erfolgreichen Initialisierung gibt der ProjectLoader die Kontrolle an RiveMain zurück. RiveMain initialisiert darauf den GuiManager und ruft zyklisch die Render Methode auf. Der GuiManager rendert in dieser Methode alle sichtbaren und interessanten Steuerelemente. Tritt ein Ereignis im I/O Treiber auf (z.B. wenn sich der Wert einer SPS Variable ändert) oder löst ein Steuerelement ein Ereignis aus, so werden diese vom GuiManager bearbeitet.

Vom Wert im Speicher der Steuerung zum RIVE Steuerelement in der Visualisierung 

Für ein Visualisierungssystem ist es natürlich essentiell schnell und effizient über Änderungen von Werten (Variablen) in den zu visualisierenden Steuerungen informiert zu werden.

Wenn sich eine Steuerungsvariable ändert, so erfährt die SpsProvider Komponente als erste davon. Sie ordnet dem SPS Speicherbereich (definiert durch einen Access-String) einem registrierten SpsVariable-Objekt zu (über eine Hashtabelle), löst das VariableValueChanged Ereignis im GUI Manager aus und teilt ihm mit, welche Variable sich geändert hat. Der GUI Manager überprüft in einer internen Liste von sichtbaren Fenster, welche Steuerelemente sich für den Wert der Variable interessieren. Im obigen Bild sieht man, dass sich das Steuerelement C3 im Fenster 1 für den Wert der Variable schalter1 interessiert. Somit ruft der EventHandler die update-Methode von C3 mit dem neuen Wert der schalter1 Variable auf.

RiveScript und RiveSDK

Damit Ersteller von Visualisierungsprojekten auf Ereignisse von Steuerelementen reagieren können, habe ich im Rahmen dieser Arbeit eine eigene, auf Script.NET (von Petro Protsyk) aufbauende Skriptsprache entwickelt und den Schreibern von solchen Scripts die RiveSDK zur Verfügung gestellt. Unter RiveScript versteht man also im Groben das Zusammenwirken von Script.NET mit der RiveSDK Laufzeitbibliothek. So können beispielsweise mit easy-cheesy Einzeilern der Wert von Sps-Variablen geändert, Fenster geöffnet/geschlossen, Steuerelemente-Eigenschaften geändert werden uvm.

RIVE Konsole 

Dabei handelt es sich um ein Overlay, das (wenn im Projekt freigegeben) durch Tastendruck halb transparent über den aktuellen Bildschirm gelegt wird. Sie verfügt über eine Hand voll grundlegender Befehle, die einem beim Debuggen eines Visualisierungsprojekt sehr behilflich sein können. So kann man sich z.B. mit DEBUGCONTROL die Ist-Werte aller Eigenschaften eines Steuerelementes ansehen oder mit dem SHOWVAR Befehl den internen Status und die Eigenschaften einer registrierten Sps-Variable beobachten.

Auftretende Laufzeitfehler (z.B. von falsch implementierten Benutzer-Scripts in Event-Handlern von Steuerelementen) werden nicht nur im Ereignisprotokoll mitgeloggt, sondern auch in der Konsole angezeigt.