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