Exemple de programme PLC

Cette section présente un exemple de programme d'un automate Beckhoff TwinCAT qui communique avec le serveur OPC UA de RoboDK.

PROGRAMME PRINCIPAL

VAR

   bConnected       :BOOL ;

   StationPointer  :DINT ;

   iStep            :INT ;

   bDébut           :BOOL; ;

   i                :INT ;

   TON              :TON ;

   bReset           :BOOL ;

   bWrite           :BOOL ;

   TON2             :TON ;

   bShow         :BOOL:=TRUE ;

   bVis          :BOOL:=True ;

END_VAR

 

VAR

   Nom du robot        :STRING(80):='ABB_RB1' ;

   Item_ID          :ULINT ;

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

   strJoints     :STRING(80):='' ;

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

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

        débogage        :BOOL ;

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

END_VAR

bConnected:=OPCUA_VirtualClient_RoboDK_Station.bConnected ;

 

CASE iStep OF

  

 

   cStepWaitCmd :

        SI bStart ALORS

           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

              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

              ALORS

           iStep:=cStepGetItem ;

        END_IF

        iStep:=cStepGetItem ;

  

   cStepGetItem :

 

        IF OPCUA_VirtualClient_RoboDK_Station.getItem.bDone ALORS

           iStep:=cStepGetItemReset ;

        Item_ID:=OPCUA_VirtualClient_RoboDK_Station.getItem.Item_ID ;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.getItem.bError ALORS

           iStep:=cStepGetItemError ;

        END_IF

       

   cStepGetItemReset :

 

        IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError

              AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

              ALORS

           iStep:=cStepGetJoints ;

        END_IF

   cStepGetJoints :

 

        IF OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone

              AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy

              ALORS

           iStep:=cStepGetJointsReset ;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.getJoints.bError ALORS

              iStep:=991 ;

        END_IF

       

   cStepGetJointsReset :

 

        IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError

              AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

       

              ALORS

           iStep:=cStepGetJointsStr ;

        END_IF ;

       

   cStepGetJointsStr :

 

        IF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone

              AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

              ALORS

        iStep:=cStepGetJointsStrReset ;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError ALORS

        iStep:=cStepGetJointsStrError ;

        END_IF          

 

   cStepGetJointsStrReset :

 

        IF NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError

              AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

              ALORS

              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) ;

        SI TON2.Q ALORS

              TON2(IN:=FALSE) ;

           iStep:=cStepSetJointsStr ;

        END_IF

  

   cStepSetJointsStr :

 

       

        SI (

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone

              ET NON   

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy

         )

              OR NOT bWrite

              ALORS

        iStep:=cStepSetJointsStrReset ;

        ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError           

          ALORS

        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

              ALORS

              iStep:=cStepEnd ;

        END_IF ;

       

   cStepEnd :

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

        SI TON.Q ALORS

              TON(IN:=FALSE) ;

              IF NOT debug ALORS

                    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

        SORTIE ;

    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

Nom_de_l'objet:=Nom_du_robot

) ;

 

 

OPCUA_VirtualClient_RoboDK_Station.getJoints(

bExecute:=iStep=cStepGetJoints

Item_ID:=Item_ID,Joints=>arrJoints

) ;

 

 

OPCUA_VirtualClient_RoboDK_Station.getJointsStr(

bExecute:=iStep=cStepGetJointsStr

,Nom_du_robot:=Nom_du_robot,Joints=>strJoints

) ;

 

SI bWrite ALORS

OPCUA_VirtualClient_RoboDK_Station.setJointsStr(

   bExecute:=TRUE

Nom_du_robot:=Nom_du_robot,Joints:=strJointsCommand) ;

END_IF ;