OPC-UA

Habilite o Add-in OPC UA

Este documento mostrará como você pode adicionar a conectividade OPC UA ao RoboDK. Uma conexão OPC UA permite que você interaja com PLCs e outros dispositivos que suportam esse protocolo. Você deve ativar o add-in OPC UA no RoboDK para adicionar recursos de servidor e cliente OPC UA aos seus projetos.

O RoboDK inclui um add-in OPC UA que permite a você adicionar compatibilidade com o OPC UA aos seus projetos do RoboDK.

Por padrão, o RoboDK tem o add-in OPC UA desativado. Uma vez ativado, o add-in deverá ser exibido sempre que você iniciar o RoboDK.

Você pode ativar o suplemento OPC UA seguindo estas etapas:

1.Selecione Ferramentas - Add-ins.

2.Clique duas vezes no OPC UA.

Você verá uma barra de ferramentas adicional com os recursos do OPC UA.

OPC UA - Imagem 1    OPC UA - Imagem 2

Você deverá ver o botão OPC UA na barra de ferramentas e também a entrada OPC UA no menu.

OPC UA - Imagem 3

Exemplo de servidor OPC UA

Neste exemplo, você aprenderá a ativar o Add-in OPC UA e a converter o RoboDK em um servidor OPC UA. Navegaremos por algumas configurações usando o software UaExpert e o Beckhoff TwinCAT3 TF6100.

OPC UA - Imagem 4

Configure seu servidor OPC UA

O Add-in OPC UA permite que você defina algumas configurações, como a porta do servidor. Você também pode optar por ativar o servidor, desativá-lo ou iniciar automaticamente com o RoboDK.

Com o Add-in OPC UA ativado, selecione OPC UA – Configurações OPC UA para definir suas configurações de OPC UA.

A tela Configurações OPC UA é exibida no lado esquerdo, conforme mostrado na imagem a seguir.

OPC UA - Imagem 5

OPC UA - Imagem 6

Se você vir uma mensagem como "Servidor RoboDK's OPC UA em execução na porta 4840", isso significa que o servidor OPC UA no RoboDK foi iniciado.

Crie sua própria estação

Você pode testar a conectividade OPC UA com qualquer estação RoboDK que tenha um ou mais robôs.

OPC UA - Imagem 7

Implementação com UaExpert

Você pode usar o software UaExpert para testar a conectividade com o Servidor RoboDK OPC UA.

Você pode fazer o download da versão gratuita do software UaExpert no site da Unified Automation: https://www.unified-automation.com/downloads/OPC UA-clients.html.

OPC UA - Imagem 8

Adicionar servidor no UaExpert

Inicie o UaExpert e clique no botão "+" para adicionar o servidor OPC UA do RoboDK.

OPC UA - Imagem 9

Expanda o Custom Discovery e selecione a opção <Double clicks to Add Server.> para adicionar o Servidor RoboDK OPC UA.

OPC UA - Imagem 10

Digite o URL do servidor OPC UA, opc.tcp://127.0.0.1:48440, que você configurou na etapa anterior.

OPC UA - Imagem 11

Conecte o servidor OPC UA com a segurança "None".

OPC UA - Imagem 12

O servidor está configurado.

OPC UA - Imagem 13

Conecte-se ao servidor

Agora você pode se conectar ao Servidor RoboDK OPC UA a partir do UaExpert.

OPC UA - Imagem 14

Você pode ver os nós e os métodos quando a conexão for estabelecida.

OPC UA - Imagem 15

Nós do servidor

Há alguns nós dentro do servidor OPC UA do RoboDK que permitem que você troque algumas informações básicas sobre a sua estação.

RoboDK

O nó do RoboDK é um nó que fornece a versão real do seu software RoboDK.

OPC UA - Imagem 16

A versão RoboDK 64 Bit v5.5.3.23031 foi usada neste exemplo.

OPC UA - Imagem 17

Velocidade de Simulação

