使用方法
根据以下说明,创建OPC UA Client的程序。
前提条件:假设使用OPC UA Client的库等。(例:Node.js的node-opcua库、Python的opcua-asyncio库)
创建OPC UA Client的程序,以通过OPC UA获取并利用机器人控制信息数据。OPC UA客户端的数据获取流程如下所示。
设置数据数的上限
可通过DataNum节点,设置从OPC UA Server 1次获取的数据数的最大值。
设置数据获取周期
设置基于OPC UA Server的数据获取周期。可通过SamplingInterval节点设置。请注意,这与基于OPC UA Client的数据获取周期不同。
注意
根据数据数的上限设置和数据获取周期的设置,可能无法获取连续的机器人控制信息数据。此时,请将数据数的上限设为0,将数据获取周期设为更大的值。
Data节点的读取开始时点
请以DataExistsStatus节点的状态为判定条件,开始读取Data节点。也可以订阅注册DataExistsStatus节点。DataExistsStatus节点的值为Stop期间,请使其待机,不要读取。
Data节点的读取
通过浏览Data节点,可按以下章节所述读取数据。请根据需要解码数据。
注意
- 开始读取Data节点后,请继续通过OPC UA Client按10ms~100ms左右的周期获取数据。如果Data节点的读取间隔过长,数据可能缺失。在此情况下,ErrorStatus节点变为Warning。如果变为Warning,请确认时间戳等,并恰当地处理数据。
- 如要减少上述的数据缺失,请采取加快数据获取周期、将DataNum设置为0或200、增大SamplingInterval值等措施。
- 为切实地读取数据,请勿订阅注册Data节点。
支持ErrorStatus
通过参考ErrorStatus节点,可以判断是否可以正常获取数据。以下介绍ErrorStatus节点值的含义和处理示例。
| ErrorStatus节点 | 含义 | 处理示例 |
|---|---|---|
| None | 可以获取正常数据。 | 继续读取Data节点。 |
| Warning | 部分数据缺失。 读取Data节点后ErrorStatus返回None。 | 注意Warning期间的数据缺失,继续读取数据。 |
| Error | 无法通过OPC UA服务器获取机器人控制信息数据。 如果可以获取机器人控制信息数据,则ErrorStatus返回None。 | 中断读取数据。 |
下面用伪代码表示获取机器人控制信息数据的程序。请根据使用的OPC UA客户端库的使用方法创建程序。
# Collect the MotionLog 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_DataNum = client.getNode('ns=1;i=20313') # DataNum Node
node_SamplingInterval = client.getNode('ns=1;i=20314') # SamplingInterval Node
node_Data = client.getNode('ns=1;i=20316') # Data Node
node_LoggingStatus = client.getNode('ns=1;i=20317') # MonitorStatus Node
node_DataExistsStatus = client.getNode('ns=1;i=20318') # DataExistsStatus Node
# Setup necessary settings
node_DataNum.setValue(0) # set DataNum
node_SamplingInterval.setValue(0) # set SamplingInterval
# Start data collection
while True: # loop for collect data
while node_DataExistsStatus.getValue() is not 'Ready': # wait to data Exists
sleep(0.01) # wait 10ms
binary_data = node_Data.getValue() # read MotionLog data
decoded_data = decode(binary_data) # decode binary data to readable format
writefile(decoded_data) # write data to file