終於有人把Modbus協議講清楚了

前言

算了一下,今年是我跟Modbus相識的第10年,從最開始的簡單應用到協議瞭解,從協議開發到協議講解,這個陪伴了10年的協議,它一直沒變,變的只是我對它的理解和認識。

我一直認為Modbus協議的存在有它的歷史意義,也就是說即使沒有Modbus,也可能會出一個ABUS、DBUS之類的協議,因為控制器與控制器之間通訊,一個標準協議,會大大提供開發效率。

因此,現在國產的各種品牌PLC,比如臺達、匯川、信捷等,這些PLC都是支援Modbus協議,也就是說,學會了Modbus協議,我們可以很輕鬆與這些PLC實現資料通訊。

Modbus協議能夠成為工業領域應用最廣泛的協議,它必須具備以下幾個特點:

1、免費:這個是最大的前提,任何產品都是一樣,只有透過免費才能獲取到前期最大的使用量。

2、簡單:Modbus協議幀格式簡單緊湊,使用者容易理解,廠商容易整合。

3、介面:Modbus協議只是一種規約,屬於應用層的協議,因此不僅可以應用在串列埠(485/232/422),也可以在乙太網、光纖、藍芽、無線上傳輸。

儲存區分類

我一般介紹Modbus協議的時候,喜歡站在Modbus規約制定者的角度,結合一些事物來對比說明,這樣對很多人來說,可能會更加容易理解。

假設沒有Modbus協議,我們想要制定一個協議,我們首先要明確,協議的目的是為了資料傳輸,因此,為了更好地儲存不同的資料型別,我們會將布林和非布林的資料分開儲存,因此,就有了線圈和暫存器的概念。

線圈和暫存器,這個經常被很多人詬病,認為不應該這麼翻譯,感覺不容易理解。從電氣角度來看,在電氣控制迴路中,一般都是靠接觸器或中間繼電器來實現控制,接觸器或中繼最終靠的是線圈的得電和失電來控制觸點閉合和斷開,因此用線圈表示布林量;而暫存器在計算機中,就是用來儲存資料的,因此非布林的資料放在暫存器裡。

這個可以跟PLC的儲存區來進行對比,西門子的I/Q/M都是線圈,V/T/C/DB都是暫存器,三菱的X/Y都是線圈,D/W/H都是暫存器,歐姆龍的CIO是線圈,D/W/H是暫存器。

以西門子為例,雖然I和Q都表示線圈,但是他們的分工是不同的,I表示輸入,Q表示輸出,輸入意味著該儲存區裡的值必須由外部裝置接入,是隻讀的,輸出表示輸出結果給外部裝置,是可讀可寫的。

因此,Modbus的線圈和暫存器應該也按照只讀、讀寫來進一步細分,因此這就形成了Modbus的儲存區,如下表所示:

儲存區代號

然而,上面表格裡的儲存區名稱是一個全稱,開發和使用中使用全稱會比較麻煩,因此需要給他們取個別名,就像西門子的I/Q/M一樣,這些都是西門子給儲存區取的一個代號,所以Modbus也要給這些儲存區取一個代號,乾脆直接用數字吧,於是,就有了下面的規定:

這個其實就跟我們的姓名和小名一樣,姓名是正式場合使用,日常場合,我們一般可以使用小名。

儲存區範圍

無論是什麼儲存區,都會有一個範圍的限制,就像西門子的M區可能最大到8192,三菱的X區最大到2048,Modbus的每個儲存區也應該規定一個範圍,不能無限制使用。

Modbus是這麼規定的,每個儲存區的最大範圍是65536,這個範圍是很大的。

我們再以三菱的X區為例,如果最大範圍是2048,那麼意味著我們只能訪問X0-X2047這些地址,我們這裡說的X0、X2047,就是我們常說的PLC地址,那麼這個地址是怎麼組成的呢?它是由儲存區編號加上一個地址索引組成,我們把這樣的PLC地址,理解為絕對地址,後面的地址索引,理解為相對地址。

所謂絕對地址,就是我們僅僅透過一個地址名稱,就能知道是什麼儲存區的第幾個資料,而這個第幾個,就是我們說的相對地址,因此絕對地址是唯一的,相對地址,每個儲存區都有。

那麼對於Modbus來說,我們的絕對地址和相對地址是怎麼樣的呢?

我們仍然遵從公式:絕對地址=區號+相對地址。

但是也會有一些不一樣的地方,以保持型暫存器為例,第一個絕對地址是400001,這個地方不是400000,這個是由Modbus規約決定的,其它儲存區也是類似的。

