由於感覺上一次寫的篇幅過長,所以新開一貼,繼續介紹Modbus TCP/IP的初步認識,
書接上回
3)、03(0x03)功能碼--------讀保持寄存器
請求與響應格式

這是一個請求讀寄存器108-110 的實例:

發送數據為:
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x6B, 0x00, 0x03
程序如下:
接收數據為:
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,
0x03, 0x06, 0x02, 0x2B, 0x00,0x00,0x00,0x64
程序如下:
我們再來看一下Modbus Slave設置


我們再看一下Wireshark截取封包
Modbus TCP請求
Modbus TCP響應

我們的軟件所收到的數據

4)、05(0x05)功能碼--------寫單個線圈
十六進制值0XFF00請求線圈為ON。十六進制值0X0000請求線圈為OFF。
其它所有值均為非法的,並且對線圈不起作用。
請求與應答PDU

這是一個請求寫線圈173 為ON 的實例:
發送數據為;
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0xAD, 0xFF, 0x00
程序如下:
接收數據為:
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,
0x02, 0x03,0xAD, 0xFF, 0x00
程序如下:
我們再來看一下Modbus Slave設置


我們再看一下Wireshark截取封包
Modbus TCP請求

Modbus TCP響應

我們的軟件所收到的數據

5)、06 (0x06)寫單個寄存器
請求與應答PDU

這是一個請求將十六進制00 03 寫入寄存器2的實例:

發送數據為;
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x06, 0x00, 0x01, 0x00, 0x03
程序如下:
接收數據為:
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,
0x06, 0x00,0x01, 0x00, 0x03
程序如下:
我們再來看一下Modbus Slave設置


我們再看一下Wireshark截取封包
Modbus TCP請求

Modbus TCP響應

在一個遠程設備中,使用該功能碼強制線圈序列中的每個線圈為ON 或OFF。
域比特位置中的邏輯“1”請求相應輸出為ON。
域比特位置中的邏輯“0”請求相應輸出為OFF。
請求與應答PDU

這是一個請求從線圈20 開始寫入10 個線圈的實例:

發送數據為;
0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x0F, 0x00, 0x14, 0x00, 0x0A,0x02,0xCD,0x01
程序如下:
接收數據為:
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,
0x0F, 0x00,0x14,0x00, 0x0A
程序如下:
我們再來看一下Modbus Slave設置


我們再看一下Wireshark截取封包
Modbus TCP請求

Modbus TCP響應

我們的軟件所收到的數據

7)、16 (0x10)寫多個寄存器
請求與應答PDU

這是一個請求將十六進制00 0A 和01 02 寫入以2 開始的兩個寄存器的實例:

發送數據為;
0x00, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x010, 0x00, 0x02, 0x00, 0x02, 0x04,0x00,0x0A,0x01,0x02
程序如下:
接收數據為:
0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01,
0x10, 0x00,0x02, 0x00, 0x02
程序如下:
我們再來看一下Modbus Slave設置


我們再看一下Wireshark截取封包
Modbus TCP請求
Modbus TCP響應

我們的軟件所收到的數據

至此,我們對Modbus協議的初步認識就到此結束了,這里我們只做了對Modbus TCP
客戶端的了解,之后的博文中我會陸續增加Modbus TCP服務器,modbus 485協議的
主從站,還有在硬件上如何實現modbus通訊等一系列內容敬請關注,同時,由於本人
也是出於學習目的,希望博文中有任何不足的地方都請大家提出,我也學習改正。
