OPC-UA

Habilite el Addin OPC-UA -in

Este documento le mostrará cómo puede añadir conectividad OPC-UA a RoboDK. Una conexión OPC UA le permite interactuar con PLC y otros dispositivos compatibles con este protocolo. Debe activar el Addin OPC-UA en RoboDK para añadir funciones de servidor y cliente OPC UA a sus proyectos.

RoboDK incluye un Addin OPC-UA que le permite añadir compatibilidad OPC UA a sus proyectos RoboDK.

Por defecto, RoboDK tiene desactivado el Addin OPC-UA. Una vez habilitado, el Addin debería aparecer cada vez que inicie RoboDK.

Puede habilitar el Addin OPC UA siguiendo estos pasos:

1.Seleccione Herramientas-Add-ins.

2.Haga doble clic en OPC-UA.

Debería ver una barra de herramientas adicional con las funciones OPC-UA.

OPC UA - Imagen 1    OPC UA - Imagen 2

Debería ver el botón OPC-UA en la barra de herramientas y también la entrada OPC-UA en el menú.

OPC UA - Imagen 3

Servidor OPC UA Ejemplo

En este ejemplo aprenderá a habilitar el Addin OPC UA y convertir RoboDK en un servidor OPC UA. Examinaremos algunos ajustes utilizando el software UaExpert y Beckhoff TwinCAT3 TF6100.

OPC UA - Imagen 4

Configure su servidor OPC UA

El Addin OPC UA le permite configurar algunos parámetros, como el puerto del servidor. También puede optar por activar el servidor, desactivarlo o iniciarlo automáticamente con RoboDK.

Con el Addin OPC UA activado, seleccione Ajustes OPC UA-OPC-UA para configurar sus ajustes OPC UA.

La pantalla de configuración de OPC UA se muestra en el lado izquierdo como se muestra en la siguiente imagen.

OPC UA - Imagen 5

OPC UA - Imagen 6

Si ve un mensaje como "Servidor OPC UA de RoboDK ejecutándose en el puerto 4840" significa que el servidor OPC UA de RoboDK se ha iniciado.

Cree su propia estación

Puede probar la conectividad OPC UA con cualquier estación RoboDK que tenga uno o varios robots.

OPC UA - Imagen 7

Puesta en marcha con UaExpert

Puede utilizar el software UaExpert para probar la conectividad con el servidor OPC UA de RoboDK.

Puede descargar la versión gratuita del software UaExpert de la página web de Unified Automation: https://www.unified-automation.com/downloads/opc-ua-clients.html.

OPC UA - Imagen 8

Addin UaExpert Server

Inicie UaExpert y haga clic en el botón "+" para añadir el servidor OPC UA de RoboDK.

OPC UA - Imagen 9

Expanda el descubrimiento personalizado y seleccione la opción <Doble clic para añadir servidor.> para añadir el servidor OPC UA de RoboDK.

OPC UA - Imagen 10

Introduzca la URL del servidor OPC UA, opc.tcp://127.0.0.1:48440 que configuró en el paso anterior.

OPC UA - Imagen 11

Conecte el servidor OPC UA con seguridad "Ninguna".

OPC UA - Imagen 12

El servidor está configurado.

OPC UA - Imagen 13

Conéctese al servidor

Ahora puede conectarse al servidor OPC UA de RoboDK desde UaExpert.

OPC UA - Imagen 14

Podrá ver los Nodos y Métodos cuando se establezca la conexión.

OPC UA - Imagen 15

Nodos del servidor

Existen algunos nodos dentro del servidor OPC UA de RoboDK que le permiten intercambiar información básica sobre su estación.

RoboDK

El nodo RoboDK es un nodo que proporciona la versión real de su software RoboDK.

OPC UA - Imagen 16

En este ejemplo se ha utilizado la versión RoboDK 64 Bit v5.5.3.23031.

OPC UA - Imagen 17

SimulaciónVelocidad

Velocidad de simulación es un nodo que muestra la velocidad de simulación actual y permite al usuario sobrescribir la velocidad de simulación actual.

OPC UA - Imagen 18

El valor del nodo está referenciado a la barra de deslizamiento de la velocidad de simulación.

La simulación actual puede leerse desde este nodo y puede sobrescribir la velocidad de simulación.

