使い方

以下の説明にしたがって、OPC UA Clientのプログラムを作成します。

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

OPC UAでロボット制御情報データを取得し、活用するためにOPC UA Clientのプログラムを作成します。OPC UAクライアントのデータ取得フローを以下に示します。

データ数の上限設定

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

データの取得周期の設定

OPC UA Serverによるデータの取得周期を設定します。SamplingIntervalノードで設定できます。OPC UA Clientによるデータ取得周期とは異なることに注意してください。

注意


データ数の上限設定とデータの取得周期の設定によっては、連続したロボット制御情報データを取得できない場合があります。その場合はデータ数の上限を0にし、データの取得周期をより大きな値に設定してください。

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

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

Dataノードの読み取り

Dataノードを参照することで、以下の章にしたがったデータを読み取ることができます。必要に応じてデータをデコードしてください。

データのフォーマット

注意


  • Dataノードの読み取り開始後は、OPC UA Clientで10 ms~100 ms程度の周期でデータを取得し続けるようにしてください。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