Modbus的編寫首先需要知道協議的格式是什么樣的,這里先通過PC端的modbus Poll的報文來分析具體的格式,內容含義。
1. 功能碼為06寫單寄存器
000182-Tx:01 06 00 02 00 0C 28 0F
000183-Rx:01 06 00 02 00 0C 28 0F
01 這里的01表示從機的寫寄存器的時候,如果我們要把12寫到一個地址是0002的寄存器地址里,點一下“send”,就會出現發送指令:01 06 00 02 00 0C 280F。我們來分析一下這幀數據,其中01是設備地址,06是功能碼,代表寫寄存器這個功能,后邊跟0002表示的是要寫入的寄存器的地址,00 0C就是要寫入的數據,280F就是CRC校驗碼,這是軟件自動算出來了。而根據Modbus協議,當寫寄存器的時候,從機成功完成該指令的操作后,會把主機發送的指令直接返回,我們的調試的modbus poll會接收到這樣一幀數據:01 06 00 02 00 0C 280F.
2. 功能碼為03的讀多個寄存器
000464-Tx:01 03 00 00 00 0A C5 CD
000465-Rx:01 03 14 00 09 00 08 00 0C 00 00 00 05 00 04 00 00 00 03 00 02 0001 F0 31
我們來分析一下這幀數據,發送的數據中01是設備地址,03是功能碼,代表讀多個寄存器這個功能,后邊跟00 00表示的是要讀的寄存器的起始地址,00 0A就是要寫入數據的個數有10個,C5 CD就是CRC校驗碼。
而主機接收到的數據時,01是設備地址,03是功能碼,14是要讀取數據的2倍,14的10進制為20.而后面的00 09 00 08 00 0C 00 00 00 05 00 04 00 00 00 03 00 02 0001為讀取的10個數據,兩個字節表示一位數據。顯示的數據與上位機軟件的設置一樣說明正確。
3. 功能碼為05的單線圈的寫入
000220-Tx:01 05 00 05 FF 00 9C 3B
000221-Rx:01 05 00 05 FF 00 9C 3B
下面我們來看看0X中功能碼為05的報文含義,發送的數據中01是設備地址,05是功能碼,代表寫單個線圈狀態,后邊跟00 05表示的是要寫的線圈的地址,FF 00就是要寫入的線圈的狀態,9C 3B就是CRC校驗碼。
而根據Modbus協議,當寫線圈的時候,從機成功完成該指令的操作后,會把主機發送的指令直接返回,與寫寄存器類似,返回的數據與原數據一樣。
4 .功能碼為01的讀取線圈的狀態
000332-Tx:01 01 00 00 00 0ABC 0D
000333-Rx:01 01 02 A8 03 86 3D
相比于前面幾個線圈的讀取所包含的內容相對較多。發送的數據中01是設備地址,01是功能碼,代表讀多個線圈狀態,后邊跟00 00表示的是要讀的線圈的起始地址,00 0A就是要讀取線圈的個數這里是要讀取10個線圈狀態,BC 0D就是CRC校驗碼。
我們再看看modbus poll返回的報文,前兩個01與前面含義一樣,而后面的02的含義是,要讀取的10個線圈的狀態要使用兩個寄存器(每8個線圈狀態占用一個寄存器10個就需要兩個),A8 03表示的含義是這10個線圈所代表的值的含義。上圖中0~9依次是000101011,A8就是7~0的表達值,7~0為10101000剛好為A8,而后面剩余的8~9,也是由00000011表示剛好為03.
|