Moderne SPS-Echtzeitprogrammierung

Rust als Alternative zur IEC61131?

Die Programmierung von Anlagen und Maschinen erfolgt klassisch mit SPSen auf Basis der Norm IEC61131, deren Ursprung auf die 90er-Jahre zurück geht. Doch in den letzten 30 Jahren hat sich die Softwareentwicklung stark verändert, was sich auch in den Programmiersprachen niederschlägt. Dieser Artikel geht den Fragen nach, warum es sich lohnt, die klassische SPS-Programmierung zu überdenken, und warum ausgerechnet die Sprache Rust als Basisbaustein dienen soll.
 Codebeispiel mit Kompilierfehler des Borrow-Systems
Codebeispiel mit Kompilierfehler des Borrow-SystemsBild: Institut für Steuerungstechnik der Werkzeugmaschinen und Fertigungseinrichtungen (ISW)

Warum erfolgt die die Programmierung von Anlagen überhaupt mit SPSen? Eine Kernanforderung ist die Echtzeitanforderung an das Steuerungsprogramm. Hierfür muss das Laufzeitsystem, die Programmierung und die integrierte Entwicklungsumgebung (IDE) ausreichende Unterstützung bieten. Dazu gehört ein echtzeitfähiges Laufzeitsystem, das in der IDE konfiguriert werden kann. Außerdem gibt es modellgetriebene Programmieransätze mit Kontaktplan oder Ablaufsprache, um einfacheren Code für spezialisierte Problemstellungen zu erstellen. Weiterhin ist die Kommunikation über Feldbus mit den I/Os notwendig. Sie muss ebenfalls durch das Programmiersystem unkompliziert konfigurierbar sein. Darüber hinaus muss sich die SPS in eine heterogene IT- und OT-Landschaft einbinden lassen, die Integration und Kommunikation von nicht echtzeitkritischer Software muss also auch einfach möglich sein.

Was ist Rust?

Rust ist eine kompilierte Sprache ohne Garbage Collection, was sie für die Echtzeitprogrammierung geeignet macht. Denn bei der Garbage Collection wird der Speicher im Hintergrund automatisiert verwaltet, was zu Latenzschwankungen führen kann und die Echtzeit negativ beeinflusst. Das Besondere an Rust ist die Speicherverwaltung. Ohne Garbage Collector ist eine manuelle Speicherverwaltung notwendig, was bei C/C++ eine Hauptursache für Bugs und Sicherheitslücken ist. Rust setzt hier auf ein Ownership- und Borrowing-System, wodurch die Lebensdauer von Speicher und Speicherreferenzen bereits zur Kompilierzeit überprüft werden kann. Damit wird der Compiler zu einem mächtigen Werkzeug bei der Softwareentwicklung. Im abgebildeten Code-Beispiel wird durch die Übergabe des Vektors v an die Funktion print_vec die Zugehörigkeit an die Funktion gegeben. Der Nachfolgende push Aufruf führt daher zu einem „borrow of move value“. Neben der Speichersicherheit gehören auch Nebenläufigkeitsprüfungen zur Kompilierzeit oder die Überprüfung der Fehlerbehandlung zum Repertoire von Rust, was die Stabilität der Software erhöht. Die Anzahl der Laufzeitfehler in Rust-Programmen ist geringer im Vergleich zu C/C++, da der Compiler viele Fehler abfängt und den Programmierer zu sauberen Lösungen zwingt. Darüber hinaus bietet Rust die Vorteile von modernen Programmiersprachen, wie Buildsystem, Paketmanager, einfache Testintegration und IDE-Integration.

Lohnt sich Rust?

Auch die klassischen Sprachen der IEC61131-3 sind von einer unsicheren Speicherverwaltung bei der Verwendung von Speicherreferenzen betroffen und bieten damit eine Angriffsfläche für potentielle Laufzeitfehler und Sicherheitslücken. Diesen Herausforderungen kann durch Standards wie Misra begegnet werden oder mit Softwareentwicklungsprozessen, wie sie die Automobilindustrie einsetzt. Die Hürde für den Einsatz ist jedoch deutlich höher, als wenn die Programmiersprache selbst Speichersicherheit bereits mitbringt. Der Einzug von Rust in den Linux-Kernel 6.1 zeigt, welches Potenzial in der Sprache gesehen wird. Auch Microsoft ist gerade dabei Rust in den Windows-Kernel zu integrieren. Erfahrungen mit Rust bestätigen diesen Eindruck: Es lässt sich im Vergleich zu C/C++ tatsächlich schneller stabile Software schreiben. Gerade in der Automatisierungstechnik scheint sich der Einsatz zu lohnen. Ein Nachteil muss jedoch erwähnt werden, der Einstieg in Rust stellt eine hohe Hürde dar: Die Konzepte müssen erst verstanden und verinnerlicht werden, bevor sie effektiv genutzt werden können und der Compiler zufrieden ist.

