OPC-UA

Abilitare OPC-UA Add -in

Questo documento le mostrerà come può aggiungere la connettività OPC-UA a RoboDK. Una connessione OPC UA le consente di interagire con i PLC e altri dispositivi che supportano questo protocollo. Deve abilitare il componente aggiuntivo OPC-UA in RoboDK per aggiungere le funzioni di server e client OPC UA ai suoi progetti.

RoboDK include un add-in OPC-UA che le permette di aggiungere la compatibilità OPC UA ai suoi progetti RoboDK.

Per impostazione predefinita, RoboDK ha il componente aggiuntivo OPC-UA disattivato. Una volta abilitato, il componente aggiuntivo dovrebbe essere visualizzato ad ogni avvio di RoboDK.

Può abilitare l'add-in OPC UA seguendo questi passaggi:

1.Selezioni Strumenti-Add-in.

2.Fare doppio clic su OPC-UA.

Dovrebbe vedere una barra degli strumenti aggiuntiva con le funzioni OPC-UA.

OPC UA - Figura 1    OPC UA - Figura 2

Dovrebbe vedere il pulsante OPC-UA nella barra degli strumenti e anche la voce OPC-UA nel menu.

OPC UA - Figura 3

Esempio di server OPC UA

In questo esempio imparerà come abilitare l'addin OPC UA e convertire RoboDK in un server OPC UA. Esamineremo alcune impostazioni utilizzando il software UaExpert e Beckhoff TwinCAT3 TF6100.

OPC UA - Figura 4

Configuri il suo Server OPC UA

L'add-in OPC UA le consente di configurare alcune impostazioni, come la porta del server. Può anche scegliere di attivare il server, disattivarlo o avviarlo automaticamente con RoboDK.

Con l'add-in OPC UA abilitato, selezioni Impostazioni OPC UA-OPC-UA per configurare le impostazioni OPC UA.

La schermata Impostazioni OPC UA è visualizzata sul lato sinistro, come mostrato nell'immagine seguente.

OPC UA - Figura 5

OPC UA - Figura 6

Se vede un messaggio come "Il server OPC UA di RoboDK è in esecuzione sulla porta 4840", significa che il server OPC UA di RoboDK è stato avviato.

Crei la sua stazione personale

Può testare la connettività OPC UA con qualsiasi stazione RoboDK che abbia uno o più robot.

OPC UA - Figura 7

Implementazione con UaExpert

Può utilizzare il software UaExpert per testare la connettività con il Server OPC UA RoboDK.

Può scaricare la versione gratuita del software UaExpert dal sito web di Unified Automation: https://www.unified-automation.com/downloads/opc-ua-clients.html.

OPC UA - Figura 8

Aggiungi il server UaExpert

Avvii UaExpert e clicchi sul pulsante "+" per aggiungere il server RoboDK OPC UA.

OPC UA - Figura 9

Espanda la sezione Custom Discovery e selezioni l'opzione <Doppio clic per aggiungere il server.> per aggiungere il server RoboDK OPC UA.

OPC UA - Figura 10

Inserisca l'URL del server OPC UA, opc.tcp://127.0.0.1:48440 che ha configurato nel passaggio precedente.

OPC UA - Figura 11

Colleghi il Server OPC UA con la sicurezza "Nessuno".

OPC UA - Figura 12

Il server è configurato.

OPC UA - Figura 13

Si connetta al server

Ora può collegarsi al server RoboDK OPC UA da UaExpert.

OPC UA - Figura 14

Può vedere i Nodi e i Metodi quando viene stabilita la connessione.

OPC UA - Figura 15

Nodi server

Ci sono alcuni nodi all'interno del server RoboDK OPC UA che le permettono di scambiare alcune informazioni di base sulla sua stazione.

RoboDK

Il nodo RoboDK è un nodo che fornisce la versione effettiva del suo software RoboDK.

OPC UA - Figura 16

In questo esempio è stata utilizzata la versione RoboDK 64 Bit v5.5.3.23031.

OPC UA - Figura 17

SimulationSpeed