OPC UA - Imagen 19

Estación

El Nodo Estación es un nodo que permite al usuario obtener el nombre actual de la Estación en RoboDK.

OPC UA - Imagen 20

Como puede ver a continuación, el nodo Estación hace referencia a su "Nombre de estación" en RoboDK.

OPC UA - Imagen 21

Parámetros de la estación/Valor de la estación

El Parámetro de la Estación y el Valor de la Estación son un Nodo conjunto de pares que permite al usuario obtener o establecer cualquier parámetro dentro de su Estación. El Servidor OPC UA de RoboDK monitorizará continuamente el valor real de "StationParameter" y devolverá el Valor de ese "StationParameter", desde el Nodo Valor de la Estación.

OPC UA - Imagen 22

Puede ver los parámetros de su estación haciendo clic con el botón derecho del ratón en su estación RoboDK>Parámetros de la estación.

OPC UA - Imagen 23

En el campo Parámetros constantes puede ver los parámetros por defecto de la estación y su valor.

OPC UA - Imagen 24

El parámetro de la estación se refiere al campo "Parámetro" y el valor de la estación al campo "Valor".

OPC UA - Imagen 25

Y podemos crear nuestros propios Parámetros haciendo clic en el botón "Añadir".

OPC UA - Imagen 26

Se añade un nuevo parámetro Estación.

OPC UA - Imagen 27

Introduzca el nombre y el valor del parámetro y pulse Aplicar para guardarlo.

OPC UA - Imagen 28

También puede obtener su propio parámetro de estación.

OPC UA - Imagen 29

Tiempo

El nodo hora es un nodo que permite obtener la hora actual de la RoboDK Station.

OPC UA - Imagen 30

Se devuelve un valor con formato DataTime.

OPC UA - Imagen 31

Y este Nodo se actualiza continuamente.

OPC UA - Imagen 32

Métodos

El servidor OPC UA de RoboDK también dispone de algunos métodos que permiten al usuario acceder a los datos de la estación RoboDK de forma dinámica.

Podemos hacer clic con el botón derecho del ratón en Método>Llamada para ejecutar el método.

OPC UA - Imagen 33

getItem

getItem es un Método que permite al usuario obtener el puntero de su Item.

OPC UA - Imagen 34

Para los InputArguments, Nombre del Dispositivo es necesario, puede imagen el Nombre del Dispositivo es el Nombre de su Estación,Nombre del Robot..etc.. Y Item ID es el OutputArguments que devuelve el Puntero de ese Dispositivo.

OPC UA - Imagen 35

En este Ejemplo, recibí el Item ID (Puntero) de mi Robot ABB que se llama como "ABB_RB1".

OPC UA - Imagen 36

Se devuelve 0 si el Nombre del artículo no es válido o no existe dentro de su estación.

OPC UA - Imagen 37

getJoints

getJonits es un método que permite al usuario obtener el valor de la articulación del robot desde la estación, basándose en el ID del elemento.

OPC UA - Imagen 38

El ID del elemento es el valor del puntero de su elemento, y puede obtenerlo del método getItem().

OPC UA - Imagen 39

Obtendremos el ID del artículo con este nombre de artículo "ABB_RB1", y se devuelve un valor UInt64.

OPC UA - Imagen 40

El valor de las juntas se devuelve al pasar el ID del artículo en el método que obtuvimos en el anterior.

OPC UA - Imagen 41

getJointsStr

getJointsStr es un método que permite al usuario obtener el valor de las Juntas basándose en un valor de cadena.

OPC UA - Imagen 42

Podemos pasar el nombre del Robot (String) en este método.

OPC UA - Imagen 43

En Mi estación, ABB_RB1 es el nombre de mi robot.

OPC UA - Imagen 44

Basta con pasar "ABB_RB1" en el parámetro Nombre del robot y llamar al método - Se devuelve el valor de la articulación en formato String.

OPC UA - Imagen 45

setJointsStr

setJointsStr es un método que permite al usuario establecer el valor de las Juntas del Robot, basándose en un Valor de Cadena.

OPC UA - Imagen 46

En el nombre del Robot, se pasa ABB_RB1, y podemos pasar simplemente una cadena con el valor de la articulación en el parámetro Articulaciones.

