modbus-poll和modbus-slave工具的學習使用——modbus協議功能碼1的解析


一、數據解析

上一文介紹了modbus工具的基本使用情況,但是還沒用說明modbus中的協議的具體意義,

1、左邊是slave,id=1,說明地址是1,f=01說明是功能碼01,功能碼是一個字節,說明理論上最多可以是256個功能碼。

2、右邊是poll,tx是發送的次數,err是錯誤數量,id是從機地址,f=01,說明是功能碼01,sr=1000ms,說明poll 端是1s發送一次數據。

alias是其實是modbus的協議地址(個人理解的),第二列是數值,即寄存器中的value

 

這里摘取了slave端部分通信的真實數據:

Rx:000008-01 01 00 00 00 0A BC 0D ,其實是poll-slave系統中的tx
Tx:000009-01 01 02 12 00 B5 5C  ,其實是poll-slave系統中的rx

這里摘取了poll端部分通信的真實數據:

Tx:052-01 01 00 00 00 0A BC 0D
Rx:053-01 01 02 12 00 B5 5C

解析poll端為例:

主要看-后面的hex數據

TX-01(從機地址01) 01(功能碼01) 00(起始地址高位) 00(起始地址低位)  00(寄存器數高位)  0A(寄存器數低位,000a,=總共是10個,和上文一致。)  BC(crc16的低位) 0D (crc16的高位)

其中,crc16的兩個字節是低位先發送的,組合起來就是0dbc,涉及到大小端的知識,這里不詳細展開了。

Rx:01(從機地址01) 01(功能碼01) 02 (字節數量為2)12 (數據1)00(數據2) B5(crc16的低位) 5C(crc16的高位)

這里詳細說明一下:12 (數據1)00(數據2),同時在poll端讀取到的數據一次從上往下是:

0100 1000 00

 

用excel展開為:

數據1(0x12)先發,緊跟數據2(0x00)

功能碼1是位操作指令,最小單位是1bit。功能碼01的功能是:讀取線圈狀態/離散量輸出狀態,即各DO(discrete output,離散輸出)的on/off狀態。

二、RTU、 ASCII方式區別

軟件中,我使用了rtu模式,效率更加高,ascii模式是使用ascii字符來表示數據,舉個例子:

rtu中的0x12,在ascii中,使用0x31,0x32來表示。

下面做個實例:

connect中分別選擇ascii模式,

運行后,得到:

Tx:074-3A 30 31 30 31 30 30 30 30 30 30 30 41 46 34 0D 0A
Rx:075-3A(“;”幀頭) 30 31(從機地址0x01) 30 31 (功能碼0x01)30 32(字節數量為2) 31 32(數據1) 30 30(數據2)45 41(LRC) 0D 0A(幀尾CR/LF).

這里看到,ascii是有幀頭幀尾的,單片機可以根據這個來判斷,而rtu是沒有的。rtu的起始位和結束符:一幀數據和另一幀數據之前,前后都至少有 3.5 個字節的時間間隔,起始位和結束符實際上沒有任何數據,T1-T2-T3-T4 代表的是時間間隔 3.5 個字節以上的時間,而真正有意義的第一個字節是設備地址。說白了,就是單片機在3ms內接受到數據,則認為是是一幀數據的,如果成多3ms及以上,說明一幀數據已經結束,進而進行處理。

LRC的計算方式還不懂,因此從通信效率上來看,rtu的方式是最高效的,在單片機開發過工程中,通常使用rtu方式。

三、修改slave端的數據

在slave端更新某一位,就可以在poll端查看到,引用到實際嵌入式中,可以將某一位映射到mos管的輸出到低電平,上位機可以通過功能碼1來查看mos的工作狀態。

 

 

四、poll端數據的設置

在poll也是可以設置slave的數據的,如下所示,其實這里的設定已經使用了功能碼5,好比,上位機將某一個mos管的輸出進行更改高低電平。功能碼5的功能是:寫單個線圈或單個離散輸出,具體的功能,將在后續文章中分析。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM