Modbus協議詳解


Modbus 協議是應用於控制器 上的一種 通用語言。通過此協議,控制器相互之間、控制器經由網絡(例如以太網)和其它設備之間可以通信。它已經成為一通用工業標准。有了它,不同廠商生產的控制設備可以連成工業網絡,進行集中監控。此協議定義了一個控制器能認識使用的消息結構,而不管它們是經過何種網絡進行通信的。它描述了一控制器請求訪問其它設備的過程,如果回應來自其它設備的請求,以及怎樣偵測錯誤並記錄。它制定了消息域格局和內容的公共格式。當在一個 Modbus 網絡上通信時,此協議 決定了 每個控制器須要知道它們的設備地址,識別按地址發來的消息,決定要產生何種行動。如果需要回應,控制器將生成反饋信息並用 Modbus 協議發出。在其它網絡上,包含了 Modbus 協議的消息轉換為在此網絡上使用的幀或包結構。這種轉換也擴展了根據具體的網絡解決節地址、路由路徑及錯誤檢測的方法。協議在一根通訊線上使用 應答式連接(半雙工),這意味着在一根單獨的通訊線上信號沿着相反的兩個方向傳輸。首先,主計算機的信號尋址到一台唯一的終端設備(從機),然后,在相反的方向上終端設備發出的應答信號傳輸給主機。

協議只允許在主計算機和終端設備 之間,而不允許 獨立的設備之間的數據交換。這就不會在使它們初始化時占據通訊線路,而僅限於響應到達本機的查詢信號。

所謂協議不外乎就是通訊格式與通信規范。下面對這倆部分分別介紹:

一、通訊格式

Modbus的通訊協議包括:波特率,檢驗方式,數據位,停止位

  1. 波特率 一秒鍾傳送的位數,也就是通訊速率;比如波特率為 9600,即,一秒種可以傳送 9600 個位數,
  2. 校驗方式 :奇校驗或偶校驗或無校驗,目的是判斷傳輸過程中是否有錯誤!它只是用於判斷一個字符(比如八個位或是七個位組成一個字符)傳 輸是否有錯誤。但是它並不能完全能夠判斷傳輸是否有錯。比如偶校驗,在檢驗送八個11111111”時,如果到達接收方,由於干擾而變成了“10111101”, “1”的個數仍然是偶數,接收方就判斷不出來傳送的字符已經錯誤!
  3. 數據位:傳輸一個字符由幾個位組成,計算機的基本單位就是“位”,其值非“0”即“1”,又如傳送 A,定義通訊格式時,是定義的八位,其傳送 的數據可能就是:00001010
  4. 停止位:傳輸一個字符有幾個停止位,用天判斷某個字符是否傳輸結束,以便開始接收下一個字符。

通訊格式的作用是規范發送方與接收方的傳輸格式,如果雙方通訊格式不一樣,接收方就不可能正確判斷發送方發來的東西是什么。

比如,接收方設置的波特率是 10(一秒只接收十個位)位,而發送方的波特率是 20(一秒發送二十個位),那么發送方一秒種發送的 20 個字符,接收方就不可能都收到,只能接收到 10 個,造成通訊出錯。

校驗方式:雙方校驗方式不一樣,就沒有一個統一的標准認定傳輸是否有錯誤。

數據位,接收方設定的七位,即它接收到七個位就認為是一個字符,而實際發送方設定的是八位,那么接收方認定的字符與發送方發送的字符就不一樣了。

二、通訊規范

 通訊格式只是保證接收方正確地接收到發送方傳輸過來的每一個字符(實際如上所述,檢驗方式並不能保證完全正確,還要靠通訊規范中的校驗和計算來驗證整體正確性,下面會繼續說明),那么接收到的整串字符做什么用呢,就要靠通訊規范了 MODBUS 的通訊規范很簡單 !

1.ASCII 方式:

ASCII 方式發送時的規范定義如下: 起始符 + 設備地址 + 功能代碼 + 數據 + 校驗 + 結束符

1\ 起始符: 接收到一串字符,總要知道這串字符從哪個地方開始吧,這就是起始符的作用,接收方不管以前收到多少個字符。當接收到起始符時, 以前的字符就不再理它了,從起始符開始分析以后的字符! MODBUS 的 ASCII 方式起始符是一個冒號 “ : “

2\ 設備地址:前面說過,MODBUS 是單主站的主/從通信模式,一個主站下面可以接十多個從站。大家都掛在一條線,如果沒有一個設備地址,就不知道是發給哪個 從站的,大家都回應的話,這條線上的信號就亂七八糟了,主站也不知道接收到的是什么了。所以,設這么一個設備地址,告訴是給那個從站的。只要這個從站回答,其他的閉嘴!“二號,請您回答,其他人就不要吱聲了。” 廣播地址(0)是命令式的,不要求從站回答的。“都聽着,晚上全體到我家喝酒去,散會!” 設備地址是要求兩個字符,比如發給 2 號站,則是“02” 現在的組合是“:02”

