创建OPC UA Client的程序
概要
前提条件:以使用OPC UA Client 库为前提。(例:Node.js 的node-opcua 库和Python 的opcua-asyncio)
创建OPC UA Client的程序,以通过OPC UA获取并利用力觉传感器数据。如下所示为用于获取RecordStart1次部分数据的OPC UA客户端的数据获取流程。
选择数据类型
根据想要获取的数据类型,将DataType 节点设置到0~3中任意一个。有关与可获取数据之间的差异,请参阅以下内容。
设置数据数量的上限
从OPC UA Server 一次性获取的数据数量的最大值可通过DataNum 节点设置。
在设置Port节点之前,请进行上述设置。
选择数据输出目标
可选择将通过执行RecordStart 获取的数据输出至Epson RC+或OPC UA。如要输出至OPC UA,请将Port 节点设置为True。请在运行前设置Port节点。
注意
数据仅输出至Epson RC+或OPC UA。无法同时对Epson RC+与OPC UA进行数据的获取。
Data节点读取开始的时点
请将MonitoringStatus节点状态作为判断条件,开始执行Data节点的读取。MonitoringStatus节点也可注册订阅。在MonitoringStatus节点的值为Stop时,请让其待机,避免进行读取。
或者,也可将DataExistsStatus作为判断条件。
读取Data节点
通过浏览Data节点,可按以下章节所述读取数据。
首先读取头部。接下来,读取多个数据部分,最后读取尾部并结束。请根据需要对数据进行解码。请根据OPCUACommonTag 的值,执行和结束读取。
注意
- 执行RecordStart 后,请继续通过OPC UA Client以数十至数百毫秒的时间间隔获取数据。如果Data 节点的读取间隔过长,数据可能缺失。在此情况下,ErrorStatus节点变为Warning。如果变为Warning,请确认时间戳等,并恰当地处理数据。
- 如要降低上述数据缺失的风险,请采取加快数据获取周期、用DataType节点变更数据类型、增加通过RecordStart指定的测量间隔等措施。
- 为确实地读取数据,请勿注册订阅Data节点。
Data节点读取的结束条件
在读取的数据的OPCUACommonTag为4时,请结束Data节点的读取。
OPCUACommonTag=4时,表示已读取尾部。
要点
如要重复执行RecordStart,请重复上述的数据获取流程。
下面以伪代码表示获取1次RecordStart所对应的数据的程序。请根据所使用的OPC UA客户端库的使用方法创建编程。
# Collect the force sensor data from OPC UA Server of Epson Robot Controller.
# * This is pseudo code.
# Create OPC UA Client
client = create_opcua_client() # Create OPC UA Client Instance
client.connect('opc.tcp://192.168.0.1:4840') # Connect to OPC UA Server
# Get node object
node_DataType = client.getNode('ns=1;i=196611') # DataType Node
node_DataNum = client.getNode('ns=1;i=196612') # DataNum Node
node_Port = client.getNode('ns=1;i=196609') # Port Node
node_DataExistsStatus = client.getNode('ns=1;i=196867') # DataExistsStatus Node
node_MonitorStatus = client.getNode('ns=1;i=196866') # MonitorStatus Node
node_Data = client.getNode('ns=1;i=196865') # Data Node
# Setup necessary settings
node_DataType.setValue(0) # set DataType
node_DataNum.setValue(1000) # set DataNum
node_Port.setValue(True) # set Port
# Start data collection
while node_MonitorStatus.getValue() is not 'Run': # wait to RecordStart
sleep(0.1) # wait 100ms
while True: # loop for collect data
while node_DataExistsStatus.getValue() is not 'Ready': # wait to data Exists
sleep(0.1) # wait 100ms
binary_data = node_Data.getValue() # read force sensor data
decoded_data = decode(binary_data) # decode binary data to readable format
writefile(decoded_data) # write data to file
if binary_data[0] == 0x4: # if Footer received,
break # then end loop