CODESYS V3 basierte SPS

Sie benötigen Grafcet-Studio Pro/Demo V1.1.0.0 oder neuer

Hinweis: CODESYS, CODESYS-Logo: © 2019 3S-Smart Software Solutions GmbH, CODESYS Webseite

Damit eine CODESYS V3 basierte Steuerung mit Grafcet-Studio programmiert werden kann, liefern wir die Grafcet-Engine als CODESYS V3 Bibliothek (compiled library). Die Grafcet-Engine unterstützt in der CODESYS-Variante max. 100 Schritte. Wenn Sie mehr als 100 Schritte benötigen, dann schicken Sie uns eine Email an support@mhj.de. Das Device muss ein CODESYS V3 basiertes Device sein. Es muss mind. 64 KB remanenter Speicher vorhanden sein. Das Gerät muss OPC/UA unterstützten.

Link Beschreibung Größe in MB
Download CODESYS Compiled Library (CODESYS Compiler Version: 3.5.3.86) mit der Grafcet-Engine Version 0x1011. Diese Library muss in das Bibliothek-Repository installiert werden. Danach können Sie die Bibliothek in Ihr Projekt einfügen. 0.1 MB
Download CODESYS Vorlageprojekt (V3.3SP1) als Basis für Ihr CODESYS-Projekt. Für die Verwendung der Grafcet-Engine sind noch wenige Komponenten (Variablen, FB) notwendig, die in diesem Projekt vorhanden sind. 0.1 MB
Download Projektvorlage als PDF Datei. Falls das Vorlageprojekt nicht geöffnet werden kann. 0.2 MB
Download Grafcet-Studio Testprojekt (3 Schritte) 0.1 MB
Download XSOFT-CODESYS (3.5.12) Beispielprojekt für Eaton Steuerungen. Wenn Sie XSOFT-CODESYS besitzen, dann verwenden Sie dieses Projekt als Vorlageprojekt. 0.2 MB
Download WAGO eCockpit V1.5.0.3 Beispielprojekt für WAGO Steuerungen. Wenn Sie WAGO eCockpit besitzen, dann verwenden Sie dieses Projekt als Vorlageprojekt. 0.2 MB

  • Installation der Bibliothek Grafcet-Engine1x.compiled-library (siehe Download oben)
  • Öffnen des CODESYS Vorlageprojektes Grafcet-Engine-TemplateCoDeSysV3_3SP1.project (siehe Download oben). Ersetzen Sie das Device "CODESYS Control Win V3" durch Ihre Hardware-SPS und konfigurieren Sie die Baugruppen.
  • Alternative: Erzeugen Sie mit Ihrem CODESYS Tool ein Projekt und konfigurieren Sie die Hardware. Starten Sie dann eine 2. Instanz des CODESYS Tools und öffnen Sie das Vorlageprojekt. Dann können Sie mit Copy und Paste (STRG+C und STRG+V) die notwendigen Komponenten in Ihr Projekt kopieren.
  • Hinzufügen der Bibliothek Grafcet-Engine for GrafcetStudio (Namensraum: GrafcetStudio) in das Projekt
  • Hinzufügen der Bibliothek Date and Time

Hier könnten Probleme entstehen, wenn Ihre CODESYS Version zu alt ist. Dann können Sie evtl. nicht die Bibliothek importieren oder das Vorlageprojekt öffnen. Wenn möglich, sollten Sie Ihr CODESYS Programmiertool updaten. Kontaktieren Sie uns unter support@mhj.de, wenn Sie Hilfe benötigen.

  • Öffnen Sie die Symbolikkonfiguration durch Doppelklick und stellen Sie sicher, dass die Variable "GVLGrafcetEngine" über OPC/UA freigegeben ist (ist Häkchen vorhanden?)
  • Die E/A-Baugruppen, die über die Grafcet-Logik verwendet werden sollen, müssen konfiguriert werden: Baugruppeneinstellung lokales E/A Abbild der Baugruppe Einstellung "Variablen aktualisieren" auf Aktiviert 2 (immer im Buszyklustask). Dies können Sie global in den SPS-Einstellungen oder für jede Baugruppe separat realisieren.

Es muss ein neues CODESYS Device angelegt werden:

  • Neues Device vom Typ "OPC/UA Device" anlegen
  • Verbindungsparameter festlegen: IP-Adresse, OPC/UA-Port (Default=4840), Instanz-Variable Container (Default=GVLGrafcetEngine), Instanzvariable (Default=GrafcetEngineRuntime). Hier müssen Sie normalerweise nur die IP-Adresse ändern.
  • IO-Mapping festlegen: Der Grafcet-Engine wird mitgeteilt, welche E/A in der SPS verwendet werden sollen.

Bild Codesys V3 Device hinzufügen:

Bild Verbindungseinstellungen:

Im Feld Instanzvariable Container muss der Name der globalen Variablentabelle stehen, in der die Grafcet-Instanz gespeichert ist. Im Feld Instanzvariable muss der Variablenname der GrafcetEngine Instanz stehen. Wenn Sie den Sourcecode nicht geändert haben, sind hier bereits die richtigen Bezeichnungen eingetragen.

Bild: IO-Mapping

Beispiel im Bild: In der SPS sollen diese Adressen verwendet werden:

  • 16 Digitale Eingänge: Adresse 0-1 (%IB0,%IB1)
  • 16 Digitale Ausgänge: Adresse 0-1 (%QB0,%QB1)
  • 4 Analoge Eingänge: Word-Adresse 4-7 (%IW4,%IW5,%IW6,%IW7)
  • 4 Analoge Ausgänge: Wort-Adresse 2-5 (%QW2,%QW3,%QW4,%QW5)

In den I/O Einstellungen muss dann stehen:

  • Zeile DI: Bytelänge=2 für 16 DI, SPS-Adresse=Anfangsadresse=0
  • Zeile DO: Bytelänge=2 für 16 DO, SPS-Adresse=Anfangsadresse=0
  • Zeile AI: Bytelänge=8 für 4 AI, SPS-Adresse=Anfangsadresse=4
  • Zeile AO: Bytelänge=8 für 4 AO, SPS-Adresse=Anfangsadresse=2

Hinweise: Für die einzelnen Bereiche DI, DO, AI, AO kann jeweils nur 1 Bereich festgelegt werden. Das bedeutet: Wenn z.B. die DI Baugruppen auf der SPS verteilt sind auf Adresse 0-1 und 10-11, dann kann nur 1 Bereich mit Grafcet-Studio genutzt werden.

Mit diesen Einstellungen haben Sie die Start-Adresse der E/A festgelegt. Jetzt fügen Sie einfach die Symbole in der richtigen Reihenfolge in die Symbolikdatei ein. Die Adressierung der einzelnen Symbole erfolgt dann automatisch von oben nach unten. Wenn bei Bool-Symbolen (Bool-Operanden) einzelne Bits eines Bytes nicht verwendet werden, dann legen Sie einfach Platzhalter Symbole an (Reserved1, Reserved2, usw.). Alternativ können Sie auch eine Lücke definieren. Dazu geben Sie einfach in der Kommentarspalte z.B. "{{#3}}" an. Dies bedeutet, dass für das Symbol mind. 3 Bits angelegt werden sollen. Das nächste Symbol wird dann entsprechend adressiert (siehe nachfolgendes Bild: nach I0.2 folgt I0.5). Sie können auch über Drag&Drop einzelne Symbole in eine andere Zeile verschieben. Siehe nachfolgendes Bild: Verwenden Sie für Drag&Drop die 1. nicht benutzte Spalte, wie im Bild zu sehen ist.

Sind diese Schritte erledigt, kann Grafcet-Studio über OPC/UA auf die Steuerung zugreifen:

  • Grafcet in das Device übertragen
  • Grafcet beobachten

Der Grafcet läuft anschließend autark (wie jedes andere SPS Programm). Für die Programmierung in Grafcet ist das CODESYS Programmiersystem nicht mehr notwendig. Es muss auch nicht auf dem PC installiert sein. In der Steuerung kann zusätzlich zur Grafcet-Logik ein z.B. in ST geschriebenes Programm vorhanden sein, welches bei Bedarf Daten mit der Grafcet-Logik austauschen kann.

Wenn Sie alles vorbereitet haben, dann können Sie einen 1. Test durchführen.

Kontrollieren Sie nochmals:

  • Das Projekt mit der Grafcet-Engine befindet sich in der SPS.
  • Ein neues Device in Grafcet-Studio ist erstellt und die IP-Adresse und das I/O Mapping sind richtig eingestellt.
  • Die SPS-Einstellungen lokales E/A Abbild der Baugruppe, "Variablen aktualisieren" sind auf Aktiviert 2 (immer im Buszyklustask) gesetzt.
  • Die Variablentabelle GVLGrafcetEngine ist in der Symbolikkonfiguration freigegeben.
  • Die IP-Adresse der SPS befindet sich im gleichen Netz wie die IP-Adresse des PCs.

Der 1. Test (siehe auch nachfolgendes Bild):

  • Drücken Sie den Button Verbinden im Fenster Grafcet-Engine.
  • Eine Verbindung sollte nun zu Stande kommen. Die Zähler (Bild Punkt Nr 4) sollten hochzählen.
  • Drücken Sie den Button Schreiben (Bild Punkt Nr 6) um den Grafcet in das Gerät zu schreiben
  • Jetzt sollten die ersten 3 Ausgänge nacheinander an- und wieder ausgehen.
  • Wenn Sie den Button Beobachten (Mausbutton Brille) drücken, sehen Sie den Grafcet im Beobachten Modus.
  • Legen Sie am 1. Eingang an der SPS Spannung an. Dann sollte im I/O Panel das Symbol I0 farbig hinterlegt werden.

Nr Beschreibung
1 Zeichenfläche mit Test-Grafcet: Die ersten 3 Ausgänge werden nacheinander eingeschaltet.
2 Das neu erzeugte Device ist eingestellt
3 Die Verbindung wurde aufgebaut
4 Diese Zähler müssen hochzählen, dann arbeitet die Grafcet-Engine korrekt.
5 Button Init=Alle Initialschritte aktivieren, Button Löschen=Grafcet-Programm auf dem Device löschen
6 Button Schreiben=Grafcet in das Device schreiben
7 Anzeige Offline stimmt mit Online überein.
8 Im I/O Panel werden die aktuellen Zustände der E/A angezeigt (wenn eine Verbindung besteht)
9 Wichtig: Kontrollieren Sie hier in der Symboliktabelle ob die E/A Adressen richtig eingestellt sind. Siehe Spalte Adresse.

Sollten Sie bei diesem Test Probleme haben, dann kontaktieren Sie unseren Support per Email: support@mhj.de

Die Bibliothek Grafcet-Engine1x.compiled-library wurde importiert, damit der Namensraum "GrafcetStudio" bekannt ist.

In dieser Variablentabelle wird die Instanz GrafcetEngineRuntime angelegt, die im FB GrafcetEngineRT verwendet wird.

Dieser FB ruft die Grafcet-Engine auf und übergibt einen Millisekunden-Counter und das aktuelle Datum und Uhrzeit. Des Weiteren wird das Grafcet-Programm in eine persistente Variable geschrieben, nachdem ein Grafcet Programm neu übertragen wurde. Bei einem Neustart wird das gespeicherte Grafcet-Programm aus der persistenten Variablen geladen. So steht das Grafcet-Programm nach dem Einschalten des Gerätes sofort zur Verfügung.

Im Hauptprogramm wird eine Instanz von GrafcetEngineRT erzeugt und aufgerufen.

Hier wird das Grafcet-Programm remanent gespeichert. Anmerkung: Der Versuch die Grafcet-Variablen ausschließlich in einer remanenten Tabelle zu speichern, führte nicht zum Erfolg, da hier der Datenaustausch über OPC/UA nicht mehr funktioniert hat. Hier werden ca. 63 KB remanenter Speicher benötigt.

In der Symbolkonfiguration muss die Tabelle GVLGrafcetEngine über OPC/UA freigegeben werden. Dies ist automatisch der Fall, wenn "GVLGrafcetEngine" markiert ist.

Ein Intervall von 10ms ist für die Grafcet-Engine ausreichend.

Bei der Einstellung lokales E/A Abbild der Baugruppe muss "Variablen aktualisieren" auf Aktiviert 2 (immer im Buszyklustask) eingestellt sein. Oder Sie stellen jede Baugruppe separat auf diesen Wert. Diese Einstellung ist notwendig, da die Grafcet-Engine über Pointer auf die E/A zugreift. Ist diese Einstellung nicht aktiv, dann kann die Grafcet-Engine die E/A nicht synchronisieren.

Auch ist es möglich zusätzlich zum Grafcet-Programm eigenen Code zu schreiben und einen Datenaustausch mit dem Grafcet-Programm durchzuführen. Damit ist es möglich, aus dem nativen SPS-Programm, auf die Bedingungen der Transitionen Einfluß zu nehmen, oder auf Aktionen zu reagieren.

Für den Datenaustausch stellt die GRAFCET-Engine Funktionen (FC) bereit, mit denen Sie beliebige Grafcet-Symbole lesen und schreiben können. Diese Funktionen erwarten immer die Instanz der GrafcetEngine und die Offset-Adresse des Symbols, die Sie in der Symboliktabelle in GRAFCET-Studio in der Spalte DB-Adresse ablesen können.

Funktionen mit Beispielparametern, um GRAFCET-Symbole lesen und schreiben zu können:

Symbol-Datentyp Lese-Funktion Schreibfunktion
BOOL "GetGrafcetSymbolBool"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175, Bit:=1); "SetGrafcetSymbolBool"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175, Bit:=1, Value:=true);
UInt8 "GetGrafcetSymbolUInt8"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175); "SetGrafcetSymbolUInt8"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175, Value=4);
UInt16 "GetGrafcetSymbolUInt16"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175); "SetGrafcetSymbolUInt16"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175, Value=4);
Int16 "GetGrafcetSymbolInt16"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175); "SetGrafcetSymbolInt16"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175, Value=4);
Int32 "GetGrafcetSymbolInt32"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175); "SetGrafcetSymbolInt32"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175, Value=4);
Float "GetGrafcetSymbolFloat"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175); "SetGrafcetSymbolFloat"(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset := 175, Value=4);

Beispiel:

In diesem Beispiel werden Grafcet-Symbole zuerst auf einen bestimmten Wert gesetzt und anschließend wieder ausgelesen. Diese Grafcet-Symbole wurden in Grafcet-Studio in der Symboliktabelle angelegt:

Symbol-Gruppe Symbol-Datentyp Symbol-Name DB-Adresse
Data BOOL DBool 150.0
Data UINT8 DUint8 175
Data UINT16 DUint16 176
Data UINT32 DUInt32 178
Data FLOAT DFloat 182
Data INT16 DInt16 186
Data INT32 DInt32 188

Wichtig ist hier die Spalte DB-Adresse der Symboliktabelle. Diese Adresse muss der Funktion "GetGrafcetSymbol..." bzw. "SetGrafcetSymbol..." übergeben werden.

Bild:

Testprogramm in ST "PLC_PRG": Variablendeklaration:

    testbool:BOOL;
    testuint8:BYTE;
    testuint16:WORD;
    testuint32:DWORD;
    testint16:INT;
    testint32:DINT;
    testReal:REAL;

Codebereich:

//Werte schreiben
GrafcetStudio.SetGrafcetSymbolBool(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=150, Value:=TRUE, BitNr:=0);
GrafcetStudio.SetGrafcetSymbolUInt8(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=175, Value:=233);
GrafcetStudio.SetGrafcetSymbolUInt16(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=176, Value:=32000);
GrafcetStudio.SetGrafcetSymbolUInt32(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=178, Value:=200000);
GrafcetStudio.SetGrafcetSymbolFloat(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=182, Value:=601.23);
GrafcetStudio.SetGrafcetSymbolInt16(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=186, Value:=-32000);
GrafcetStudio.SetGrafcetSymbolInt32(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=188, Value:=-300000);

//Werte wieder auslesen
testbool:=GrafcetStudio.GetGrafcetSymbolBool(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=150, BitNr:=0);
testuint8:= GrafcetStudio.GetGrafcetSymbolUInt8(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=175 );
testuint16:=GrafcetStudio.GetGrafcetSymbolUInt16(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=176);
testuint32:=GrafcetStudio.GetGrafcetSymbolUInt32(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=178);
testReal:=GrafcetStudio.GetGrafcetSymbolFloat(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=182);
testInt16:=GrafcetStudio.GetGrafcetSymbolInt16(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=186);
testInt32:=GrafcetStudio.GetGrafcetSymbolInt32(GrafcetEngineInstance:=GVLGrafcetEngine.GrafcetEngineRuntime, Offset:=188);

Kontrolle in Grafcet-Studio: Nach der Verbindung zu dem Device, können die Werte entweder im I/O-Panel oder in der Symboliktabelle kontrolliert werden. In der Symboliktabelle werden die aktuellen Werte angezeigt, nachdem der Beobachten-Modus eingeschalten wurde. Im nachfolgenden Bild wurde der Beobachten-Modus eingeschaltet: Man sieht, dass die Werte mit den geschriebenen Werte übereinstimmen.

Auf diese Art und Weise kann man nun im eigenen Programm ein Grafcet-Symbol auslesen und darauf reagieren. Oder man schreibt beispielsweise ein Grafcet-Symbol im Bereich "Data" und kann dieses Symbol dann in einer Transition verwenden.

Es kommt keine Verbindung zwischen Grafcet-Studio und der SPS zu Stande? Bitte prüfen Sie:

  • IP-Adresse richtig eingestellt?
  • Wenn Sie die Variablennamen geändert haben: Stimmen die Angaben noch in den Verbindungseinstellungen in Grafcet-Studio?
  • Ist die Variable GVLGrafcetEngine in der Symbolikkonfiguration selektiert (Häkchen)
  • PC und SPS im gleichen Netz?

Die Zustände der Eingänge werden im Grafcet nicht erkannt oder die Ausgänge kommen in der Ausgangsbaugruppe nicht an. Bitte prüfen:

  • In Grafcet-Studio: I/O Mapping in den Deviceeinstellungen kontrollieren. Stimmen die Startadressen der Ein- und Ausgänge?
  • CODESYS: Ist die Einstellung lokales E/A Abbild der Baugruppe auf Aktiviert 2 (immer im Buszyklustask) eingestellt?

Kontaktieren Sie unseren Support, wenn Sie das Problem nicht selbst lösen können: support@mhj.de