Velocidade de simulação é um nó que mostra a velocidade de simulação real e permite que o usuário substitua a velocidade de simulação atual.

OPC UA - Imagem 18

O valor do nó tem como referência a barra deslizante da velocidade de simulação.

A simulação atual pode ser lida a partir desse nó e pode substituir a velocidade da simulação.

OPC UA - Imagem 19

Estação

O Nó Estação é um nó que permite ao usuário obter o nome atual da estação no RoboDK.

OPC UA - Imagem 20

Como você vê abaixo, o nó Station é referenciado ao seu "Nome da Estação" no RoboDK.

OPC UA - Imagem 21

Parâmetros da estação/Valor da estação

Parâmetro da Estação e Valor da Estação são um par de nós que permite ao usuário obter ou definir qualquer parâmetro dentro da estação. O servidor OPC UA do RoboDK monitorará continuamente o valor real de "Parâmetro da estação" e retornará o valor desse "Parâmetro da estação", a partir do nó Valor da Estação.

OPC UA - Imagem 22

Você pode visualizar os parâmetros da sua estação clicando com o botão direito do mouse na estação RoboDK > Parâmetros da estação.

OPC UA - Imagem 23

No campo Parâmetros constantes, você pode ver os parâmetros padrão da estação e seus valores.

OPC UA - Imagem 24

O parâmetro da estação é referenciado no campo "Parâmetro" e o valor da estação é referenciado no campo " Valor".

OPC UA - Imagem 25

E podemos criar nossos próprios parâmetros clicando no botão "Adicionar".

OPC UA - Imagem 26

Um novo parâmetro Estação foi adicionado.

OPC UA - Imagem 27

Digite o nome do parâmetro e o valor do parâmetro e, em seguida, pressione Aplicar para salvá-lo.

OPC UA - Imagem 28

Você também pode obter seu próprio parâmetro de estação.

OPC UA - Imagem 29

Tempo

O nó Hora é um nó que permite a você obter a hora atual da Estação RoboDK.

OPC UA - Imagem 30

É retornado um valor com o formato DataHora.

OPC UA - Imagem 31

E esse nó é atualizado continuamente.

OPC UA - Imagem 32

Métodos

O Servidor RoboDK OPC UA também é fornecido com alguns métodos para permitir que o usuário acesse os dados da estação RoboDK dinamicamente.

Podemos simplesmente clicar com o botão direito do mouse no Método > Chamada para executar o método.

OPC UA - Imagem 33

ObterItem

ObterItem é um método que permite que o usuário obtenha o ponteiro do seu Item.

OPC UA - Imagem 34

Para os ArgumentosDeEntrada, o Nome do Dispositivo é necessário, você pode imaginar que o Nome do Dispositivo é o nome da estação, o nome do robô, etc. E Item ID é o ArgumentosDeSaida que retorna o ponteiro desse dispositivo.

OPC UA - Imagem 35

Neste exemplo, recebi o ID do item (ponteiro) do meu robô ABB denominado "ABB_RB1".

OPC UA - Imagem 36

0 é retornado se o Item Name for inválido ou não existir em sua estação.

OPC UA - Imagem 37

ObterEixos

ObterEixos é um método que permite ao usuário obter o valor do ângulo dos eixos do robô na estação, com base na ID do item.

OPC UA - Imagem 38

O ID do item é o valor do ponteiro do seu item e você pode obtê-lo no método ObterItem().

OPC UA - Imagem 39

Obteremos a ID do item com esse nome de item "ABB_RB1", e um valor UInt64 será retornado.

OPC UA - Imagem 40

O valor dos ângulos dos eixos é retornado ao passar o ID do item no método que obtivemos anteriormente.

OPC UA - Imagem 41

ObterStrEixos

ObterStrEixos é um método que permite ao usuário obter o valor dos ângulos dos eixos com base em um valor String.

OPC UA - Imagem 42

Podemos passar o nome do robô (String) nesse método.

OPC UA - Imagem 43

