跳至主要内容

Modbus Master 節點

Modbus 可讓多個連接在同一網路上的裝置之間進行通訊,例如一個量測溫度與濕度並將結果傳送至電腦的系統。Modbus 常被用於在監控電腦與遠端終端單元(RTU)之間建立連線,應用於監控與資料擷取(SCADA)系統中。

許多資料型態的命名源自其在控制繼電器上的應用:單一位元的實體輸出稱為 coil,而單一位元的實體輸入稱為 discrete input 或 contact。Modbus 也提供用於數值的 word 資料型態,稱為 register:可讀寫的 word 稱為 holding register,而輸入用的 word 稱為 input register。

Modbus-Master Node 是一個 ROS 節點,可以設定為從 Modbus server 存取資料,並提供 ROS2 DDS topic 供使用者訂閱。使用者可以快速接收 Modbus 資料並進行後續處理,例如資料解析(parse)、儲存(store)、分析(analysis)等。以下章節將介紹如何使用 Modbus-Master Node。


Topic 定義

/adv/modbusmaster

訊息定義

請參考 Advantech ROS2 資料格式 章節

設定

Modbus 相關參數請見<Modbus Master Configuration Guide>。

驗證資料

訊息會定期更新,你可以使用 ROS2 工具來驗證資料更新:

Step1. 設定 ROS2 環境變數:

$ source /opt/ros/${ROS_DISTRO}/setup.bash

Step2. 設定 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/modbusmaster
/parameter_events
/rosout

 

Step4. 顯示(echo)node 資料

$ ros2 topic echo /adv/modbusmaster

輸出:

---
sensor: Modbus-Master/Device/Sensor-Device-1/Sensor/Temperature
type: v
bv: false
v: 16.0
sv: ''
ts: 1677660801212
---
sensor: Modbus-Master/Device/Sensor-Device-1/Sensor/Door-Open
type: bv
bv: false
v: 0.0
sv: ''
ts: 1677660802511
---
sensor: Modbus-Master/Device/Sensor-Device-1/Sensor/FAN-Speed
type: v
bv: false
v: 2636.0
sv: ''
ts: 1677660803055
---

運行範例客戶端

本節說明如何使用範例 client 訂閱資料。

Node.js

程式 rclnodejs_edge_data_client 是一個 Node.js 範例, 用來讓使用者學習如何使用 rclnodejs client 訂閱 node 的資料。 請依照以下步驟執行,程式啟動後會訂閱 node 的資料並輸出到 console。

訂閱感測器

Step1. 設定 ROS2 環境變數,將 ROS_DISTRO 替換為你的 ROS2 發行版本(foxy、humble):

$ source /opt/ros/${ROS_DISTRO}/setup.bash

Step2. 設定 Node message:

$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash

Step3. 進入 node.js 範例路徑:

$ cd /usr/local/Advantech/ros/${ROS_DISTRO}/sample_code/edge-data-client/rclnodejs_edge_data_client/

Step4. 執行 node.js 範例:

$ node example_SubscribeSensor.js "rclnodejs_ModbusMaster_subscriber" "/adv/modbusmaster"

Step5. 驗證接收到的資料:

You have entered arguments:
node name: rclnodejs_ModbusMaster_subscriber
message topic: /adv/modbusmaster
----------------------------------------------
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Temperature", v = 21.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Door-Open", v = 1.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/FAN-Speed", v = 2814.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Humidity", v = 44.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Light-Switch", v = 0.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00

設定感測器

本節說明如何透過 set action 設定資料。要執行此範例,你的裝置需要支援可寫入的 sensor。

Step1. 設定 ROS2 環境變數:

$ source /opt/ros/${ROS_DISTRO}/setup.bash

Step2. 設定 Node message:

$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash

Step3. 進入 node.js 範例路徑:

$ cd /usr/local/Advantech/ros/${ROS_DISTRO}/sample_code/edge-data-client/rclnodejs_edge_data_client/

Step4. 執行 set sensor 範例:

指令:

node example_SetSensor.js [node name] [action] [sensor] [type] [value]

輸出:

$ node example_SetSensor.js "rclnodejs_ModbusMaster_setter" "adv_modbusmaster_set" "Modbus-Master/Device/Sensor-Device-1/Sensor/FAN-Speed" "v" 3000

Step5. 接收結果:

[INFO] [1671431728.320213435] [adv.rclnodejs_ModbusMaster_setter]: Waiting for action server...
[INFO] [1671431729.034446428] [adv.rclnodejs_ModbusMaster_setter]: Sending goal request...
[INFO] [1671431729.384845693] [adv.rclnodejs_ModbusMaster_setter]: Goal accepted
[INFO] [1671431729.774134098] [adv.rclnodejs_ModbusMaster_setter]: Goal suceeded with result: 202

Python

程式 rclpy_edge_data_client 是一個 Python 範例, 用來讓使用者了解如何使用 rclpy 訂閱 node 的資料。

訂閱感測器

Step1. 設定 ROS2 環境變數:

$ source /opt/ros/${ROS_DISTRO}/setup.bash

Step2. 設定 Node message:

$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash

Step3. 設定範例環境:

$ source /usr/local/Advantech/ros/${ROS_DISTRO}/sample_code/edge-data-client/install/local_setup.bash

Step4. 執行 Python 範例:

$ ros2 run rclpy_edge_data_client listener "rclpy_ModbusMaster_subscriber" "/adv/modbusmaster"

Step5. 驗證接收到的資料:

You have entered arguments:
node name: rclpy_ModbusMaster_subscriber
message topic: /adv/modbusmaster
----------------------------------------------
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Temperature", v = 21.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Door-Open", v = 1.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/FAN-Speed", v = 2814.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Humidity", v = 44.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Light-Switch", v = 0.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00

C++

程式 rclcpp_edge_data_client 是一個 C++ 範例, 用來讓使用者了解如何使用 rclcpp 訂閱 node 的資料。

訂閱感測器

Step1. 設定 ROS2 環境變數:

$ source /opt/ros/${ROS_DISTRO}/setup.bash

Step2. 設定 Node message:

$ source /usr/local/Advantech/ros/${ROS_DISTRO}/include/edge-converter-ros2/adv_msgs/install/local_setup.bash

Step3. 設定 node 環境:

$ source /usr/local/Advantech/ros/${ROS_DISTRO}/sample_code/edge-data-client/install/local_setup.bash

Step4. 執行 C++ 範例:

$ ros2 run rclcpp_edge_data_client listener "rclcpp_ModbusMaster_subscriber" "/adv/modbusmaster"

Step5. 驗證接收到的資料:

You have entered arguments:
node name: rclcpp_ModbusMaster_subscriber
message topic: /adv/modbusmaster
----------------------------------------------
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Temperature", v = 21.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Door-Open", v = 1.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/FAN-Speed", v = 2814.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Humidity", v = 44.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00
Data: sensor = "Modbus-Master/Device/Sensor-Device-1/Sensor/Light-Switch", v = 0.00
Data: sensor = "Modbus-Master/Link/Net1/Message", sv = "Link connected"
Data: sensor = "Modbus-Master/Link/Net1/Status", v = 1.00