Tutorial CodeSys V3 Steuerungen über OPC UA

Mit PLC-Lab kann eine virtuelle Anlage zum Test eines SPS-Programms für CodeSys-V3-Steuerungen verwendet werden. Die Kommunikation zwischen PLC-Lab und der CodeSys-Steuerung wird über OPC UA realisiert.

PLC-Lab unterstützt ab der Version 1.6.0.0 das Device OPC UA.

Folgende Schritte sind dazu im CodeSys-Projekt notwendig:

  1. Erzeugen des benutzerdefinierten Datentyps (DUT): PlcLabData.

  2. Erzeugen der globalen Variablenliste (GVL): PlcLabConnector.

  3. Erzeugen der Programm-Organisationseinheit (POU): PlcLabSync.

  4. Aufruf der Funktion "PlcLabSync" in PLC_PRG.

  5. Zugriff von PlcLabConnector über OPC UA in der Symbolkonfiguration ermöglichen.

  6. SPS-Einstellung vornehmen: Variablen immer aktualisieren.

Im folgenden Beispiel wird eine Anlage erstellt und zum Test eines SPS-Programms für eine CodeSys V3-Steuerung verwendet. Dabei soll das SPS-Programm von einer CODESYS Control Win V3-SoftPlc bearbeitet werden. Die Vorgehensweise bei einer Hardware-SPS von z.B. Wago oder Schneider Electric ist identisch.

Im Beispiel kommt die Programmiersoftware CODESYS V3.5X zum Einsatz. Es können aber auch die IEC-Programmiertools von anderen Herstellern wie z.B. e!COCKPIT, Machine Expert, TwinCAT usw. verwendet werden. Die Begrifflichkeiten sind teilweise identisch.

Start der CodeSys-Programmiersoftware

Im ersten Schritt wird in CodeSys ein neues Projekt erzeugt, es kann aber auch ebenso ein vorhandenes Projekt geöffnet werden. Wird ein neues Projekt erzeugt, dann kann man ein Standardprojekt als Vorlage verwenden.

Anschließend wird im Projektbaum am Knoten "Application" das Kontextmenü aufgerufen und ein Ordner hinzugefügt.

Der Ordner erhält die Bezeichnung "PlcLab". In diesem sollen die für die Kommunikation mit PLC-Lab notwendigen Objekte abgelegt werden.

Erzeugen des benutzerdefinierten Datentyps (DUT): PlcLabData

Nun wird der Ordner selektiert und mit Hilfe des Kontextmenüs ein "data unit type (DUT)"-Objekt hinzugefügt.

Als Typ wird ein Struct ausgewählt und der Name "PlcLabData" vergeben.

Die Struktur hat das im nachfolgenden Bild dargestellte Aussehen.

Anbei der Code, welcher direkt kopiert und in CodeSys eingefügt werden kann.

TYPE PlcLabData :
STRUCT
    CntBytes:WORD; //how many bytes?
    Addr:WORD; //Ofs addr
    IoOfs:WORD; //IO offs addr
END_STRUCT
END_TYPE

Erzeugen der globalen Variablenliste (GVL): PlcLabConnector

Im nächsten Schritt ist eine globale Variablenliste im Ordner "PlcLab" einzufügen. Hier kommt dann auch der zuvor angelegte Datentyp zum Einsatz.

Info

Als Name muss zwingend "PlcLabConnector" angegeben werden, denn dieser Name wird für die Kommunikation über OPC UA benötigt.

Im folgenden Bild ist die GVL zu sehen.

Der Inhalt der GVL kann nachfolgend kopiert und direkt in CodeSys eingefügt werden.

VAR_GLOBAL CONSTANT
    _SIZE_AREA_I_ARRAY : WORD := 10; //how many areas are defined? 
    _SIZE_AREA_Q_ARRAY: WORD := 10; //how many areas are defined? 
    _SIZE_I_ARRAY : WORD := 1024;
    _SIZE_Q_ARRAY : WORD := 1024;
END_VAR