For example:-0.000000,0.000000,-0.000000,-0.000000,-0.0,-0.000000

OPC UA - Imagen 47

Implementación con Beckhoff TwinCAT 3

Puede utilizar el software TwinCAT 3 de Beckhoff para probar la conectividad con el servidor OPC UA de RoboDK.

Añadir servidor TwinCAT3

Puede empezar creando el cliente OPC UA seleccionando E/S>Dispositivos>Añadir nuevo elemento.

OPC UA - Imagen 48

Seleccione Dispositivo OPC UA virtual de OPC >OK.

OPC UA - Imagen 49

Se inserta OPC UA Virtual.

OPC UA - Imagen 50

Necesitamos añadir un cliente OPC UA para acceder al servidor OPC UA de RoboDK.

Seleccione Dispositivo 1 >Clic derecho >Añadir nuevo elemento.

OPC UA - Imagen 51

Seleccione "Cliente OPC UA (Módulo)" y Aceptar.

OPC UA - Imagen 52

Se inserta el Cliente OPC UA.

OPC UA - Imagen 53

Configurar el servidor

Abra el cliente OPC UA >Vaya a la pestaña Configuración>haga clic en "Seleccionar punto final" para configurar el punto final del servidor OPC UA al que desea acceder.

OPC UA - Imagen 54

Introduzca la URL del servidor OPC UA de RoboDK y Actualícelo.

OPC UA - Imagen 55

Add RoboDK Server Method

Pulse "Añadir nodos" para examinar el nodo que se encuentra dentro del servidor OPC UA.

OPC UA - Imagen 56

Si se establece la conexión entre TwinCAT y el servidor OPC UA, puede examinar los detalles del servidor OPC UA.

OPC UA - Imagen 57

Seleccione todos los Métodos y Ok.

OPC UA - Imagen 58

Los métodos se insertan en su Configuración.

OPC UA - Imagen 59

Generar automáticamente el método RoboDK

Configure el prefijo de su nombre en este campo.

OPC UA - Imagen 60

Pulse "Crear Código Plc" para crear el Código PLC desde TwinCAT.

OPC UA - Imagen 61

Se crea una carpeta OpcUaClient en su proyecto y todos los métodos de RoboDK se crean en formato de bloque de función IEC61131-3.

OPC UA - Imagen 62

Ejemplo de programa PLC

Esta sección muestra un programa de ejemplo de un PLC TwinCAT de Beckhoff que se comunica con el servidor OPC UA de RoboDK.

PROGRAMA PRINCIPAL

VAR

   bConectado      :BOOL;

   StationPointer  :DINT;

   iPaso           :INT;

   bStart          :BOOL;;

   i               :INT;

   TON             :TON

   bReset          :BOOL;

   bEscribir       :BOOL;

   TON2            :TON

   bShow           :BOOL:=TRUE;

   bVis            :BOOL:=Verdadero;

FIN_VAR

 

VAR

   Nombre_robot          :CADENA(80):='ABB_RB1';

   ID_artículo           :ULINT;

   arrJoints       :ARRAY[0..11]DE LREAL;

   strJoints       :CADENA(80):='';

   arrJointsFromStr:ARRAY[1..11]OF LREAL;

   sSeparador      :CADENA(1) := ',';

   arrJointsComando:ARRAY[1..11]OF LREAL;

   strJointsComando:STRING(80);

FIN_VAR

 

VAR CONSTANTE

   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;

FIN_VAR

 

 

VAR

  aSplit :ARRAY[1..11] OF STRING(80);

  bResultadoSplit :BOOL;

    depurar         :BOOL;

     URL              :STRING:='http://192.168.3.42:8091';

FIN_VAR

bConectado:=OPCUA_VirtualClient_RoboDK_Station.bConectado;

 