Wie sieht die SPS-Programmierung aus?

Für eine Architektur für den Einsatz von Rust in der SPS werden zunächst ein echtzeitfähiges Laufzeitsystem und eine Feldbusanbindung benötigt. Das Laufzeitsystem abstrahiert dabei die Erstellung und Konfiguration von zyklischen oder Ereignis-basierten Echtzeit-Tasks, so dass sich der Anwender nicht selbst um deren Verwaltung kümmern muss. Die Feldbusanbindung ist an das Laufzeitsystem gekoppelt, so dass hier mittels Konfigurationsdaten die Feldbusse gestartet werden können. Die Feldbuskonfiguration erfolgt in einem separaten Tool, das in das Engineering integriert werden kann. Mit der Feldbuskonfiguration können mit Hilfe der Makrofunktionalität von Rust die Zugriffsmethoden zur Kompilierzeit für die Prozessdaten automatisch generiert werden.

Darauf aufbauend kann die Implementierung des Steuerungsprogramms erfolgen. Dabei wird auf eine klare Trennung von Echtzeit- und Nicht-Echtzeitanteilen geachtet. Das hat den Vorteil, dass unkritischer Code keine Echtzeitressourcen verschwendet und der wirklich kritische Code kleiner wird. Allerdings werden Datenstrukturen benötigt, um Daten zwischen den beiden Teilen auszutauschen, ohne den Echtzeitteil zu blockieren. Sie werden in einer Bibliothek zur Verfügung gestellt, in der auch andere typischen Modelle wie Zustandsautomaten enthalten sind. Sowohl im Echtzeit- als auch im Nicht-Echtzeitteil können beliebige Bibliotheken eingebunden werden, die für das jeweilige Betriebssystem verfügbar sind. Das bietet einen hohen Mehrwert, da auf eine Vielzahl von Bibliotheken zurückgegriffen werden kann. Für den Echtzeitteil müssen jedoch zusätzliche Validierungen durchgeführt werden, z.B. die Freiheit von Speicherzuweisungen oder ungebundenen Schleifendurchläufen. Dies kann durch statische Codeanalyse oder durch Analysen während des Kompiliervorgangs erfolgen.

Ausblick

Das Interesse an Rust in der Steuerungstechnik zeigt sich auch in Projekten wie einem vollständig in Rust implementierten OPC UA Server und Client oder einem Ethercat Master. Um das Potential von Rust zu evaluieren und die Praxistauglichkeit zu testen, wird die vorgestellte Architektur am ISW der Universität Stuttgart analysiert und implementiert. Die bisherigen Erfahrungen zeigen, dass Rust das Potential für die SPS-Programmiersprache der Zukunft hat.

Das könnte Sie auch Interessieren

Weitere Beiträge

Bild: KEB Automation KG
Bild: KEB Automation KG
Edge Devices als Basis für das IIoT im Maschinenbau

Edge Devices als Basis für das IIoT im Maschinenbau

Datenverarbeitung am Rand des Netzwerks: Edge Computing findet direkt an oder nahe einer bestimmten Datenquelle statt, um eine schnelle Analyse und Reaktion zu ermöglichen. Diese dezentrale Ergänzung zum Cloud Computing ermöglicht schnelle Reaktionszeiten für industrielle Anwendungen in der Fertigung oder Robotik. Durch Edge Computing werden Entscheidungen in Echtzeit sowie eine bessere Steuerung von Maschinen und Prozessen möglich.

mehr lesen
Bild: Insevis GmbH
Bild: Insevis GmbH
Von der S7 in die Cloud

Von der S7 in die Cloud

Insevis ist für seine Ergänzungen zur Siemens-Welt bekannt. Die Produktfamilien umfassen eigene Hutschienensteuerungen mit S7-CPUs mit und ohne Onboard-I/Os, S7-Panels ohne Windows und Verbindungen von beiden als Kompaktsysteme sowie Anbindungen an die IT-Ebene per MQTT und OPC UA.

mehr lesen

Simatic Automation Workstation

Die neue Siemens Simatic Automation Workstation ermöglicht es Herstellern, eine hardwarebasierte speicherprogrammierbare Steuerung (SPS), ein herkömmliches HMI und ein Edge-Gerät durch eine einzige, softwarebasierte Workstation zu ersetzen.

mehr lesen