Tutorial S7-1200/1500 über OPC UA

PLC-Lab kann über OPC UA auf eine als OPC UA-Server konfigurierte Siemens S7-1200/1500 oder PLCSIM Advanced zugreifen. Dazu müssen im TIA-Projekt einige Voraussetzungen gegeben sein.

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

Info

OPC UA ist in PLC-Lab primär vorhanden, um auf CodeSys V3-Steuerungen zugreifen zu können. Da die aktuellen Siemens-CPUs der Reihen S7-1200/1500 ebenfalls als OPC UA Server konfiguriert werden können, ist auch der Zugriff auf diese über OPC UA möglich.

Folgende Schritte sind im TIA-Projekt notwendig, damit PLC-Lab über OPC UA auf die S7-Steuerung zugreifen kann:

  • Erzeugen des DBs "PlcLabConnector" mit folgendem Inhalt:
DATA_BLOCK "PlcLabConnector"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
NON_RETAIN
   VAR 
      SIZE_AREA_I_ARRAY : Int;
      SIZE_AREA_Q_ARRAY : Int;
      SIZE_I_ARRAY : Int;
      SIZE_Q_ARRAY : Int;
      Inputs : Array[0..1023] of Byte;
      Outputs : Array[0..1023] of Byte;
      AreaInputs : Array[0..9] of Struct
         CntBytes : Word;
         Addr : Word;
         IoOfs : Word;
      END_STRUCT;
      AreaOutputs : Array[0..9] of Struct
         CntBytes : Word;
         Addr : Word;
         IoOfs : Word;
      END_STRUCT;
   END_VAR


BEGIN
   SIZE_AREA_I_ARRAY := 10;
   SIZE_AREA_Q_ARRAY := 10;
   SIZE_I_ARRAY := 1024;
   SIZE_Q_ARRAY := 1024;
END_DATA_BLOCK
  • Erzeugen der Funktion "PlcLabOpcUaSync" mit folgendem Inhalt:
FUNCTION "PlcLabOpcUaSync" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Inputs : Bool;
      Outputs : Bool;
   END_VAR

   VAR_TEMP 
      a : Int;
      b : Int;
      value : Byte;
   END_VAR