La Velocità di simulazione è un nodo che mostra la Velocità di simulazione attuale e consente all'utente di sovrascrivere la Velocità di simulazione corrente.

OPC UA - Figura 18

Il valore del nodo è riferito alla barra di scorrimento della velocità di simulazione.

La Simulazione corrente può essere letta da questo nodo e può sovrascrivere la velocità di simulazione.

OPC UA - Figura 19

Stazione

Il Nodo Stazione è un nodo che consente all'utente di ottenere il nome attuale della Stazione in RoboDK.

OPC UA - Figura 20

Come si vede qui sotto, il nodo Stazione fa riferimento al suo "Nome Stazione" in RoboDK.

OPC UA - Figura 21

Parametri della stazione/Valore della stazione

Station Parameter e Station Value sono una coppia di Nodi che consente all'utente di ottenere o impostare qualsiasi parametro all'interno della sua Stazione. Il Server OPC UA RoboDK monitorerà continuamente il valore effettivo di "StationParameter" e restituirà il valore di tale "StationParameter", dal Nodo Station Value.

OPC UA - Figura 22

Può visualizzare i parametri della sua Stazione facendo clic con il pulsante destro del mouse sulla sua Stazione RoboDK>Parametri della Stazione.

OPC UA - Figura 23

Nel campo Parametri costanti, può vedere i parametri predefiniti della stazione e il loro valore.

OPC UA - Figura 24

Il parametro della stazione fa riferimento al campo "Parametro" e il valore della stazione fa riferimento al campo "Valore".

OPC UA - Figura 25

E possiamo creare i nostri parametri cliccando sul pulsante "Aggiungi".

OPC UA - Figura 26

Viene aggiunto un nuovo parametro Stazione.

OPC UA - Figura 27

Inserisca il nome del parametro e il valore del parametro, quindi prema Applica per salvarlo.

OPC UA - Figura 28

Può anche ottenere il suo parametro di stazione personale.

OPC UA - Figura 29

Tempo

Il nodo time è un nodo che le permette di ottenere l'ora attuale della RoboDK Station.

OPC UA - Figura 30

Viene restituito un valore con il formato DataTime.

OPC UA - Figura 31

E questo Nodo viene aggiornato continuamente.

OPC UA - Figura 32

Metodi

Il server RoboDK OPC UA è dotato anche di alcuni metodi per consentire all'utente di accedere ai dati della stazione RoboDK in modo dinamico.

Possiamo semplicemente fare clic con il pulsante destro del mouse su Metodo>Chiama per eseguire il metodo.

OPC UA - Figura 33

getItem

getItem è un metodo che consente all'utente di ottenere il puntatore del suo elemento.

OPC UA - Figura 34

Per gli InputArguments, è necessario il Nome del dispositivo, si può immaginare che il Nome del dispositivo sia il Nome della stazione, il Nome del robot, ecc. E Item ID è l'OutputArguments che restituisce il puntatore di quel dispositivo.

OPC UA - Figura 35

In questo esempio, ho ricevuto l'ID articolo (puntatore) del mio robot ABB che si chiama "ABB_RB1".

OPC UA - Figura 36

0 viene restituito se il nome dell'articolo non è valido o non esiste nella sua stazione.

OPC UA - Figura 37

getJoints

getJonits è un metodo che consente all'utente di ottenere il valore del giunto del robot dalla stazione, in base all'ID dell'oggetto.

OPC UA - Figura 38

L'ID dell'elemento è il valore del puntatore del suo elemento e può ottenerlo dal metodo getItem().

OPC UA - Figura 39

Otterremo l'ID dell'articolo con questo nome di articolo "ABB_RB1" e verrà restituito un valore UInt64.

OPC UA - Figura 40

Il valore dei giunti viene restituito quando si passa l'ID dell'articolo nel metodo che abbiamo ottenuto in precedenza.

OPC UA - Figura 41

getJointsStr

getJointsStr è un metodo che consente all'utente di ottenere il valore Joints in base a un valore stringa.

OPC UA - Figura 42

Possiamo passare il nome del robot (String) in questo metodo.

OPC UA - Figura 43

