创建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