使用

新增伺服器

新增TwincCAT3專案,然後選擇I/O>右擊>點下Add New Item

OPC UA - 图片 47

OPC菜單中選擇Virtual OPC UA Device然後點擊OK

OPC UA - 图片 48

OPC UA Virtual 被新增在你的專案中。

OPC UA - 图片 49

現在我們需要在TwinCAT專案中新加RoboDK OPC UA 伺服器。選擇Device 1 >右擊>點擊Add New Item

OPC UA - 图片 50

從菜單中選擇OPC UA Client(Module)然後OK

OPC UA - 图片 51

你的專案中追加了OPC UA 客戶介面。

OPC UA - 图片 52

設定OPCUA 伺服器

打開OPC UA 客戶介面然後點擊“Select Endpoint”去設定你要讀取的OPC UA伺服器。

OPC UA - 图片 53

輸入你的OPC UA伺服器地址然後點擊Update

OPC UA - 图片 54

新增RoboDK 伺服器method

點擊 “Add Nodes” 你就可以用瀏覽其OPC 伺服器的NodeMethod

OPC UA - 图片 55

如果TwinCATOPC 伺服器是已經連接你就可以瀏覽到所有的情報。

OPC UA - 图片 56

選擇所有的Methods然後按下OK

OPC UA - 图片 57

RoboDK OPC 伺服器中所有的method都追加了在你的專案中。

OPC UA - 图片 58

自動生成RoboDK Method

設定你自動生成程式的預設名稱。

OPC UA - 图片 59

點擊“Create Plc Code”

OPC UA - 图片 60

OpcUaClient檔案夾會被新增到你的PLC專案中,然後你會找到所有的RoboDK Method會被自動轉換成IEC61131-3 功能塊格式。

OPC UA - 图片 61

PLC 程式例子

.以下是利用剛才自動生成的功能塊編寫PLC程式來讀寫RoboDK OPC UA 伺服器的程式例子。

PROGRAM MAIN

VAR

   bConnected       :BOOL;

   StationPointer  :DINT;

   iStep            :INT;

   bStart           :BOOL;;

   i                :INT;

   TON              :TON;

   bReset           :BOOL;

   bWrite           :BOOL;

   TON2             :TON;

   bShow         :BOOL:=TRUE;

   bVis          :BOOL:=True;

END_VAR

 

VAR

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

    debug      :BOOL;

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

END_VAR

bConnected:=OPCUA_VirtualClient_RoboDK_Station.bConnected;

 

CASE iStep OF

  

 

   cStepWaitCmd:

    IF bStart THEN

       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

          THEN

       iStep:=cStepGetItem;

    END_IF

    iStep:=cStepGetItem;

  

   cStepGetItem:

 

    IF OPCUA_VirtualClient_RoboDK_Station.getItem.bDone THEN

       iStep:=cStepGetItemReset;

    Item_ID:=OPCUA_VirtualClient_RoboDK_Station.getItem.Item_ID;

    ELSIF OPCUA_VirtualClient_RoboDK_Station.getItem.bError THEN

       iStep:=cStepGetItemError;

    END_IF

   

   cStepGetItemReset:

 

    IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

          THEN

       iStep:=cStepGetJoints;

    END_IF

   cStepGetJoints:

 

    IF OPCUA_VirtualClient_RoboDK_Station.getJoints.bDone

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getJoints.bBusy

          THEN

      iStep:=cStepGetJointsReset;

    ELSIF OPCUA_VirtualClient_RoboDK_Station.getJoints.bError THEN

          iStep:=991;

    END_IF

   

   cStepGetJointsReset:

 

    IF NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bError

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getItem.bBusy

   

          THEN

       iStep:=cStepGetJointsStr;

    END_IF;

   

   cStepGetJointsStr:

 

    IF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bDone

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

          THEN

    iStep:=cStepGetJointsStrReset;

    ELSIF OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError THEN

    iStep:=cStepGetJointsStrError;

    END_IF          

 

   cStepGetJointsStrReset:

 

    IF NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bError

          AND NOT OPCUA_VirtualClient_RoboDK_Station.getJointsStr.bBusy

          THEN

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

    IF TON2.Q THEN

       TON2(IN:=FALSE);

       iStep:=cStepSetJointsStr;

    END_IF

  

   cStepSetJointsStr:

 

   

    IF (

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bDone

          AND NOT   

        OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bBusy

         )

          OR NOT bWrite

          THEN

    iStep:=cStepSetJointsStrReset;

    ELSIF OPCUA_VirtualClient_RoboDK_Station.setJointsStr.bError           

          THEN

    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

          THEN

       iStep:=cStepEnd;

    END_IF;

   

   cStepEnd:

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

    IF TON.Q THEN

          TON(IN:=FALSE);

          IF NOT debug THEN

             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

    EXIT;

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

,Item_Name:=Robot_name

);

 

 

OPCUA_VirtualClient_RoboDK_Station.getJoints(

bExecute:=iStep=cStepGetJoints

,Item_ID:=Item_ID,Joints=>arrJoints

);

 

 

OPCUA_VirtualClient_RoboDK_Station.getJointsStr(

bExecute:=iStep=cStepGetJointsStr

,Robot_name:=Robot_name,Joints=>strJoints

);

 

IF bWrite THEN

OPCUA_VirtualClient_RoboDK_Station.setJointsStr(

   bExecute:=TRUE

,Robot_name:=Robot_name,Joints:=strJointsCommand);

END_IF;