OPCUA 節點
OPC Unified Architecture (UA) 於 2008 年發布,是一種與平台無關的服務導向架構, 將傳統 OPC Classic 規範中的所有功能整合到一個可擴展的框架中。
OPCUAClient Node 是一個 ROS2 節點,可以設定為從 OPCUA server 訂閱資料, 並提供 ROS2 DDS topic 讓使用者訂閱。使用者可以快速接收 OPCUA 資料, 並進行後續資料處理,例如資料解析(parse)、儲存(store)、分析(analysis)等。 以下章節將介紹如何使用 OPCUAClient Node。
Topic定義
OPCUA node 的 topic 定義如下:
/adv/opcuaclient
訊息定義
請參考 Advantech ROS2 資料格式 章節
設定
設定方式請見《OPCUA Node Configuration Guide》。
驗證資料
訊息會定期更新,你可以使用 ROS2 工具來驗證資料更新:
Step1. 設定 ROS2 環境變數:
$ source /opt/ros/${ROS_DISTRO}/setup.bash
Step2. 設定 OPCUAClient Node message:
$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash
Step3. 列出所有 topics:
$ ros2 topic list
輸出:
/adv/parameter_events
/adv/opcuaclient
/parameter_events
/rosout
Step4.顯示(echo)node 資料
$ ros2 topic echo /adv/opcuaclient
輸出:
---
sensor: OPCUAClient/OPCUA-01/Node/Temperature
type: v
bv: false
v: 25.713000000426085
sv: ''
ts: 1677661555546
---
sensor: OPCUAClient/OPCUA-01/Node/Humidity
type: v
bv: false
v: 59.999999999653745
sv: ''
ts: 1677661556561
---
運行範例客戶端
本節說明如何使用範例 client 訂閱 OPCUA node 的資料。
Node.js
程式 rclnodejs_edge_data_client 是一個 Node.js 範例, 用來讓使用者學習如何使用 rclnodejs client 訂閱 OPCUA node 的資料。 請依照以下步驟執行,程式啟動後會訂閱 OPCUA node 的感測器資料, 並將資料輸出到 console。
訂閱感測器
Step1. 設定 ROS2 環境變數,將 ROS_DISTRO 替換為你的 ROS2 發行版本(foxy、humble):
$ source /opt/ros/${ROS_DISTRO}/setup.bash
Step2. 設定 OPCUAClient Node message:
$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash
Step3. 進入 node.js OPCUA 範例路徑:
$ cd /usr/local/Advantech/ros/${ROS_DISTRO}/sample_code/edge-data-client/rclnodejs_edge_data_client/
Step4. 執行 node.js OPCUA 範例:
$ node example_SubscribeSensor.js "rclnodejs_OPCUAClient_subscriber" "/adv/opcuaclient"
Step5. 驗證接收到的資料:
You have entered arguments:
node name: rclnodejs_OPCUAClient_subscriber
message topic: /adv/opcuaclient
----------------------------------------------
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98247999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.396799999928998
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98223999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.372799999928997
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98199999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.348799999928996
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.981759999556076
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.324799999928995
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98151999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.300799999928994
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98127999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.276799999928993
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98103999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.252799999928992
設定感測器
本節說明如何透過 set action 設定 OPCUA 資料。 要執行此範例,你的裝置需要支援 OPCUA driver 的可寫入感測器。
Step1. 設定 ROS2 環境變數:
$ source /opt/ros/${ROS_DISTRO}/setup.bash
Step2. 設定 OPCUAClient Node message:
$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash
Step3. 進入 node.js OPCUA 範例路徑:
$ cd /usr/local/Advantech/ros/${ROS_DISTRO}/sample_code/edge-data-client/rclnodejs_edge_data_client/
Step4. 執行 OPCUA node 設定範例:
指令:
node example_SetSensor.js [node name] [action] [sensor] [type] [value]
範例:
$ node example_SetSensor.js "rclnodejs_OPCUAClient_setter" "adv_opcuaclient_set" "OPCUAClient/OPCUA-01/Node/Temperature-SetPoint" "v" 26
Step5. 接收結果:
[INFO] [1671432195.232498528] [adv.rclnodejs_OPCUAClient_setter]: Waiting for action server...
[INFO] [1671432195.890056725] [adv.rclnodejs_OPCUAClient_setter]: Sending goal request...
[INFO] [1671432196.076197797] [adv.rclnodejs_OPCUAClient_setter]: Goal accepted
[INFO] [1671432196.310811395] [adv.rclnodejs_OPCUAClient_setter]: Received feedback: status = {"status":200,"sensor":"OPCUAClient/OPCUA-01/Node/Temperature-SetPoint","info":"Success","ts":1671432196198}
[INFO] [1671432196.331143326] [adv.rclnodejs_OPCUAClient_setter]: Goal suceeded with result: 202
Python
程式 rclpy_edge_data_client 是一個 Python 範例, 用來讓使用者了解如何使用 rclpy 訂閱 OPCUA node 的資料。
訂閱感測器
Step1. 設定 ROS2 環境變數:
$ source /opt/ros/${ROS_DISTRO}/setup.bash
Step2. 設定 OPCUAClient Node message:
$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash
Step3. 設定 OPCUA 範例環境:
$ source /usr/local/Advantech/ros/${ROS_DISTRO}/sample_code/edge-data-client/install/local_setup.bash
Step4. 執行 Python OPCUA 範例:
$ ros2 run rclpy_edge_data_client listener "rclpy_OPCUAClient_subscriber" "/adv/opcuaclient"
Step5. 驗證接收到的資料:
You have entered arguments:
node name: rclpy_OPCUAClient_subscriber
message topic: /adv/opcuaclient
----------------------------------------------
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98247999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.396799999928998
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98223999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.372799999928997
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98199999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.348799999928996
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.981759999556076
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.324799999928995
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98151999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.300799999928994
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98127999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.276799999928993
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98103999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.252799999928992
C++
程式 rclcpp_edge_data_client 是一個 C++ 範例, 用來讓使用者了解如何使用 rclcpp 訂閱 OPCUA node 的資料。
訂閱感測器
Step1. 設定 ROS2 環境變數:
$ source /opt/ros/${ROS_DISTRO}/setup.bash
Step2. 設定 OPCUAClient Node message:
$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash
Step3. 設定 OPCUA node 環境:
$ source /usr/local/Advantech/ros/${ROS_DISTRO}/sample_code/edge-data-client/install/local_setup.bash
Step4. 執行 C++ OPCUA 範例:
$ ros2 run rclcpp_edge_data_client listener "rclcpp_OPCUAClient_subscriber" "/adv/opcuaclient"
Step5. 驗證接收到的資料:
You have entered arguments:
node name: rclcpp_OPCUAClient_subscriber
message topic: /adv/opcuaclient
----------------------------------------------
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98247999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.396799999928998
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98223999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.372799999928997
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98199999955607
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.348799999928996
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.981759999556076
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.324799999928995
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98151999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.300799999928994
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98127999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.276799999928993
Data: sensor = OPCUAClient/OPCUA-01/Node/Humidity, v = 59.98103999955608
Data: sensor = OPCUAClient/OPCUA-01/Node/Temperature, v = 28.252799999928992