VAR_GLOBAL
    SIZE_AREA_I_ARRAY : WORD := _SIZE_AREA_I_ARRAY; //10
    SIZE_AREA_Q_ARRAY:  WORD := _SIZE_AREA_Q_ARRAY; //10
    SIZE_I_ARRAY : WORD := _SIZE_I_ARRAY;//1024
    SIZE_Q_ARRAY : WORD := _SIZE_Q_ARRAY;    //1024
    Inputs: ARRAY[0.._SIZE_I_ARRAY-1] OF BYTE; //is written by PLC-Lab
    Outputs: ARRAY[0.._SIZE_Q_ARRAY-1] OF BYTE; //is read by PLC-Lab
    AreaInputs: ARRAY[0.._SIZE_AREA_I_ARRAY-1] OF PlcLabData; //is written by PLC-Lab
    AreaOutputs: ARRAY[0.._SIZE_AREA_Q_ARRAY-1] OF PlcLabData; //is written by PLC-Lab
END_VAR

Erzeugen der Programm-Organisationseinheit (POU): PlcLabSync

Die Variablen aus der GVL kommen in einer Funktion zum Einsatz. Diese ist zunächst zu erzeugen.

Auf dem erscheinenden Dialog wird eine Funktion als Typ, sowie der Name "PlcLabSync" eingestellt. Die Implementierungssprache ist "ST".

Nach Bestätigung der Eingabe wird die Funktion erzeugt. Der Code ist im folgenden Bild zu sehen.

Nachfolgend ist nochmals der Code der Funktion zu sehen, dieser kann direkt kopiert und in CodeSys eingefügt werden.

FUNCTION PlcLabSync 
VAR_INPUT
    Inputs:BOOL;
    Outputs:BOOL;
END_VAR
VAR
    a,b:WORD;
    BytePtr:POINTER TO BYTE;  
END_VAR

IF Inputs THEN
    //Write sensor data of PLC-Lab to the PLC Inputs
    BytePtr:=ADR(%IB0);
    FOR a := 0 TO PLCLabConnector.SIZE_AREA_I_ARRAY-1 DO
        IF PLCLabConnector.AreaInputs[a].CntBytes=0 THEN //nothing to do anymore
            EXIT;
        END_IF
        FOR b := 0 TO PLCLabConnector.AreaInputs[a].CntBytes DO
            BytePtr[PLCLabConnector.AreaInputs[a].IoOfs+b]:=PLCLabConnector.Inputs[PLCLabConnector.AreaInputs[a].Addr+b];
        END_FOR;
    END_FOR;
END_IF;

IF Outputs THEN 
    //Write PLC outputs to the PLC-Lab outputs
    BytePtr:=ADR(%QB0);
    FOR a := 0 TO PLCLabConnector.SIZE_AREA_Q_ARRAY-1 DO
        IF PLCLabConnector.AreaOutputs[a].CntBytes=0 THEN //nothing to do anymore 
            EXIT;
        END_IF
        FOR b := 0 TO PLCLabConnector.AreaOutputs[a].CntBytes DO
            PLCLabConnector.Outputs[PLCLabConnector.AreaOutputs[a].Addr+b]:=BytePtr[PLCLabConnector.AreaOutputs[a].IoOfs+b];
        END_FOR;
    END_FOR;    
END_IF

Aufruf der Funktion "PlcLabSync" in PLC_PRG

Damit sind alle für die Kommunikation mit PLC-Lab notwendigen Programmteile vorhanden. Die Funktion "PlcLabSync" muss nur noch als erste Operation innerhalb von "PLC_PRG" aufgerufen werden. Im Bild ist der Aufruf in der Implementierungssprache ST zu sehen.

Dahinter kann dann der eigene Code angefügt werden.

Nachfolgend nochmals der Aufruf als Code-Snippet:

//Sync the PLC-Lab data with the inputs and outputs
PlcLabSync(Inputs:=TRUE, Outputs:=TRUE);

Symbolkonfiguration hinzufügen