BEGIN
    IF #Inputs THEN
        //Write sensor data of PLC-Lab to the PLC Inputs
        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 WORD_TO_INT("PlcLabConnector".AreaInputs[#a].CntBytes) DO
                //BytePtr["PlcLabConnector".AreaInputs[#a].IoOfs + #b] := "PlcLabConnector".Inputs["PlcLabConnector".AreaInputs[#a].Addr + #b];
                #value := "PlcLabConnector".Inputs[ WORD_TO_INT("PlcLabConnector".AreaInputs[#a].Addr) + #b];
                //
                POKE(area := 16#81,
                     dbNumber := 0,
                     byteOffset := WORD_TO_INT("PlcLabConnector".AreaInputs[#a].IoOfs) + #b,
                     value := #value);
            END_FOR;
        END_FOR;
    END_IF;

    IF #Outputs THEN
        //Write PLC outputs to the PLC-Lab outputs
        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 WORD_TO_INT("PlcLabConnector".AreaOutputs[#a].CntBytes) DO
                //read the output-byte
                #value := PEEK(area := 16#82,
                               dbNumber := 0,
                               byteOffset :=  WORD_TO_INT("PlcLabConnector".AreaOutputs[#a].IoOfs) + #b);
                //write into the PLC-Lab data
                "PlcLabConnector".Outputs[ WORD_TO_INT("PlcLabConnector".AreaOutputs[#a].Addr) + #b] := #value;
            END_FOR;
        END_FOR;
    END_IF;
END_FUNCTION
  • Aufruf der Funktion "PlcLabOpcUaSync" im Netzwerk 1 des OB1.

  • Aktivierung des OPC UA Servers in den Einstellungen der CPU.

  • Auswahl der notwendigen OPC UA Runtime-Lizenz in den Einstellungen der CPU.

Info

Der Code-Snippet des DBs "PlcLabConnector" kann über einen Texteditor in der Datei "PlcLabConnector.db" abgespeichert werden. Der Code-Snippet der Funktion "PlcLabOpcUaSync" ist in einer Datei mit der Bezeichnung "PlcLabOpcUaSync.scl" abzulegen. Die beiden Dateien können in einem vorhanden TIA-Projekt in den Knoten "Externe Quellen" eingefügt werden. Anschließend generiert man die Bausteine mit Hilfe des Kontextmenüs und dem Menüpunkt "Bausteine aus Quelle generieren". Dies wird auch im weiteren Verlauf des Beispiels gezeigt.

Start des TIA-Portals von Siemens und Konfiguration der SPS

Im ersten Schritt wird im TIA-Portal von Siemens ein neues Projekt erzeugt, ebenso kann ein vorhandenes Projekt geöffnet werden. Im Beispiel wird ein neues Projekt erzeugt und eine CPU 1511 (also eine S7-1500er) als CPU eingestellt.

Die verwendete CPU mit dem Firmwarestand 2.6 besitzt die benötigte OPC UA Funktionaliät. Durch Betätigung des Buttons "Hinzufügen" wird die CPU eingefügt.

Nach dem Umschalten auf die Projektansicht werden jeweils eine Eingangsbaugruppe (DI) und eine Ausgangsbaugruppe (DQ) zur CPU hinzugefügt. Im Beispiel sollen zwei Eingänge und ein Ausgang verwendet werden, somit genügt eine DI16- und DQ16-Baugruppe.

Beide Baugruppen haben die Anfangsadresse 0 und adressieren somit die Eingangsbytes EB0 und EB1 sowie AB0 und AB1.

Konfiguration der OPC UA Funktionalität der CPU

Da PLC-Lab über OPC UA auf die S7-CPU zugreifen soll, ist diese als OPC UA-Server zu konfigurieren. Dazu führt man einen Doppelklick auf der CPU aus, damit die Eigenschaften der CPU zu sehen sind. Innerhalb des Knotens "OPC UA" wählt man den Knoten "Server" und selektiert die Option "OPC UA-Server aktivieren".

Nun wird der Knoten "Runtime-Lizenzen" ausgewählt und in der Rubrik "OPC UA" die für die CPU notwendige Lizenz selektiert. Im Beispiel wird für die CPU 1511 die mit "small" gekennzeichnete Lizenz benötigt.

Damit ist die Konfiguration der CPU vollständig.

Import der Code-Snippets als externe Quellen

Im nächsten Schritt ist der DB "PlcLabConnector" und die Funktion "PlcLabOpcUaSync" im Projekt einzufügen. Dazu wird zunächst der obige Code-Snippet des DBs in die Zwischenablage kopiert, in einen Texteditor (z.B. dem Editor von Windows) kopiert und anschließend in die Datei mit der Bezeichnung "PlcLabConnector.db" abgespeichert. Danach folgt die gleiche Vorgehensweise für die Funktion. Auch hier wird der Code-Snippet in die Zwischenablage kopiert, in einem Editor eingefügt und anschließend in der Datei mit der Bezeichnung "PlcLabOpcUaSync.scl" abgespeichert.

Im TIA-Projekt wird nun der Knoten "Externe Quellen" ausgewählt und darin der Punkt "Neue externe Datei hinzufügen" über einen Doppelklick selektiert.

Als Folge erscheint der Datei-Auswahl-Dialog über welchen die beiden zuvor angelegten Dateien ausgewählt und hinzugefügt werden können.

Jetzt kann man aus diesen beiden Dateien die Bausteine generieren lassen. Dazu selektiert man zunächst beide Quellen und bringt das Kontextmenü zur Ansicht. In diesem wird der Menüpunkt "Bausteine aus Quelle generieren" ausgeführt.

Danach sind der DB "PlcLabConnector" und die Funktion "PlcLabOpcUaSync" innerhalb der Programmbausteine vorhanden, die Bausteine wurden also aus der Quelle generiert.

Die Nummern der Bausteine können von Projekt zu Projekt verschieden sein. Wichtig ist, dass der DB die Bezeichnung "PlcLabConnector" besitzt und die Funktion mit "PlcLabOpcUaSync" bezeichnet ist.

Aufruf der Funktion "PlcLabOpcUaSync" im Netzwerk 1 des OB1

Zuletzt ist die Funktion "PlcLabOpcUaSync" im Netzwerk 1 des OB1 aufzurufen. Dann sind alle Voraussetzungen für die Kommunikation zwischen PLC-Lab und der SPS über OPC UA erfüllt. Im Bild ist der Aufruf zu sehen, dabei wurde die Darstellungsart FUP im OB1 eingestellt. Die Darstellungsart ist dabei nicht relevant.

Beide Eingänge der Funktion werden mit der Konstanten "true" versorgt.

SPS-Programm im OB1 für dieses Beispiel

Da alle Voraussetzungen für die Kommunikation zwischen PLC-Lab und der S7-CPU über OPC UA vorhanden sind, kann nun das SPS-Programm für das kleine Beispiel im Netzwerk 2 des OB1 erstellt werden.

Dabei soll der Eingang E0.0 "Start" den Ausgang A0.0 "LampStart" setzen. Das Rücksetzen erfolgt über den negierten Eingang E0.1 "Stop". Nachfolgend ist der S/R-Speicher und dessen Belegung zu sehen.

Übertragen des SPS-Programms und der Konfiguration in die S7-SPS

Jetzt kann die SPS an den PC angeschlossen und das SPS-Programm sowie die Konfiguration übertragen werden. Kommt das PLCSIM Advanced zum Einsatz, dann wird dieses gestartet und der "PLCSIM Virtual Eth. Adapter" als "Online Access" eingestellt.

Sollte PLCSIM Advanced zum Einsatz kommen, dann ist auch darauf zu achten, dass in den Projekteigenschaften innerhalb der Rubrik "Schutz" die Option "Beim Übersetzen von Bausteinen Simulierbarkeit unterstützen" selektiert ist.

Start von PLC-Lab und erzeugen des OPC UA-Device

Nun wird PLC-Lab gestartet und ein neues Projekt erzeugt. Im nächsten Schritt ist das OPC UA-Device zu erzeugen mit den Daten für die Kommunikation. Dazu wird in der Symboliktabelle die nachfolgend dargestellte Schaltfläche betätigt.

Auf dem erscheinenden Dialog ist als Device-Typ "OPC UA" auszuwählen. Im Beispiel wird "OpcUaS7" als Bezeichnung für das neue Device eingetragen.

Nach Bestätigung erscheint ein weiterer Dialog, auf dem die Verbindungseinstellungen vorzunehmen sind. Hier ist unter anderem die IP-Adresse der anzusprechenden S7-CPU, die Port-Adresse und die Polling-Rate beim Lesen in Millisekunden einzustellen.

IP-Adresse

Die IP-Adresse des anzusprechenden OPC UA-Servers, im Beispiel also die IP-Adresse der CPU.

Port-Adresse

Standardmäßig ist hier die Port-Adresse 4840 angegeben. Diese muss nur geändert werden, wenn im OPC UA-Server eine andere Port-Adresse eingestellt ist.

Polling-Rate beim Lesen

Hier kann eingestellt werden, in welchem Zeitabstand (Millisekunden) der Status der in der virtuellen Anlage verwendeten Operanden gelesen wird. Der Standardwert ist 50ms.

Variablenname Container

Der Name des Containers in welchem sich die Daten für PLC-Lab auf dem OPC UA-Server befinden ist fix auf "PlcLabConnector" eingestellt. Dies ist auch der Grund dafür, dass der Datenbaustein in der SPS, welche die Daten für PLC-Lab enthält, die Bezeichnung "PlcLabConnector" hat.

Einstellung der Speicherausrichtung

Diese Einstellung ist sehr wichtig! Wird wie im Beispiel mit einer S7-CPU kommuniziert, dann ist die "Adressierungsart für S7-Systeme von Siemens" zu selektieren. Ist der Kommunikationspartner eine CodeSys V3-Steuerung, dann muss entsprechend "Adressierungsart für CodeSys-Systeme" ausgewählt werden. Wurde das Device angelegt, dann kann diese Einstellung danach nicht mehr verändert werden.

Nachfolgend ist die Einstellung des Dialogs für das Beispiel zu sehen.

Mit "OK" werden die Einstellungen übernommen und der Dialog geschlossen.

Erzeugen der Symbole für das Beispiel

Im Beispiel werden drei Operanden des Device benötigt. Deren Symbole sollen im nächsten Schritt in der Symboltabelle angelegt werden. Zunächst ist das neue Device als aktives Device zu selektieren (wenn nicht bereits geschehen).

Danach können über die linke mit einem Pluszeichen versehene Schaltfläche, die Symbole hinzugefügt werden.

Nachfolgend ist das Erzeugen der Symbole zu sehen.

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 "OpcUaS7.". 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.

Info

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. Da der Taster als Öffner eingestellt sein soll, wird die entsprechende Eigenschaft "Button ist ein Öffner" ausgewählt.

Im nächsten 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 man entfernen.

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 S7-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 A0.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 TIA-Projekt zu ergänzen ist, damit PLC-Lab über OPC UA auf die zu programmierende S7-SPS zugreifen kann und somit die Simulation über eine virtuelle Anlage in PLC-Lab ermöglicht wird.