Em My Station, ABB_RB1 é o nome do meu robô.

OPC UA - Imagem 44

Podemos simplesmente passar "ABB_RB1" no parâmetro do nome do robô e chamar o método - O valor conjunto no formato String é retornado.

OPC UA - Imagem 45

DefinirStrEixos

DefinirStrEixos é um método que permite ao usuário definir o valor dos ângulos dos eixos do Robô, com base em um valor String.

OPC UA - Imagem 46

No nome do robô, ABB_RB1 é passado, e podemos simplesmente passar uma string com o valor do ângulo no parâmetro Joints.

Por exemplo:-0.000000,0.000000,-0.000000,-0.000000,-0.0,-0.000000

OPC UA - Imagem 47

Implementação com o TwinCAT 3 da Beckhoff

Você pode usar o software TwinCAT 3 da Beckhoff para testar a conectividade com o Servidor RoboDK OPC UA.

Adicionar Servidor TwinCAT3

Você pode começar criando o cliente OPC UA selecionando I/O > Devices > Add New Item.

OPC UA - Imagem 48

Selecione Virtual OPC UA Device from OPC > OK.

OPC UA - Imagem 49

OPC UA Virtual é inserido.

OPC UA - Imagem 50

Precisamos adicionar um cliente OPC UA para acessar o servidor OPC UA do RoboDK.

Selecione Device 1 > Clique com o botão direito do mouse > Add New Item.

OPC UA - Imagem 51

Selecione "OPC UA Client(Module)" e Ok.

OPC UA - Imagem 52

O cliente OPC UA é inserido.

OPC UA - Imagem 53

Configurar o servidor

Abra o OPC UA Client > Vá para a guia Settings (Configurações) > Clique em "Select Endpoint" (Selecionar ponto final) para configurar o ponto final do OPC UA Server que você gostaria de acessar.

OPC UA - Imagem 54

Digite o URL do servidor OPC UA do RoboDK e atualize-o.

OPC UA - Imagem 55

Adicionar um método de servidor RoboDK

Pressione "Add Nodes" (Adicionar nós) para procurar o nó que está dentro do servidor OPC UA.

OPC UA - Imagem 56

Se a conexão entre o TwinCAT e o servidor OPC UA for estabelecida, você poderá procurar os detalhes do servidor OPC UA.

OPC UA - Imagem 57

Selecione todos os métodos e clique em Ok.

OPC UA - Imagem 58

Os métodos são inseridos em sua configuração.

OPC UA - Imagem 59

Método de geração automática do RoboDK

Configure o prefixo do nome nesse campo.

OPC UA - Imagem 60

Pressione "Create Plc Code" para criar o código PLC a partir do TwinCAT.

OPC UA - Imagem 61

Uma pasta OpcUaClient é criada em seu projeto e todos os métodos do RoboDK são criados no formato de bloco de função IEC61131-3.

OPC UA - Imagem 62

Exemplo de programa PLC

Esta seção mostra um programa de amostra de um PLC TwinCAT da Beckhoff que se comunica com o servidor RoboDK OPC UA.

PROGRAM MAIN

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

   Robot Name      :STRING(80):='ABB_RB1';

   Item_ID         :ULINT;

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

   strJoints       :STRING(80):='';

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

   sSeparador      :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;

        debug      :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

              E NÃO 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

              ENTÃO

              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

              ENTÃO

              iStep:=cStepGetJoints;

        END_IF

   cStepGetJoints:

 

        IF OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone

              AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy

              ENTÃO

              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

       

              ENTÃO

              iStep:=cStepGetJointsStr;

        END_IF;

       

   cStepGetJointsStr:

 

        IF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone

              AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

              ENTÃO

              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

              ENTÃO

                   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:

 

       

        IF (

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone

              E NÃO   

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy

         )

              OR NOT bWrite

              ENTÃO

              iStep:=cStepSetJointsStrReset;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError           

          ENTÃO

              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

              ENTÃO

              iStep:=cStepEnd;

        END_IF;

       

   cStepEnd:

        TON(IN:=TRUE,PT:=T#0.1S);

        IF TON.Q THEN

              TON(IN:=FALSE);

              IF NOT debug THEN

                   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

        SAÍDA;

    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

Item_Name:=Nome_do_robô

);

 

 

