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;