如何快速掌握plc或工控機與其他設備的modbus通訊協議?包括格式與實際過程
RT,本人從事工控行業多年,對於PLC與觸摸屏也算比較熟悉,唯獨對這個通訊協議比較難理解,請教高人指導,從什麼地方開始下手,或者是說如何正確理解報文格式或正確寫入
Modbus協議是OSI模型的第七層的應用層通訊協議,定義了不同類型設備間交換信息方式,以及信息的格式。
Modbus的工作方式是請求/應答,每次通訊都是主站先發送指令,可以是廣播,或是向特定從站的單播,從站響應指令,並按要求應答,或者報告異常。當主站不發送請求時,從站不會自己發出數據,從站和從站之間不能直接通訊。
Modbus協議的報文(或幀)的基本格式是:
表頭 + 功能碼 + 數據區 + 校驗碼
功能碼和數據區在不同類型的網路都是固定不變的,表頭和校驗碼則因網路底層的實現方式不同而有所區別。表頭包含了從站的地址,功能碼告訴從站要執行何種功能,數據區是具體的信息。
圖1是一次請求和應答的過程。
圖1
先以串列通訊的Modbus為例(注意Modbus TCP的報文表頭和校驗碼是不一樣的),主站發送了:
09 03 00 04 00 03 XX
主站告訴從站09,我要讀取的地址偏移為4、5、6的Holding Register的數值。其中"03"是讀Holding Register的功能碼,"00 04 00 01"是數據區,"00 04"是寄存器的地址,"00 03"說明要連續讀三個寄存器的值。"XX"代表最後的校驗位,校驗方法是LRC或CRC。
從站收到信息後,就從對應的寄存器找到數值,回復:
09 03 06 02 2B 00 01 00 64 XX
從站回答,該地址偏移為4的寄存器值為02 2B,地址偏移為5的寄存器值為00 01,地址偏移為6的寄存器值為00 64。其中"09 03"是複製了主站發來的地址和功能碼,"06"代表接下來的數據共有6個位元組。
如果從站收到了一個錯誤的請求,例如發現要讀的寄存器地址是錯誤的,則回復:
09 83 02 XX
其中"83"是把功能碼"03"的最高位置1,告訴主站發生了異常,"02"是異常碼,說明發生了無效地址的異常。
Modbus的四種數據類型
Coil:大小只有1位,ON或OFF,可讀可寫,既可以是一個輸出量輸出點,也可以是數字量輸入點,有效的地址範圍是1-9999。
Input Status:大小只有1位,ON或OFF,只讀,即數字量輸出點,有效地址範圍是10001-19999。
Input Register:16位的寄存器,只讀,可以用作模擬量或16位打包輸入點,有效地址範圍是30001-39999。
Holding Register:16位的寄存器,可讀可寫,既可以是一個模擬量或16位打包輸入點,也可以是模擬量或16位打包輸出點,有效地址範圍是40001-49999。
在PLC或DCS上用點名標記不同的變數,在Modbus則以數據地址來標記每個點。以上所說的地址都是參考地址,而不是實際的物理地址。上述的地址是在設備中的地址,按照PLC的習慣從1開始遞增,而Modbus報文中是從0開始遞增。例如地址偏移為4、5、6的Holding Register,其實是指參考地址是40005、40006、40007的寄存器。
Modbus TCP、Modbus RTU和Modbus ASCII的區別
對於不同類型的網路,Modbus的第7層實現是一樣的,區別在於下層的實現方式,常見的有TCP/IP和串列通訊兩種。
Modbus TCP基於乙太網和TCP/IP協議,Modbus RTU和Modbus ASCII則是使用非同步串列傳輸(通常是RS-232/422/485)。
圖2
對於Modbus TCP而言,主站通常稱為Client,從站稱為Server;而對於Modbus RTU和Modbus ASCII來說,主站是Master,從站是Slave。
如圖2所示,串列傳輸的物理層是RS-485或RS-232,數據鏈路層是Modbus的串列傳輸協議;Modbus TCP的1、2、3、4層實現和日常所見的乙太網、網際網路一樣。Modbus默認採用的TCP埠號是502。
圖3說明了Modbus TCP的改動:
- 取消了校驗位。數據鏈路層上就進行了CRC-32的校驗,TCP/IP是面向連接的可靠性的協議,因此沒必要再加上校驗位。
- Slave地址換成了Unit Identifier。當網路里的設備全是使用TCP/IP,這個地址是沒有意義的,因為IP就能進行路由定址。如果網路里還有串列通訊的設備,則需要網關來實現Modbus TCP到Modbus RTU或ASCII之間的協議轉換,這時用Unit Identifier來標識網關後面的每個串列通訊設備。
- Length是指後面的位元組總數。實際上數據區的長度是能確定的,有的功能碼就可以確定數據區的長度,有的功能碼雖不能確定數據區長度,但是數據區有位元組計數,參見上文舉的從站應答的例子。表頭增加的Length是為了應對有些情況下TCP/IP協議會將應用層的數據拆包傳輸。
- Transaction Identifier和Protocol
Identifier由Client生成,Server的響應將複製這些參數。
圖3
RTU和ASCII的區別
RTU模式下,一個位元組的數據,傳輸的就是一個位元組。ASCII模式下,同樣一個位元組數據用了兩個位元組來傳輸。
例如,要傳輸數字0x5B,RTU傳輸的是0101 1011(二進位),而ASCII傳輸的是00110101和01000010。可見,ASCII傳輸的速率是RTU的一半。
ASCII模式採用LRC校驗,RTU模式採用16位CRC校驗。
Modbus資料
MODBUS
Protocol Specification——Modbus總體功能介紹
Modbus
Serial Line Protocol and Implementation Guide V1.02——串列通訊的實現MODBUS TCP/IP——Modbus TCP的實現
Modicon Modbus Protocol Reference Guide——Modbus最早起源於Modicon
Modbus協議非常簡單,這也是它為啥被幾乎所有工控領域供應商支持的原因。總共就那麼幾條指令,還完全是公開的。
Modbus Technical Resources 找幾個文檔看看就夠了。
網上的東西不錯,過於零零碎碎了,不好系統學習。
其實,modbus雖然比較簡單,但是如果不注意有很多坑, 特別是寄存器的位數,大小端處理,浮點數,長整數的處理等等。 目前也沒有什麼合適的書籍系統介紹,幫助理解的。
剛剛搜了一下,只有最近清華出版的《Modbus軟體開發實戰指南》不錯, 應該是Modbus開發方面第一書,很系統很全面,各種代碼都是開源的。 內容著重講述如何快速入門並精通Modbus軟體開發技術, 適用於初學Modbus通信協議的讀者,京東淘寶都有吧,可以看看。
MODBUS網關也不難,不管是走RS485或者RS232,就是物理通信第七層協議。具體的MODBUS網關產品應用可以參考:工業交換機_串口伺服器_RS232轉RS485_串口轉wifi_乙太網光纖轉換器
推薦閱讀:
※控制系統性能評估有哪些實用演算法和經驗?
※控制系統loop shaping的inherent limitation有哪些?
※傳遞函數的零點、極點怎麼解釋,有什麼用?
※自動控制、控制理論的未來在哪裡?
※波士頓動力的機器人是否代表了運動控制的最高水平?所用到的理論知識和工程經驗在普通工程中有應用價值么?
TAG:自動控制 |