Kostenlose
Testversion

Plugin-Steuerung

Die Plugin-Steuerung ist eine durch Plugins erweiterbare Steuerung. Steuerungs-Plugins können selbst in der Programmiersprache Java erstellt werden. Dadurch können komplexe Steuerungen erstellt werden. Weiterleitungen in andere Programmierumgebungen wie Matlab sind möglich, um beispielsweise vorhandene Steuerungen in Polysun einzubinden. Die Schnittstelle zu den Plugin-Steuerungen bildet das Java Interface IPluginController.

Einleitung

Plugin-Steuerungen ermöglichen die Erstellung von Steuerungen in Polysun. Komplexe und mächtige Steuerungen können damit entwickelt werden. Diese Steuerungen können selbst entwickelt oder erhaltene Steuerungs-Plugins können einer Polysun-Installation hinzugefügt werden.

Einer Polysun-Installation liegen verschiedene Plugin-Steuerungen bei, siehe folgende Kapitel.

In der Anwendung verhalten sich Plugin-Steuerungen vergleichbar wie „traditionelle Steuerungen“. Der Unterschied ist, dass jedermann, der Java programmieren kann, Plugin-Steuerungen entwickeln und weitergeben kann.

Unterschied zur Programmierbaren Steuerung bzw Vorteile der Plugin-Steuerung

Plugin-Steuerungen erlauben ebenso die Programmierung von Steuerungen wie die „Programmierbare Steuerung“. Die Programmierung der Steuerungen erfolgt jedoch in den Programmiersprachen Java, Python oder Matlab. Komplexe Steuerungen können programmiert werden. Programmschleifen oder Bibliotheken können genutzt werden. Der volle Sprachumfang dieser Programmiersprachen steht zur Verfügung.

Weiter besteht zusätzlich die Möglichkeit, „Weiterleitungen“ zu bestehenden Steuerungen oder in andere Programmierumgebungen zu programmieren, wie dies beispielsweise für Matlab oder Python gemacht wurde.

Anwendung von Plugin-Steuerungen

Plugin-Steuerungen werden wie „traditionelle Steuerungen“ über die Steuerungsauswahl einer Variante hinzugefügt. In der Plugin-Steuerungs-Auswahl werden alle vorhanden Plugin-Steuerungen angezeigt.

Projekte, die eine Plugin-Steuerung enthalten, benötigen zur Ausführung und Bearbeitung das Plugin mit der Steuerung. Plugins werden als .jar-Dateien abgelegt und können dem Ordner plugins im Datenpfad von Polysun hinzugefügt werden, z.B. für Windows wäre dies normalerweise C:UsersPublicPolysunplugins oder normalerweise für MacOS /Programme/Polysun/plugins. Hinzugefügte Plugins stehen nach einem Neustart von Polysun zur Auswahl.

Ausprobiert werden kann dies durch die Demo-Plugin-Steuerung, die im Plugin DemoPlugin.jar enthalten ist. Diese ist im Datenverzeichnis von Polysun abgelegt und kann aus dem Datenverzeichnis plugins/examples in den Ordner plugins kopiert werden. Die Steuerung steht nach erneutem Start von Polysun zur Auswahl.

Falls eine Plugin-Steuerung fehlt, wird ein Fehler angezeigt. Die Bearbeitung oder Simulation ist bei fehlendem Plugin nicht möglich. Das fehlende Steuerungs-Plugin muss hinzugefügt werden.

Polysun liegen eine Anzahl Plugin-Steuerungen bei.

Beispielprojekte sind im Datenverzeichnis plugins/examples verfügbar.

Plugin-Steuerungen werden zurzeit nicht automatisch wie Profile Projekten hinzugefügt. Plugins müssen vom Benutzer eigenhändig weitergegeben werden.

Durchfluss-Plugin-Steuerung

Die Plugin-Durchflusssteuerung verhält sich genauso wie die bereits vorhandene Durchflussteuerung. Sie ist eine Kopie. Diese Steuerung steht im Quellcode zur Verfügung und ist Open Source Software, siehe im Datenverzeichnis plugins/PolysunPluginDevelopmentKit.zip.

„Fixer Zeitschritt“-Plugin-Steuerung

Eine Steuerung, die einen regelmässigen, fixen Zeitschritt in der Simulation vorgibt.