In La mia stazione, ABB_RB1 è il nome del mio robot.

OPC UA - Figura 44

Possiamo semplicemente passare "ABB_RB1" nel parametro Nome robot e chiamare il metodo - Viene restituito il valore del giunto in formato stringa.

OPC UA - Figura 45

setJointsStr

setJointsStr è un metodo che consente all'utente di impostare il valore Joints del Robot, in base a un valore stringa.

OPC UA - Figura 46

Nel nome del robot, viene passato ABB_RB1 e possiamo semplicemente passare una stringa con il valore del giunto nel parametro Giunti.

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

OPC UA - Figura 47

Implementazione con Beckhoff TwinCAT 3

Può utilizzare il software Beckhoff TwinCAT 3 per testare la connettività con il Server RoboDK OPC UA.

Aggiungere il server TwinCAT3

Può iniziare creando il client OPC UA selezionando I/O>Devices>Add New Item.

OPC UA - Figura 48

Selezionare Dispositivo OPC UA virtuale da OPC >OK.

OPC UA - Figura 49

OPC UA Virtual è inserito.

OPC UA - Figura 50

Dobbiamo aggiungere un client OPC UA per accedere al server RoboDK OPC UA.

Selezioni il Dispositivo 1 >Click destro >Aggiungi nuovo elemento.

OPC UA - Figura 51

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

OPC UA - Figura 52

Il client OPC UA è inserito.

OPC UA - Figura 53

Configurare il server

Apra il client OPC UA >Andare alla scheda Impostazioni>cliccare su "Seleziona endpoint" per configurare l'endpoint del server OPC UA a cui desidera accedere.

OPC UA - Figura 54

Inserisca l'URL del server RoboDK OPC UA e lo aggiorni.

OPC UA - Figura 55

Aggiungi il metodo del server RoboDK

Prema "Aggiungi nodi" per sfogliare il nodo che si trova all'interno del Server OPC UA.

OPC UA - Figura 56

Se la connessione tra TwinCAT e il server OPC UA è stabilita, può sfogliare i dettagli del server OPC UA.

OPC UA - Figura 57

Selezionare tutti i metodi e cliccare su Ok.

OPC UA - Figura 58

I metodi sono inseriti nella sua Configurazione.

OPC UA - Figura 59

Generazione automatica del metodo RoboDK

Configuri il prefisso del suo nome in questo campo.

OPC UA - Figura 60

Premere "Crea codice Plc" per creare il codice PLC da TwinCAT.

OPC UA - Figura 61

Nel suo progetto viene creata una cartella OpcUaClient e tutti i RoboDK Method vengono creati nel formato IEC61131-3 Function Block.

OPC UA - Figura 62

Esempio di programma PLC

Questa sezione mostra un esempio di programma di un PLC Beckhoff TwinCAT che comunica con il server RoboDK OPC UA.

PROGRAMMA PRINCIPALE

VAR

   bConnesso       :BOOL;

   StazionePointer :DINT;

   iStep           :INT;

   bInizio         :BOOL;;

   i               :INT;

   TON             :TON;

   bReset          :BOOL;

   bScrivere       :BOOL;

   TON2            :TON;

   bShow           :BOOL:=TRUE;

   bVis            :BOOL:=Vero;

END_VAR

 

VAR

   Nome_robot      :STRING(80):='ABB_RB1';

   ID_articolo           :ULINT;

   arrGiunti       :ARRAY[0..11]DI LREAL;

   strJoints       :STRING(80):='';

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

   sSeparatore     :STRING(1) := ',';

   arrJointsCommand:ARRAY[1..11]DI LREAL;

   strJointsCommand:STRING(80);

END_VAR

 

VAR COSTANTE

   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] DI STRINGA(80);

      bResultSplit :BOOL;

        debug      :BOOL;

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

END_VAR

bConnected:=OPCUA_VirtualClient_RoboDK_Station.bConnected;

 