3\ 功能代碼: 告訴從站應該做什么,比如讀數據的命令是“3”,從站接收到這個命令,再根據下面數據要求的具體地址,把具體地址的數據返回給主站。 功能代碼也是要求兩個字符,比如讀命令 3,則是“03” 現在的組合是“:0203”

4\ 數據:

數據會有不同的情況所以才會有不一樣的數據表示,大致分為以下幾種:

1、告訴從站具體的元件通訊地址,寫入到哪里,從哪里讀。如讀變頻器的設定頻率的通訊地址是 00A0 元件的通訊地址要求是 :四個字符,當 控制器的元件地址不足四個字符,則在前面補 0,比如元件通訊地址是 A0,則在前面補足兩個 0:“00A0”

2、數據又有可能包括您要讀取的字節數( 有的控制器是字數),比如連續讀取 PLC 的兩個十六位寄存器,其字節數為四個,則是“0004”。讀取個數也是要求四個字符,不足四個,前面補零現在的組合是“:020300A00004“

3、而當要實現寫入功能時,數據又可能包括寫入的數據,比如寫入一個十六位寄存器的值,則要包括是寫入的數值,如“0D98” 現在的組合是“:020600A00D98“ 06 是單個寄存器的寫入命令 Modbus 通信協議

4、當連續寫入多個寄存器時,這個數據包括的內容又不一樣,它可能是: 寄存器通訊地址 (四個字符) + 字數(四個字符)+ 字節數(兩個字符)+ 要寫入的數值。起始符 + 設備地址 + 功能代碼 + 數據 + 校驗 + 結束符 MODBUS 是一種標准通訊協議, 數據呢,因為功能代碼的不同,其包含的內容也不同!

5\ 檢驗和: 

通訊格式里的校驗方式並不能保證每個字符都正確,所以這里就把所有字符的值加在一起,其和(檢驗值)傳給接收方,接收再把接收到 的字符的值加在一起,與發送方傳送過來的檢驗值比較,如果相等,就算接收正確了。最大限度的提高傳輸的可靠性,唯有最大限度地降低干擾!於是產生了 232,485,422 傳輸方式,他們的區別就在於傳輸的可靠性! 1+2+3=6 3+2+1=6 這兩個字符串的作用肯定是不一樣的!但是其校驗和是一樣的,如果在傳輸過程中,由於干擾,1 變 3,3 變 1,根據校驗和的計算,接收方並不知道由於干擾而造成傳輸錯誤,此時,或是出現通訊錯誤,或是出現通訊混亂。 如,命令碼 03,由於干擾而變成了 30,此時校驗和是一樣的,而 MODBUS 並沒有 30 這個命令碼,接收不認識,於是出現通訊錯誤。 再如,讀變頻器的設定頻率通訊地址是 0001,由於干擾而變成了 0010,此時校驗和是一樣的,但是通訊地址卻變了,變頻器就可能返回的是其他數據, 造成通訊混亂! 校驗字符是要求: 兩個字符,如果計算結果超過兩個字符,則取后兩位! 參加校驗計算的字符是 起始符與校驗符之間的字符串(不含起始符與校驗符) 現在的組合是“:02030A000004FB“ (假設校驗和為 FB) 02030A000004 參加校驗和計算。

這里簡單提及一下關於S232與S485的區別:

http://www.elecfans.com/emb/jiekou/20180418663969.html(詳細可以查看網址)

RS232是全雙工的,但是485為半雙工。

RS485與RS232僅僅是通訊的物理協議(即接口標准)有區別,RS485是差分傳輸方式(發送端在兩條信號線上傳輸幅值相等相位相反的電信號,接收端對接受的兩條線信號作減法運算,這樣獲得幅值翻倍的信號。其抗干擾的原理是:假如兩條信號線都受到了同樣(同相、等幅)的干擾信號,由於接受端對接受的兩條線的信號作減法運算,因此干擾信號被基本抵消)RS232是單端傳輸方式,但通訊程序沒有太多的差別。

 6\ 結束符: 

接收到一串字符,總要知道在那個地方結束吧,這就是結束符的作用,接收方不管以后還會收到多少個字符。當接收到結束符時,以后再接收的字符就 算是下一輪的東西了,從起始符到結束符之間的字符就是它要分析的字符! MODBUS 的 ASCII 方式結束符是‐‐‐ Chr$(13) + Chr$(10) 現在的組合是“:02030A000004FB“+ Chr$(13) + Chr$(10) 至此,ASCII 方式的發送就完成了,控制器接收到此串字符后,根據 MODBUS 協議定義的通訊規范分析此串字符的作用,然后返回相應的字符! 注意:發送的字符都是以十六進制數表示!

2.RTU 方式:

RTU方式發送時的規范定義如下: 至少 3.5 個字符傳輸時間的停頓間隔時間標定消息的開始

