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