CASO iStep di

  

 

   cStepWaitCmd:

        SE bStart ALLORA

              iStep:=cStepInit;

              bStart:=FALSE;

        END_IF

  

   cStepInit:

 

        StationPointer:=0;

        PER i :=1 A 11 FARE

              arrJoints[i]:=0,0;

              arrJointsFromStr[i]:=0.0;

              aSplit[i]:='';

        FINE_FOR

        SE NON OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

              E NON OPCUA_VirtualClient_RoboDK_Station.getItem.bError

              E NON OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy

              E NON OPCUA_VirtualClient_RoboDK_Station.getJoints.bError

              E NON OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

              E NON OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError

              E NON OPCUA_VirtualClient_RoboDK_Station.setJoints.bBusy

              E NON OPCUA_VirtualClient_RoboDK_Station.setJoints.bError

              E NON OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy

              E NON OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError

              ALLORA

              iStep:=cStepGetItem;

        END_IF

        iStep:=cStepGetItem;

  

   cStepGetItem:

 

        SE OPCUA_VirtualClient_RoboDK_Station.getItem.bDone ALLORA

              iStep:=cStepGetItemReset;

        Item_ID:=OPCUA_VirtualClient_RoboDK_Station.getItem.Item_ID;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.getItem.bError ALLORA

              iStep:=cStepGetItemError;

        END_IF

       

   cStepGetItemReset:

 

        SE NON OPCUA_VirtualClient_RoboDK_Station.getItem.bError

              E NON OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

              ALLORA

              iStep:=cStepGetJoints;

        END_IF

   cStepGetJoints:

 

        SE OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone

              E NON OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy

              ALLORA

              iStep:=cStepGetJointsReset;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.getJoints.bError ALLORA

              iStep:=991;

        END_IF

       

   cStepGetJointsReset:

 

        SE NON OPCUA_VirtualClient_RoboDK_Station.getItem.bError

              E NON OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

       

              ALLORA

              iStep:=cStepGetJointsStr;

        END_IF;

       

   cStepGetJointsStr:

 

        SE OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone

              E NON OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

              ALLORA

              iStep:=cStepGetJointsStrReset;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError ALLORA

              iStep:=cStepGetJointsStrError;

        END_IF         

 

   cStepGetJointsStrReset:

 

        SE NON OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError

              E NON OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

              ALLORA

                   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:=VERO,PT:=T#0,2S);

        SE TON2.Q ALLORA

              TON2(IN:=FALSE);

              iStep:=cStepSetJointsStr;

        END_IF

  

   cStepSetJointsStr:

 

       

        SE (

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone

              E NON   

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy

         )

              O NON bWrite

              ALLORA

              iStep:=cStepSetJointsStrReset;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError           

          ALLORA

              iStep:=cStepSetJointsStrError;

        END_IF    

             

   cStepSetJointsStrReset:

        bWrite:=FALSE;

         OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bExecute:=FALSE;

        SE NON OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError

              E NON OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy

              ALLORA

              iStep:=cStepEnd;

        END_IF;

       

   cStepEnd:

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

        SE TON.Q ALLORA

              TON(IN:=FALSE);

              SE NON debug ALLORA

                   iStep:=10;

              ELSE

                   iStep:=cStepSetJointStrDelay;

              END_IF;

        END_IF

       

   cStepGetItemError:

        ID_articolo:=0;

        iStep:=cStepWaitReset;

  

   cStepGetJointsError:

        PER i :=0 A 11 FARE

              arrJoints[i]:=-99999.99;

        FINE_FOR

        iStep:=cStepWaitReset;

       

   cStepGetJointsStrError:

        strJoints:='';

        iStep:=cStepWaitReset;

       

   cStepWaitReset:

        SE bReset ALLORA

              iStep:=cStepInit;

              bReset:=FALSE;

        END_IF;   

END_CASE

 

aSplit[1] := strJoints;

 

PER i:=1 A 7 FARE

    bResultSplit := FindAndSplit(

   pSeparatore := ADR(sSeparatore)

   pSrcString := ADR(aSplit[i])

   pLeftString:= ADR(aSplit[i])

   nLeftSize := SIZEOF(aSplit[i])

   pRightString:= ADR(aSplit[i+1])

   nDimensione destra := SIZEOF(aSplit[i+1])

   bSearchFromRight := FALSE );

    SE NON bResultSplit ALLORA

        USCIRE;

    END_IF

