Mapping
Für die Verknüpfung von OPC UA Nodes mit SPS-Symbolen steht der TwinCAT Target Browser zur Verfügung, der die Adressinformationen eines SPS-Symbols zu einem OPC UA Node hinzufügt. Das Nodeset kann dann auf dem TwinCAT OPC UA Server zur Verfügung gestellt werden. Grundsätzlich funktioniert das Mapping durch das Ziehen eines Symbols aus dem Target Browser auf eine OPC UA Instanz (Drag-And-Drop):

Objekte
Objekte können nicht mit SPS-Symbolen verknüpft werden, da sie keine Value haben, die verknüpft werden könnte.
Variablen
Variablen (und Properties) können mit Hilfe des TwinCAT Target Browsers mit SPS-Variablen verknüpft werden.
Voraussetzungen
- Der Datentyp der SPS-Variablen entspricht dem Datentyp der OPC UA Node.
Je nach Einstellung (Tools -> Options -> Advanced -> Allow mapping despite validation errors & Disable warning dialogue) werden Sie am Mapping gehindert oder darauf hingewiesen, falls ein Mapping nicht (perfekt) passt.
Weitere Informationen bezüglich der Zuordnung finden sie unter Datentypzuordnung TwinCAT <=> OPC UA.
Strukturen
Strukturen können mit Hilfe des TwinCAT Target Browsers mit einer SPS-Struktur verknüpft werden.
Voraussetzungen
- Die Datenstruktur in der SPS passt zur OPC UA-Datenstruktur. Insbesondere:
- Reihenfolge der Felder
- Datentypen
- Die PLC-Typdefinition enthält die OPC UA-Typinformationen als Attribute.
Diese Attribute benötigt der TwinCAT OPC UA Server, um den SPS-Datentyp dem richtigen OPC UA-Datentyp zuzuordnen. Einfache SPS-Datentypen benötigen diese Attribute nicht.
Die benötigten Attribute können von Hand an die Instanz- oder Typdeklaration geschrieben werden oder über den TwinCAT OPC UA Nodeset Editor zum Kopieren abgerufen werden.
Schritt-für-Schritt mit dem Nodeset Editor:
1 - Finden und Öffnen des Strukturtypen.
5 - Anlegen des DUT in TwinCAT.
2 - Auswählen und Kopieren aller Namen und DataType BrowseNames der Felder
5 - Einfügen in TwinCAT zwischen STRUCT und END_STRUCT
3 - Öffnen der Pragmas für den Typen
4 - Kopieren der Pragmas
5 - Einfügen in TwinCAT oberhalb von TYPE
6 - Ersetzen der DataType BrowseNames durch die passenden SPS-Typen
(Bsp. Boolean => „Tc3_OpcUa.UA_Boolean“ oder „BOOL“).
Fehlende (Struktur-) Typen müssen eventuell ebenfalls angelegt werden.