OPCUA_VirtualClient_RoboDK_Station.getJoints(

bExecute:=iStep=cStepGetJoints

Item_ID:=Item_ID,Joints=>arrJoints

);

 

 

OPCUA_VirtualClient_RoboDK_Station.getJointsStr(

bExecute:=iStep=cStepGetJointsStr

,Robot_name:=Robot_name,Joints=>strJoints

);

 

IF bWrite THEN

OPCUA_VirtualClient_RoboDK_Station.setJointsStr(

   bExecute:=TRUE

   , Robot_name:=Robot_name,Joints:=strJointsCommand);

END_IF;

Exemplo de cliente OPC UA

Este exemplo mostrará como você pode adicionar a conectividade do cliente OPC UA ao RoboDK. O RoboDK inclui um Add-in OPC UA que permite a você adicionar compatibilidade OPC UA aos seus projetos do RoboDK.

Neste exemplo, você aprenderá como obter os dados da Estação RoboDK via OPC UA Client.

OPC UA - Imagem 63

A tela de parâmetros da estação é exibida e pressione "Limpar tudo" para excluir todos os parâmetros da estação.

OPC UA - Imagem 64

Implementação com a interface

Podemos criar mais um projeto do RoboDK com o servidor OPC UA configurado e iniciado.

OPC UA - Imagem 65

Adicionar Cliente

Esta seção mostra como adicionar um cliente OPC UA.

Digite o URL do endpoint, por exemplo: opc.tcp://127.0.0.1:48441.

Você precisa fazer a correspondência do endereço IP e da configuração da porta com o servidor OPC UA de destino.

OPC UA - Imagem 66

Pressione "Connect" para estabelecer a conexão.

Se houver uma mensagem com "Variáveis do servidor recuperadas. Clique com o botão direito do mouse no item da estação e selecione 'Parâmetro da Estação' para ver as variáveis.", a conexão será estabelecida.

OPC UA - Imagem 67

Clique com o botão direito do mouse em sua estação e selecione "Parâmetro da Estação".

OPC UA - Imagem 68

Nós de clientes

Você pode verificar os detalhes de cada nó na seção de nós.

OPC UA - Imagem 69

Implementação com a API do RoboDK

Depois de obter os dados dos nós do servidor OPC UA por meio do cliente OPC UA no RoboDK, você também pode obter esses dados usando a RoboDK-Python-API.

Instalação

Você pode consultar este link para instalar a Python-API do RoboDK.

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

Ou instale manualmente o pacote robodk para Python:

pip install robodk

Script

Este script de exemplo mostra como obter os parâmetros da estação por meio da API Python do RoboDK.

from robodk import robolink # API do RoboDK

 

RDK = robolink.Robolink()

 

from robodk import * # API do RoboDK

from robolink import * # Caixa de ferramentas do robô

itemlist = RDK.ItemList()

se itemlist:

    # Obter todos os parâmetros da estação

    print('Vaild Paramaters are configured in your Station...')

    StationParameters=RDK.getParams()

    para StationParameter em StationParameters:

        print("Parâmetro da Estaçãos %s : %s"%(StationParameter[0],str((StationParameter[1]))))

E mais:

    print('No Parameter list...')

Aqui está o resultado do script de exemplo:

Os parâmetros válidos são configurados em sua estação.

Parâmetros da estação RoboDK: RoboDK 64 bit v5.5.3.23031

Hora dos parâmetros da estação: 14/02/2023 03:58:29.191.000.000

Parâmetros da estação VelocidadeDaSimulacao : 13,8551

Parâmetros da estação Estação: MyTestStation