因此,Modbus儲存區範圍如下圖所示:

終於有人把Modbus協議講清楚了

正如上文所說,65536這個範圍是很大的,但在實際使用中,我們一般用不了這麼多地址,一般情況下,10000以內就已經足夠我們使用了,因此,為了方便起見,我們有一種短的地址模型,如下圖所示:

終於有人把Modbus協議講清楚了

功能碼

功能碼這個概念,我們可以這麼去理解,先回到我們的初衷,協議的目的是為了資料傳輸,也就是為了讀取資料和寫入資料,我們已經確定好4個儲存區,儲存不同的資料型別,那麼接下來我們就要對這些儲存區進行讀寫,那麼可能會產生很多種不同的行為,比如讀取輸入線圈儲存區、讀取輸出線圈儲存區,這就是兩種不同的行為,同樣的,如果用讀取輸入線圈儲存區、讀取輸出線圈儲存區,會比較麻煩,那麼我們乾脆給每種形成指定一個代號,那麼這種代號就是功能碼。

我們再來探討一下,究竟有多少種不同的行為呢?

讀取和寫入是2種行為,儲存區有4個,但是我們知道輸入線圈和輸入暫存器是隻讀的,因此不能進行寫入,除去這2種的話,應該會產生6種不同的行為,如下圖所示:

然而,Modbus規約將寫入輸出線圈和寫入保持暫存器這2種行為,又進一步做了細分,包括寫入單個和寫入多個,因此原來的6種行為就變成了8種行為,同時給每種行為設定一個代號,就形成了下圖所示的功能碼列表:

Modbus規約中的功能碼其實不止這8個,還有一些功能碼是用於診斷或異常碼,但是一般很少使用,這8種功能碼是最主要的核心功能碼。

協議分類

Modbus嚴格來說,是一個標準化的規約,而不是一個具體協議。我們常說的裝置A和裝置B之間透過Modbus協議來通訊,這句話其實是不嚴謹的。

Modbus規約上有三種不同的協議,分別是ModbusRtu、ModbusAscii、ModbusTcp。

一般來說,ModbusRtu和ModbusAscii是執行在串列埠上的協議,ModbusTcp是執行是乙太網上的協議,但是這並非絕對的,我們也可以將ModbusRtu、ModbusAscii執行在乙太網或光纖上使用,同樣的,在串列埠網路裡,我們也可以使用ModbusTcp的協議,因為協議只是一種規範,並不限制通訊介質。

報文格式

前面我們說了Modbus有三種不同的協議,分別是ModbusRtu、ModbusAscii、ModbusTcp,那麼這三種協議的報文格式也是不同的,下面分別對這三種協議的報文格式進行說明:

ModbusRtu的報文格式如下:

第一部分:從站地址,佔1個位元組

第二部分:功能碼,佔1個位元組

第三部分:資料部分,佔N個位元組

第四部分:校驗部分,CRC校驗,佔2個位元組

2。 ModbusAscii的報文格式如下:

第一部分:開始字元(:)

第二部分:從站地址,佔2個位元組

第三部分:功能碼,佔2個位元組

第四部分:資料部分,佔N個位元組

第五部分:校驗部分,LRC校驗,佔2個位元組

第六部分:結束字元(CR LF)

3。 ModbusTcp的報文格式如下:

第一部分:事務處理識別符號,佔2個位元組

第二部分:協議識別符號,佔2個位元組

第三部分:長度,佔2個位元組

第四部分:單元識別符號,佔1個位元組

第五部分:功能碼,佔1個位元組

第六部分:資料部分,佔N個位元組

除錯軟體

Modbus學習成本很低,因為協議是公開免費的,我們可以直接獲取到《Modbus中文協議文件》。

同時,也有很多除錯軟體可以進行模擬除錯,因此我們可以在不購買任何硬體的情況下,就把Modbus協議學好。

【協議文件和除錯軟體】可以聯絡助教老師獲取

Modbus 學習必須要配合相關的除錯軟體,可以達到事半功倍的效果,Modbus

學習必備的三大神器分別是 ModbusPoll、ModbusSlave 及 VSPD,ModbusPoll 軟體主要用於模擬 Modbus主站或 Modbus 客戶端,ModbusSlave 軟體主要用於模擬 Modbus 從站或 Modbus 伺服器,而 VSPD 全稱 Configure Virtual Serial Port Driver,是用來給電腦建立虛擬串列埠使用的。

即使我們想要結合硬體,支援Modbus協議的裝置也有很多,各種品牌PLC、各種品牌的儀表、各種溫溼度感測器、流量計等都可以很好地支援Modbus協議。