Damit die Struktur "PlcLabConnector" über OPC UA erreichbar ist, muss diese in einer Symbolkonfiguration als über OPC UA erreichbar eingestellt werden. Dazu ist zunächst eine Symbolkonfiguration als Objekt hinzuzufügen. Das Objekt soll dabei der Application hinzugefügt werden, weshalb dieser Knoten für den Aufruf des Kontextmenüs verwendet wird.

Im folgenden Dialog ist die Option "OPC-UA-Funktionalitäten unterstützen" auszuwählen. Anschließend wird dieser bestätigt.

Nun ist zunächst das SPS-Programm zu erstellen, also zu übersetzen, damit die Variablen in der Systemkonfiguration erscheinen. Dies kann am oberen Rand der Symbolkonfiguration initiiert werden.

Als Folge sind die Variablen des Projekts im Fenster gelistet und es sind durch Selektion die Variablen auswählbar, welche über OPC UA erreichbar sein sollen. Im Beispiel ist dies nur "PlcLabConnector".

SPS-Code für das Beispiel

Für das Beispiel mit PLC-Lab ist ein kleines SPS-Programm notwendig. Dabei wird der Ausgang QX0.0 über den Eingang IX0.0 auf den Status 1 (true) gesetzt. Sobald der Eingang IX0.1 den Status 1 (true) besitzt, wird der Ausgang auf den Wert 0 (false) gesetzt.

SPS-Einstellung vornehmen: Variablen immer aktualisieren

Damit das Lesen der Ausgänge und das Schreiben der Eingänge durch PLC-Lab funktioniert, muss eine bestimmte Einstellung innerhalb der SPS-Einstellungen vorgenommen werden. Dazu wird am Knoten "Device" das Kontextmenü aufgerufen und der Menüpunkt "Objekt bearbeiten" selektiert.

Als Folge sind die Einstellungen der SPS zu sehen. Hier wird die Rubrik "SPS-Einstellungen" ausgewählt und an der Eigenschaft "Variablen immer aktualisieren" die Einstellung "Aktiviert 2 (immer in Buszyklustask)" ausgewählt.

Start der SoftSPS bzw. Anschluss der Hardware-SPS

Im Beispiel wird das SPS-Programm in der SoftSPS "CODESYS Control Win V3" ausgeführt. Diese ist zunächst zu starten, wenn dies nicht bereits der Fall ist. Dazu wird im Tray von Windows über dem Symbol die rechte Maustaste betätigt, um das Kontextmenü zur Ansicht zu bringen.

Mit Hilfe des Menüpunkts "Start PLC" wird diese gestartet.

Kommt eine Hardware-SPS zum Einsatz, dann ist diese entsprechend einzuschalten und mit dem PC zu verbinden.

Einloggen und ändern der Betriebsart

Für das Einloggen wird der Menüpunkt "Online->Einloggen" ausgeführt.

Damit wird das SPS-Programm und die Konfiguration in die SPS übertragen. Befindet sich die SPS nach diesem Vorgang in der Betriebsart "Stop", so ist diese in "Run" umzuschalten.

Nun sind alle Vorbereitungen auf Seiten der CodeSys-SPS getätigt und es kann mit dem Erstellen der virtuellen Anlage in PLC-Lab begonnen werden.

Start von PLC-Lab und erzeugen eines neuen Device

Nach dem Start von PLC-Lab wird mit Hilfe der Schaltfläche "Neu" ein neues Projekt erzeugt.

Im unteren Bereich des neu erzeugten Projekts befindet sich die Symboltabelle. Hier kann ein neues Device erzeugt werden.

Dazu wird die im obigen Bild markierte Schaltfläche betätigt. Daraufhin ist der Dialog "Neues Gerät bzw. Verbindung erzeugen" zu sehen. Auf diesem wird als Device-Typ "OPC UA" selektiert und ein Name für das Device eingetragen.

Es erscheint der Dialog um die Parameter des OPC UA Device einzustellen.