Für jeden Zeitpunkt, welcher ein Vielfaches des fixen Zeitschrittes ist, führt die Simulation einen Zeitschritt aus. Polysun kann mehr Zeitschritte ausführen, falls dies für die Simulation erforderlich ist. Zum Beispiel, für einen fixen Zeitschritt von 180s, führt die Simulation die Zeitschritte 0s, 180s, 360s, 480s, 720s, …  aus. 0 bedeutet keine fixen Zeitschritte und die normalen Zeitschritte (240s während dem Tag und 720s während der Nacht) von Polysun kommen zur Anwendung. 0 steht also für die „normalen Zeitschritte“.

Matlab-Plugin-Steuerung

Die Matlab-Steuerung ist eine Plugin-Steuerung, die die Steuerungsaufrufe aus Polysun an eine Matlab-Funktion weiterleitet. In der Steuerung wird der Name der Funktion in Matlab gesetzt. Diese Funktion muss im Pfad von Matlab oder im Startverzeichnis sein. Die Matlab-Funktion muss folgende Funktionsargumente haben:

function [ controlSignals, logValues, timepoints ] = control( simulationTime, status, sensors, sensorsUsed, properties, propertiesStr, preRun, controlSignalsUsed, numLogValues, stage, fixedTimestep, verboseLevel, parameters)

Die in der Matlab-Steuerung angegebene Matlab-Funktion wird in jedem Zeitschritt von Polysun aufgerufen und muss in jedem Zeitschritt aufgrund der Input-Parameter die Steuersignale für Polysun berechnen.

Die Konfiguration und Beispiele der Matlab-Steuerung werden im Polysun-Datenverzeichnis plugins/com.velasolaris.plugin.controller.matlab.matconsolectl.MatlabPluginController nach dem ersten Steuerungsaufruf abgelegt, z.B.

C:UsersPublicPolysunpluginscom.velasolaris.plugin.controller.matlab.matconsolectl.MatlabPluginController.

Die Datei config.properties enthält die grundlegende Konfiguration der Matlab-Steuerung. Falls Matlab nicht gefunden wird, muss der Pfad zur Matlab-Programmdatei mit matctl.matlabLocation gesetzt werden, beispielsweise

matctl.matlabLocation=C:\Program Files\MATLAB\R2017a\bin\matlab.exe

Die richtige Angabe von „“ ist technisch notwendig, also doppelt und einzeln vor dem Doppelpunkt („:“). Ebenso kann das Startverzeichnis beim ersten Aufruf von Matlab mit dem Parameter matctl.matlabStartingDirectory gesetzt werden. Die meisten anderen Parameter sind durch den Namen selbst erklärend oder müssen in der Regel nicht weiter angepasst werden.

Die Funktionsargumente der Steuerungsfunktion sind in control.m dokumentiert. Die Matlab-Funktion controlFlowrate.m implementiert eine Durchflusssteuerung. Sie verhält sich gleich wie die „traditionelle Durchflusssteuerung“ von Polysun.

Diese Steuerung steht im Quellcode zur Verfügung und ist Open Source Software, siehe im Datenverzeichnis plugins/PolysunPluginDevelopmentKit.zip.

Falls Matlab noch nicht gestartet ist, wird Matlab gestartet. Breakpoints in Matlab werden unterstützt.

Die Matlab-Steuerung benutzt zur internen Kommunikation die Bibliothek MatConsoleCtl.

Im Kapitel Geschwindigkeitsvergleich wird Matlab mit den anderen Steuerungsaufrufarten verglichen.

RPC-Plugin-Steuerung (Python)

Die RPC-Steuerung ist eine Plugin-Steuerung, die die Steuerungsaufrufe aus Polysun über einen Remote Procedure Call (RPC) an einen RPC-Server weiterleitet. In der Steuerung werden der Name der Funktion und die URL des Servers gesetzt, z.B „controlFlowrate“ und „http://localhost:2102/control“. Die Funktion im RPC-Server muss folgende Funktionsargumente haben:

control(simulationTime, status, sensors, sensorsUsed, properties, propertiesStr, preRun, controlSignalsUsed, numLogValues, stage, fixedTimestep, verboseLevel, parameters)

=> controlSignals, logValues, timepoints

