Dieses Dokument zeigt Ihnen, wie Sie RoboDK eine OPC-UA-Verbindung hinzufügen können. Eine OPC UA-Verbindung ermöglicht Ihnen die Interaktion mit SPSen und anderen Geräten, die dieses Protokoll unterstützen. Sie sollten das OPC-UA Add-in in RoboDK aktivieren, um OPC UA Server- und Client-Funktionen zu Ihren Projekten hinzuzufügen.
RoboDK enthält ein OPC-UA Add-in, mit dem Sie Ihre RoboDK Projekte um OPC UA Kompatibilität erweitern können.
Standardmäßig ist das OPC-UA Add-in in RoboDK deaktiviert. Sobald es aktiviert ist, sollte das Add-in jedes Mal angezeigt werden, wenn Sie RoboDK starten.
Sie können das OPC UA Add-in aktivieren, indem Sie die folgenden Schritte ausführen:
1.Wählen Sie Tools-Add-ins.
2.Doppelklicken Sie auf OPC-UA.
Sie sollten eine zusätzliche Symbolleiste mit den OPC-UA Funktionen sehen.
Hinweis: Weitere Informationen über das OPC UA Add-in finden Sie auf dem RoboDK Marktplatz unter: https://robodk.com/addin/com.robodk.plugin.opc-ua.
Sie sollten die Schaltfläche OPC-UA in der Symbolleiste sehen und auch den Eintrag OPC-UA im Menü.
In diesem Beispiel erfahren Sie, wie Sie das OPC UA Add-in aktivieren und RoboDK in einen OPC UA Server umwandeln. Wir werden einige Einstellungen mit Hilfe der UaExpert Software und der Beckhoff TwinCAT3 TF6100 durchsuchen.
Mit dem OPC UA Add-in können Sie einige Einstellungen wie den Server-Port konfigurieren. Sie können auch wählen, ob Sie den Server aktivieren, deaktivieren oder automatisch mit RoboDK starten möchten.
Wenn das OPC UA Add-in aktiviert ist, wählen Sie OPC UA-OPC-UA Einstellungen, um Ihre OPC UA Einstellungen zu konfigurieren.
Der Bildschirm OPC UA Einstellungen wird auf der linken Seite angezeigt, wie in der folgenden Abbildung zu sehen ist.
Wenn Sie eine Meldung wie "RoboDKs OPC UA Server läuft auf Port 4840" sehen, bedeutet dies, dass der OPC UA Server in RoboDK gestartet wurde.
Hinweis: Vergewissern Sie sich, dass der im vorigen Abschnitt konfigurierte OPC UA-Port in der Windows-Firewall, im Antivirenprogramm oder in anderen für Ihr System erforderlichen Sicherheitseinstellungen aktiviert ist.
Sie können die OPC UA Konnektivität mit jeder RoboDK Station testen, die einen oder mehrere Roboter hat.
Sie können die UaExpert Software verwenden, um die Konnektivität mit dem RoboDK OPC UA Server zu testen.
Sie können die kostenlose Version der UaExpert Software von der Unified Automation Website herunterladen: https://www.unified-automation.com/downloads/opc-ua-clients.html.
Starten Sie den UaExpert und klicken Sie auf die Schaltfläche "+", um den RoboDK OPC UA Server hinzuzufügen.
Erweitern Sie die benutzerdefinierte Suche und wählen Sie die Option <Doppelklick auf Server hinzufügen.>, um den RoboDK OPC UA Server hinzuzufügen.
Geben Sie die URL des OPC UA Servers ein, opc.tcp://127.0.0.1:48440, den Sie im vorherigen Schritt konfiguriert haben.
Verbinden Sie den OPC UA Server mit "Keine" Sicherheit.
Server ist konfiguriert.
Jetzt können Sie sich von UaExpert aus mit dem RoboDK OPC UA Server verbinden.
Sie können die Knoten und Methoden sehen, wenn die Verbindung hergestellt ist.
Innerhalb des RoboDK OPC UA Servers gibt es einige Knotenpunkte, über die Sie einige grundlegende Informationen über Ihre Station austauschen können.
RoboDK Knoten ist ein Knoten, der die aktuelle Version Ihrer RoboDK Software bereitstellt.
In diesem Beispiel wurde die Version RoboDK 64 Bit v5.5.3.23031 verwendet.
Simulationsgeschwindigkeit ist ein Knoten, der die aktuelle Simulationsgeschwindigkeit anzeigt und es dem Benutzer ermöglicht, die aktuelle Simulationsgeschwindigkeit zu überschreiben.
Der Knotenwert bezieht sich auf den Schieberegler der Simulationsgeschwindigkeit.
Die aktuelle Simulation kann von diesem Knoten aus gelesen werden und kann die Simulationsgeschwindigkeit überschreiben.
Station Node ist ein Knoten, der es dem Benutzer ermöglicht, den aktuellen Namen der Station in RoboDK abzurufen.
Wie Sie unten sehen, bezieht sich der Knoten Station auf Ihren "Stationsnamen" in RoboDK.
StationParameter und StationWert sind ein Knotenpaar, das es dem Benutzer ermöglicht, beliebige Parameter innerhalb Ihrer Station abzurufen oder einzustellen. Der RoboDK OPC UA Server überwacht kontinuierlich den aktuellen Wert von "StationParameter" und gibt den Wert dieses "StationParameters" vom Station Value Node zurück.
Hinweis: Ein leerer String wird zurückgegeben, wenn der Stationsparameter nicht existiert.
Sie können Ihre Stationsparameter einsehen, indem Sie mit der rechten Maustaste auf Ihre RoboDK Station>Stationsparameter klicken.
Im Feld Konstante Parameter sehen Sie die Standardparameter des Senders und deren Wert.
Der Stationsparameter bezieht sich auf das Feld "Parameter" und der Stationswert auf das Feld "Wert".
Und wir können unsere eigenen Parameter erstellen, indem wir auf die Schaltfläche "Hinzufügen" klicken.
Ein neuer Stationsparameter wurde hinzugefügt.
Geben Sie Ihren Parameternamen und den Parameterwert ein und drücken Sie dann auf Übernehmen, um ihn zu speichern.
Sie können auch Ihre eigenen Senderparameter erhalten.
Der Knoten Zeit ist ein Knoten, über den Sie die aktuelle Zeit der RoboDK Station abrufen können.
Es wird ein Wert im DataTime-Format zurückgegeben.
Und dieser Knotenpunkt wird ständig aktualisiert.
RoboDK OPC UA Server verfügt auch über einige Methoden, mit denen der Benutzer dynamisch auf die Daten der RoboDK Station zugreifen kann.
Wir können einfach mit der rechten Maustaste auf die Methode>Aufrufen klicken, um die Methode auszuführen.
getItem ist eine Methode, die es dem Benutzer ermöglicht, den Zeiger Ihres Elements zu erhalten.
Für die InputArgumente ist der Gerätename erforderlich. Sie können sich vorstellen, dass der Gerätename Ihr Stationsname, Robotername usw. ist. Und Item ID ist das OutputArgument, das den Zeiger des Geräts zurückgibt.
In diesem Beispiel habe ich die Element-ID (Pointer) meines ABB-Roboters mit dem Namen "ABB_RB1" erhalten.
0 wird zurückgegeben, wenn der Objektname ungültig ist oder in Ihrer Station nicht existiert.
getJonits ist eine Methode, mit der der Benutzer den Gelenkwert des Roboters von der Station abrufen kann, basierend auf der Item ID.
Die Item ID ist der Zeigerwert Ihres Items, den Sie über die Methode getItem() abrufen können.
Wir erhalten die Objekt-ID mit dem Objektnamen "ABB_RB1", und es wird ein UInt64-Wert zurückgegeben.
Der Wert von Joints wird zurückgegeben, wenn Sie die Item ID in der Methode übergeben, die wir im vorherigen Abschnitt erhalten haben.
getJointsStr ist eine Methode, die es dem Benutzer ermöglicht, den Wert Joints auf der Grundlage eines String-Wertes zu erhalten.
Wir können den Roboternamen (String) in dieser Methode übergeben.
In Meine Station ist ABB_RB1 der Name meines Roboters.
Wir können einfach "ABB_RB1" im Parameter Robotername übergeben und die Methode aufrufen - der gemeinsame Wert im String-Format wird zurückgegeben.
setJointsStr ist eine Methode, mit der der Benutzer den Joints-Wert des Roboters auf der Grundlage eines String-Wertes festlegen kann.
Im Roboternamen wird ABB_RB1 übergeben, und im Parameter Joints können wir einfach eine Zeichenkette mit dem Gelenkwert übergeben.
For example:-0.000000,0.000000,-0.000000,-0.000000,-0.0,-0.000000
Sie können die Beckhoff TwinCAT 3 Software verwenden, um die Konnektivität mit dem RoboDK OPC UA Server zu testen.
Sie können damit beginnen, den OPC UA Client zu erstellen, indem Sie E/A>Geräte>Neues Element hinzufügen wählen.
Wählen Sie Virtuelles OPC UA-Gerät aus OPC >OK.
OPC UA Virtual wird eingefügt.
Wir müssen einen OPC UA Client hinzufügen, um auf den RoboDK OPC UA Server zuzugreifen.
Wählen Sie Gerät 1 >Rechtsklick >Neues Element hinzufügen.
Wählen Sie "OPC UA Client(Modul)" und Ok.
OPC UA Client wird eingefügt.
Öffnen Sie den OPC UA Client > gehen Sie auf die Registerkarte "Einstellungen" > klicken Sie auf "Endpunkt auswählen", um den OPC UA Server Endpunkt zu konfigurieren, auf den Sie zugreifen möchten.
Geben Sie die RoboDK OPC UA Server URL ein und aktualisieren Sie sie.
Klicken Sie auf "Knoten hinzufügen", um den Knoten zu suchen, der sich im OPC UA Server befindet.
Wenn die Verbindung zwischen TwinCAT und dem OPC UA Server hergestellt ist, können Sie die Details des OPC UA Servers durchsuchen.
Wählen Sie alle Methoden und Ok.
Methoden werden in Ihre Konfiguration eingefügt.
Konfigurieren Sie Ihr Namenspräfix in diesem Feld.
Klicken Sie auf "Create Plc Code", um den SPS-Code aus TwinCAT zu erstellen.
In Ihrem Projekt wird ein OpcUaClient-Ordner erstellt, und alle RoboDK-Methoden werden im IEC61131-3 Funktionsblockformat erstellt.
Dieser Abschnitt zeigt ein Beispielprogramm für eine Beckhoff TwinCAT SPS, die mit dem RoboDK OPC UA Server kommuniziert.
PROGRAMM HAUPT
VAR
bConnected :BOOL;
StationPointer :DINT;
iStep :INT;
bStart :BOOL;;
i :INT;
TON :TON;
bReset :BOOL;
bWrite :BOOL;
TON2 :TON;
bShow :BOOL:=TRUE;
bVis :BOOL:=True;
END_VAR
VAR
Roboter_name :STRING(80):='ABB_RB1';
Artikel_ID :ULINT;
arrJoints :ARRAY[0..11]OF LREAL;
strJoints :STRING(80):='';
arrJointsFromStr:ARRAY[1..11]OF LREAL;
sTrennzeichen :STRING(1) := ',';
arrJointsCommand:ARRAY[1..11]OF LREAL;
strJointsCommand:STRING(80);
END_VAR
VAR KONSTANTE
cStepWaitCmd :INT:=0;
cStepInit :INT:=5;
cStepGetItem :INT:=10;
cStepGetItemReset :INT:=20;
cStepGetItemError :INT:=990;
cStepGetJoints :INT:=30;
cStepGetJointsReset :INT:=40;
cStepGetJointsError :INT:=991;
cStepGetJointsStr :INT:=50;
cStepGetJointsStrReset:INT:=60;
cStepGetJointsStrError:INT:=992;
cStepSetJointStrDelay :INT:=69;
cStepSetJointsStr :INT:=70;
cStepSetJointsStrReset:INT:=80;
cStepSetJointsStrError:INT:=993;
cStepEnd :INT:=300;
cStepWaitReset :INT:=999;
END_VAR
VAR
aSplit :ARRAY[1..11] OF STRING(80);
bResultSplit :BOOL;
debuggen :BOOL;
URL :STRING:='http://192.168.3.42:8091';
END_VAR
bConnected:=OPCUA_VirtualClient_RoboDK_Station.bConnected;
CASE iStep OF
cStepWaitCmd:
IF bStart THEN
iStep:=cStepInit;
bStart:=FALSE;
END_IF
cStepInit:
StationPointer:=0;
FOR i :=1 TO 11 DO
arrJoints[i]:=0.0;
arrJointsFromStr[i]:=0.0;
aSplit[i]:='';
END_FOR
IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJoints.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJoints.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
DANN
iStep:=cStepGetItem;
END_IF
iStep:=cStepGetItem;
cStepGetItem:
IF OPCUA_VirtualClient_RoboDK_Station.getItem.bDone THEN
iStep:=cStepGetItemReset;
Item_ID:=OPCUA_VirtualClient_RoboDK_Station.getItem.Item_ID;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getItem.bError THEN
iStep:=cStepGetItemError;
END_IF
cStepGetItemReset:
IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy
DANN
iStep:=cStepGetJoints;
END_IF
cStepGetJoints:
IF OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy
DANN
iStep:=cStepGetJointsReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getJoints.bError THEN
iStep:=991;
END_IF
cStepGetJointsReset:
IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy
DANN
iStep:=cStepGetJointsStr;
END_IF;
cStepGetJointsStr:
IF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy
DANN
iStep:=cStepGetJointsStrReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError THEN
iStep:=cStepGetJointsStrError;
END_IF
cStepGetJointsStrReset:
IF NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy
DANN
iStep:=cStepSetJointStrDelay;
END_IF;
cStepSetJointStrDelay:
strJointsCommand:=''; strJointsCommand:=CONCAT(LREAL_TO_STRING(arrJointsCommand[1]),strJointsCommand);
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[2]));
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[3]));
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[4]));
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[5]));
strJointsCommand:=CONCAT(strJointsCommand,',');
strJointsCommand:=CONCAT(strJointsCommand,LREAL_TO_STRING(arrJointsCommand[6]));
TON2(IN:=TRUE,PT:=T#0.2S);
IF TON2.Q THEN
TON2(IN:=FALSE);
iStep:=cStepSetJointsStr;
END_IF
cStepSetJointsStr:
WENN (
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone
UND NICHT
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy
)
OR NOT bWrite
DANN
iStep:=cStepSetJointsStrReset;
ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
DANN
iStep:=cStepSetJointsStrError;
END_IF
cStepSetJointsStrReset:
bWrite:=FALSE;
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bExecute:=FALSE;
IF NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy
DANN
iStep:=cStepEnd;
END_IF;
cStepEnd:
TON(IN:=TRUE,PT:=T#0.1S);
IF TON.Q THEN
TON(IN:=FALSE);
IF NOT debug THEN
iSchritt:=10;
ELSE
iStep:=cStepSetJointStrDelay;
END_IF;
END_IF
cStepGetItemError:
Artikel_ID:=0;
iStep:=cStepWaitReset;
cStepGetJointsError:
FOR i :=0 TO 11 DO
arrJoints[i]:=-99999.99;
END_FOR
iStep:=cStepWaitReset;
cStepGetJointsStrError:
strJoints:='';
iStep:=cStepWaitReset;
cStepWaitReset:
IF bReset THEN
iStep:=cStepInit;
bReset:=FALSE;
END_IF;
END_CASE
aSplit[1] := strJoints;
FOR i:=1 TO 7 DO
bResultSplit := FindAndSplit(
pTrennzeichen := ADR(sTrennzeichen)
,pSrcString := ADR(aSplit[i])
,pLeftString:= ADR(aSplit[i])
,nLinksGröße := SIZEOF(aSplit[i])
,pRightString:= ADR(aSplit[i+1])
,nRightSize := SIZEOF(aSplit[i+1])
,bSearchFromRight := FALSE );
IF NOT bResultSplit THEN
EXIT;
END_IF
END_FOR
FOR i :=1 BIS 6 DO
arrJointsFromStr[i]:=STRING_TO_LREAL(aSplit[i]);
END_FOR;
//
OPCUA_VirtualClient_RoboDK_Station.getItem(
bAusführen:=iStep=cStepGetItem
Artikel_Name:=Roboter_name
);
OPCUA_VirtualClient_RoboDK_Station.getJoints(
bAusführen:=iStep=cStepGetJoints
,Item_ID:=Item_ID,Joints=>arrJoints
);
OPCUA_VirtualClient_RoboDK_Station.getJointsStr(
bAusführen:=iStep=cStepGetJointsStr
,Roboter_name:=Roboter_name,Verbindungen=>strJoints
);
IF bSchreiben THEN
OPCUA_VirtualClient_RoboDK_Station.setJointsStr(
bAusführen:=TRUE
,Roboter_name:=Roboter_name,Joints:=strJointsCommand);
END_IF;
Dieses Beispiel zeigt Ihnen, wie Sie RoboDK eine OPC-UA Client-Konnektivität hinzufügen können. RoboDK enthält ein OPC-UA Add-in, mit dem Sie Ihre RoboDK Projekte um OPC UA Kompatibilität erweitern können.
In diesem Beispiel erfahren Sie, wie Sie die Daten von der RoboDK Station über den OPC UA Client abrufen können.
Hinweis: Sie können die Stationsparameter löschen, indem Sie mit der rechten Maustaste auf das Stammverzeichnis der Station klicken und Stationsparameter wählen.
Der Bildschirm mit den Stationsparametern wird angezeigt. Drücken Sie "Alle löschen", um alle Stationsparameter zu löschen.
Wir können ein weiteres RoboDK Projekt erstellen, in dem der OPC UA Server konfiguriert und gestartet ist.
Dieser Abschnitt zeigt, wie Sie einen OPC UA Client hinzufügen.
Geben Sie die Endpunkt-URL ein, zum Beispiel: opc.tcp://127.0.0.1:48441.
Sie müssen die IP-Adresse und die Port-Konfiguration an Ihren Ziel-OPC-UA-Server anpassen.
Drücken Sie "Verbinden", um die Verbindung herzustellen.
wenn die Meldung" Servervariablen abgerufen. Klicken Sie mit der rechten Maustaste auf das Stationsobjekt und wählen Sie 'Stationsparameter', um die Variablen zu sehen.", ist die Verbindung hergestellt.
Klicken Sie mit der rechten Maustaste auf Ihre Station und wählen Sie "Stationsparameter".
Sie können die Details jedes Knotens im Bereich Knoten überprüfen.
Nachdem Sie die Daten der Knoten vom OPC UA Server über den OPC UA Client in RoboDK erhalten haben, können Sie diese Daten auch über die RoboDK-Python-API abrufen.
Sie können diesen Link verwenden, um die RoboDK Python-API zu installieren.
https://robodk.com/doc/en/PythonAPI/intro.html#how-to-install
Oder installieren Sie das Paket robodk für Python manuell:
pip install robodk
Dieses Beispielskript zeigt, wie Sie die Stationsparameter über die Python-API von RoboDK abrufen können.
from robodk import robolink # RoboDK API
RDK = robolink.Robolink()
from robodk import * # RoboDK API
from robolink import * # Roboter-Werkzeugkasten
Artikelliste = RDK.Artikelliste()
if itemlist:
# Alle Stationsparameter abrufen
print('Vaild Paramaters sind in Ihrer Station konfiguriert...')
StationParameter=RDK.getParams()
für StationParameter in StationParameter:
print("Station Parameter %s : %s"%(StationParameter[0],str((StationParameter[1]))))
sonst:
print('Keine Parameterliste..')
Hier sehen Sie das Ergebnis des Beispielskripts:
Vaild Paramaters werden in Ihrer Station konfiguriert...
Stationsparameter RoboDK : RoboDK 64 bit v5.5.3.23031
Station Parameter Zeit : 02/14/2023 03:58:29.191.000.000
Station Parameter SimulationGeschwindigkeit : 13.8551
Stationsparameter Station : MyTestStation