10.4.7 字節序和大小端
Modbus中傳輸的數據,按照“大字節序”來傳輸,比如:
寄存器數值是0x1234,先傳輸0x12,再傳輸0x34。
在Modbus寄存器中,對于一個由2字節組成的16數,在內存中存儲這兩個字節有兩種方法:一種是將低序字節存儲在起始地址為小端(Little-Endian)字節序;另一種方法是將高序字節存儲在起始地稱為大端(Big-Endian)字節序。Modbus通信協議中具體規定了字節高低位發送順序,這樣就自然引出了字節序和大小端的問題。
①什么是大端:
所謂大端,是指數據的低位保存在內存的高地址中,數據的高位保存在內存的低地址中。
②什么是小端:
所謂小端,是指數據的低位保存在內存的低地址中,數據的高位保存在內存的高地址中。
③為什么會有大小端:
計算機系統是以字節為單位的,每個地址單元都對應著1個字節,一個字節為8bit。但在C語言中除了8bit的char類型,還有16bit的short類型和32bit的long類型,還有就是對于位數大于8位的處理器,如16位或32位的處理器,由于寄存器寬度大于一個字節,那么必然存在一個如何將多個字節安排的問題。因此就導致了大端存儲模式和小端存儲模式的出現。
低位字節和高位字節:比如123456其中的1就是高位數字,6就是低位數字。
舉一個例子,在32位數字0x12345678在內存中的表示形式為:
1)大端模式:
低地址 | —— | —— | 高地址 |
0x12 | 0x34 | 0x56 | 0x78 |
2)小端模式:
低地址 | —— | —— | 高地址 |
0x78 | 0x56 | 0x34 | 0x12 |
10.4.8 Modbus報文分析
在第二章中我們已經生成了一個報文,我們就拿此報文來逐步分析一下,報文如下:
我們可以看到上面報文都是循環發送的,這樣看起來不太容易分析,摘抄下來其中一組來給大家分析:
發送:
從機 地址 |
功能碼 | 起始地址高位 | 起始地址低位 | 寄存器數量高位 | 寄存器數量低位 |
CRC 高位 |
CRC低位 |
01 | 03 | 00 | 00 | 00 | 0A | C5 | CD |
響應:
從機地址 | 功能碼 | 返回字節數 | 數據位 | CRC高位 | CRC低位 |
01 | 03 | 14 | 00 42… | CF | 10 |
這里我們就以03功能碼為例來分析一下報文:
03發送報文格式:從機地址+功能碼+加起始地址+寄存器數量+CRC校驗
03接受報文格式:從機地址+功能碼+字節數+具體數據+CRC校驗
首先我們看一下發送報文:
從機地址是01,功能碼03,起始地址00,寄存器數量是十六進制0A也就是10,和門設置的是一樣的,我們來對對照一下我們設置的參數:
我們再來看一下接收報文:
從機地址是01,功能碼03,返回字節數是十六進制14也就是返回20給字節,我們發送是個返回20個字節也是對的上的,第一個數據位是00 42也是和我們發送的可以對上,十六機制42,也就66,我們來看一下我們之前設置的參數:
10.4.9 Moubus TCP消息幀格式
1. 協議描述
在Modbus TCP/IP中,串行鏈路中的主/從設備分別演變為客戶端/服務器端設備,即客戶端相當于主站設備,服務器端設備相當于從設備。基于TCP/IP網絡的傳輸特性,串行鏈路上一主多從的機構也演變為多客戶端/多服務器端的構造模型。Modbus協議在TCP/IP上的實現是在TCP/IP層上的應用,它需要一個完整的TCP/IP棧作為支撐,Modbus TCP/IP服務器端通常使用端口502作為接收報文的端口。
下圖為Moubus TCP的通訊結構:
ModbusTCP與ModbusUDP的報文格式是一樣的,它們之間的區別其實就是TCP與UDP的區別,因此下面就針對ModbusTCP的協議進行分析,ModbusTCP與ModbusRtu(ModbusASCII)之間的區別如下圖:
從上圖可以看出,ModbusTCP在Modbus串行通信的基礎上,去除了校驗(由于TCP本身就帶有校驗和)和設備地址(ModbusTCP弱化了設備地址,用IP地址來取代),再加上MBAP報文頭(占7bytes),下面針對MBAP進行分析說明:
事務處理標識符:
事務處理標識用于在查詢報文與未來響應之間建立聯系。因此,對TCP/IP連接來說,在同一時刻這個標識符必須是唯一的。有以下幾種使用此標識符的方式。
例如,可以將傳輸標識作為一個帶有計數器的簡單“TCP發送順序號”,在每個請求發送時自動+1;也可以用作智能索引或指針,用來識別事務處理的內容,以便記憶當前的遠端服務器和未處理的請求。
服務器端可接收的請求數量取決于其容量,即服務器資源量和TCP窗口尺。
同樣,客戶端同時啟動事務處理的數量也取決于客戶端的資源容量。
單元標識符:
在對Modbus或Modbus+等串行鏈路子網中的設備進行尋址時,這個域用于路由的目的。在這種情況下,單元標識符(Unit Identifier)攜帶一個遠端設備的Modbus從站地址。
如果Modbus服務器連接到Modbus+或Modbus串行鏈路子網,并通過一個網橋或網關配置這個服務器的IP地址,則Modbus單元標識符對識別連接到網橋或網關后的子網的從站設備是必需的。TCP連接中的目的IP地址識別了網橋本身的地址,而網橋則使用Modbus單元標識符將請求轉交給正確的從站設備。分配給串行鏈路上的Modbus從站設備地址為1~247(十進制),地址0作為廣播地址。
對單純的Modbus TCP/IP設備來說用IP地址即可尋址Modbus服務器端設備,此時Modbus單元標識符是無用的,必須使用值0xFF填充。當對直接連接到TCP/IP網絡上的Modbus服務器尋址時,建議不要在“單元標識符”域使用有效的Modbus從站地址。
以上是MBAP報文頭個字段含義的詳細說明。
實際上,在Modbus TCP/IP傳輸過程中,服務端(從機)返回的響應報文中同樣包含MBAP報頭,除了Length字段外,其他字段均與客戶端一致。Modbus消息TCP/IP層提供,不需要像串行鏈路那樣自己判斷一幀是否結束,所有數據傳輸均由TCP/IP層處理。因為底層TCP/IP確保了端到端的連接,而且TCP/IP鏈路層已確保傳輸數據的準確性,所以Modbus TCP/IP中已不再需要LRC或CRC等校驗功能。
2. 查詢與響應報文示例
對于Modbus TCP消息幀格式,下面舉例說明各部分的含義。
①查詢報文:00 00 00 00 00 06 09 03 00 04 00 01。
1)0x06:后續還有6字節。
2)0x09:單元標識符為9。
3)0x03:功能碼3,即讀保持寄存器的值。
4)0x00 0x04:Modbus起始地址4(即40005)。
5)0x00 0x01:讀取寄存器個數為1。
②響應報文:00 00 00 00 00 05 09 03 02 00 05。
1)0x05:表示后續還有5字節。
2)0x09:同查詢報文,單元標識符。
3)0x03:功能碼,同查詢報文。
4)0x02:返回數據字節數。
5)0x00 0x05:寄存器的值。
可見,在Modbus TCP模式下,差錯校驗字段已不復存在。但在某些特殊場合,例如串行Modbus協議轉Modbus TCP的情況下,串行協議數據可以完整地裝載到Modbus TCP的數據字段,這時CRC或LRC差錯校驗字段仍然存在。例如,Modbus RTU Over TCP/IP或Modbus ASCII Over TCP/IP等。
-
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
MODBUS
+關注
關注
28文章
1799瀏覽量
76949 -
MPU
+關注
關注
0文章
357瀏覽量
48775 -
工業控制
+關注
關注
37文章
1451瀏覽量
85829
原文標題:字節序與Modbus通信 - RZ MPU工業控制教程連載(29)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論