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 ;