想了解更多關于開源的內容,請訪問:
本站開源基礎軟件社區
Modbus簡介
原文鏈接:鏈接
Modbus是一種串行通信協議,是Modicon公司(現在的施耐德電氣Schneider Electric)于1979年為使用可編程邏輯控制器(PLC)通信而發表。Modbus已經成為工業領域通信協議的業界標準(De facto),并且現在是工業電子設備之間常用的連接方式。
Modbus RTU(Remote Terminal Unit 遠程終端單元):這種方式常采用RS-485做為物理層,一般利用芯片的串口實現數據報文的收發,報文數據采用二進制數據進行通信。
Modbus TCP/IP 或 Modbus TCP:這是一種 Modbus 變體版本,使用 TCP/IP 網絡進行通信,通過 502 端口進行連接。報文不需要校驗和計算,因為以太網底層已經實現了CRC32 數據完整性校驗
Modbus RTU
地址:取值范圍是0-247,如果是0,就是主站廣播報文;如果是1-247,則有可能是主站請求或者從站應答。
功能碼:也就是報文命令,代表主站對從站的操作,讀或者寫。
數據:數據字段,主請求報文,從應答報文會有所差異。也就是說假設抓取總線報文,如何區分是主站請求還是從站應答,則需要通過數據字段進行區分了。
CRC校驗:采樣CRC16,16位循環冗余校驗。
部分功能碼解析
1、功能碼 –讀線圈狀態
- 主機發送:01 01 00 01 00 08 6C 0C
- 從機回復: 01 01 01 2F 10 54
- 主機解析:01 地址(設備ID)
01 功能碼;
00 01 代表查詢的起始線圈地址,即從0001線圈開始查詢。
00 08 查詢線圈數量。
6C 0C 循環冗余校驗。
從機解析:01 地址(設備ID)。
01 功能碼;
01 代表后面數據的字節數。
2F 讀取以0001線圈開始的8個線圈的狀態。0x2F二進制為00101111,對應狀態為1111 0100
10 54 循環冗余校驗。
2、功能碼 –-讀離散輸入寄存器
功能:讀離散輸入寄存器,位操作,可讀單個或多個,類似功能碼0X01。
3、功能碼 –-讀保持寄存器的值
- 主機發送:01 03 00 01 00 01 D5 CA
- 從機回復: 01 03 02 00 01 79 84
- 主機解析:01 地址(設備ID)
03 功能碼;
00 01 代表查詢的起始寄存器地址,即從0001寄存器開始查詢。
00 01 查詢寄存器數量。
D5 CA 循環冗余校驗。
從機解析:01 地址(設備ID)。
03 功能碼;
02 代表后面數據的字節數。
00 01 查詢0001寄存器的值。
79 84 循環冗余校驗。
4、功能碼 –-讀輸入寄存器
功能:讀輸入寄存器,字節操作,可讀單個或多個,類似功能碼0X03。
5、功能碼 –-寫單個保持寄存器
功能:對單個線圈進行寫操作,位操作,只能寫一個。寫入0xFF00表示將線圈置為ON,寫入0x0000表示將線圈置為OFF,其它值無效。
主機發送數據:從站地址+功能碼+寄存器起始地址+數據值+校驗碼
從站應答數據:從站地址+功能碼+寄存器地址+寫入值+校驗碼
6、功能碼 –-寫單個保持寄存器
- 主機發送:01 06 00 02 00 01 E9 CA
- 從機回復: 01 06 00 02 00 01 E9 CA
- 主機解析:01 地址(設備ID)
06 功能碼;
00 02 代表待寫入的起始寄存器地址,即從0002寄存器開始寫數據。
00 01 寫入的寄存器的值。即給0002寄存器寫入0001
E9 CA 循環冗余校驗。
從機解析:01 地址(設備ID)。
06 功能碼;
02 代表后面數據的字節數。
00 01 查詢0001寄存器的值。
E9 CA 循環冗余校驗。
7、功能碼 –-寫多個線圈狀態
- 主機發送:01 0F 00 01 00 07 01 6B B2 B9
- 從機回復: 01 0F 00 01 00 07 45 C9
- 主機解析:01 地址(設備ID)
0F 功能碼;
00 01 代表待寫入的起始線圈地址,即從0001線圈開始寫數據。
00 07 待寫入的線圈的數量。
01 后面寫入數據的字節數。
6B寫入寄存器的值,即11010110。二進制01101011
B2 B9 循環冗余校驗。
從機解析:01 地址(設備ID)。
0F 功能碼;
00 01 代表待寫入的起始線圈地址,即從0001線圈開始寫數據。
00 07 待寫入的線圈的數量。
45 C9 循環冗余校驗。
8、功能碼 – 寫多個保持寄存器
- 主機發送:01 10 00 04 00 03 06 00 01 00 00 00 01 5B 55
- 從機回復: 01 10 00 04 00 03 C1 C9
- 主機解析:01 地址(設備ID)
10 功能碼;
00 04 代表待寫入的起始寄存器地址,即從0004寄存器開始寫數據。
00 03 待寫入的寄存器的數量。
06 后面寫入數據的字節數。
0001,0000,0001寫入寄存器的值。即給0004,0005,0006寄存器分別寫入0001,0000,0001
5B 55 循環冗余校驗。
從機解析:01 地址(設備ID)。
10 功能碼;
00 04 代表待寫入的起始寄存器地址,即從0004寄存器開始寫數據。
00 03 待寫入的的寄存器的值。即給0004,0005,0006寄存器分別寫入0001,0000,0001
C1 C9 循環冗余校驗。
在OpenHarmony上面使用Modbus
原文鏈接:鏈接
加入Modbus C++庫libmodbus
適配文件在當前目錄下的cpp文件夾中。
庫文件:
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
c文件:
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
把上面文件加入編譯:
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
Modbus TCP
配置Modbus信息
設置IP和端口號以及DeviceID。
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
設置數據地址和長度。
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
把測試代碼執行起來
引入測試代碼庫。
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
初始化Modbus連接。
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
讀取數據。
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
運行調試
基于OpenHarmony 系統通過Modbus協議讀取設備數據-開源基礎軟件社區
Modbus RTU
Modbus RTU主要是通過RS485或者232接口讀取數據的modbus協議。
libmodbus庫函數解析
功能碼函數:
函數 | 功能嗎 |
modbus_read_registers | 03 |
modbus_read_input_registers | 04 |
modbus_read_bits | 01 |
modbus_read_input_bits | 02 |
modbus數據轉換函數
函數 | 轉換內容 |
modbus_get_float_abcd | 獲取浮點數ABCD |
modbus_set_float_abcd | 設置浮點數ABCD |
想了解更多關于開源的內容,請訪問:
本站開源基礎軟件社區