OPC-UA

Activez l'OPC-UA Add -in

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.

OPC UA - Image 1    OPC UA - Image 2

Vous devriez voir le bouton OPC-UA dans la barre d'outils et l'entrée OPC-UA dans le menu.

OPC UA - Image 3

Exemple de serveur OPC UA

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.

OPC UA - Image 4

Configurez votre serveur OPC UA

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.

OPC UA - Image 5

OPC UA - Image 6

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é.

Créez votre propre station

Vous pouvez tester la connectivité OPC UA avec n'importe quelle station RoboDK comportant un ou plusieurs robots.

OPC UA - Image 7

Mise en œuvre avec UaExpert

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.

OPC UA - Image 8

Add-in du serveur UaExpert

Lancez UaExpert et cliquez sur le bouton "+" pour ajouter le serveur OPC UA de RoboDK.

OPC UA - Image 9

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.

OPC UA - Image 10

Saisissez l'URL du serveur OPC UA, opc.tcp://127.0.0.1:48440 que vous avez configuré à l'étape précédente.

OPC UA - Image 11

Connectez le serveur OPC UA avec la sécurité "None".

OPC UA - Image 12

Le serveur est configuré.

OPC UA - Image 13

Connectez-vous au serveur

Vous pouvez maintenant vous connecter au serveur OPC UA de RoboDK à partir de UaExpert.

OPC UA - Image 14

Vous pouvez voir les nœuds et les méthodes lorsque la connexion est établie.

OPC UA - Image 15

Nœuds de serveur

Le serveur OPC UA de RoboDK comporte quelques nœuds qui vous permettent d'échanger des informations de base sur votre station.

RoboDK

Le nœud RoboDK est un nœud qui fournit la version actuelle de votre logiciel RoboDK.

OPC UA - Image 16

La version RoboDK 64 Bit v5.5.3.23031 a été utilisée dans cet exemple.

OPC UA - Image 17

Vitesse de simulation

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.

OPC UA - Image 18

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.

OPC UA - Image 19

Station

Le nœud de station est un nœud qui permet à l'utilisateur d'obtenir le nom actuel de la station dans RoboDK.

OPC UA - Image 20

Comme vous le voyez ci-dessous, le nœud Station est référencé à votre "Nom de la station" dans RoboDK.

OPC UA - Image 21

Paramètres de la station/Valeur de la station

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.

OPC UA - Image 22

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.

OPC UA - Image 23

Dans le champ Paramètres constants, vous pouvez voir les paramètres par défaut de la station et leur valeur.

OPC UA - Image 24

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".

OPC UA - Image 25

Nous pouvons créer nos propres paramètres en cliquant sur le bouton "Add-in".

OPC UA - Image 26

Un nouveau paramètre Station est ajouté.

OPC UA - Image 27

Saisissez le nom et la valeur de votre paramètre, puis appuyez sur Appliquer pour l'enregistrer.

OPC UA - Image 28

Vous pouvez également obtenir votre propre paramètre de station.

OPC UA - Image 29

Temps

Le nœud time est un nœud qui vous permet d'obtenir l'heure actuelle de la station RoboDK.

OPC UA - Image 30

Une valeur au format DataTime est renvoyée.

OPC UA - Image 31

Et ce nœud est mis à jour en permanence.

OPC UA - Image 32

Méthodes

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.

OPC UA - Image 33

getItem

getItem est une méthode qui permet à l'utilisateur d'obtenir le pointeur de votre élément.

OPC UA - Image 34

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.

OPC UA - Image 35

Dans cet exemple, j'ai reçu l'ID d'élément (pointeur) de mon robot ABB nommé "ABB_RB1".

OPC UA - Image 36

0 est renvoyé si le nom de l'élément n'est pas valide ou n'existe pas dans votre station.

OPC UA - Image 37

getJoints

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.

OPC UA - Image 38

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().

OPC UA - Image 39

Nous obtiendrons l'ID de l'élément avec le nom de l'élément "ABB_RB1", et une valeur UInt64 sera renvoyée.

OPC UA - Image 40

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.

OPC UA - Image 41

getJointsStr

getJointsStr est une méthode qui permet à l'utilisateur d'obtenir la valeur des joints à partir d'une chaîne de caractères.

OPC UA - Image 42

Nous pouvons transmettre le nom du robot (chaîne) dans cette méthode.

OPC UA - Image 43

Dans Ma station, ABB_RB1 est le nom de mon robot.

OPC UA - Image 44

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.

OPC UA - Image 45

setJointsStr

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.

OPC UA - Image 46

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

OPC UA - Image 47

Mise en œuvre avec Beckhoff TwinCAT 3

Vous pouvez utiliser le logiciel Beckhoff TwinCAT 3 pour tester la connectivité avec le serveur OPC UA RoboDK.

Ajouter un serveur TwinCAT3

Vous pouvez commencer par créer le client OPC UA en sélectionnant I/O>Devices>Add New Item.

OPC UA - Image 48

Sélectionnez Virtual OPC UA Device from OPC >OK.

OPC UA - Image 49

OPC UA Virtual est inséré.

OPC UA - Image 50

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.

OPC UA - Image 51

Sélectionnez "OPC UA Client(Module)" et Ok.

OPC UA - Image 52

Le client OPC UA est inséré.

OPC UA - Image 53

Configurer le serveur

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.

OPC UA - Image 54

Saisissez l'URL du serveur OPC UA de RoboDK et mettez-le à jour.

OPC UA - Image 55

Add-in Méthode du serveur RoboDK

Appuyez sur "Add Nodes" pour parcourir le nœud qui se trouve à l'intérieur du serveur OPC UA.

OPC UA - Image 56

Si la connexion entre TwinCAT et le serveur OPC UA est établie, vous pouvez parcourir les détails du serveur OPC UA.

OPC UA - Image 57

Sélectionnez toutes les méthodes et cliquez sur Ok.

OPC UA - Image 58

Les méthodes sont insérées dans votre configuration.

OPC UA - Image 59

Méthode de génération automatique de RoboDK

Configurez votre préfixe de nom dans ce champ.

OPC UA - Image 60

Appuyez sur "Create Plc Code" pour créer le code PLC à partir de TwinCAT.

OPC UA - Image 61

Un dossier OpcUaClient est créé dans votre projet et toutes les méthodes RoboDK sont créées au format IEC61131-3 Function Block.

OPC UA - Image 62

Exemple de programme PLC

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 ;

Exemple de client OPC UA

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.

OPC UA - Image 63

L'écran des paramètres de la station s'affiche et appuyez sur "Effacer tout" pour supprimer tous les paramètres de la station.

OPC UA - Image 64

Mise en œuvre avec l'interface

Nous pouvons créer un autre projet RoboDK avec le serveur OPC UA configuré et démarré.

OPC UA - Image 65

Add-in client

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.

OPC UA - Image 66

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.

OPC UA - Image 67

Cliquez avec le bouton droit de la souris sur votre station et sélectionnez "Paramètres de la station".

OPC UA - Image 68

Nœuds clients

Vous pouvez vérifier les détails de chaque nœud dans la section des nœuds.

OPC UA - Image 69

Implémentation avec l'API RoboDK

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.

Installation

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

Script

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