CoDeSys 2.3

Hier wird die Vorgehensweise zur Erstellung eines Automatenmodells zur Verwendung mit CoDeSys 2.3, seine Übertragung auf eine Steuerung des Typs Wago 750-841 sowie dessen Test mit Hilfe des SeT-Systems beschrieben.

Voraussetzungen

Es werden folgende Gegebenheiten vorausgesetzt:

  1. Arbeitsplattform ist ein PC mit Windows 2000 oder neuer, einem Prozessor mit 1 GHz Taktfrequenz (oder schneller) sowie einer Speicherausstattung von 1 GB oder mehr.
  2. Auf diesem PC sind SeT und CoDeSys 2.3 in aktuellen Versionen installiert.
  3. An den PC ist eine Wago-Steuerung des Typs 750-841 angeschlossen (und eingeschaltet).
  4. Die Konfigurationseinstellungen von CoDeSys 2.3 sind so eingerichtet, dass eine Verbindung zwischen dem CoDeSys-System und der Steuerung hergestellt werden kann (siehe Kapitel Vorbereiten des Wago Controllers 750-841 für den Betrieb mit CoDeSys 2.3).

Vorübung: OPC einrichten

Die Kommunikation zwischen dem SeT-System und der Wago-Steuerung erfolgt während des Tests über OPC, wobei der von CoDeSys 2.3 bereitgestellte OPC - Server verwendet wird. Dementsprechend muss dieser Server entsprechend eingerichtet werden. Diese Einrichtung ist auf einem konkreten System nur einmalig notwendig und wird nachfolgend schrittweise beschrieben.

Einstellungen in SeT

Mit der Installation von SeT sind die Einstellungen für die OPC - Verbindung über den von CoDeSys 2.3 bereitgestellten OPC - Server vorkonfiguriert. Änderungen sollten i. A. nicht notwendig sein. Dennoch ist eine Kontrolle der Einstellungen angebracht.

Die OPC - Einstellungen sind über das Hauptmenü (Extras / Einstellungen) erreichbar.


Einstellung für OPC


Nach Auswahl der Kategorie "OPC - Einstellungen" auf der linken Seite und Aufklappen des "Wago OPC" - Abschnitts sollte der Dialog etwa wie in obigem Bild aussehen.
Wichtig sind hier die Einstellungen "Server", "CLSID" und "Host".
Dabei meint Server den Identifikator des OPC - Servers als COM-Komponente (die sogenannte ProgId) und CLSID die dazugehörige Klassen-ID. Sie wird verwendet, wenn die Auflösung des Servernamens fehlschlägt (z.B. weil der OPC - Server auf einem Remote-System läuft). Host ist der Name des Rechners, auf dem der OPC - Server läuft. Hier kann wahlweise "localhost" (für den aktuellen Rechner) oder der Rechnername bzw. die aktuelle IP-Adresse des Arbeitsplattform-PCs eingetragen sein.
Die übrigen Einstellungen betreffen die Zuordnung von bestimmten über OPC bereitgestellten Symbolen zu speziellen Datenverweisen in SeT. Sie hängen vom verwendeten OPC - Server ab und sollten i. A. unverändert bleiben.

Einrichten des CoDeSys 2.3-OPC-Servers

Das Konfigurationsprogramm des OPC - Servers ist nach der Installation des CoDeSys-Systems über das Windows-Programmenü unter "Wago Software\CoDeSys for Automation Alliance\Kommunikation\CoDeSys OPC Konfigurator" erreichbar.

Nach dem Start sollte das Konfigurationsprogramm folgendermaßen aussehen:


Konfigurator WAGO-OPC


Ggf. sind die Einstellungen wie im Bild gezeigt vorzunehmen. Wichtig ist dabei insbesondere, dass die Konfiguration auf "Multi-PLC" eingestellt wird (geht über das Datei-Menü des Konfigurators).

Als nächster Schritt ist dem Server eine PLC hinzuzufügen (rechte Maustaste auf dem Server-Knoten).

Nach dem Anhängen der PLC und Aktivieren ihres Knotens unterhalb des Serverknotens hat der Konfigurationsdialog folgende Gestalt:


Konfigurator WAGO-OPC mit neuer PLC


Auch hier sind die im Bild dargestellten Werte erprobte Einstellungen, die entsprechend übernommen werden sollten.

Als nächster Schritt muss die Verbindung zur SPS konfiguriert werden. Nach Aktivieren des Eintrags "Verbindung" unterhalb des PLC1-Knotens sind die Verbindungseinstellungen zunächst leer.


Konfigurator WAGO-OPC mit Verbindungseinstellungen


Über den Button "Bearbeiten" wird nun der Kommunikationsparameter-Dialog gestartet


Kommunikationsparameter im OPC-Konfigurator


Zuerst wird das Gateway auf "Lokal" gestellt (Button "Gateway). Dann wird unter dem Knoten "Lokal" mit dem Button "Neu..." eine neue Verbindung angelegt. Dazu wird im folgenden Dialog der Verbindung ein sinnvoller Name (z.B. Wago TCP/IP) vergeben und als Gerät "Ethernet_TCP_IP" ausgewählt.

Der Ethernet_TCP_IP Treiber ist ein spezieller Treiber für den Wago-Controller. Er sollte nicht mit dem allgemeinen TCP/IP-Gerätetreiber verwechselt werden, der möglicherweise ebenfalls zur Auswahl steht.


Nach dem Hinzufügen des neuen Geräts muss nun noch die entsprechende IP-Adresse der Steuerung für das Gerät vergeben werden; die übrigen Einstellungen bleiben unverändert.

Schließlich werden alle offenen Dialoge mit "OK" beendet, die geänderten Einstellungen im Konfigurator gespeichert (Datei/Speichern) und der Konfigurator geschlossen.

Modellieren in SeT

Die Modellierung des Automaten in SeT erfolgt für alle Plattformen nach dem gleichen Muster. Für die Verwendung mit dem Wago-Controller 750-841 in Verbindung mit CoDeSys 2.3 sollten nachfolgend beschriebene Besonderheiten berücksichtigt werden.

Allgemeines

Zunächst wird ein neues Projekt angelegt bzw. ein bereits vorhandenes geöffnet. Danach sind folgende Grundeinstellungen vorzunehmen:


Symbolleisten Modell und Debugger
  1. In der SeT-Umgebung (Symbolleiste Debugger) muss als Zielplattform "Wago OPC" ausgewählt werden.
  2. In der Symbolleiste Modell ist als Sprache "StructuredTextOPC" auszuwählen.

Hinweise:

  • StructuredTextOPC ist die derzeit einzige für CoDeSys verwendbare Interpreter-Anbindung. Deshalb erfolgt, sofern bereits ein Projektdokument geöffnet ist, die Spracheinstellung automatisch mit der Auswahl der Plattform.
  • StructuredTextOPC legt fest, dass Bedingungsausdrücke und ausführbare Abschnitte des Modells in der Sprache StructuredText angegeben werden. Das angehängte "OPC" bedeutet keine Sprachbesonderheiten sondern verdeutlicht lediglich, das der "Interpreter" ein externes System (eine SPS) ist, mit dem per OPC kommuniziert wird.
  • Es sollten keine Zustandsnamen vergeben werden, die sich nur in der Groß- bzw. Kleinschreibung unterscheiden. Der Hintergrund dafür ist, dass (Stand August 2010) zur Unterstützung des Debuggings in CoDeSys selbst während der Code-Generierung ein Monitor-Programm erzeugt wird, in dem die Zustandsnamen als Bezeichner vorkommen. Dies kann u. U. zu Bezeichnerkonflikten führen.

Definition von Watches und I/O-Ports

Mit Hilfe von Watches (Wächtern) können während des Ablaufs des Automatenmodells Ereignisse generiert werden, wenn eine bestimmte Bedingung erfüllt ist. Dies kann beispielsweise eine bestmmie aktuelle Wertbelegung von Elementen des Datenmodells sein.

Allgemeine Hinweise zur Definition von Watches sind im Kapitel zur Konfiguration, Abschnitt Watches zusammengestellt.

Für die Plattform CoDeSys2 kann als Bedingung ein beliebiger Ausdruck der Sprache Structured Text (ST) stehen, der einen Wahrheitswert (Typ BOOL) ergeben muss.

Ein von einem Watch ausgelöstes Ereignis kann als zusätzliches Datum einen Zahlenwert vom Typ SINT (-128 .. 127) tragen. Für seine Definition kann ein Literal, der Name eines Elements des Datenmodells oder ein Ausdruck der Sprache ST verwendet werden, der Ergebnis vom Typ SINT liefert.

Bitte beachten Sie, dass "beliebiger Ausdruck" auch beliebig komplexer Ausdruck bedeutet. Das bedeutet, dass ein solcher Ausdruck zur Auswertung eine bestimmte Menge Zeit benötigt. Dies kann zu einer erheblichen Verringerung der Ausführungsgeschwindigkeit führen.
Sie sollten deshalb nicht unnötig viele Wächter einsetzen und außerdem auf unnötig komplexe Ausdrücke für Bedingungen und Daten verzichten.

Bitte beachten Sie auch, dass ein in einem Wächter verwendeter Ausdruck niemals Seiteneffekte haben sollte (z.B. Setzen von Variablen o.ä.), die das Ablaufverhalten des Automaten beeinträchtigen könnten.

Die Auswertung von Variablen oder Ausdrücken für Ereignisdaten erfolgt auschließlich während der Initialisierung des Automaten. Es ist deshalb nicht möglich, sich während des Ablaufs ändernde Ereignisdaten zu definieren.

Achtung: Derzeit (Stand 11/2011) werden für Wächter nur die Typen on und off unterstützt.

I/O-Ports werden auf Datemnodell-Elemente, d. h. auf globale Variablen des Zielgeräts, mit fester Adressangabe abgebildet.

Allgemeine Hinweise zur Definition von I/O-Kanälen sind im Kapitel zur Konfiguration, Abschnitt I/O-Kanäle zusammengestellt.

Die dort erwähnten Kanalattribute haben folgende Bedeutung:

  • Name
    Name des I/O-Kanals. Dies muss ein gültiger (Variablen-)Bezeichner nach IEC 61131-3 sein. Er darf nicht mit dem Bezeichner eines bereits vorhandenen globalen Datenmodell-Elements übereinstimmen.
  • Adresse
    Als Adresse ist eine gültige I/O-Adresse nach IEC 61131-3 mit vorangestelltem AT anzugeben, z.B. AT %IX0.0 zur Definition des 1. Bits des 1. I/O-Kanals als Eingang.
  • Typ
    bezeichnet den Datentyp für den I/O-Kanal. Der angegebene (einfache) Datentyp muss zur festgelegten Adresse kompatibel sein.
  • Richtung
    bezeichnet die Richtung des I/O-Kanals. Da die Richtung implizit durch die Notation der Adresse festgelegt wird, dient der hier ausgewählte Wert nur der Dokumentation.

Hinweise:

  • In Structured Text wird bei Variablen- und Typbezeichnern nicht wird zwischen Groß- und Kleinschreibung unterschieden. Weil CodeSys2 bei Schlüsselwörtern Großschreibung verlangt, sollten die Typbezeichner in Großbuchstaben notiert (oder aus der Vorschlagsliste ausgewählt) werden..
  • Die I/O-Kanäle werden innerhalb des Automaten auf globale Variablen abgebildet und können auch genau so verwendet werden.

Es ist möglich, Bezeichner von Eingabekanälen in Bedingungsausdrücken von Watches zu verwenden. Dies erlaubt z.B. das Senden von Ereignissen, wenn sich externe Daten ändern.

Definition des Datenmodells


Datenmodelleditor

Die Inhalte des Datenmodells werden bei der Generierung des Zielcodes auf globale Variablen abgebildet. Daher ist darauf zu achten, dass die definierten Namen der Elemente des Datenmodells gültige StructuredText-Bezeichner sein müssen und überdies nicht anderen global gültigen Symbolen entsprechen dürfen.

Structured-Text unterscheidet nicht zwischen Groß- und Kleinschreibung!.

Weil Structured-Text eine streng typisierte Sprache ist, muss ferner für jedes Element des Datenmodells ein dem Zielsystem bekannter Datentyp-Bezeichner zugeordnet werden.

Die Angabe von Werten im Datenmodell ist optional. Ist ein Wert angegeben, so wird er zur Initialisierung der entsprechenden Variablen verwendet.

Die angegebenen Werte müssen korrekte Literale im Sinne von Structured-Text sein. Insbesondere müssen Zeichenkettenliterale in Hochkommata eingeschlossen sein (keine doppelten Gänsefüßchen - CoDeSys 2.3 kann mit Wide-Character-Strings nicht umgehen)!


Ausführbare Code-Abschnitte (Executable Content)

Ausführbarer Code wird - ebenso wie Bedingungsausdrücke an Transitionen - immer in der Sprache Structured-Text notiert.

Sämtlicher ausführbarer Code innerhalb von Zustandsübergängen oder Eintritts- bzw. Austrittsaktionen teilt sich einen gemeinsamen Gültigkeitsbereich. Es ist nicht möglich, hier lokale Variablen zu definieren. Für den Datenaustausch sollten vielmehr stets die Elemente des Datenmodells (siehe oben) verwendet werden. Sofern eigene Funktionen bzw. Funktionsblöcke benötigt werden, sind diese im globalen Code-Abschnitt zu definieren.

Innerhalb des ausführbaren Codes stehen folgende zusätzliche Funktionen zur Verfügung:

  • send(evtName:STRING) : BOOL
    Sendet ein (externes) Ereignis an den Automaten.
    Parameter:
    • evtName
      Name des zu sendenden Ereignisses.
Rückgabewert:
TRUE, falls evtName ein gültiger (bekannter) Ereignisname ist; sonst FALSE.
  • In(stateName : STRING) : BOOL
    Prüft, ob der angegebene Zustand gerade aktiv ist.
    Parameter:
    • stateName
      Absoluter (vollständig qualifizierter) oder relativer Zustandsname.
      Achtumg: Der übergebene Zustandsname muss als Literal (nicht als Variablenwert) angegeben werden.
Rückgabewert:
TRUE, falls der angegebene Zustand ist; sonst FALSE.

Ein qualifizierter Zustandsname bezeichnet den Namenspfad zu einem bestimmten Zustand in einem hierarchischen Zustandsautomaten. Der Pfad wird als Folge der Namen der einzelnen übergeordneten Zustande, beginnend bei der obersten Ebene, angegeben. Als Trennzeichen zwischen den Namensteilen dient der Punkt (.).

Ein relativer Zustandsname bezieht sich immer auf den aktuellen Ausführungskontext des Code-Abschnittes, der den "aktuellen Zustand" bestimmt. Ein solcher Kontext existiert nur in ausführbaren Abschnitten eines Zustands (Ein- oder Austrittscode) oder einer Transition (Kontext ist der Ausgangszustand).
Relative Zustandspfade beginnen mit einem Kleiner-Als-Zeichen (<), gefolgt von einer Dezimalzahl, die die Anzahl der in der Zustandshierarchie in Richtung Wurzel zu laufenden Ebenen bezeichnet. Auf diese Zahl folgt nun ein qualifizierter Teilname.

z.B. <2.region.part1.A

Falls der relative Pfad beim Kontextzustand beginnt (sich also auf eines seiner Kinder bezieht), kann der relative Pfad einfach mit einem Punkt (.) eingeleitet werden.

Die Elemente des globalen Datenmodells werden vom Code-Generator auf einfache globale Variablen abgebildet. Der Zugriff darauf erfolgt dementsprechend wie der auf jede andere Variable. Dabel ist entspricht der Name des Eintrags im Datenmodell dem Bezeichner der Variablen.

Die Elemente des lokalen Datenmodells eines Zustands werden ebenfalls auf globale Variablen abgebildet. Um hierbei Namenskonflikte zu vermeiden, generiert der Code-Generator eindeutige Bezeichner. Für den Zugriff auf lokale Datenelemente ist deshalb im Quellcode eine Pseudo-Funktion der Form

#(stateName : STRING, dataName : STRING)

zu verwenden, wobei stateName der vollständig qualifizierte oder relative Pfad des Zustands ist, der das lokale Datenmodell besitzt, und dataName den Dateneintrag in diesem lokalen Modell bezeichnet.
Achtung: Sowohl stateName als auch dataName müssen als Literale angegeben werden.

Die eigentlichen Datenbezeichner - sowohl für Zugriffe auf das globale als auch ein lokales Datenmodell - hängen u.U. vom Datentyp der jeweiligen Einträge ab. So können etwa zum Zugriff auf untergeordnete Elemente von Strukturen qualifizierte Bezeichner oder Index-Notationen für den Zugriff auf Feldelemente verwendet werden.

Der globale Code ist in Programm-Organisationseinheiten (POUs) organisiert. Dabei werden folgende POU-Typen unterstützt:

  • PROGRAM (eigenständiges Programm, das normalerweise in einer zum Automaten parallelen Task ausgeführt wird)
  • FUNCTION_BLOCK (Funktionsblock)
  • FUNCTION (Funktion)

Zur Definition einer POU wird zunächst im Dialog zur Bearbeitung des globalen Codes mit dem Button "Hinzufügen" eine neue Seite angelegt, wobei der hier vergebene Name dem der POU entspricht. Die Festlegung des POU-Typs erfolgt nun über den Button "Deklaration". Dabei erscheint zunächst folgender Auswahldialog:


POU-Auswahl


In diesem Dialog ist nun der des gewünschte POU-Typ aus der Liste auszuwählen und die Auswahl durch Bestätigung von "Ok" zu bestätigen.

Unmittelbar daran anschließend wird der Dialog zur Deklaration der Eingabe- und Ausgabevariablen sowie der lokalen Variablen der POU angezeigt.


Variablendeklaration


Die unterschiedlichen Variablenarten werden dabei durch Tabulatorseiten repräsentiert. Welche Variablenarten verfügbar sind, hängt vom ausgewählten POU-Typ ab.
Das Feld für den Typ des Rückgabewertes ist nur beim POU-Typ FUNCTION aktiv.

Durch Betätigung des Buttons "Ok" unten im Dialog wird die Variablendeklaration abgeschlossen. Spätere Ergänzungen oder Änderungen lassen sich durch erneuten Aufruf des Dialoges über den Button "Deklaration" des Code-Editors vornehmen.

Der POU-Typ lässt sich nur beim Anlegen einer neuen POU festlegen. Er kann später nicht mehr geändert werden.

Im Eingabebereich des Code-Editors wird der Rumpf der jeweiligen POU als StructuredText implementiert.

Zur Unterstützung der internen Visualisierung des CoDeSys-Systems kann eine spezielle POU mit dem Namen "Modell" angelegt werden, die vom TYP PROGRAM sein muss. Existiert eine solche POU, so wird vom Code-Generator eine zusätzliche Task generiert, in der die POU parallel zum eigentlichen Automaten abläuft.

Der Structured-Text-Compiler von CoDeSys 2.3 weist zwei Eigenheiten auf, die von der Sprachspezifikation lt. IEC 61131-3 abweichen:

  1. Obwohl Structured-Text eigentlich nicht zwischen Groß- und Kleinschreibung von Bezeichnern unterscheidet, verlangt der Compiler, dass Schlüsselwörter immer GROSS geschrieben werden.
  2. Funktionen/Prozeduren bzw. Funktionsblöcke dürfen keinen leeren Rumpf haben.

Wenn bei der Übersetzung auf Grund dieser Festlegungen Fehler auftreten, lassen diese sich sehr leicht korrigieren. Zur Umwandlung eines Schlüsselwortes in Großbuchstaben genügt ein Doppelklick auf die entsprechende Zeile in der Fehlerausgabe des Compilers. Leere Funktionsrümpfe werden akzeptabel, wenn man ein Semikolon hinein schreibt.

Übertragen und Ausführen des Automaten

Debugger starten


Starten des Debuggers

Nach Abschluss der Modellierung (und Speichern des Projekts) wird durch Klick auf das grüne Pfeilsymbol - im Bild oben - der Debug-Toolbar von SeT der Debugger aktiviert. Beim Start des Debuggers werden nacheinander das Modell auf formale Korrektheit überprüft, die Automatenbeschreibung als SCXML-Datei exportiert und der ST-Code für CoDeSys 2.3 generiert.

Nach erfolgreicher Code-Generierung erscheint ein modales Hinweisfenster - im Bild unten - das zur "manuellen Konfiguration" auffordert und damit die Einrichtung des CoDeSys-Projekts meint.
Die für CoDeSys 2.3 erzeugten Dateien sind dann vom Code-Generator in einem Unterverzeichnis des für die Wago-Plattform festgelegten Ausgabeverzeichnis (SeT-Menü Extras/Einstellungen) abgelegt worden, welches den Namen des jeweiligen Projekts trägt.
Ein Beispiel für die Verzeichnisstruktur zeigt folgender Screenshot des Windows-Explorers.


Struktur der Codegenerator-Ausgabe für Wago


CoDeSys-Projekt anlegen

Das erwähnte Hinweisfenster bleibt zunächst offen und es beginnt die Arbeit mit dem CoDeSys-System.

In CoDeSys 2.3 wird nun ein neues Projekt angelegt (Datei/Neu). Als Konfiguration wählt man "WAGO_750-841_(...-FW12)".


Zielsystemeinstellung in CoDeSys 2.3


In der Registerkarte "Allgemein" sollte nun noch die Option "Symboldatei senden" aktiviert werden, da andernfalls keine Symbole übertragen werden und eine Kommunikation via OPC nicht möglich ist.

Nach dem Bestätigen des Dialogs mit OK will CoDeSys einen neuen Baustein anlegen. Darauf kann verzichtet werden, da alle benötigen Teile von SeT generiert wurden und im Folgenden importiert werden.

Als nächstes sollten nun die Kommunikationsparameter eingestellt werden. Diese sind nicht projektabhängig, müssen also i. A. nur einmal eingestellt werden (es sei denn, es werden unterschiedliche Steuerungen verwendet). Dazu wird der Konfigurationsdialog mittels Menü: Online/Kommunikationsparameter... aufgerufen. Dort sollte sich bereits die bei der OPC - Konfiguration angelegte Verbindung befinden, die hier ebenfalls verwendet wird; das Erstellen einer neuen Verbindung ist somit nicht mehr nötig. Es wird einfach diese Verbindung ausgewählt und als Gateway wiederum "Lokal" verwendet. Danach kann der Dialog geschlossen werden.

Automat importieren


Projektstruktur in CoDeSys 2.3

Nun werden über das Menü Projekt/Importieren die von SeT generierten Dateien "ALGORITHMUS.EXP" und projektname.EXP (in dieser Reihenfolge) in das CoDeSys-Projekt geladen. Ggf. auftretende Nachfragen, ob bereits vorhandene Objekte ersetzt werden sollen, können mit "Ja, alle" bestätigt werden.

Nach dem Import sollte die Projektstruktur der im Bild rechts entsprechen.

Symbolkonfiguration

Die Variablen, die per OPC sichtbar sein sollen, müssen vor dem Übertragen auf die Steuerung in die Symbolkonfiguration aufgenommen werden. Dies geschieht im Optionsdialog, der über das Menü Projekt/Optionen... erreichbar ist. Dort wird die Kategorie "Symbolkonfiguration" ausgewählt und die Option "Symboleinträge erzeugen" aktiviert.


Symbolkonfiguration in CoDeSys 2.3



Auswahl der Variablen für die Symbolkonfiguration

Anschließend kann das Symbolfile konfiguriert werden. Dazu werden nacheinander für jeden im Bild rechts markierten Eintrag die Optionen "Variablen des Objekts ausgeben" und "Sammeleinträge aktivieren" ausgewählt.

Programm auf die Steuerung übertragen

Das Übertragen geschieht mittels dem Menü Online/Einloggen. Dabei wird das Programm zunächst übersetzt. Anschließend muss das Programm mit Online/Starten noch gestartet werden.

Nun kann der "Warten-Dialog" in SeT bestätigt werden. Danach wird die Verbindung mit dem OPC - Server hergestellt und der Debugger gestartet.