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