設備地址 + 功能代碼+ 數據 + 校驗 + 至少 3.5 個字符傳輸時間的停頓間隔時間標定了消息的結束其他的就不用說了,與 ASCII 方式一樣的作用,比如通訊格式是 9600,E,8,1 比如一秒傳送 9600 個位, 通訊格式已經標定了一個字符為7 個位或 8個位,那 3.5 個字符的傳送時間就好算了吧: 3.5*11(或 10)=39 個位(35 個位), 傳 3.5 個字符需要的時間是:39/9600=4 毫秒。這里雖然顯示是8位但是還有一個起始位,奇或偶的校驗位(無奇偶校驗,則沒有此位),停止位(兩個停止位就是 2 了。) 就是說,您得保證發送字符串的連續性,中間停頓時間超過 4 毫秒,接收方就認為您已經發送完了這組消息,開始處理了。這就是至少 3.5 個字符傳輸時 間的停頓間隔時間標定了消息的結束的含義 如果發送的太連續,下一組消息與上一組消息之間的間隔時間沒超過 4 毫秒,接收方就認為這些字符是一組消息,按一組消息去處理。所以,發送結束一組命令后,必須間隔 4 毫秒才能發送下一組命令。

 

三、通訊信息

這里的通訊信息是指主機發送的信息與從機發送的信息,我們經常使用的就是讀取信息的通信過程:這里是常用的功能碼:

 

 

 

在我們讀取信息的時候分為讀取保持寄存器(holding)與讀取輸入寄存器(input),這里說一下保持寄存器與輸入寄存器的區別:modbus協議最開始是用來解決PLC的通信協議問題的,主要用於輸入輸出數字量信號以及模擬量信號,所謂的輸入寄存器就是從模擬量信號輸入引申出來的,即輸入寄存器只能從模擬量信號輸入端改變寄存器,而主機則不能通過下發指令改變輸入寄存器的數據,而保持寄存器則是用於輸出模擬量信號的,主機是可以改變寄存器數據。這里是官方話語,其實簡單的說就是對於主機而言,保持寄存器是可讀可寫的,但是輸入寄存器是只可讀不可以寫入,但是對於從機而言,倆者區別不大。

 

 

 

 

 

 

 

這里舉個例子:在使用我們modbus poll 模擬主機時,從機會發出:

0104140000000c000000000000000000000000000000005082

這里的01表示從機號,04表示功能碼讀取,14表示總共上發多少個字節,這里0000代表從機第一個寄存器的數據,這里是因為每一個寄存器分別對應2個字節,第一個是高位數據第二個是低位數據,即前倆個00表示高位數據,后倆位00表示低位數據(具體數據存放不清楚的可以查看寄存器存放數據的問題),介於我們查詢了10個寄存器故0000000c00000000000000000000000000000000分別對應這10個寄存器的,5082這里對應的就是他的CRC檢驗。

這里我們說一下CRC校驗,在檢驗和的時候我們提過數據可能會出現錯誤數據傳輸。Modbus使用的是CRC16校驗 x16+x15+x2+1 16進制表示為8005

1 預置一個 16 位寄存器為 0FFFFH(全 1),稱之為 CRC 寄存器。

2 把數據幀中的第一個 8 位字節與 CRC 寄存器中的低字節進行異或運算,結果存回 CRC 寄存器。

3 CRC 寄存器向右移一位,最高位填以 0,最低位移出並檢測。

4 如果最低位為 0:重復第 3 步(下一次移位)。

如果最低位為 1:將 CRC 寄存器與一個預設的固定值(0A001H)進行異或運算。

5 重復第 3 步和第 4 步直到 8 次移位。這樣處理完了一個完整的八位。

6 重復第 2 步到第 5 步來處理下一個八位,直到所有的字節處理結束。

因為使用的cRC16的檢驗,這里的錯碼率為1/65536。

 

四、出錯情況

這里會有一個出錯情況的分析,這里大致分為以下幾種情況:

  1. 從機接收查詢,通訊錯誤正常處理信息,則返回一個正常響應事件。
  2. 由於通訊出錯,從機不能接收查詢數據,因而不返回響應。此時,主機依靠處理程序給出查詢超時事件。

3.若從機接收查詢,發現有  CRC通訊錯誤,並返回響應,此時,依靠主機處理程序給出查詢超時事件。

4.從機接收查詢,無通訊錯誤,但無法處理(如讀不存在的線圈和寄存器)時,向主機報告錯誤的性質。

當從機發生不正常響應時,在正常通訊的情況下會返回數據告訴主機這里發生了問題,與正常數據相比,不正常響應信息有 2 個與正常響應不相同的區域:

功能代碼區:正常響應時,從機的響應功能代碼區,帶原查詢的功能代碼。所有功能代碼的 MSB 為 0(其值低於 80H)。不正常響應時,從機把功能代碼的 MSB 置為 1,使功能代碼值大於 80H,高於正常響應的值。簡單的說,我們返回正常的功能碼的數值是在01-72的范圍,但是返回的數據為73~119的時候就代表此時功能代碼出現問題,主機應用程序能識別不正常響應事件,能檢查不正常代碼的數據區

數據區:正常響應中,數據區含有(按查詢要求給出的) 數據或統計值,在不正常響應中,數據區為一個不正常代碼,它說明從機產生不正常響應的條件和原因.

 

上述圖中的Exception Code就是指從機發送給主機的異常代碼,下表為其異常代碼表:

    

 

 


免責聲明!

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



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