建立OPC UA Client的程式

概述

前提條件:以使用OPC UA Client的程式庫等為前提。(範例:Node.js的node-opcua程式庫、Python的opcua-asyncio)

在OPC UA取得力覺感應器資料,並建立OPC UA Client的程式,以有效活用取得之資料。以下OPC UA用戶端的數據採集流程用於取得RecordStart一次資料。

選擇資料類型

依照欲取得資料的種類,將DataType節點設定為0~3的任一值。關於可取得的資料的差異,請參閱下列章節。

資料格式

資料數量的上限設定

您可以透過DataNum節點,設定從OPC UA Server一次性取得的資料數量最大值。

請在設定Port節點前完成上述設定。

選擇資料輸出目的地

透過執行RecordStart而取得的資料,可選擇Epson RC+或OPC UA為其輸出目的地。若選擇輸出至OPC UA,請將Port節點設定為True。請在執行RecordStart之前設置Port節點。

注意


資料的輸出目的地將為Epson RC+或OPC UA的其中一方。您無法同時從Epson RC+與OPC UA雙方取得資料。

Data節點開始讀取的時序

請將MonitoringStatus節點的狀態,設為Data節點開始讀取的判斷條件,並予以執行。亦可註冊訂閱MonitoringStatus節點。在MonitoringStatus節點的值為Stop的期間,請維持等待狀態,避免進行讀取。

或也可以將DataExistsStatus設為判斷條件。

讀取Data節點

可按照下列章節的說明,透過參照Data節點來讀取資料。

資料格式

首先讀取標頭。接下來讀取多個資料部,最後讀取註腳後即結束。請視需要解碼資料。請依照OPCUACommonTag的值,執行或結束讀取作業。

注意


  • 執行RecordStart後,請以數10~數100ms為間隔,在OPC UA Client持續取得資料。若Data節點的讀取時間過長,將可能導致資料缺漏。屆時,ErrorStatus節點將會變為Warning。若變為Warning,請在確認時戳等資訊後,進行適當的資料處理。
  • 若想減少發生上述資料短少之情形,請實施相關對策,例如調快資料的取得週期、使用DataType節點更改資料類型、拉長透過RecordStart指定的測定間隔等。
  • 為確實讀取資料,請勿註冊訂閱Data節點。

Data節點的讀取結束條件

請在讀取完成資料的OPCUACommonTag為4時,結束Data節點的讀取。

若OPCUACommonTag=4,則代表已完成註腳的讀取。

提示


需重複執行RecordStart時,請重複執行上述的資料取得流程。

以下為以虛擬碼表示取得相當於執行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