RoboDK#TwinCATとOPCUA連携し異なるプログラム起動する

この記事ではRoboDKからOPCUA Client立ち上げ、TwinCATにあるOPCUA Serverと通信し、コマンド値によって違うプログラムを起動する方法を紹介したいと思います。

よろしくおねがいします。ではまずStationを作成し2つのRobotプログラムを作りましょう。


RoboDK Side

Program1

こちらはプログラム1です。


Program2

こちらはProgram2です。

Python Script

次はPython Scriptを追加します。

次はPython Scriptを右クリック>Edit Python Scriptします。

Code

こちらのライブラリを使用します。

pip install opcua

https://github.com/FreeOpcUa/python-opcua

from opcua import Client,ua
from robodk import robolink    # RoboDK API
from robodk import robomath    # Robot toolbox
RDK = robolink.Robolink()

def SetNodeValue(Node,value):
    DataType=Node.get_data_type_as_variant_type()
    DataValue=ua.DataValue(ua.Variant(value,DataType))
    Node.set_data_value(DataValue)

item = RDK.Item(‘UR3’)
if item.Valid():
    print(‘Robot is found..’)

Programs=[‘Coke’,’Beer’]

ENDPOINT=’opc.tcp://127.0.0.1:4840′
REGSNODE=’ns=4;s=GVL.Reg’
BUSYNODE=’ns=4;s=GVL.bBusy’
ENDNODE=’ns=4;s=GVL.bEnd’

GetProgram=False

client=Client(ENDPOINT)
client.connect()
Regs=client.get_node(REGSNODE)
Busy=client.get_node(BUSYNODE)
End=client.get_node(ENDNODE)
_busy=False
SetNodeValue(Busy,False)
while True:
    cmd=Regs.get_value()[0]
    if cmd is 0:
        GetProgram=False
        _busy=False
        SetNodeValue(Busy,False)
        SetNodeValue(End,False)
        _busy=False
       
    if cmd >0  :
        if not GetProgram and not _busy :
            prog=RDK.Item(Programs[cmd-1])
            print(prog.Name())
            GetProgram=True
        if not _busy:
            value = prog.RunProgram()
            SetNodeValue(Busy,True)
            SetNodeValue(End,False)
            _busy=True
        if not prog.Busy() :
            SetNodeValue(Busy,False)
            SetNodeValue(End,True)
            GetProgram=False
            

TwinCAT Side

こちらはRoboDKとTwinCATのFlow Chartです。

TwinCATがScreenでプログラムを選択し、Startコマンドを贈ります。RoboDKがTwinCATからのCommandが0以外の値をまち、条件成立するとまずいまRobot Programが実行中かどうかCheckします。もしBusyではなければPython Script内からRobot Program Objectを取得し、Programを実行します。そしてProgramが実行終わったらEND FlagをTwinCATに渡します。そしてTwinCATはコマンドをリセットし、RoboDKもコマンドが0だと検知し、EndやBusyのFlagをリセットします。

GVL

先書いてたのFlow制御プログラムです。

{attribute ‘qualified_only’}
VAR_GLOBAL
{attribute ‘OPC.UA.DA’ := ‘1’}
Reg:ARRAY[0..99]OF INT;
{attribute ‘OPC.UA.DA’ := ‘1’}
bBusy:BOOL;
{attribute ‘OPC.UA.DA’ := ‘1’}
bEnd:BOOL;

END_VAR

MAIN

RoboDKとHandshake制御をするプログラムです。.

VAR

PROGRAM MAIN
VAR
bBeer:BOOL;
bCoke:BOOL;
p1:R_TRIG;
END_VAR

Program

IF bBeer THEN
bBeer:=FALSE;
GVL.Reg[0]:=1;
END_IF

IF bCoke THEN
bCoke:=FALSE;
GVL.Reg[0]:=2;
END_IF

p1(clK:=GVL.bEnd);

IF  p1.Q THEN
GVL.Reg[0]:=0;
END_IF

Screen

BeerやCokeのプログラムを選べます。

Result

https://youtu.be/2rpX9jBX2yo

Soruce Code

https://github.com/soup01Threes/TwinCAT3/blob/main/Demo_Project_Play%20with%20OPCUA.zip

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする