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;