Ce document vous montrera comment ajouter la connectivité OPC-UA à RoboDK. Une connexion OPC UA vous permet d'interagir avec des automates et d'autres dispositifs qui prennent en charge ce protocole. Vous devez activer l'Add-in OPC-UA dans RoboDK pour ajouter les fonctions de serveur et de client OPC UA à vos projets.
RoboDK comprend un Add-in OPC-UA qui vous permet d'ajouter la compatibilité OPC UA à vos projets RoboDK.
Par défaut, le complément OPC-UA est désactivé dans RoboDK. Une fois activé, le complément doit s'afficher chaque fois que vous démarrez RoboDK.
Vous pouvez activer le complément OPC UA en procédant comme suit :
1.Sélectionnez Outils-Add-in.
2.Double-cliquez sur OPC-UA.
Vous devriez voir une barre d'outils supplémentaire avec les fonctions OPC-UA.
Vous devriez voir le bouton OPC-UA dans la barre d'outils et l'entrée OPC-UA dans le menu.
Dans cet exemple, vous apprendrez comment activer l'add-in OPC UA et convertir RoboDK en serveur OPC UA. Nous allons parcourir quelques paramètres en utilisant le logiciel UaExpert et Beckhoff TwinCAT3 TF6100.
Le complément OPC UA vous permet de configurer certains paramètres tels que le port du serveur. Vous pouvez également choisir d'activer le serveur, de le désactiver ou de le démarrer automatiquement avec RoboDK.
Lorsque l'add-in OPC UA est activé, sélectionnez OPC UA-OPC-UA Settings pour configurer vos paramètres OPC UA.
L'écran des paramètres OPC UA s'affiche sur le côté gauche, comme le montre l'image suivante.
Si vous voyez un message tel que "RoboDK's OPC UA server running on port 4840", cela signifie que le serveur OPC UA de RoboDK a démarré.
Vous pouvez tester la connectivité OPC UA avec n'importe quelle station RoboDK comportant un ou plusieurs robots.
Vous pouvez utiliser le logiciel UaExpert pour tester la connectivité avec le serveur OPC UA de RoboDK.
Vous pouvez télécharger la version gratuite du logiciel UaExpert sur le site web d'Unified Automation : https://www.unified-automation.com/downloads/opc-ua-clients.html.
Lancez UaExpert et cliquez sur le bouton "+" pour ajouter le serveur OPC UA de RoboDK.
Développez la découverte personnalisée et sélectionnez l'option <Double clics pour ajouter un serveur.> pour ajouter le serveur OPC UA de RoboDK.
Saisissez l'URL du serveur OPC UA, opc.tcp://127.0.0.1:48440 que vous avez configuré à l'étape précédente.
Connectez le serveur OPC UA avec la sécurité "None".
Le serveur est configuré.
Vous pouvez maintenant vous connecter au serveur OPC UA de RoboDK à partir de UaExpert.
Vous pouvez voir les nœuds et les méthodes lorsque la connexion est établie.
Le serveur OPC UA de RoboDK comporte quelques nœuds qui vous permettent d'échanger des informations de base sur votre station.
Le nœud RoboDK est un nœud qui fournit la version actuelle de votre logiciel RoboDK.
La version RoboDK 64 Bit v5.5.3.23031 a été utilisée dans cet exemple.
Vitesse de simulation est un nœud qui indique la vitesse de simulation actuelle et permet à l'utilisateur d'écraser la vitesse de simulation actuelle.
La valeur du nœud est référencée à la barre de glissement de la vitesse de simulation.
La simulation en cours peut être lue à partir de ce nœud et peut écraser la vitesse de simulation.
Le nœud de station est un nœud qui permet à l'utilisateur d'obtenir le nom actuel de la station dans RoboDK.
Comme vous le voyez ci-dessous, le nœud Station est référencé à votre "Nom de la station" dans RoboDK.
Les paramètres et la valeur de la station sont une paire de nœuds qui permet à l'utilisateur d'obtenir ou de définir n'importe quel paramètre à l'intérieur de votre station. Le serveur OPC UA de RoboDK surveille en permanence la valeur réelle du "StationParameter" et renvoie la valeur de ce "StationParameter" à partir du nœud de valeur de la station.
Vous pouvez afficher les paramètres de votre station en cliquant avec le bouton droit de la souris sur votre station RoboDK>Paramètres de la station.
Dans le champ Paramètres constants, vous pouvez voir les paramètres par défaut de la station et leur valeur.
Le paramètre de la station est référencé dans le champ "Paramètre" et la valeur de la station est référencée dans le champ "Valeur".
Nous pouvons créer nos propres paramètres en cliquant sur le bouton "Add-in".
Un nouveau paramètre Station est ajouté.
Saisissez le nom et la valeur de votre paramètre, puis appuyez sur Appliquer pour l'enregistrer.
Vous pouvez également obtenir votre propre paramètre de station.
Le nœud time est un nœud qui vous permet d'obtenir l'heure actuelle de la station RoboDK.
Une valeur au format DataTime est renvoyée.
Et ce nœud est mis à jour en permanence.
Le serveur OPC UA de RoboDK est également fourni avec quelques méthodes permettant à l'utilisateur d'accéder dynamiquement aux données de la station RoboDK.
Il suffit de cliquer avec le bouton droit de la souris sur Method>Call pour exécuter la méthode.
getItem est une méthode qui permet à l'utilisateur d'obtenir le pointeur de votre élément.
Pour les InputArguments, le Device Name est requis, vous pouvez imaginer que le Device Name est le nom de votre station, de votre robot, etc. L'ID de l'élément est l'argument de sortie qui renvoie le pointeur de l'appareil.
Dans cet exemple, j'ai reçu l'ID d'élément (pointeur) de mon robot ABB nommé "ABB_RB1".
0 est renvoyé si le nom de l'élément n'est pas valide ou n'existe pas dans votre station.
getJonits est une méthode qui permet à l'utilisateur d'obtenir la valeur de l'articulation du robot à partir de la station, sur la base de l'ID de l'élément.
L'ID de l'élément est la valeur du pointeur de votre élément, et vous pouvez l'obtenir à l'aide de la méthode getItem().
Nous obtiendrons l'ID de l'élément avec le nom de l'élément "ABB_RB1", et une valeur UInt64 sera renvoyée.
La valeur des joints est renvoyée lorsque vous passez l'ID de l'élément dans la méthode que nous avons obtenue dans la section précédente.
getJointsStr est une méthode qui permet à l'utilisateur d'obtenir la valeur des joints à partir d'une chaîne de caractères.
Nous pouvons transmettre le nom du robot (chaîne) dans cette méthode.
Dans Ma station, ABB_RB1 est le nom de mon robot.
Il suffit de passer "ABB_RB1" dans le paramètre Nom du robot et d'appeler la méthode - La valeur de l'articulation est renvoyée au format chaîne.
setJointsStr est une méthode qui permet à l'utilisateur de définir la valeur des articulations du robot, sur la base d'une chaîne de caractères.
Dans le nom du robot, ABB_RB1 est transmis, et nous pouvons simplement transmettre une chaîne avec la valeur de l'articulation dans le paramètre Joints.
For example:-0.000000,0.000000,-0.000000,-0.000000,-0.0,-0.000000
Vous pouvez utiliser le logiciel Beckhoff TwinCAT 3 pour tester la connectivité avec le serveur OPC UA RoboDK.
Vous pouvez commencer par créer le client OPC UA en sélectionnant I/O>Devices>Add New Item.
Sélectionnez Virtual OPC UA Device from OPC >OK.
OPC UA Virtual est inséré.
Nous devons ajouter un client OPC UA pour accéder au serveur OPC UA de RoboDK.
Sélectionnez Device 1 >Cliquez avec le bouton droit de la souris >Ajouter un nouvel élément.
Sélectionnez "OPC UA Client(Module)" et Ok.
Le client OPC UA est inséré.
Ouvrez le client OPC UA >Allez dans l'onglet Paramètres>cliquez sur "Sélectionner un point de terminaison" pour configurer le point de terminaison du serveur OPC UA auquel vous souhaitez accéder.
Saisissez l'URL du serveur OPC UA de RoboDK et mettez-le à jour.
Appuyez sur "Add Nodes" pour parcourir le nœud qui se trouve à l'intérieur du serveur OPC UA.
Si la connexion entre TwinCAT et le serveur OPC UA est établie, vous pouvez parcourir les détails du serveur OPC UA.
Sélectionnez toutes les méthodes et cliquez sur Ok.
Les méthodes sont insérées dans votre configuration.
Configurez votre préfixe de nom dans ce champ.
Appuyez sur "Create Plc Code" pour créer le code PLC à partir de TwinCAT.
Un dossier OpcUaClient est créé dans votre projet et toutes les méthodes RoboDK sont créées au format IEC61131-3 Function Block.
Cette section présente un exemple de programme d'un automate Beckhoff TwinCAT qui communique avec le serveur OPC UA de RoboDK.
PROGRAMME PRINCIPAL
VAR
bConnected :BOOL ;
StationPointer :DINT ;
iStep :INT ;
bDébut :BOOL; ;
i :INT ;
TON :TON ;
bReset :BOOL ;
bWrite :BOOL ;
TON2 :TON ;
bShow :BOOL:=TRUE ;
bVis :BOOL:=True ;
END_VAR
VAR
Nom du robot :STRING(80):='ABB_RB1' ;
Item_ID :ULINT ;
arrJoints :ARRAY[0..11]OF LREAL ;
strJoints :STRING(80):='' ;
arrJointsFromStr:ARRAY[1..11]OF LREAL ;
sSeparator :STRING(1) := ',' ;
arrJointsCommand:ARRAY[1..11]OF LREAL ;
strJointsCommand:STRING(80) ;
END_VAR
VAR CONSTANT
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 ;
débogage :BOOL ;
URL :STRING:='http://192.168.3.42:8091';
END_VAR
bConnected:=OPCUA_VirtualClient_RoboDK_Station.bConnected ;
CASE iStep OF
cStepWaitCmd :
SI bStart ALORS
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
ALORS
iStep:=cStepGetItem ;
END_IF
iStep:=cStepGetItem ;
cStepGetItem :
IF OPCUA_VirtualClient_RoboDK_Station.getItem.bDone ALORS
iStep:=cStepGetItemReset ;
Item_ID:=OPCUA_VirtualClient_RoboDK_Station.getItem.Item_ID ;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getItem.bError ALORS
iStep:=cStepGetItemError ;
END_IF
cStepGetItemReset :
IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy
ALORS
iStep:=cStepGetJoints ;
END_IF
cStepGetJoints :
IF OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy
ALORS
iStep:=cStepGetJointsReset ;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getJoints.bError ALORS
iStep:=991 ;
END_IF
cStepGetJointsReset :
IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy
ALORS
iStep:=cStepGetJointsStr ;
END_IF ;
cStepGetJointsStr :
IF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy
ALORS
iStep:=cStepGetJointsStrReset ;
ELSIF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError ALORS
iStep:=cStepGetJointsStrError ;
END_IF
cStepGetJointsStrReset :
IF NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError
AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy
ALORS
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) ;
SI TON2.Q ALORS
TON2(IN:=FALSE) ;
iStep:=cStepSetJointsStr ;
END_IF
cStepSetJointsStr :
SI (
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone
ET NON
OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy
)
OR NOT bWrite
ALORS
iStep:=cStepSetJointsStrReset ;
ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError
ALORS
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
ALORS
iStep:=cStepEnd ;
END_IF ;
cStepEnd :
TON(IN:=TRUE,PT:=T#0.1S) ;
SI TON.Q ALORS
TON(IN:=FALSE) ;
IF NOT debug ALORS
iStep:=10 ;
ELSE
iStep:=cStepSetJointStrDelay ;
END_IF ;
END_IF
cStepGetItemError :
Item_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(
pSeparator := ADR(sSeparator)
pSrcString := ADR(aSplit[i])
pLeftString:= ADR(aSplit[i])
nLeftSize := SIZEOF(aSplit[i])
pRightString:= ADR(aSplit[i+1])
nRightSize := SIZEOF(aSplit[i+1])
bSearchFromRight := FALSE ) ;
IF NOT bResultSplit THEN
SORTIE ;
END_IF
END_FOR
FOR i :=1 TO 6 DO
arrJointsFromStr[i]:=STRING_TO_LREAL(aSplit[i]) ;
END_FOR ;
//
OPCUA_VirtualClient_RoboDK_Station.getItem(
bExecute:=iStep=cStepGetItem
Nom_de_l'objet:=Nom_du_robot
) ;
OPCUA_VirtualClient_RoboDK_Station.getJoints(
bExecute:=iStep=cStepGetJoints
Item_ID:=Item_ID,Joints=>arrJoints
) ;
OPCUA_VirtualClient_RoboDK_Station.getJointsStr(
bExecute:=iStep=cStepGetJointsStr
,Nom_du_robot:=Nom_du_robot,Joints=>strJoints
) ;
SI bWrite ALORS
OPCUA_VirtualClient_RoboDK_Station.setJointsStr(
bExecute:=TRUE
Nom_du_robot:=Nom_du_robot,Joints:=strJointsCommand) ;
END_IF ;
Cet exemple vous montrera comment vous pouvez ajouter une connectivité client OPC-UA à RoboDK. RoboDK comprend un Add-in OPC-UA qui vous permet d'ajouter la compatibilité OPC UA à vos projets RoboDK.
Dans cet exemple, vous apprendrez comment obtenir les données de la station RoboDK via le client OPC UA.
L'écran des paramètres de la station s'affiche et appuyez sur "Effacer tout" pour supprimer tous les paramètres de la station.
Nous pouvons créer un autre projet RoboDK avec le serveur OPC UA configuré et démarré.
Cette section explique comment ajouter un client OPC UA.
Saisissez l'URL du point de terminaison, par exemple : opc.tcp://127.0.0.1:48441.
Vous devez faire correspondre l'adresse IP et la configuration du port à votre serveur OPC UA cible.
Appuyez sur "Connect" pour établir la connexion.
s'il y a un message avec " Variables du serveur récupérées. Cliquez avec le bouton droit de la souris sur l'élément de la station et sélectionnez 'Paramètres de la station' pour voir les variables", la connexion est établie.
Cliquez avec le bouton droit de la souris sur votre station et sélectionnez "Paramètres de la station".
Vous pouvez vérifier les détails de chaque nœud dans la section des nœuds.
Après avoir obtenu les données des nœuds à partir du serveur OPC UA via le client OPC UA dans RoboDK, vous pouvez également obtenir ces données à l'aide de RoboDK-Python-API.
Vous pouvez vous référer à ce lien pour installer l'API Python de RoboDK.
https://robodk.com/doc/en/PythonAPI/intro.html#how-to-install
Vous pouvez également installer manuellement le paquetage RoboDK pour Python :
pip install robodk
Cet exemple de script montre comment obtenir les paramètres de la station via l'API Python de RoboDK.
from robodk import robolink # RoboDK API
RDK = robolink.Robolink()
from robodk import * # RoboDK API
from robolink import * # Boîte à outils du robot
itemlist = RDK.ItemList()
if itemlist :
# Obtenir tous les paramètres de la station
print('Vaild Paramaters are configured in your Station..')
StationParameters=RDK.getParams()
pour StationParameter dans StationParameters :
print("Station Parameters %s : %s"%(StationParameter[0],str((StationParameter[1]))))
autre :
print('Pas de liste de paramètres..')
Voici le résultat de l'exemple de script :
Les différents paramètres sont configurés dans votre station...
Paramètres de la station RoboDK : RoboDK 64 bit v5.5.3.23031
Heure des paramètres de la station : 02/14/2023 03:58:29.191.000.000
Paramètres de la station Vitesse de simulation : 13.8551
Paramètres de la station Station : MyTestStation