Als IP-Adresse ist die Adresse der anzusprechenden SPS einzutragen. Im Beispiel hat die anzusprechende SoftSPS die IP-Adresse "192.168.1.163". Als Port-Adresse wird normalerweise der Port 4840 verwendet. Dies ist nur zu ändern, wenn die Einstellung in der SPS verändert wurde. Die Polling-Rate in Millisekunden gibt an, wie häufig der Status von Operanden aus der SPS gelesen wird. Im Beispiel wird der Wert 50ms eingestellt.

Der Variablenname des Containers auf Seiten der SPS, ist fest auf den Namen "PlcLabConnector" eingestellt. Aus diesem Grund war es auch wichtig, dass in CodeSys die globale Variablenliste diesen Namen trägt. Aus diesem Container werden die Daten von PLC-Lab gelesen bzw. in diesen geschrieben.

Da im Beispiel mit einer CodeSys-SPS kommuniziert wird, ist als Adressierungsart die "Adressierungsart für CodeSys-Systeme" einzustellen. Anderenfalls wird der Zugriff auf die Operanden bzw. deren Werte nicht korrekt sein. Insbesondere bei Wort- und Doppelwortoperanden.

Sind alle Einstellungen getätigt, dann wird der Dialog über "OK" verlassen.

Erzeugen der Symbole

Für das Beispiel werden drei Operanden benötigt. Für diese sollen die Symbole in der Symboltabelle erzeugt werden. Dazu ist zunächst das Device zu selektieren, im Beispiel das Device "CodeSysViaOpcUa".

Anschließend können über die Schaltfläche mit dem Plus-Symbol die Symbole eingefügt werden. Nachfolgend ist dies zu sehen.

Es werden die beiden Eingangsbits I0.0 und I0.1, sowie der Ausgang Q0.0 benötigt. Alternativ kann auch die deutsche Syntax für die Operanden verwendet werden (E0.0, E0.1 sowie A0.0). Den Operanden wurden Symbole zugeordnet, die deren Aufgabe beschreiben.

Erzeugen des ersten Schalter-Objekts

Für das Beispiel werden zwei Schalter-Objekte benötigt, welche als Taster zu konfigurieren sind. Die beiden werden der Rubrik "Schalter"->"Schalter ohne Leuchteinsatz" entnommen. Zunächst das erste Schalter-Objekt.

Nachdem der Schalter platziert wurde, sind dessen Eigenschaften innerhalb der Tabelle mit den Eigenschaften der Objekte zu sehen. Im Beispiel soll zunächst der Operand angegeben werden, mit dem das Schalter-Objekt verbunden ist. Dieser wird also beim Betätigen des Schalters beeinflusst. Für die Angabe des Operanden stehen mehrere Möglichkeiten zur Verfügung:

Erste Variante "Autovervollständigung": Bei der ersten Variante wird in der Zelle für den Operanden zunächst der Device-Name gefolgt von einem Punkt angegeben, im Beispiel also "CodeSysViaOpcUa.". Anschließend wird die Tastenkombination Strg + Space betätigt. Als Folge werden alle Symbole dieses Devices in einer Liste angezeigt. Man wählt das gewünschte Symbol mit Hilfe der Cursortasten (../Up bzw Down) aus und bestätigt dies mit der Return-Taste. Das selektierte Symbol wird dann als Operand eingetragen. Nachfolgend sind diese Schritte zu sehen:

Zweite Variante "Drag-and-Drop": Bei der zweiten Variante wird die Zeile des Operanden in der Symboltabelle selektiert und dann per Drag-and-Drop auf der Beschreibung der Operanden-Eigenschaft oder dem Editor der Eigenschaft fallen gelassen.

Dritte Variante "Drag-and-Drop" auf das Schalter-Objekt: Nun zur dritten Variante. Bei dieser wird ebenfalls der Operand aus der Symboltabelle selektiert und dann per Drag-and-Drop entnommen. Allerdings ist das Ziel der Schalter selbst. Dies bedeutet, der Operand wird direkt über dem Objekt fallen gelassen. Bei Schalter-Objekten wird der so eingefügte Operand automatisch als der Operand eingefügt, der vom Schalter beeinflusst wird.

