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 ;