1、概論
Modbus是一種串行通信協議,由於其協議簡單易用,且沒有版權要求,目前已經成為工業領域通信協議的實時標准。ModBus協議是又施耐德電氣的前身Modicon公司在1979年提出的。Modbus目前有兩個主要版本 ModBus串口,MODBUS TCP/IP。ModBus 串口又有兩個變種:Modbus RTU是一種緊湊的,采用二進制表示數據的方式,Modbus ASCII是一種人類可讀的,冗長的表示方式。還有一種擴展協議MODBUS PLUS(Modbus+或者MB+),不過此協議是Modicon專有的一種高速令牌傳遞網絡,和Modbus不同,它需要一個專門的協處理器來處理類似HDLC的高速令牌旋轉。
下圖說明ModBus協議規范和現有協議的關系從圖可以看出,Modbus是基於現有OSI 網絡模型上的應用協議。
Modbus 協議和 ISO/OSI 模型 具體情況
2、ModBus的應用場景
ModBus協議可以解決工廠不同種類設備的數據采集問題,使得我們可以通過采集的數據隨時監控工廠的運行情況。MODBUS 協議允許在各種網絡體系結構內進行簡單通信,它的常見體系結構圖如下。
HMI代表人機界面,PLC是工廠常用的采集設備,工廠中的各類PLC,I/O數據接口,驅動器設備可以通過各類Modbus協議采集它的數據,並且不同Modbus協議網絡之間還可以通過網關進行數據交換。
3、Modbus協議內容介紹
3.1 Modbus 網絡形式和協議
在介紹Modbus網絡之前首先介紹一下Modbus網絡上傳輸的是什么,和其他協議類似,Modbus協議最基本的通信單位是幀,整個Modbus幀又被稱之為應用數據單元(ADU),ADU中又包含了協議數據單元(PDU)用於傳真正需要傳輸的數據。
Modbus協議是一個主/從架構的協議。在同一個Modbus網絡中同一時刻只有一個節點是主(master)節點,其他使用Modbus協議參與通信的節點是從(slave)節點,從節點的最大編號為247。每一個slave設備都有一個唯一的地址。
在串行和MB+網絡中,通訊總是由主節點發起(在以太網上,任何一個設備都能發送一個Modbus命令,但是通常也只有一個主節點設備啟動指令),子節點在沒有收到主節點請求時不會發送數據。各個子節點之間不會直接相互通信。
在同一個時刻,主節點只會發起一個Modbus事務處理。什么是事務處理呢?其實就是一次網絡上完整的應答通訊。主要包含兩種形式,1 單播模式 , 2 廣播模式
所謂單播模式就是主節點給某個指定的節點發送消息(通過ADU中的地址域指定),從節點收到並處理完請求后,從節點向主節點返回一個應答報文,在這種模式下,一個Modbus事務包含兩個報文,一個來自主節點的請求,一個來自子節點的應答
所謂廣播模式,是主節點向所有的子節點發送請求,當主節點發送的請求報文的地址域值為0時,代表廣播請求,所有的從節點都需要接受處理,但不需要向主節點返回報文。
其實在物理層所有設備都會收到所有的請求,但地址域不為0時,從機判斷當前為單播模式,只有地址域和自身地址號相同的從機才會響應請求,當地址域為0時,從機判斷為廣播消息,所有的從機都會執行指令,所有收到指令的設備都會運行,只不過不回應指令。
客戶機(主機)和服務器(從機)通信時會出現兩種情況,一種是正常,一種是異常。
其中事務處理正常時示意圖如下,客戶機(主機)向服務器(從機)發送請求,在功能碼中填充功能碼代號,說明服務器需要執行的動作,在數據碼區填充具體的要求,比如讀寄存器的地址和數量,通信正常時服務器會在返回的通信幀的功能碼區中填充一個操作碼,該操作碼和功能碼的值一樣,在通訊幀的數據區填充返回的采樣數據。
當出現事務處理異常時,示意圖如下,服務器會在返回的通訊幀的功能碼中填充一個差錯碼,該差錯碼 = 功能碼 + 0x80,即將功能碼的最高位置1代表出現錯誤。並在后面的數據段中填充錯誤碼,用來指示本次通信的錯誤具體內容。
錯誤檢測域是針對通訊鏈路是否可靠的檢測域,通過CRC(循環冗余校驗碼)等錯誤校驗方式校驗通信過程中是否發生了差錯。
4、幀詳解
Modbus協議的三種形式通訊的幀略有不同,具體如下
MBAP是一個通用的報文頭,依賴於可靠的網絡層,各域的典型長度如下(以串行鏈路為例)
各功能域介紹:
4.1、地址域
第一部分是8位是地址域,用於給從機編號,而主機是沒有地址的,從機的地址必須是唯一的。Modbus 地址域使用1個字節,尋址空間有 256 個不同地址,但合法的地址是0 – 247。
主節點通過將子節點的地址放到報文的地址域對子節點尋址。當子節點返回應答時, 它將自己的地址放到應答報文的地址域以讓主節點知道哪個子節點在回答
4.2、功能碼
第二部分8位是功能碼,功能碼指明服務器要執行的動作。
主機通過在PDU中指定不同的功能碼,通知從機(服務器)執行不同的動作, 功能碼分為三類:
A、公共功能碼:這是Modbus協議組織定義的功能碼,被大家一致認可,普通情況下不會改變。
B、用戶定義功能碼: 有兩個用戶定義功能碼的定義范圍,十進制 65 至 72 和十進制 100 至 110,可以用戶自行定義使用。
C、保留功能碼:這是一些公司對一些歷史產品使用的功能碼,對公共來說是無效的。
公共功能碼的定義如下:
訪問形式有單比特訪問和16比特訪問還有文件記錄訪問, 這里的線圈可以理解為開關量 0,1
4.3、數據區
介紹數據區之前,先介紹一下Mobbus協議的數據模型,Modbus可訪問的數據存儲在四個區塊或地址范圍的其中一個: 線圈狀態、離散量輸入、保持寄存器和輸入寄存器。這里的區塊是概念性的定義,在物理層面它們可能作為獨立的內存地址存在於給定的系統中,但也可能重疊,這個完全由設備自己管理。
每個區塊定義可以包含65,536個元素的地址空間。在PDU的定義中,Modbus定義了每個數據元素的地址,范圍從0到65,535。但是我們的物理設備如寄存器、線圈通常從1開始編號從1到n,其中n的最大值為65,536。也就是說,線圈11位於地址10的線圈狀態區塊中,而保持寄存器34位於從機被定義為保持寄存器的內存部分中的地址33。 實際使用時設備不會直接描述數據在某某號寄存器中,如電壓量在第13號保存寄存器中,而是會描述為電壓量在地址40001(或者4001,400001等),其中4XXX、4XXXX和4XXXXX的區別取決於設備使用的地址空間。 如果所有65,536個寄存器都在使用中,應該使用4XXXXX符號,因為其允許范圍為400,001~465,536。4開頭是因為實際使用時地址編碼的前綴通常反映數據的類型,一般如下定義數據類型和前綴關系。
4.4、錯誤檢驗域
該域是串行鏈路對報文內容執行 "冗余校驗" 的計算結果。根據不同的傳輸模式 (RTU or ASCII)使用兩種不同的計算方法。
4.5、報文示例
請求讀離散量輸出 20-38 的實例
將輸出 27-20 的狀態表示為十六進制字節值 CD,或二進制 1100 1101。輸出 27 是這個字節的MSB,輸出 20 是 LSB。按照慣例,將一個字節內的比特表示為 MSB 位於左側,LSB 位於右側。第一字節的輸出從左至右為 27 至 20。下一個字節的輸出從左到右為 35 至 28。當串行發射比特時,從 LSB 向 MSB 傳輸: 20 . . .27、28 . . . 35 等等。在最后的數據字節中,將輸出狀態 38-36 表示為十六進制字節值 05,或二進制 0000 0101。輸出38 是左側第六個比特位置,輸出 36 是這個字節的 LSB。用零填充五個剩余高位比特。如果返回的輸出數量不是八的倍數,將用零填充最后數據字節中的剩余比特。設備內部流程如下
4.6 異常代碼
5、關於傳輸
串行傳輸模式有兩種:RTU模式和ASCII模式
Modbus 串行鏈路 上所有設備的傳輸模式和串口參數必須相同。所有設備必須實現RTU模式,ASCII模式是選擇項,只有配置成相同模式的設備才可以相互正常通信。在其他網絡上(如MAP,Modbus Plus)Modbus消息被轉換為與串行傳輸無關的幀。Modbus 使用“大端模式”(big-Endian) 表示地址和數據項。當發送多個字節時,首先發送最高有效位。這是字節層面的,在串口線路中傳送每個字節時bit傳送模式為,LSB先發送,MSB后發送。
RTU 傳輸模式
當控制器以RTU模式通信時,消息中每個8bit字節包含兩個4bit十六進制字符。這種方式的有點是:在相同波特率下,可以比ASCII方式傳送更多數據
相應的串口設置要求
- 1 起始位
- 8 數據位, 首先發送最低有效位
- 1 位作為奇偶校驗
- 1 停止位
每個字符或字節均由此順序發送(從左到右):最低有效位 (LSB) . . . 最高有效位 (MSB)
ASCII 傳輸模式
當 Modbus 串行鏈路的設備被配置為使用 ASCII (American Standard Code for Information
Interchange) 模式通信時, 報文中的每個 8 位子節以兩個 ASCII 字符發送。當通信鏈路或者設備
無法符合 RTU 模式的定時管理時使用該模式。
注 : 由於一個子節需要兩個字符,此模式比 RTU 效率低。
例 : 子節 0X5B 會被編碼為兩個字符 : 0x35 和 0x42 ( ASCII 編碼 0x35 ="5", 0x42 ="B" )。
相應的串口設置
- 1 起始位
- 7 數據位, 首先發送最低有效位
- 1 位作為奇偶校驗
- 1 停止位
和RTU模式一樣每個字符或字節均由此順序發送(從左到右):最低有效位 (LSB) . . . 最高有效位 (MSB)
(ASCII 十六進制 3A )起始,以‘回車-換換行’ (CR LF) 對(ASCII 十六進制 0D 和 0A)結束。