Objekt Orientierte Programmierung in Speicher-Programmierbaren-Steuerungen (SPS oder PLC). Was gibt es wirklich Neues?
Die objektorientierte Programmierung (OOP) ist ein Programmierparadigma, das auf dem Konzept von Objekten basiert, die Daten in Form von Eigenschaften und Code in Form von als Methoden bekannten Verfahren enthalten können. Objekte zeichnen sich dadurch aus, dass sie über Prozeduren verfügen können, mit denen wir auf Datenfelder eines Objekts, mit denen die Felder verknüpft sind, zugreifen und sie ändern können. In OOP bestehen Computerprogramme aus Objekten, die miteinander interagieren. Die OOP-Sprachen sind vielfältig. Die beliebtesten sind jedoch klassenbasiert, was bedeutet, dass die in ihnen verwendeten Objekte Instanzen von Klassen sind, die Objekttypen bestimmen.
Das ist es, was Wiki über OOP im Allgemeinen sagt, und das ist es, was sich die meisten von uns bei der Entwicklung von PLC-Systemen wünschen. Wenn ich ein Programm in einer beliebigen Hochsprache wie C++ oder C# programmieren muss, scheint es mir, dass ich viel mehr Werkzeuge und Möglichkeiten habe; folglich schreitet der Entwicklungsprozess viel einfacher und schneller voran.
TwinCat3 von Beckhoff führte OOP in die SPS-Welt ein. Hier ist eine Liste der Features, die sie auf den Tisch gebracht haben:
- Methoden
- Eigenschaften
- Schnittstellen
Daraus können wir ableiten, dass wir jetzt von den meisten OOP-Vorteilen profitieren können, die für die Fabrikautomatisierung gelten. Aber sind sie so neu, wie sie zu sein scheinen, und werden sie das C#-Look and Feel in die SPS-Entwicklung einbringen?
Wir möchten Ihnen eine Reihe von Artikeln vorstellen, in denen wir versuchen werden, den alten CoDeSys2 Weg mit dem neuen TwinCat3 anhand einfacher Beispiele zu vergleichen, wie wir sowohl mit als auch ohne OOP vorgehen würden. Ich werde versuchen, das SPS-Beispielprojekt von Beckhoff zu verwenden, das einige der Grundfunktionen der objektorientierten Programmierung veranschaulichen soll. Gleichzeitig werde ich es in nicht objektorientiertem CodeSys2 programmieren, so dass wir alle den Unterschied sehen können, einschließlich der Fehler und Funktionen, die es im Hinblick auf die SPS-Entwicklung mit sich bringen könnte.
In diesem ersten Artikel möchte ich die neueste Funktion beleuchten, die in TwinCat3 verfügbar ist: Eigenschaften.
Sie erscheinen zunächst in JavaScript, um einfach die Assoziation zwischen einem bestimmten Namen und dem Wert eines Objekts herzustellen. In TwinCAT verfügt eine Eigenschaft über Get- und Set-Accessor-Methoden, um ihren Wert abzurufen bzw. zu setzen. TwinCAT ruft diese Methoden automatisch auf, wenn der Funktionsblock, der die Eigenschaft implementiert, gelesen oder geschrieben wird.
Eigenschaften sind an den folgenden Merkmalen erkennbar:
Access specifier
- PUBLIC: Entspricht der Angabe von no access modifier.
- PRIVATE: Der Zugriff auf die Eigenschaft ist nur auf den Funktionsblock beschränkt.
- PROTECTED: Der Zugriff auf die Eigenschaft ist auf das Programm oder auf den Funktionsblock und seine Ableitungen beschränkt.
- INTERNAL: Der Zugriff auf die Eigenschaft ist auf den Namensraum, d.h. auf die Bibliothek, beschränkt.
- FINAL: Das Überschreiben der Eigenschaft in einer Ableitung des Funktionsblocks ist nicht erlaubt. Das bedeutet, dass die Eigenschaft in einer möglicherweise vorhandenen Unterklasse nicht überschrieben oder erweitert werden kann.
Eigenschaften können abstrakt sein, d.h. der Fall, dass eine Eigenschaft keine initiale Implementierung hat und dass die eigentliche Implementierung im abgeleiteten Funktionsblock bereitgestellt wird.
Wir haben jedoch in der PLC immer eine einfache Assoziation gehabt: VarIn, VarOut und all die anderen Arten von Variablen mit verschiedenen Zugriffsarten, die so einfach wie Eigenschaften aufgerufen werden können.
Zum Beispiel: Cylinder.var_in_out_bAtBasePos ist das Gleiche wie Cylinder.State_AtBasePos.
Zusätzlich können wir einige Regeln für das Setzen und den Zugriff innerhalb des Funktionsblocks Cylinder angeben. Für den öffentlichen Gebrauch kann ich mich auf konventionelle interne Variablen beschränken.
PROTECTED, INTERNAL und FINAL ist wirklich neu und macht die Eigenschaften flexibler. Aber diese erfordern zusätzliche Kodierung und bringen eine nachteilige Eigenschaft mit sich:
Wie Sie sehen, können Sie sie nicht monitoren!
Aber es ist nur am Anfang überraschend. Das Hinzufügen von etwas mehr Code hilft wie folgt, die ordnungsgemäße Funktionalität wiederherzustellen.
Pragmas sind sehr nützlich für die Überwachung von Eigenschaften im Online-Modus. Schreiben Sie sie dazu ganz oben in die Deklarationen der Eigenschaften (Attribut „Überwachung“):
{attribute ‚monitoring := ‚variable‘}: Beim Zugriff auf eine Eigenschaft speichert TwinCAT den aktuellen Wert in einer Variablen und zeigt den Wert der letzteren an. Dieser Wert kann obsolet werden, wenn der Code nicht mehr auf die Eigenschaft zugreift.
{attribute ‚monitoring‘ := ‚call‘}: Jedes Mal, wenn der Wert angezeigt wird, ruft TwinCAT den Code des Get-Accessors auf. Jede Nebenwirkung, die durch diesen Code verursacht wird, kann in der Überwachung auftreten.
Durch die Verwendung von Eigenschaften können wir also Vorteile für Bibliotheken mit komplizierterem Code nutzen. Wir verwenden Eigenschaften in den Projekten innerhalb unseres Programmierteams nicht oft, aber sie haben in Bibliotheken zur externen Verwendung stattgefunden.
Der nächste Artikel soll Sie mit Methoden vertraut machen, unter anderem mit brandneuen Dingen in den modernen SPS-Entwicklungswerkzeugen.