この記事では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
Soruce Code
https://github.com/soup01Threes/TwinCAT3/blob/main/Demo_Project_Play%20with%20OPCUA.zip