TC3 Kommunikation OPC UA Server zu OPC UA Server

Licht9885

Level-2
Beiträge
351
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,

ich stehe aktuell vor einem kleinen Problem, ich habe 2 SPS Systeme vor mir auf beiden ist ein OPC UA Server installiert und funktioniert auch, Die Abfrage über den OPC UA Client von Beckhoff läuft auch super. nun ist meine Aufgabe die beiden SPS Systeme über die PLCOpen lib zu Verbinden damit Steuerung 1 von Steuerung 2 Daten abhohlen kann und Befehle setzen kann und umgekehrt. Leider bekomme ich bei beiden Systemen schon beim Verbindungsaufbau mit dem Baustein FB_UA_Connect die Fehlerid 6 zurück (Laut Beckhoff: Zielport nicht gefunden), kennt jemand das Problem und weiß abhilfe? Ich denke ich habe nur in meinem jugendlichen Leichtsinn was falsches eingetragen, Quellcode ist wie folgt,

PROGRAM PRG_READ
VAR
(* Declarations for UA_Connect *)
fbUA_Connect : UA_Connect;
SessionConnectInfo : ST_UASessionConnectInfo;
nConnectionHdl : DWORD;


(* Declarations for UA_GetNamespaceIndex *)
fbUA_GetNamespaceIndex : UA_GetNamespaceIndex;
nNamespaceIndex : UINT;


(* Declarations for UA_NodeGetHandle *)
fbUA_NodeGetHandle : UA_NodeGetHandle;
NodeID : ST_UANodeID;
nNodeHdl : DWORD;


(* Declarations for UA_Read *)
fbUA_Read : UA_Read;
stIndexRange : ARRAY [1..nMaxIndexRange] OF ST_UAIndexRange;
nIndexRangeCount : UINT;
stNodeAddInfo : ST_UANodeAdditionalInfo;
sNodeIdentifier : STRING(MAX_STRING_LENGTH) := 'MAIN.nCounter'; // change to node identifier
nReadData : INT; // change to node data type
cbDataRead : UDINT;

(* Declarations for UA_NodeReleaseHandle *)
fbUA_NodeReleaseHandle : UA_NodeReleaseHandle;


(* Declarations for UA_Disconnect *)
fbUA_Disconnect : UA_Disconnect;


(* Other declarations *)
iState : INT;
bTest : BOOL:= TRUE;
bDone : BOOL;
bBusy : BOOL;
bError : BOOL;
nErrorID : DWORD;
END_VAR




CASE iState OF
0: (* idle *)
IF bTest THEN
bTest := FALSE;
bError := FALSE;
nErrorID := 0;


SessionConnectInfo.tConnectTimeout := T#1M;
SessionConnectInfo.tSessionTimeout := T#1M;
SessionConnectInfo.sApplicationName := '';
SessionConnectInfo.eSecurityMode := eUASecurityMsgMode_None;
SessionConnectInfo.eSecurityPolicyUri := eUASecurityPolicy_None;
SessionConnectInfo.eTransportProfileUri := eUATransportProfileUri_UATcp;


stNodeAddInfo.nIndexRangeCount := nIndexRangeCount;
stNodeAddInfo.stIndexRange := stIndexRange;
iState := iState + 1;
END_IF


1: (* Open UA session *)
fbUA_Connect(
Execute := TRUE,
ServerURL := GVL.sOpcUaServerUrl,
SessionConnectInfo := SessionConnectInfo,
Timeout := T#2M,
ConnectionHdl => nConnectionHdl
);


IF NOT fbUA_Connect.Busy THEN
fbUA_Connect(Execute := FALSE);


IF NOT fbUA_Connect.Error THEN
(* session open *)
iState := iState + 1;
ELSE
bError := TRUE;
nErrorID := fbUA_Connect.ErrorID;
nConnectionHdl := 0;
iState := 0; (* idle *)
END_IF
END_IF




2: (* GetNS Index *)
fbUA_GetNamespaceIndex(
Execute := TRUE,
ConnectionHdl := nConnectionHdl,
NamespaceUri := GVL.sNamespaceUri,
NamespaceIndex => nNamespaceIndex
);


IF NOT fbUA_GetNamespaceIndex.Busy THEN
fbUA_GetNamespaceIndex(Execute := FALSE);
IF NOT fbUA_GetNamespaceIndex.Error THEN
iState := iState + 1;
ELSE
bError := TRUE;
nErrorID := fbUA_GetNamespaceIndex.ErrorID;
iState := 6; (* idle *)
END_IF
END_IF


3: (* Get Node Handle *)
NodeID.eIdentifierType := eUAIdentifierType_String;
NodeID.nNamespaceIndex := nNamespaceIndex;
NodeID.sIdentifier := sNodeIdentifier;
fbUA_NodeGetHandle(
Execute := TRUE,
ConnectionHdl := nConnectionHdl,
NodeID := NodeID,
NodeHdl => nNodeHdl
);


IF NOT fbUA_NodeGetHandle.Busy THEN
fbUA_NodeGetHandle(Execute := FALSE);


IF NOT fbUA_NodeGetHandle.Error THEN
iState := iState + 1;
ELSE
bError := TRUE;
nErrorID := fbUA_NodeGetHandle.ErrorID;
iState := 6; (* idle *)
END_IF
END_IF