Bedeutung der Attribute:
- OPC.UA.DA
Aktiviert die Bereitstellung des Datentyps und eventueller Subelemente über OPC UA. - OPC.UA.DA.StructuredType
Kennzeichnet den Typ als strukturierten OPC UA-Datentyp. - OPC.UA.AdditionalStructuredType.NamespaceName
Gibt die NamespaceUri des Datentyps aus dem Nodeset an. - OPC.UA.AdditionalStructuredType.Id
Enthält die NodeId des OPC UA-Datentyps, hier also i=3007. - pack_mode := '1'
Stellt sicher, dass die Speicheranordnung der Struktur definiert und kompatibel ist.
Sobald eine Instanz des SPS-Strukturtyps deklariert ist, kann diese nach dem gleichen Prinzip wie eine Variable verknüpft werden.
Methoden
Methoden können über den TwinCAT Target Browser mit einem SPS-Funktionsbaustein verknüpft werden.
Voraussetzungen
- Der SPS-Funktionsbaustein hat den Aufbau einer sogenannten Job-Methode. Dies ist in Job-Methoden in der Dokumentation des TwinCAT OPC UA Servers erklärt.
- Die Eingabe- und Ausgabeparameter des SPS-Funktionsbaustein entsprechen der OPC UA Methode.
Beispiel
Da die Beispiel OPC UA Methode umfangreich definiert ist, sind hier nur die Eckdaten der OPC UA Methode angegeben:
Vier InputParameter: Boolean, Int16, String, Enum (INT16)
Vier OutputParameter: Boolean, Int16, String, Enum (INT16)
Der SPS-Funktionsbaustein sieht aus wie folgt:
//Funktionsbaustein Deklaration:
{attribute 'OPC.UA.DA.JobMethod' := 'Method2_WithSimpleArguments'}
FUNCTION_BLOCK PUBLIC FB_Method2_WithSimpleArguments
VAR
// Timer to simulate job execution
timer : TON := (PT:=T#4S);
// Variables to determine if a job has been started (Start() method has been called) or finished
jobRunning : BOOL;
jobFinished : BOOL;
// State machine variable
state : UDINT;
//Values of method specific input parameters:
bArgIn : BOOL;
nArgIn : INT;
sArgIn : STRING;
eArgIn : E_Enum_1;
//Values of method specific output parameters:
bArgOut : BOOL;
nArgOut : INT;
sArgOut : STRING;
eArgOut : E_Enum_1;
END_VAR
//Funktionsbaustein Implementierung
CASE state OF
0:
IF jobRunning THEN
state := state + 1;
END_IF
1: //Logic of method in here:
timer(IN:=TRUE);
IF timer.Q THEN
//Set Inputs To Outputs
bArgOut := bArgIn;
nArgOut := nArgIn;
sArgOut := sArgIn;
eArgOut := eArgIn;
timer(IN:=FALSE);
jobRunning := FALSE;
jobFinished := TRUE;
state := 0;
END_IF
END_CASEDer Funktionsbaustein hat, wie von jeder Job-Methode erfordert, drei PLC-Methoden:
//Start Deklaration:
{attribute 'TcRpcEnable' := '1'}
METHOD PUBLIC Start : HRESULT
VAR_INPUT
SimpleArgIn1 : BOOL;
SimpleArgIn2 : INT;
SimpleArgIn3 : STRING;
SimpleArgIn4 : E_Enum_1;
END_VAR
VAR_OUTPUT
hdl : UDINT; // handle, can be used for concurrent calls
END_VAR
//Start Implementierung:
IF jobRunning THEN
Start := Tc3_Module.E_FAIL;
ELSE
//Give inputs to functionblock body
bArgIn := SimpleArgIn1;
nArgIn := SimpleArgIn2;
sArgIn := SimpleArgIn3;
eArgIn := SimpleArgIn4;
hdl := 16#BE6780FF; //static because concurrent calls are disabled by checking jobRunning
jobRunning := TRUE;
Start := OpcUaStatusCodes.Good; //Set return value of method
END_IF
//CheckState Deklaration:
{attribute 'TcRpcEnable' := '1'}
METHOD PUBLIC CheckState : HRESULT
VAR_INPUT
hdl : UDINT; // handle, can be used for concurrent calls
END_VAR
VAR_OUTPUT
bBusy : BOOL; // Do not change. Used by server to find out if the job is finished
SimpleArgOut1 : BOOL;
SimpleArgOut2 : INT;
SimpleArgOut3 : STRING;
SimpleArgOut4 : E_Enum_1;
END_VAR
//CheckState Implementierung:
IF hdl <> 16#BE6780FF THEN
CheckState := OpcUaStatusCodes.BadInternalError; //Set return value of method
ELSIF NOT jobFinished THEN
bBusy := TRUE; // job is not finished yet
CheckState := OpcUaStatusCodes.Good; // done, no error occured during execution (OPC UA StatusCode "GOOD")
ELSE
//Give values to outputs
SimpleArgOut1 := bArgOut;
SimpleArgOut2 := nArgOut;
SimpleArgOut3 := sArgOut;
SimpleArgOut4 := eArgOut;
bBusy := FALSE; // job is finished
CheckState := OpcUaStatusCodes.Good; // done, no error occured during execution (OPC UA StatusCode "GOOD")
END_IF
//Abort Deklaration:
{attribute 'TcRpcEnable' := '1'}
METHOD PUBLIC Abort : HRESULT
VAR_INPUT
hdl : UDINT; // handle, can be used for concurrent calls
END_VARSobald eine Instanz des SPS-Funktionsbausteins erstellt ist, kann diese nach dem gleichen Prinzip wie eine Variable gemappt werden. Nach dem Mappen…

…können am TwinCAT Symbol Mapping über folgende Buttons die Parameter überprüft werden und bei Bedarf angepasst werden. OPC UA und SPS müssen zueinander passen! Es findet (noch) keine Validierung von Methodenverküpfungen statt.