FINE_FOR

 

PER i :=1 A 6 FARE

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

END_FOR;

 

//

OPCUA_VirtualClient_RoboDK_Station.getItem(

bExecute:=iStep=cStepGetItem

Nome_oggetto:=Nome_Robot

);

 

 

OPCUA_VirtualClient_RoboDK_Station.getJoints(

bExecute:=iStep=cStepGetJoints

ID_articolo:=ID_articolo, Giunti=>arrGiunti

);

 

 

OPCUA_VirtualClient_RoboDK_Station.getJointsStr(

bExecute:=iStep=cStepGetJointsStr

Nome_robot:=Nome_robot,Giunti=>strGiunti

);

 

SE bScrittura ALLORA

OPCUA_VirtualClient_RoboDK_Station.setJointsStr(

   bExecute:=TRUE

   Nome_robot:=Nome_robot,Giunti:=strComandoGiunti);

END_IF;

Esempio di client OPC UA

Questo esempio le mostrerà come può aggiungere la connettività OPC-UA Client a RoboDK. RoboDK include un add-in OPC-UA che le consente di aggiungere la compatibilità OPC UA ai suoi progetti RoboDK.

In questo esempio imparerà come ottenere i dati dalla RoboDK Station tramite il client OPC UA.

OPC UA - Figura 63

Viene visualizzata la schermata dei parametri della stazione e prema "Cancella tutto" per cancellare tutti i parametri della stazione.

OPC UA - Figura 64

Implementazione con interfaccia

Possiamo creare un altro progetto RoboDK con il server OPC UA configurato e avviato.

OPC UA - Figura 65

Aggiungi cliente

Questa sezione mostra come aggiungere un client OPC UA.

Inserisca l'URL dell'endpoint, ad esempio: opc.tcp://127.0.0.1:48441.

Deve abbinare l'indirizzo IP e la configurazione della porta al suo server OPC UA di destinazione.

OPC UA - Figura 66

Premere "Connetti" per stabilire la connessione.

se appare un messaggio con" Recupero delle variabili del server. Clicchi con il tasto destro del mouse sull'elemento della stazione e selezioni 'Parametri della stazione' per vedere le variabili", la connessione è stabilita.

OPC UA - Figura 67

Clicchi con il tasto destro del mouse sulla sua Stazione e selezioni "Parametri della Stazione".

OPC UA - Figura 68

Nodi client

Può controllare i dettagli di ogni Nodo dalla sezione Nodi.

OPC UA - Figura 69

Implementazione con l'API RoboDK

Dopo aver ottenuto i dati dei nodi dal server OPC UA tramite il client OPC UA in RoboDK, può anche ottenere questi dati utilizzando RoboDK-Python-API.

Installazione

Può fare riferimento a questo link per installare la Python-API di RoboDK.

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

Oppure installi manualmente il pacchetto RoboDK per Python:

pip installare robodk

Script

Questo esempio di script mostra come ottenere i parametri della stazione tramite l'API Python di RoboDK.

da robodk importa robolink # API RoboDK

 

RDK = robolink.Robolink()

 

da robodk importa * # API RoboDK

da robolink import * # Robot toolbox

itemlist = RDK.ItemList()

se itemlist:

    # Ottenere tutti i parametri della stazione

    print('I parametri Vaild sono configurati nella sua Stazione...')

    StationParameters=RDK.getParams()

    per StationParameter in StationParameters:

        print("Parametri stazione %s : %s"%(Parametro stazione[0],str((Parametro stazione[1]))))

altro:

    print('Nessun elenco di parametri...')

Ecco il risultato dello script di esempio:

I parametri Vaild sono configurati nella sua Stazione...

Parametri della stazione RoboDK : RoboDK 64 bit v5.5.3.23031

Parametri della stazione ora : 02/14/2023 03:58:29.191.000.000

Parametri della stazione SimulationSpeed : 13,8551

Parametri della stazione Stazione : MyTestStation