4: (* UA_Read *)
fbUA_Read(
Execute := TRUE,
ConnectionHdl := nConnectionHdl,
NodeHdl := nNodeHdl,
cbData := SIZEOF(nReadData),
stNodeAddInfo := stNodeAddInfo,
pVariable := ADR(nReadData)
);


IF NOT fbUA_Read.Busy THEN
fbUA_Read( Execute := FALSE, cbData_R => cbDataRead);


IF NOT fbUA_Read.Error THEN
iState := iState + 1;
ELSE
bError := TRUE;
nErrorID := fbUA_Read.ErrorID;
iState := 6; (* idle *)
END_IF
END_IF




5: (* Release Node Handle *)
fbUA_NodeReleaseHandle(
Execute := TRUE,
ConnectionHdl := nConnectionHdl,
NodeHdl := nNodeHdl
);


IF NOT fbUA_NodeReleaseHandle.Busy THEN
fbUA_NodeReleaseHandle(Execute := FALSE);


IF NOT fbUA_NodeReleaseHandle.Error THEN
iState := iState + 1;
ELSE
bError := TRUE;
nErrorID := fbUA_NodeReleaseHandle.ErrorID;
iState := 6; (* idle *)
END_IF
END_IF




6: (* close session *)
fbUA_Disconnect(
Execute := TRUE,
ConnectionHdl := nConnectionHdl
);


GVL Variablen

sNamespaceUri : STRING(MAX_STRING_LENGTH) := 'urn:BeckhoffAutomation:Ua:test'; // TF6100 setup version 4.x default
sOpcUaServerUrl : STRING(MAX_STRING_LENGTH) := 'opc.tcp://192.100.50.44:4840';

Um Hilfe währe ich dankbar!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Sebastian, soll der Austausch zwischen zwei TC3 Systemen erfolgen, dann wären doch Netzwerkvariablen eine Alternative?

Von irgendwas mit Internetzugang gesendet.

Ja währe einfacher ist aber nicht gewünscht! Das Endgültige System beinhaltet mehrere Steuerungen verschiedener Hersteller und ein Leitsystem welches seine Befehle über ein OPC Ua Server verteilt. Leider hat der Kunde dies so vorgegeben und lässt sich auch nicht auf einfachere Varianten ein. Demnach muss es so passieren
 
Ja währe einfacher ist aber nicht gewünscht! Das Endgültige System beinhaltet mehrere Steuerungen verschiedener Hersteller und ein Leitsystem welches seine Befehle über ein OPC Ua Server verteilt. Leider hat der Kunde dies so vorgegeben und lässt sich auch nicht auf einfachere Varianten ein. Demnach muss es so passieren

Kurze Rückmeldung/Zwischenstand

Soweit ich bis jetzt herausgefunden benötige ich ein Gateway welches Standardmäßig nicht auf CE Systemen lauffähig ist. Dieses Gateway wird bei der Installation auf dem Programmiergerät (TS6100) wohl Standardmäßig mitinstalliert.

Sobald es neuerungen gibt werde ich hier dies mal schreiben! Weil anscheind kennt sich keiner mit so einer Problematik aus!

Mit freundlichen Grüßen

Sebastian
 
Fehlermeldung 6 bedeutet das deine PLC-UA-Client-Bausteine den TcOPCUaClient.exe (so müsste der Dienst im Windows heissen der letztendlich die Funktionalität des UA-Clients ) nicht angesprochen werden kann.
Bei CE-Systemen: Ist die Datei vorhanden? Irgendwo im System? Verzeichnis. Beim CX8090 e.g. ist dieser glaube ich "de-aktiviert" indem er umgenannt wurde zur Speicheroptimierung.
Bei Win-Systemen: Läuft dieser im Task-manager wenn TwinCAT aktiv ist?

Ansonsten: Wenn du Daten zwischen UA-Servern austauschen willst benötigst du ein Gateway. Ich kenne eine Anlage wo das mit dem Gateway vom UnifiedAutomation erfolgt ist.
Das ist "eigentlich" identisch zum UA-DA-Gateway was bei TwinCAT mitkommt, hier ist die Funktion aber nicht freigeschaltet sodass du tatsächlich bei UnifiedAutomation anfragen müsstest.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, folgende Neuigkeiten und Erkenntnisse konnte ich bisher gewinnen!

1. auf beiden CX9020 Systemen muss die Server sowie die Client.Cab Datei ausgeführt werden sprich installiert werden.

2. das vom Kunden geforderte Übertragen von Strukturen, Arrays, usw. wird zwar über die PLCOpen Lib ermöglicht aber von Beckhoff nicht empfohlen, laut Aussage Beckhoff werden die Funktionen zum Übertragen auch nicht supported.

3. um Strukturen und Arrays, sowie andere erdenklichen Objekte die über OPC UA übertragbar sind zu übertragen bin ich jetzt auf den Virtuellen OPC UA Client (IO Client) umgestiegen.

Ich bin vom Virtuellen OPC UA IO Client übrigens was Handling Konfiguration und Benutzung angeht positiv überrascht, selbst bei Großen Datenmengen ( 18 Strukturen mit mehr als 30 Variablen, um die 5 Statusmeldungen von Servoachsen, Und zig anderen Befehlen In Arrays etc.) wurde der CX nur minimal mehr belastet als ohne den Client ( Auslastungszuwachs mit virtuellen IO Client) ca. 5 %.
 
Zurück
Oben