跳至主要内容

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