Modbus-RTU協議報文信息幀中的代碼解析1、地址碼
地址碼是信息幀的個字節(8位),從0到255。每個從機都必須有的地址。在下行幀中,表明只有符合地址碼的從機才能接收由主機發送來的信息。在上行幀中,表明該信息來自于何處。
備注:如果地址為0x00,則認為是一個廣播命令,就是所有從機要接收主機發來的信息。規約規定廣播命令必須是寫命令,并且從站也不發送回答。
2、功能碼
功能碼是信息幀的第二個字節。ModBus通訊規約定義功能號為1到127。大多數設備只利用其中一部分功能碼。下行幀中,通過功能碼告訴從機執行什么動作。在上行幀中,從機發送的功能碼與主機發送來的功能碼一樣,并表明從機已響應主機進行的操作,否則表明從機沒有響應操作或發送出錯。其常用功能碼如下所示:
3、數據
它因不同的功能碼及不同的從機而不同。數據區可以是實際數據、狀態值、參考地址、數據長度等等。
4、CRC碼
Modbus-CRC校驗碼由發送設備計算,放置于發送信息的尾部。接受信息的設備再重新計算接收到的信息的CRC碼,比較計算得到的CRC碼是否與接收到的相符(或將接收到的信息除以約定的除數,應無余數),如果不相符(有余數),則表明出錯。它用于保證主機或從機對傳送過程中出錯的信息起不了作用,增加了系統的安全與效率。
下面我就來說一下CRC碼是如何計算出來的。
在介紹CRC碼的計算過程之前,我們先來談談“模2除法”。
A、模2運算
“模2除法”與“算術除法”類似,但它既不向上借位,也不比較除數和被除數的相同位數值大小,只要以相同位數進行相除即可。
“模2加法”為1+1=0,1+0=1,0+0=0,0+1=1;
“模2減法”為1-1=0,1-0=1,0-0=0,0-1=1;
仔細看看上面的運算,非常像一種邏輯運算,[老化試驗箱]
沒錯,上述運算相當于二進制中的邏輯異或運算。也就是比較后,兩者對應位相同則結果為“0”,不同則結果為“1”。下面以100101除以1110為例,為大家展示一下“模2除法”的運算,如下圖示:
上述算式的商為11,余數為1。
B、CRC校驗步驟
1、先選擇一個用于在接收端進行校驗時,對接收的幀進行除法運算的除數。此除數可以隨機選擇,也可按標準選擇。通常以多項式的方式表示,這個多項式也稱之為“生成多項式”。
備注:除數的位和位必須為1。
2、看已選定的除數二進制位數k,,然后在要發送的數據幀(m位)后面加上k-1位“0”,然后用已經加上k-1位“0”的新幀(m+k-1位)以“模2除法”方式除以上面所說的除數,所得到的余數就是該幀的CRC校驗碼,也稱為FCS(幀校驗序列)。
備注:余數的位數一定要是比除數位數只能少一位,哪怕前面的位是0,甚至全為0也不能省略。
3、再把這個校驗碼附加在原在原數據幀后面,構成一個新幀發送到接收端,最后在接收端再把這個新幀以“模2除法”方式除以前面選擇的余數,如果沒有余數,則該幀在傳輸過程中沒有出錯,否則就是出現了差錯。(或者重新計算CRC碼)。
C、示例
下面舉個例子來說明,CRC碼的計算過程。
更改設備地址:
寫地址命令:
設備地址 功能碼 起始寄存器地址 寄存器個數 數據長度 數據 CRC校驗
00 10 02 00xx CRCloCRChi(XX=0X01-0XFF)
設備回復:
設備地址 功能碼 起始寄存器地址 寄存器個數 CRC校驗
00 10 00 01 00 01 CRCloCRChi
讀取設備地址:
讀站號:(固定命令)
設備地址 功能碼 起始寄存器地址 寄存器個數 CRC校驗
00 03 CRCloCRChi
備注:/,在網站中下載串口軟件可以方便地計算CRC碼。
二、modbus報文實例解析
注:以下報文的CRC算法為CRC-16/MODBUS。
A、01號命令
下行幀:11 01 00 13 00 25 F9 C8
11為從機地址(1byte),地址號17;
01為功能碼(1bye),讀線圈狀態;
0013為寄存器起始地址(2byte),起始地址19;
備注:程序的起始地址為0。起始地址19實際上是第20號接觸器。
0025為數據數量(2byte),37個狀態量,需要5個字節的空間;
F9C8為CRC碼(2byte)。
釋義:讀取來自17號從機以20號接觸器為起始的37個接觸器狀態。
上行幀:11 01 05 CD 6B B2 0E 1B 18 8D
11為從機地址(1byte),地址號17;
01為功能碼(1byte),讀線圈狀態;
05為數據區字節數(1byte),5個字節;
CD 6B B2 0E 1B為數據(5byte),僅解析個數據(CD),CD轉為二進制序列為11001101,從低位到高位讀,每一位對應一個接觸器的狀態,0為分,1為合。
綜上數據段中的CD,表示20號接觸器合位、21號分位、22號合位、23號合位、24號分位、25號分位、26號合位、27號合位;
18 8D為CRC碼(2byte)。
釋義:上送來自17號從機的接觸器狀態,其數據字節數為5,信息為20號接觸器合位、21號分位、22號合位、23號合位、24號分位、25號分位、26號合位、27號合位……
備注:
若詢問的數據數量不是8的整倍數,那么字節的多余位補0,此時的0不代表任何意義。在此例里,數據段中的1B,低位B則表示52號分位,53號合位,54號分位,55號合位;它的高位1表示,56合位,其余位補0,無意義。
B、02號命令
下行幀:11 02 00 13 00 25 F9 40
11為從機地址(1byte),地址號17;
02為功能碼(1byte),讀離散輸入狀態;
0013為寄存器起始地址(2byte),起始地址19;
0025為數據數量(2byte),37個狀態量,需要5個字節的空間;
F940為CRC碼(2byte)。
釋義:讀取來自17號從機以20號開關為起始的37個斷路器狀態。
說明:
01讀取的是線圈狀態,只能代表電保持的開關器件的狀態,如是斷路器這種只需要短時合閘脈沖,線圈不需要長期得電,無法用01取得位置信號。
02讀取的是開入狀態,可以是斷路器的輔助觸點,也可以行程開關等等器件,所以可以讀取機械保持的斷路器的位置信號。
上行幀:11 02 05 CD 6B B2 0E 1B 1B BD
11為從機地址(1byte),地址號17;
02為功能碼(1byte),讀離散輸入狀態;
05為數據區字節數(1byte),5個字節;
CD 6B B2 0E 1B為數據(5byte),此次解析第二個數據(6B),6B轉為二進制序列為01101011,從低位到高位讀,每一位對應一個斷路器的狀態,0為分,1為合。
綜上數據段中的6B,表示28號斷路器合位、29號合位、30號分位、31號合位、32號分位、33號合位、34號合位、35號分位;
1BBD為CRC碼(2byte)。
釋義:上送來自17號從機的斷路器狀態,其數據字節數為5,信息為20號斷路器合位、21號分位、22號合位、23號合位、24號分位、25號分位、26號合位、27號合位……
C、03號命令
下行幀:11 03 00 6B 00 03 FF 8C
11為從機地址(1byte),地址號17;
03為功能碼(1byte),讀保持寄存器;
006B為寄存器起始地址(2byte),起始地址107;
0003為數據數量(2byte),3個模擬量;
FF 8C為CRC碼(2byte)。
下面開始報文分析:
下行幀:11 04 00 00 00 01 5A 33
11為從機地址(1byte),地址號17;
04為功能碼(1byte),讀輸入寄存器;
0000為事件交換字地址(2byte),地址號0;
0001為SOE讀指針地址(2byte),地址號1;
5A33為CRC碼(2byte)
釋義:詢問17號從機的事件交換字及當前SOE指針位置。
上行幀:11 04 04 00 02 00 2e 5A AA
11為從機地址(1byte),地址號17;
04為功能碼(1byte),讀輸入寄存器;
04為數據區字節數(1byte),4個字節;
0002為事件交換字(2byte),表示有2個SOE數據滯留在SOE緩沖區內;
002e為當前指針位置(2byte),表示指針移動到46的位置;
5AAA為CRC碼(2byte)。
釋義:17號從機回應主機:事件交換字為2,當前SOE指針位置為46。
下行幀:11 04 01 00 00 10 AA F2
11為從機地址(1byte),地址號17;
04為功能碼(1byte),讀輸入寄存器;
0100為指針46位置對應的地址,地址號256;
0010為數據占用寄存器個數,16個;
AAF2為CRC碼(2byte)。
釋義:讀取17號從機的以256為起始地址的SOE數據,共16個寄存器。
上行幀:11 04 20 02 01 09 02 0B 0C 0E 0D 01 02 00 02 00 01 00 0001 03 09 02 0C 0B 09 0F 03 14 00 04 01 01 00 00 2E 7D
11為從機地址(1byte),地址號17;
04為功能碼(1byte),讀輸入寄存器;
20為數據區字節數(1byte),32字節;
02 01 09 02 0B 0C 0E 0D 01 02 00 02 00 01 00 00為組SOE數據,其中尾部的四個字節00 01 00 00為備用數據,無任何意義。個字節為SOE類型,第二個字節為SOE的源,隨后8個字節為時標,而后兩個字節為SOE的測點。
表示2009年2月11日12點14分13秒25.8毫秒2號開關手動分閘。
01 03 09 02 0C 0B 09 0F 03 14 00 04 01 01 00 00 為第二組SOE數據,其中尾部的四個字節01 01 00 00為備用數據,無任何意義。個字節為SOE類型,第二個字節為SOE的源,隨后8個字節為時標,而后兩個字節為SOE的測點。
表示2009年2月12日11點9分15秒78.8毫秒4號開關通訊合閘。
2E7D為CRC碼。
釋義:17從機上送32字節的SOE數據:2009年2月11日12點14分13秒25.8毫秒2號開關手動分閘;2009年2月12日11點9分15秒78.8毫秒4號開關通訊合閘。
E、05號命令
下行幀:11 05 00 AC FF 00 F3 F6
11為從機地址(1byte),地址號17;
01為功能碼(1byte),寫單個線圈;
00AC為下置的寄存器地址(2byte),寄存器地址號為172;
FF00為下置的數據;
F3F6為CRC碼(2byte)。
釋義:合上17號從機的173號開關。
備注:開關的分閘命令為0x00,合閘命令為FF00,其余數值均為非法。
上行幀:11 05 00 AC FF 00 F3 F6
此幀*重復下行幀的命令,相當于確認命令已執行。
釋義:17號從機的173號開關已合閘。
F、06號命令
下行幀:11 06 00 01 00 32 79 B9
11為從機地址(1byte),地址號17;
06為功能碼(1byte),寫單個保持寄存器;
0001為下置的寄存器地址(2byte),寄存器地址號為1;
0032為下置的數據,數據為50;
79B9為CRC碼(2byte)。
釋義:將17號從機里地址為1的保持寄存器中數據置為50。此條數據可以是將18號從機的第2號變頻器的輸出頻率置為50HZ。
上行幀:11 06 00 01 00 32 79 B9
釋義:表示置位成功,即17號從機的第2號變頻器的輸出頻率已置為50HZ。
G、15號命令
下行幀:110F 00 13 00 02 01 01 98 9B
11為從機地址(1byte),地址號17;
0F為功能碼(1byte),寫多個線圈;
0013為起始地址(2byte),起始地址為19;
0002為強置個數(2byte),個數為2;
01為強置字節數(1byte),1個字節;
01為強置數據(1byte),強置數據為0001,由于強置個數為2個,所以與第二位無效;
989B為CRC碼(2byte)。
釋義:合上17號從機的20號開關,分開其21號開關。此命令可以作消防聯動,將風柜出風口閥門配置21號開關,防排煙風機的啟動開關配置為20號開關,可組成的消防聯動。
上行幀:11 0F 00 13 00 02 5F 27
11為從機地址(1byte),地址號17;
0F為功能碼(1byte),寫多個線圈;
0013為起始地址(2byte),起始地址為19;
0002為強置個數(2byte),個數為2;
5F23為CRC碼(2byte)。
釋義:已合上17號從機的20號開關,已分開其21號開關。
H、16號命令
設系統時間地址為10000~10004。
下行幀:11 10 27 10 00 05 0A 07 D2 0A 09 00 0C 0E 0D 00 00 DD D5
11為從機地址(1byte),地址號17;
10為功能碼(1byte),寫多個保持寄存器;
2710為起始地址(2byte),起始地址為10000;
0005為寫寄存器個數,占用5個寄存器;
0A為數據區字節數,10個字節;
07 D2 0A 09 00 0C 0E 0D 00 00為數據(10byte),表示2002年9月10日12點14分13秒0毫秒;
DDD5為CRC碼(2byte)。
釋義:將系統時間置為2002年9月10日12點14分13秒0毫秒。
上行幀:11 10 27 10 00 05 EB 09
11為從機地址(1byte),地址號17;
10為功能碼(1byte),寫多個保持寄存器;
2710為起始地址(2byte),起始地址為10000;
0005為寫寄存器個數,占用5個寄存器;
EB09為CRC碼(2byte)。
下面來簡要說明一下這種物理層的校驗方式:
1、當通信開始時,信號線為空閑(邏輯1),當檢測到由1跳變至0時,開始“接收時鐘”計數。
2、當計到8個時鐘時,對輸入信號進行檢測,若依舊為低電平,則確認此跳變信號為“起始位(B)”信號(邏輯0),而不是干擾信號。
3、當接收端檢測到起始位后,隔16個接收時鐘,對輸入信號檢測一次,把對應的值作為D0位數據。
4、再隔16個接收時鐘,對輸入信號檢測一次,把對應的值作為D1位數據,直到全部數據位都輸入完畢。
注意:在發送時,順序為LSB發至MSB,即由低往高發。如圖中所示,其數據是45H=0100 0101,但其發送順序是1010 0010,切莫倒置。
5、接收奇偶校驗位。
6、當接收完規定的數據位個數和校驗位后,通信接口電路希望收到停止位S(邏輯1),若此時未收到邏輯1,說明出現了錯誤,在狀態寄存器中置“幀錯誤”標志。若沒有錯誤,對全部數據進行奇偶校驗,校驗無錯誤時,把數據位從移位寄存器送入數據輸入寄存器,若校驗錯誤,在狀態寄存器中置奇偶錯誤標志。
還是以上圖數據45H為例,說明一下奇偶校驗。45H的二進制序列為0100 0101。
如果采用奇校驗,奇偶校驗位就是0。這樣才能保證發送出去的數據“1”的個數為奇數,本例中數據中“1”個數為3,所以奇偶校驗位就是0。
如果采用偶校驗,奇偶校驗位就是1,這樣才能保證發送出去的數據“1”的個數為偶數,本例中數據中“1”個數為3,所以奇偶校驗位就是1,這樣數據中就有了4個“1”,這樣才能滿足偶校驗。
7、本幀信息接收完畢,把線路上的高電平作為空閑位。
備注:本段文字中提到的時鐘,是指時鐘周期,是晶振頻率的倒數。它是計算機中最基本,最小的時間單位。
新聞分享:劉經理">/yrckj/CN/C_html/news20210317a-6.html [
劉經理 | 無錫易爾昌智能科技有限公司]