Die in der Steuerung angegebene RPC-Funktion wird in jedem Zeitschritt von Polysun aufgerufen und muss in jedem Zeitschritt aufgrund der Input-Parameter die Steuersignale für Polysun zurückgeben.

Drei Arten von RPC werden unterstützt: JSON-RPC stream (Geschwindigkeits-optimiert) JSON-RPC und XML-RPC. JSON-RPC und XML-RPC werden beide von vielen Systemen unterstützt, beispielsweise von der Programmiersprache Python.

Python (https://python.org) unterstützt JSON-RPC durch Zusatzmodule und XML-RPC standardmässig. Es stehen im Datenverzeichnis der RPC-Steuerung (plugins/com.velasolaris.plugin.controller.rpc.SimpleRpcPluginController) je ein XML-, ein JSON-RPC-Server und ein optimierter JSON-RPC-Stream-Server für Python zur Verfügung. Die Steuerungsfunktionen sind in controlFunctions.py.

Start des Funktionsservers:

python controlJsonRpcStreamServer.py

python controlJsonRpcServer.py

python controlXmlRpcServer.py

python controlRpcServer.py

Oder mit pypy (http://pypy.org), welches einen Just in Time (JIT) Compiler einsetzt und dadurch schneller ist:

pypy controlJsonRpcStreamServer.py

pypy controlJsonRpcServer.py

pypy controlXmlRpcServer.py

pypy controlRpcServer.py

Es besteht die Möglichkeit, den RPC-Funktionsserver automatisch in Polysun zu starten. Für einen erfolgreichen Start des RPC-Servers müssen die Parameter richtig gesetzt werden. Falls das automatische Starten des RPC-Servers nicht funktioniert, konsultieren Sie bitte die Polysun-Log-Datei im Datenverzeichnis von Polysun, z.B. C:UsersPublicPolysundata.log. Die Analyse von Problemen setzt ein gewisses technisches Verständnis voraus.

Die verschiedenen Steuerungsaufrufarten werden im Kapitel Geschwindigkeitsvergleich miteinander verglichen.

Weiterführende Informationen sind in den Script-Dateien dokumentiert.

Diese Steuerung steht im Quellcode zur Verfügung und ist Open Source Software, siehe im Datenverzeichnis plugins/PolysunPluginDevelopmentKit.zip.

Plugin-Steuerungs-Entwicklung

Plugin-Steuerungen können selbst in der Programmiersprache Java erstellt werden. Voraussetzung zum Erstellen von Steuerungs-Plugins sind Java-Programmierkenntnisse und eine Java-Entwicklungsumgebung.

Einführend gesagt, definiert das Interface IPluginController eine Steuerung und ControllerPlugin ein Plugin.

Plugin-Steuerungen müssen das Java Interface IPluginController erfüllen (implementieren). Die wichtigste Methode ist control(). Diese Methode wird in jedem Zeitschritt aufgerufen und berechnet die Steuerungssignale aus den Sensorsignalen. Die Signatur ist

control(int simulationTime, boolean status, float[] sensors, float[] controlSignals, float[] logValues, boolean preRun, Map<String, Object> parameters).

Die Werte für die gesetzten Steuerungseingänge werden im sensors-Array in jedem Zeitschritt zur Verfügung gestellt. Daraus berechnet die Plugin-Steuerung die Kontrollsignale (controlSignals-Array) für die gesetzten Steuerungsausgänge.

Die zur Entwicklung von Plugin-Steuerungen notwendigen Dateien sind im Datenverzeichnis im Zip-Archiv plugins/PolysunPluginDevelopmentKit.zip verfügbar. Weitere Informationen sind in den README.txt-Dateien beschrieben.

Ein Steuerungs-Plugin wird durch das Interface ControllerPlugin definiert. Ein Plugin muss eine Klasse haben, die dieses Interface implementiert. Damit das Plugin gefunden wird, muss das Plugin „angemeldet“ werden. Dabei muss der volle Klassenname des erstellten Plugins (inkl. Packages) in der Datei

META-INFservicescom.velasolaris.plugin.controller.spi.ControllerPlugin

gesetzt werden. Für das Demo-Plugin ist der Inhalt dieser Datei

com.velasolaris.plugin.controller.DemoControllerPlugin. Die kompilierten Java-Klassen (.class) mit dem META-INF-Verzeichnis können daraufhin in ein Java-Archiv (.jar-Datei) verpackt und dem Klassenpfad (Classpath) von Polysun hinzugefügt werden. Am besten werden die Plugins im Ordner plugins des Datenverzeichnisses hinzugefügt. Das Erzeugen der Plugin-Jar-Datei wird am einfachsten mit einem Ant-Script erzeugt, siehe build.xml beim Demo-Plugin.

Standardmässig werden Plugin-Jars während dem Ausführen von Polysun nicht neu geladen. Während der Entwicklung kann das Neuladen jedoch hilfreich sein. Wenn in der Datei user.ini (z.B. in C:UsersPublicPolysun), die die Polysun-Benutzereinstellungen enthält, die Einstellung

Plugin.ReloadAlways=1

gesetzt ist, werden die Plugins, beim Aufruf des Plugin-Controller-Dialogs jeweils neu geladen.

Zum Entwickeln einer neuen Plugin-Steuerung werden am besten eine Kopie des Demo-Plugins gemacht und die entsprechenden Dateien angepasst. Es wird empfohlen, neue Steuerungen mit JUnit-Tests abzusichern. Der DemoFlowratePluginControllerTest ist ein Beispiel eines JUnit-Tests.

Geschwindigkeitsvergleich

Plugin-Steuerungaufrufe sind auf verschiedene Arten möglich. Programmiersprachen wie Matlab, Python oder Java können für bestimmte Aufgaben besonders geeignet sein.

Die Simulationszeit hängt von der Art der Steuerungsaufrufe ab. Um einen Geschwindigkeitsvergleich zu haben, wurden die verschiedenen Steueungsaufrufe miteinander verglichen. Die Vorlage „16c: Raumheizung (Wärmepumpe, ohne Puffer)“ mit immer der gleichen Durchflusssteuerungslogik wurde für den Vergleich verwendet, siehe dazu das Polysun Projekt „FlowratePluginControllerComparison.pse“.

Testsystem: Intel Core i7-6820HQ 2.7GHz, Windows 10 1607, Java 8, Matlab 2016a, pypy 5.4.1, Polysun 9.2 dev (r24000), plugins/examples/FlowratePluginControllerComparison.pse

Tabelle: Simulationszeit und durchschnittliche Steuerungsaufrufzeit für die verschiedenen Plugin-Steuerungstypen

AufrufstypSimulationszeitØ Steuerungsaufruf
FlowrateController4 s0 ms
Java FlowratePluginController4 s0 ms
MatlabPluginController86 s0.5 ms
JSON-RPC stream (Python)14 s0.06 ms
JSON-RPC (Python)Abbruch (68s)0.4 ms
XML-RPC (Python)228 s1.5 ms

Vergleich der Steuerungsaufrufe durch verschiedene Remote Procedure Call (RPC) Protokolle mit den unterschiedlichen Pythoninterpretern.

Testsystem: Intel Core i7-4500U CPU 1.80GHz, openSuse 13.2 Linux, Java 8, Polysun 9.2 dev (r24000), plugins/examples/FlowratePluginControllerComparison.pse

Tabelle: Durchschnittliche Steuerungsaufrufzeit für verschiedene Pythoninterpreter und RPC-Protokolle

Python / RPC-ProtokollJSON-RPC streamJSON-RPCXML-RPC
RPC-TypEigenentwicklungStandardStandard
KommunikationsprotokollTCP SocketHTTPHTTP
 EineTCP-Connection proSimulationZeitschrittZeitschritt
PyPy 5.4.10.06 ms0.5 ms0.6 ms
Python 2.70.09 ms0.7 ms1.3 ms
Python 3.40.08 ms0.9 ms1.4 ms

JSON-RPC führt auf schnellen System in Windows bei lokaler Ausführung zum Fehler „java.net.BindException: Address already in use: connect“ (PSA-4571). Verwenden Sie statt dessen das „JSON-RPC stream“-Protokoll.

Mögliche Weiterentwicklungen

Steuerungs-Plugins müssen aktuell bei der Weitergabe von Projekten ebenfalls parallel weitergegeben werden. In Zukunft könnte es möglich sein, Plugins in Polysun Projektdateien .pse abzuspeichern,  wie dies bereits bei Profilen der Fall ist.