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