OPC UA Clientのプログラムを作成する

概要

前提条件: OPC UA Clientのライブラリ等を使用することを想定しています(例: Node.jsのnode-opcuaライブラリや、Pythonのopcua-asyncioライブラリ)。

OPC UAで力覚センサーデータを取得し、活用するためにOPC UA Clientのプログラムを作成します。RecordStart1回分のデータを取得するための、OPC UAクライアントのデータ取得フローを以下に示します。

データタイプの選択

取得したいデータの種類に応じて、DataTypeノードを0~3のいずれかに設定します。取得できるデータの違いについては、以下を参照してください。

データのフォーマット

データ数の上限設定

OPC UA Serverから1度に取得するデータ数の最大値は、DataNumノードで設定できます。

以上の設定は、Portノードの設定前に行ってください。

データ出力先の選択

RecordStartの実行により得られるデータの出力先を、Epson RC+またはOPC UAにするか選択することができます。OPC UAに出力する場合は、PortノードをTrueに設定してください。PortノードはRecordStart実行前に設定してください。

注意


データの出力先は、Epson RC+またはOPC UAの片方のみです。Epson RC+とOPC UAの両方に同時でデータ取得をすることはできません。

Dataノードの読み取り開始のタイミング

Dataノードの読み取り開始はMonitoringStatusノードの状態を判定の条件にして、実行するようにしてください。MonitoringStatusノードは、サブスクリプション登録することもできます。MonitoringStatusノードの値がStopの間は、読み取りをしないように待機させてください。

または、DataExistsStatusを判定の条件にすることもできます。

Dataノードの読み取り

Dataノードを参照することで、以下の章にしたがったデータを読み取ることができます。

データのフォーマット

最初にヘッダーを読み取ります。次にデータ部を複数読み取り、最後にフッダーを読み取り、終了します。必要に応じてデータをデコードしてください。OPCUACommonTagの値にしたがって、読み取りの実行や終了をしてください。

注意


  • RecordStart実行後は、OPC UA Clientで数10~数100ms間隔でデータを取得し続けるようにしてください。Dataノードの読み取り間隔が長いとデータが欠ける場合があります。その場合、ErrorStatusノードがWarningになります。Warningになった場合は、タイムスタンプ等を確認して、適切なデータ処理を行ってください。
  • 上記のようなデータの欠けを低減したい場合、データを取得する周期を早くする, DataTypeノードを使ってデータタイプを変更する, RecordStartで指定する測定間隔を長くする, などの対応をしてください。
  • データを確実に読み取るために、Dataノードはサブスクリプション登録しないでください。

Dataノードの読み取りの終了条件

読み取ったデータのOPCUACommonTagが4のときに、Dataノード読み取りを終了してください。

OPCUACommonTag=4の場合、フッターを読み取ったことを示しています。

キーポイント


RecordStartを繰り返し実行する場合は、上記のデータ取得フローを繰り返し行ってください。

以下に、RecordStart1回分に該当するデータを取得するプログラムを疑似コードで示します。使用する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