Skriptsprachen
Lua - eine Alternative zur SPS-Programmierung?
Bei der Programmierung von Echtzeit-Anwendungen greifen Entwickler immer noch auf ihre gewohnten, allerdings oft auch komplexen Sprachen wie C und C++ oder auf die traditionelle SPS-Programmierung zurück. Eine interessante Alternative hierzu sind Skriptsprachen wie Lua.
Skriptsprachen wie Lua sind verhältnismäßig schnell erlernbar, man muss keinen dedizierten Compiler nutzen und der Quellcode ist plattformunabhängig – er kann also auf Windows, Mac OS X und Linux zum Einsatz kommen. Die gewollte Schlichtheit lässt sich auch am Sprachumfang erkennen: Während C++ rund 2000 Sprachelememente umfasst und C etwa 850, verfügt Lua gerade einmal über 250 Befehle, mit denen es sich effizient programmieren lässt. Zugegeben: Hinsichtlich der Performance hinkt Lua gegenüber Programmiersprachen wie C und C++ hinterher; dieser Geschwindigkeitsnachteil lässt sich allerdings mit Hilfe geeigneter DLL- und Echtzeit-Bibliotheken kompensieren.
Bild 1: Mithilfe einfacher Skriptbefehle lassen sich Lua-Befehle via RPC auf Echtzeitmaschinen instanziieren.
© Profimatics/eclipse.orgWas ist nun das Besondere an Skriptsprachen wie Lua für die Programmierung von Echtzeit-Applikationen im Umfeld der industriellen Automatisierung? Um diese Frage zu beantworten, lohnt ein Blick auf eine mögliche Kombination aus Lua und einem Echtzeit-Betriebssystem, wie das beispielsweise beim Entwicklungspaket RT-Lua der Firma Profimatics aus Barmstedt der Fall ist. Dort ist mittels vorbereiteter Schnittstellen ein direkter Zugriff auf die Intime-Echtzeit-Betriebssystemumgebung von Tenasys möglich; dies erlaubt die unmittelbare Nutzung der Realtime-Funktionalität aus einer Skriptsprache heraus (Bild 1). Dazu zählen unter anderem die Interprozess-Kommunikation, der Echtzeit-Zugriff auf die vorhandene Hardware (I/O, PCI-Bus etc.) und auch die Netzwerk-Funktionen (TCP/IP etc.).
Die Verbindung zwischen Skriptsprache und Echtzeit-Plattform kann auf mehreren Wegen erfolgen. Ein häufiger Ansatz ist eine RPC-Verbindung, im Normalfall auf Basis des TCP/IP-Protokolls. Damit greift der Entwickler mit Hilfe standardisierter Schnittstellen auf die Echtzeit-Umgebung zu, ohne spezielle beziehungsweise proprietäre Protokolle nutzen zu müssen. Dieser RPC-basierte Zugriff auf eine Realtime-OS-Maschine ist aber auch in Form einer Client-Server-Implementierung realisierbar. Damit können Lua-Skriptbefehle direkt auf dem Server ausgeführt, Variablen angelegt und neue Funktionen auf den Server geladen werden. Darüber hinaus ist die RPC-Bibliothek von Intime ebenso für andere Betriebssysteme wie zum Beispiel Linux und Mac OS X verfügbar. So lassen sich auch von diesen Betriebssystemen aus Funktionen in Echtzeit auf einem entsprechenden Laufzeitsystem ausführen.
Lua für Rapid Prototyping und Testen
Bild 2: Der Code-Ausschnitt zeigt eine Funktion, die eine CAN-Nachricht verschickt, sobald der Speicherbereich ‘can_mem’ eingeblendet wurde.
Vor diesem Hintergrund kann die Skriptsprache Lua nun außerdem für das Rapid Prototyping und Testen von Echtzeit-Systemen zum Einsatz kommen, womit beispielsweise die Inbetriebnahme spezieller Realtime-Hardware mit wenigen Skriptkommandos möglich ist. Hierfür müssen nicht einmal spezielle Treiber eingebunden werden, deren Programmierung standardmäßig in C oder C++ erfolgt. Umgesetzt wird dies beispielsweise bereits im Umfeld von medizinischen Anwendungen, bei denen der SJA1000-CAN-Controller Verwendung findet. Der Code-Ausschnitt in Bild 2 soll zeigen, wie einfach es ist, die Register eines CAN-Controller-Chips zu beschreiben, um eine CAN-Message zu verschicken.
Dieses treiberlose Ansprechen von Hardware mit Hilfe von Lua ist möglich, weil unter Intime privilegierte Befehle nativ ausführbar sind, die ansonsten unter Windows nur im Ring 0 – also auf der Kernel-Ebene – zur Verfügung stehen. Um diese Befehle besser verfügbar machen zu können, lassen sich diese in Lua in einer Bibliothek zusammenfassen. Dazu gehören beispielsweise Aufrufe für das Lesen und Schreiben von IO-Ports, für direkte Zugriffe auf PCI-Komponenten und das Einblenden von Speicherbereichen einer PCI-Karte.
Ideales Einsatzfeld – die Robotersteuerung
Lua lässt sich darüber hinaus in bestehende Anwendungen integrieren, so wie das beispielsweise Bosch Rexroth mit Indra Motion MLC – einem integrierten Engineering- und Laufzeitsystem für Logik-, Motion-, Robotik- und Hydraulik-Aufgaben – vollzogen hat.
RT-Lua besteht aus modularen Software-Komponenten, die keine Installation erfordern und jeweils der Größe eines herkömmlichen JPEGs entsprechen.
© Profimatics/eclipse.orgDamit sind komplexe Bewegungen mit einfachen Skriptbefehlen ausführbar, was eine vereinfachte Programmierung von Robotern und anderen Maschinen ohne SPS-Kenntnisse erlaubt. Hierfür nutzt Indra Motion MLC zwei Eigenschaften von Lua: Auf der einen Seite wird Lua mit den bestehenden Funktionalitäten des Zielsystems erweitert (extensible), auf der anderen Seite wird die Skriptsprache in die Applikation eingebunden (embeddable) und dem Benutzer zur Verfügung gestellt.
Interessant ist Lua nicht zuletzt für C- und C++-Entwickler, da sich bestehende Funktionen oder Anwendungen mittels geeigneter Tools mit einer Lua-API versehen lassen. Dabei kommen Wrapper zum Einsatz, mit denen C/C++-Funktionen auf ihre Echtzeit-Tauglichkeit hin überprüft werden können. Das spart den Aufwand eines eigenen Test-Framework, da sich das Debuggen dann mit Hilfe von Lua-Skriptbefehlen erledigen lässt. In diesem Kontext kann man Anwendungen interaktiv entwickeln; einzelne Befehle lassen sich innerhalb der Lua-Konsole eingeben, die dann in der Echtzeit-Umgebung in Byte-Code übersetzt und ausgeführt werden.
Komfortabler lassen sich Lua-Echtzeit-Anwendungen allerdings inner-halb der EclipseLDT-Entwicklungsumgebung debuggen. Hier können Entwickler wie gewohnt Breakpoints setzen, Variablen ansehen, diese verändern und noch mehr. Die Kommunikationen zwischen EclipseLDT und dem Debugger ist per TCP/IP-Verbindung implementiert.
Die notwendigen Zutaten
Mittels EclipseLDT lassen sich Lua-Echtzeit-Anwendungen direkt auf dem Zielrechner debuggen.
© Profimatics/eclipse.orgUm bestehenden Code in Lua einzubinden, gibt es zwei Möglichkeiten: Entweder man programmiert die API von Hand, was bei größeren Projekten sehr zeitaufwendig werden kann. Oder man setzt den SWIG (Simplified Wrapper and Interface Generator) ein, womit sich in C oder C++ geschriebene Module innerhalb von Lua verfügbar machen lassen. Dabei bleibt der Quellcode der Ausgangsbibliothek unverändert und es werden zusätzliche C-Funktionen, sogenannte Wrapper, erstellt. Die Wrapper dienen also als Schnittstelle zwischen der Bibliothek und der Zielsprache und können jederzeit aus der Zielsprache heraus aufgerufen werden, dabei Parameter übernehmen und übergeben sowie Ergebnisse liefern.
Wie bereits erwähnt, hat Profimatics mit RT-Lua ein Komplettpaket geschnürt, das sich genau für die beschriebenen Anwendungsszenarien einsetzen lässt. Dieses Paket besteht aus vier Komponenten: Einer Intime für Windows oder Intime-Distributed-RTOS-Laufzeitsystemumgebung, EclipseLDT als Entwicklungsumgebung (inklusive Debugger), den Lua-Interpreter selbst und drei Add-ons, die standardmäßig zu RT-Lua gehören. Dabei handelt es sich um einen Modbus-Server und -Client für die Kommunikationssteuerung zwischen SPS- und PC-Systemen, das quelloffene MQTT-Protokoll (Message Queue Telemetry Transport) für die M2M-Kommunikation und SQLite für das Speichern von Daten.
Netzwerk-Scanner für Echtzeit-Umgebungen können über zweier Lua-Befehle– hpe.open und hpe.receivepacket – effizient und schnell programmiert werden.
© Profimatics/eclipse.orgDie drei Add-ons sind allesamt in C geschrieben und dienen in erster Linie der einfachen und schnellen Kommunikation mit der Außenwelt. Das Socket-Interface ist nicht nur vom Anwender einsetzbar, sondern wird auch intern von der EclipseLDT-Entwicklungsumgebung genutzt, um mit dem Zielsystem zu kommunizieren.
Beim verwendeten Eclipse handelt es sich um EclipseLDT (https://eclipse.org/ldt), eine Cross-Platform-Entwicklungsumgebung für Lua-Programmierer. EclipseLDT bietet alle Features, die von einer modernen Entwicklungsumgebung zu erwarten sind: Farbliche Hervorhebung der Syntax, Online-Hilfe, Breakpoints, dynamisches Ändern von Variablen und das dynamische Ausführen von Code zur Laufzeit. Dabei steht Eclipse-LDT als Server-Anwendung unter In-time zur Verfügung und RT-Lua hat den entsprechenden Client, um daraus eine komplette Entwicklungsumgebung zu machen.
Das Besondere an der Intime-Realtime-Plattform ist ihre explizite Hardware-Partitionierung. Damit können die PC-Ressourcen wie etwa die vorhandenen Prozessoren einer Kombination aus deterministischen und nicht-deterministischen Anwendungen zugewiesen werden, ohne dass sich diese gegenseitig beeinflussen. Auf Basis der vorhandenen APIs gelingt der Zugriff mittels Lua auf die Echtzeit-Plattform ohne größeren technischen Aufwand. Nicht zuletzt wird per RT-Lua Add-on künftig der Zugriff auf indus-trielle Ethernet-basierte Feldbus-Systeme möglich sein. Damit lässt sich der Intime-High-Performance-Ethernet-Treiber (HPE) auch in Kombination mit Lua einsetzen. Das umfasst zudem die Nutzung der speziellen Ethernet-Controller-I210-Funktionalität von Intel.
Autor: Robert Bühlmann ist CTO von Profimatics in Barmstedt.
Wissenswertes über Lua
Lua kombiniert eine prozedurale Syntax (ähnlich der von Pascal) mit mächtigen Datenbeschreibungs-Konstrukten, basierend auf assoziativen Arrays und erweiterbarer Semantik. Darüber hinaus unterstützt Lua die objektorientierte und datengetriebene (data-driven) Programmierung. Obendrein ist die Sprache interaktiv ausführbar, schnell in der Ausführung und robust. Sie unterliegt einer freizügigen Open-Source-Lizenz, die 1988 vom Massachusetts Institute of Technology veröffentlicht wurde, und die für kommerzielle Produkte eingesetzt werden kann. Die Lua Virtual Machine ist in ANSI-C geschrieben und auf jedes System portierbar, für das ein ANSI-C-Compiler existiert. Ein Betriebssystem ist dafür nicht zwingend erforderlich.
Zum Einsatz kommt Lua in zahlreichen bekannten Applikationen wie Adobe Lightroom, Wireshark und Wikipedia. Aber auch bei Computerspiel-Entwicklern steht Lua hoch im Kurs, um beispielsweise komplexe Spielfiguren mithilfe weniger Befehle zu steuern.















