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