Important

Der Vorteil der beiden Varianten 2 und 3 besteht auch darin, dass automatisch das Symbol des Operanden für die Beschriftung des Schalter-Objekts verwendet wird.

Wurde eine der Varianten ausgeführt, dann ist der Schalter mit dem Symbol "Start" und somit dem E0.0 verbunden. Jetzt muss das Schalter-Objekt noch als Taster definiert werden. Des Weiteren soll als Text "Start" mit einer Schriftgröße "12" im Schalter-Objekt erscheinen. Nachfolgend sind die dazu notwendigen Eigenschaften dargestellt:

Erzeugen des zweiten Schalter-Objekts

Nun zum zweiten benötigten Schalter-Objekt. Dieser soll aus einer Kopie des ersten Schalters entstehen. Dazu wird der erste Schalter selektiert und anschließend die Tasten Strg + D betätigt. Als Folge wird eine Kopie des selektierten Schalters neben dem Quell-Objekt platziert.

Damit die Eigenschaften des neuen Schalters in der Tabelle erscheinen, wird auf eine freie Stelle im Zeichenfenster geklickt und danach der neue Schalter mit der Maus selektiert. Nun sind dessen Eigenschaften zu sehen und können verändert werden.

Im ersten Schritt ist der Operand des Schalters anzupassen. Da dieser der Taster "Stop" sein soll. Dies soll mit Hilfe der oben beschriebenen dritten Variante erfolgen. Es wird somit der Operand mit dem Symbol "Stop" in der Symbol-Tabelle per Drag-and-Drop über dem Schalter-Objekt fallen gelassen.

Bei dieser Aktion wird auch die Beschriftung mit verändert, da ja das Symbol des neuen Operanden als Beschriftung des Schalter-Objekts übernommen wird.

Lampe zeichnen

Zuletzt wird ein Lampen-Objekt benötigt um den Zustand "Start" zu signalisieren. Dazu wird in der Auswahl der Objekte innerhalb der Rubrik "Lampen->Leuchtmelder" ein grüner Leuchtmelder ausgewählt.

Danach kann die Lampe auf der Zeichenfläche aufgezogen werden.

Im nächsten Schritt wird dann der Operand mit dem Symbol "Lampe" dem Objekt zugewiesen. Auch hier wird dies per Drag-and-Drop auf dem Objekt ausgeführt.

Damit ist der Operand als Lampen-Operanden eingetragen. Die Beschriftung der Lampe kann entfernt werden.

Als Folge wird im Objekt kein Text mehr angezeigt.

Nach diesen Aktionen hat die Zeichenfläche folgendes Aussehen:

Das PLC-Lab Projekt ist somit komplett.

Start der Simulation

Da die CodeSys-SPS bereits angeschlossen ist und sich in der Betriebsart "run" befindet, kann in PLC-Lab ebenfalls die Simulation gestartet werden. Dazu wird die folgende Schaltfläche in PLC-Lab betätigt:

Daraufhin versucht PLC-Lab die Verbindung über OPC UA aufzubauen. Wurde die Verbindung hergestellt, dann wechselt die Anzeige im unteren Bereich von PLC-Lab wie folgt:

Test des SPS-Programms

Im nächsten Schritt können die Taster in PLC-Lab betätigt und die Reaktion des SPS-Programms beobachtet werden. Im folgenden Bild wurde der Start-Taster betätigt. Als Folge wird der Ausgang Q0.0 auf den Status 1 gesetzt und die Lampe leuchtet.

Auf diese Weise können auch entsprechend umfangreichere SPS-Programme getestet werden, indem in PLC-Lab die Anlage bedient und die Auswirkungen im Programmiertool beobachtet werden.

Fazit

Mit dem Beispiel wurde gezeigt, wie ein CodeSys-Projekt zu ergänzen ist, damit PLC-Lab über OPC UA auf die zu programmierende SPS zugreifen kann und somit die Simulation über eine virtuelle Anlage in PLC-Lab ermöglicht wird.