CASO iStep DE

  

 

   cStepWaitCmd:

    IF bStart THEN

          iPaso:=cPasoInicio;

          bInicio:=FALSE;

    FIN_IF

  

   cStepInit:

 

    PunteroEstación:=0;

    FOR i :=1 TO 11 DO

          arrJoints[i]:=0,0;

          arrJointsFromStr[i]:=0.0;

          aSplit[i]:='';

    FIN_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

          ENTONCES

          iPaso:=cPasoGetItem;

    FIN_IF

    iPaso:=cPasoGetItem;

  

   cStepGetItem:

 

    IF OPCUA_VirtualClient_RoboDK_Station.getItem.bDone THEN

          iPaso:=cPasoGetItemReset;

    Item_ID:=OPCUA_VirtualClient_RoboDK_Station.getItem.Item_ID;

    ELSIF OPCUA_VirtualClient_RoboDK_Station.getItem.bError THEN

          iStep:=cStepGetItemError;

    FIN_IF

   

   cStepGetItemReset:

 

    IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

          ENTONCES

          iPaso:=cPasoGetJoints;

    FIN_IF

   cStepGetJoints:

 

    IF OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy

          ENTONCES

          iStep:=cStepGetJointsReset;

    ELSIF OPCUA_VirtualClient_RoboDK_Station.getJoints.bError THEN

          iPaso:=991;

    FIN_IF

   

   cStepGetJointsReset:

 

    IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

   

          ENTONCES

          iStep:=cStepGetJointsStr;

    FIN_IF;

   

   cStepGetJointsStr:

 

    IF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

          ENTONCES

          iStep:=cStepGetJointsStrReset;

    ELSIF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError THEN

          iStep:=cStepGetJointsStrError;

    FIN_IF         

 

   cStepGetJointsStrReset:

 

    IF NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

          ENTONCES

               iPaso:=cPasoSetJointStrDelay;

    FIN_IF;

   

   cStepSetJointStrDelay:

    strJointsComando:=''; strJointsComando:=CONCAT(LREAL_TO_STRING(arrJointsComando[1]),strJointsComando);

      strJointsComando:=CONCAT(strJointsComando,',');

   strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[2]));

      strJointsComando:=CONCAT(strJointsComando,',');

   strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[3]));

      strJointsComando:=CONCAT(strJointsComando,',');

   strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[4]));

      strJointsComando:=CONCAT(strJointsComando,',');

   strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[5]));

      strJointsComando:=CONCAT(strJointsComando,',');

   strJointsComando:=CONCAT(strJointsComando,LREAL_TO_STRING(arrJointsComando[6]));

    TON2(IN:=VERDADERO,PT:=T#0,2S);

    IF TON2.Q THEN

          TON2(IN:=FALSO);

          iPaso:=cPasoSetJointsStr;

    FIN_IF

  

   cStepSetJointsStr:

 

   

    SI (

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone

          Y NO   

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy

         )

          OR NOT bEscribir

          ENTONCES

          iPaso:=cPasoSetJointsStrReset;

    ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError           

          ENTONCES

          iStep:=cStepSetJointsStrError;

    FIN_IF    

         

   cStepSetJointsStrReset:

    bEscribir:=FALSE;

     OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bExecute:=FALSE;

    IF NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError

          AND NOT OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy

          ENTONCES

          iPaso:=cFinPaso;

    FIN_IF;

   

   cStepEnd:

    TON(IN:=VERDADERO,PT:=T#0,1S);

    IF TON.Q THEN

          TON(IN:=FALSE);

          IF NOT debug THEN

               iPaso:=10;

          ELSE

               iPaso:=cPasoSetJointStrDelay;

          FIN_IF;

    FIN_IF

   

   cStepGetItemError:

    Item_ID:=0;

    iPaso:=cPasoEsperarReinicio;

  

   cStepGetJointsError:

    FOR i :=0 TO 11 DO

          arrJoints[i]:=-99999.99;

    FIN_FOR

    iPaso:=cPasoEsperarReinicio;

   

   cStepGetJointsStrError:

    strJoints:='';

    iPaso:=cPasoEsperarReinicio;

   

   cStepWaitReset:

    IF bReset THEN

          iPaso:=cPasoInicio;

          bReinicio:=FALSE;

    FIN_IF;   

FIN_CASE

 

aSplit[1] := strJoints;

 

FOR i:=1 TO 7 DO

bResultadoSplit := BuscarYSplit(

   pSeparador := ADR(sSeparador)

   ,pSrcString := ADR(aSplit[i])

   ,pCadenaIzquierda:= ADR(aSplit[i])

   ,nTamañoIzquierda := TAMAÑO(aSplit[i])

   ,pCadenaDerecha:= ADR(aSplit[i+1])

   ,nTamañoDerecho := SIZEOF(aSplit[i+1])

   ,bBuscarDesdeDerecha := FALSE );

IF NOT bResultadoSplit THEN

    SALIDA

FIN_IF

FIN_FOR

 

PARA i :=1 A 6 HACER

   arrJointsFromStr[i]:=STRING_TO_LREAL(aSplit[i]);

FIN_FOR;

 

//

OPCUA_VirtualClient_RoboDK_Station.getItem(

bExecute:=iStep=cStepGetItem

,Nombre_del_artículo:=Nombre_del_robot

);

 

 

OPCUA_VirtualClient_RoboDK_Station.getJoints(

bEjecutar:=iPaso=cPasoGetJoints

,Item_ID:=Item_ID,Juntas=>arrJuntas

);

 

 

OPCUA_VirtualClient_RoboDK_Station.getJointsStr(

bExecute:=iStep=cStepGetJointsStr

,Nombre_robot:=Nombre_robot,Juntas=>strJuntas

);

 

IF bWrite THEN

OPCUA_VirtualClient_RoboDK_Station.setJointsStr(

   bEjecutar:=TRUE

,Nombre_robot:=Nombre_robot,Juntas:=strComandoJuntas);

FIN_IF;

Ejemplo de cliente OPC UA

Este ejemplo le mostrará cómo puede añadir conectividad OPC-UA Client a RoboDK. RoboDK incluye un Addin OPC-UA que le permite añadir compatibilidad OPC UA a sus proyectos RoboDK.

En este ejemplo aprenderá a obtener los datos de la estación RoboDK a través del cliente OPC UA.

OPC UA - Imagen 63

Aparecerá la pantalla de parámetros de la estación y pulse "Borrar todo" para borrar todos los parámetros de la estación.

OPC UA - Imagen 64

Implementación con interfaz

Podemos crear un proyecto RoboDK más con el servidor OPC UA configurado e iniciado.

OPC UA - Imagen 65

Add Client

Esta sección muestra cómo añadir un cliente OPC UA.

Introduzca la URL del punto final, por ejemplo: opc.tcp://127.0.0.1:48441.

Debe hacer coincidir la dirección IP y la configuración del puerto con su servidor OPC UA de destino.

OPC UA - Imagen 66

Pulse "Conectar" para establecer la conexión.

si aparece un mensaje con" Variables del servidor recuperadas. Haga clic con el botón derecho en el elemento de la estación y seleccione 'Parámetros de la estación' para ver las variables", se establece la conexión.

OPC UA - Imagen 67

Haga clic con el botón derecho del ratón en su estación y seleccione "Parámetros de la estación".

OPC UA - Imagen 68

Nodos cliente

Puede consultar los detalles de cada nodo en la sección de nodos.

OPC UA - Imagen 69

Implementación con la API de RoboDK

Después de obtener los datos de los nodos del servidor OPC UA a través del cliente OPC UA en RoboDK, también puede obtener estos datos utilizando RoboDK-Python-API.

Instalación

Puede consultar este enlace para instalar la API Python de RoboDK.

https://robodk.com/doc/en/PythonAPI/intro.html#how-to-install

O instale manualmente el paquete robodk para Python:

pip install robodk

Script

Este script de ejemplo muestra cómo obtener los parámetros de la estación a través de la API Python de RoboDK.

from robodk import robolink # API RoboDK

 

RDK = robolink.Robolink()

 

from robodk import * # API RoboDK

from robolink import * # Caja de herramientas del robot

itemlist = RDK.ItemList()

si itemlist:

# Obtener todos los parámetros de la estación

print('Los Parámetros Vaild están configurados en su Estación..')

StationParameters=RDK.getParams()

para StationParameter en StationParameters:

    print("Parámetros de estación %s : %s"%(ParámetroEstación[0],str((ParámetroEstación[1]))))

si no:

print('No hay lista de parámetros..')

He aquí el resultado del script de ejemplo:

Los Parámetros Vaild se configuran en su Estación..

Parámetros de la estación RoboDK : RoboDK 64 bit v5.5.3.23031

Hora de los parámetros de la estación : 14/02/2023 03:58:29.191.000.000

Parámetros de la estación Velocidad de simulación : 13.8551

Parámetros de la estación Estación : MyTestStation