-> 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!
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!