1、 Modbus簡介
Modbus 是由 Modicon(現為施耐德電氣公司的一個品牌)在 1979 年發明的,是全球第一個真正 用于工業現場的總線協議。
ModBus 網絡是一個工業通信系統,由帶智能終端的可編程序控制器和計算機通過公用線路或局部專 用線路連接而成。其系統結構既包括硬件、亦包括軟件。它可應用于各種數據采集和過程監控。
為更好地普及和推動 Modbus 在基于以太網上的分布式應用,目前施耐德公司已將 Modbus 協議的 所有權移交給 IDA(Interface for Distributed Automation,分布式自動化接口)組織,并成立了 Modbus-IDA 組織,為 Modbus 今后的發展奠定了基礎。
在中國,Modbus 已經成為國家標準,并有專業的規范文檔,感興趣的可以去查閱相關的文件,詳情如下:
標準編號為:GB/T19582-2008
文件名稱:《基于 Modbus 協議的工業自動化網絡規范》
主要有三部分的內容,分別如下:
《GB/T 19582.1-2008 第 1 部分:Modbus 應用協議》
《GB/T 19582.2-2008 第 2 部分:Modbus 協議在串行鏈路上的實現指南》
《GB/T 19582.3-2008 第 3 部分: Modbus 協議在 TCP/IP 上的實現指南》
2、Modbus協議概述
Modbus是一個主-從模式的通信協議,屬于數據鏈路層上的協議,協議本身不涉及具體的硬件要求。
常見的應用Modbus協議的物理接口有RS-485、RS232、USART等的通信鏈路中。
Modbus協議中,一個時刻內只允許有一個主機連接于總線,多個從機連接于總線上,通信都是只能由主機發起,從機進行響應。不能從從機主動發起通信。
3、Modbus 主從機通信模式
主機和從機之間的通信,可以用兩種模式進行:廣播通知模式、單播點對點模式。
3.1、單播點對點模式
主機按照從機的明確地址訪問相應的從機,從機接到來自主機的請求并處理完請求后,從機會向主機返回一個應答,完成一個通信。
在這種模式,一個 Modbus 事務處理包含 2 個報文:一個來自主機的請求,一個來自從機的應答。
在總線上,每個從機都必須有唯一的從機地址 (1 到 247),這樣才能區別于其它節點被獨立的尋址。
3.2、廣播通知模式
主機向所總線通過廣播指令發送請求,所有的從機都要接收來自主機的廣播信息。
對于主機廣播的請求,從機是沒有應答返回的。所有的從機必須要接受主機的廣播寫功能。
地址 0 是專門用于主機向各個從機廣播數據的。
4、Modbus 地址規則
Modbus 尋址空間可以有 256 個不同地址。如下圖所示:
地址 0 為廣播地址。所有的從機必須識別廣播地址。
Modbus 主機本身是沒有地址的,只有從機必須要有一個地址。該地址必須在 Modbus 串行總線上唯一。
248~255作為預留使用的地址。
5、Modbus 的幀格式
Modbus的幀格式按照選擇的模式不同幀格式也是有所區別的。
5.1、RTU模式
RTU 模式下的幀格式如下圖:
Modbus RTU 幀總長度最大為 256 字節。
RTU 模式每個字節 ( 11 位 ) 的格式為** :**
8–位二進制,報文中每個 8 位字節含有兩個 4 位十六進制字符(0–9, A–F)
每字節的 bit 流:
1 起始位
8 數據位, 首先發送最低有效位
1 位作為奇偶校驗
1 停止位
偶校驗是要求的, 其它模式 ( 奇校驗, 無校驗 ) 也可以使用。為了保證與其它產品的最大兼容性, 同時支持無校驗模式是建議的。默認校驗模式模式 必須為偶校驗。
注 : 使用無校驗要求 2 個停止位。
RTU模式時,每個字符或字節均由此順序發送(從左到右):
最低有效位 (LSB) . . . 最高有效位 (MSB)
5.1.1、RTU模式下的幀通信
由發送設備將 Modbus 報文構造為帶有已知起始和結束標記的幀。這使設備可以在報文的開始接收 新幀,并且知道何時報文結束。
不完整的報文必須能夠被檢測到而錯誤標志必須作為結果被設置。
在 RTU 模式,報文幀由時長至少為 3.5 個字符時間的空閑間隔區分。
整個報文幀必須以連續的字符流發送。
如果兩個字符之間的空閑間隔大于 1.5 個字符時間,則報文幀被認為不完整應該被接收節點丟棄。
注意 :
RTU 模式下接收數據時,由于 t1.5 和 t3.5 的時間隔要求的存在,一般在高通信速率下,會導致 CPU 負擔加重。因此,在通信速率等于或低于 19200 bps 時,這兩個定時必須嚴格遵守;
對于波特率大于 19200 bps 的情形,應該使用 2 個定時的固定值:
建議的字符間超時時間(t1.5)為 750μs,
幀間的超時時間 (t1.5) 為 1.750ms。
下圖表示了對 RTU 傳輸模式狀態圖的描述。"主節點" 和 "子節點" 的不同角度均在相同的圖中表示:
上面狀態圖的一些解釋:
1)從 "初始" 態到 “空閑” 態轉換需要 t3.5 定時超時: 這保證幀間延遲
2)“空閑” 態是沒有發送和接收報文要處理的正常狀態。
3)在 RTU 模式, 當沒有活動的傳輸的時間間隔達 3.5 個字符長時,通信鏈路被認為在 “空閑” 態。
4)當鏈路空閑時, 在鏈路上檢測到的任何傳輸的字符被識別為幀起始。鏈路變為 "活動" 狀態。然后當鏈路上沒有字符傳輸的時間間個達到 t3.5 后,被識別為幀結束。
5)檢測到幀結束后,完成 CRC 計算和檢驗。然后,分析地址域以確定幀是否發往此設備,如果不是, 則丟棄此幀。為了減少接收處理時間,地址域可以在一接到就分析,而不需要等到整個幀結束。這 樣,CRC 計算只需要在幀尋址到該節點 (包括廣播幀) 時進行。
5.1.2、RTU模式的CRC校驗
在 RTU 模式包含一個對全部報文內容執行的,基于循環冗余校驗 (CRC - Cyclical Redundancy Checking) 算法的錯誤檢驗域。CRC 域檢驗整個報文的內容。不管報文有無奇偶校驗,均執行此檢驗。
CRC 包含由兩個 8 位字節組成的一個 16 位值。
CRC 域作為報文的最后的域附加在報文之后。計算后,首先附加低字節,然后是高字節。CRC 高字 節為報文發送的最后一個子節。
附加在報文后面的 CRC 的值由發送設備計算。接收設備在接收報文時重新計算 CRC 的值,并將計 算結果于實際接收到的 CRC 值相比較。如果兩個值不相等,則為錯誤。
CRC 的計算, 開始對一個 16 位寄存器預裝全 1。然后將報文中的連續的 8 位子節對其進行后續的計 算。只有字符中的 8 個數據位參與生成 CRC 的運算,起始位,停止位和校驗位不參與 CRC 計算。
CRC 的生成過程中, 每個 8–位字符與寄存器中的值異或。然后結果向最低有效位(LSB)方向移動 (Shift) 1 位,而最高有效位(MSB)位置充零。然后提取并檢查 LSB:如果 LSB 為 1, 則寄存器中的值與 一個固定的預置值異或;如果 LSB 為 0, 則不進行異或操作。
這個過程將重復直到執行完 8 次移位。完成最后一次(第 8 次)移位及相關操作后,下一個 8 位字節 與寄存器的當前值異或,然后又同上面描述過的一樣重復 8 次。當所有報文中子節都運算之后得到的寄存 器的最終值,就是 CRC。
5.2、ASCII傳輸模式
當 Modbus 串行鏈路的設備被配置為使用 ASCII模式通信時,報文中的每個 8 位字節以兩個 ASCII 字符發送。
一般在通信鏈路或者設備無法 符合 RTU 模式的定時管理時使用該模式。
ASCII的幀格式如下:
比如 : 字節 0X5B 會被編碼為兩個字符 : 0x35 和 0x42 ( ASCII 編碼 0x35 ="5", 0x42 ="B" )。
注 : 由于一個子節需要兩個字符,此模式比 RTU 效率低。
ASCII 模式每個字節 ( 10 位 ) 的格式為 :
十六進制,ASCII 字符 0-9, A-F。
1 起始位
7 數據位, 首先發送最低有效位
1 位作為奇偶校驗
1 停止位
偶校驗是要求的, 其它模式 ( 奇校驗, 無校驗 ) 也可以使用。為了保證與其它產品的最大兼容性, 同時支持無校驗模式是建議的。默認校驗模式模式 必須為偶校驗。
注 : 使用無校驗要求 2 個停止位。
字符是如何串行傳送的:
每個字符或字節均由此順序發送(從左到右):
最低有效位 (LSB) . . . 最高有效位 (MSB)
5.2.1、ASCII的報文幀
在 ASCII 模式, 報文用特殊的字符區分幀起始和幀結束。一個報文必須以一個‘冒號’ ( : ) (ASCII 十六進制 3A )起始,以 ‘回車-換行’ (CR LF) 對 (ASCII 十六進制 0D 和 0A) 結束。
注 : LF 字符可以通過特定的 Modbus 應用命令 (參見 Modbus 應用協議規范) 改變。
對于所有的域,允許傳送的字符為十六進制 0–9, A–F (ASCII 編碼)。設備連續的監視總線上的 ‘冒 號’ 字符。當收到這個字符后,每個設備解碼后續的字符一直到幀結束。
報文中字符間的時間間隔可以達一秒。如果有更大的間隔,則接受設備認為發生了錯誤。
特別注意:每個字符子節需要用兩個字符編碼。因此,為了確保 ASCII 模式 和 RTU 模式在 Modbus 應 用級兼容,ASCII 數據域最大數據長度為 (2x252) 是 RTU 數據域 (252) 的兩倍。
必然的, Modbus ASCII 幀的最大尺寸為 513 個字符。
ASCII 報文幀的要求在下面的狀態圖中綜合。"主節點" 和 "子節點" 的不同角度均在相同的圖中表示:
上面狀態圖的一些解釋:
1)“空閑” 態是沒有發送和接收報文要處理的正常狀態。
2)每次接收到 ":" 字符表示新的報文的開始。如果在一個報文的接收過程中收到該字符,則當前地報文 被認為不完整并被丟棄。而一個新的接收緩沖區被重新分配。
3)檢測到幀結束后,完成 LRC 計算和檢驗。然后,分析地址域以確定幀是否發往此設備,如果不是, 則丟棄此幀。為了減少接收處理時間,地址域可以在一接到就分析,而不需要等到整個幀結束。
5.2.2、ASCII的LRC校驗
在 ASCII 模式,包含一個對全部報文內容執行的,基于縱向冗余校驗 (LRC - Longitudinal Redundancy Checking) 算法的錯誤檢驗域。LRC 域檢驗不包括起始“冒號”和結尾 CRLF 對的整個報 文的內容。不管報文有無奇偶校驗,均執行此檢驗。
LRC 域為一個子節,包含一個 8 位二進制值。LRC 值由發送設備計算,然后將 LRC 附在報文后面。接收設備在接收報文時重新計算 LRC 的值,并將計算結果于實際接收到的 LRC 值相比較。如果兩個值不 相等,則為錯誤。
LRC 的計算, 對報文中的所有的連續 8 位字節相加,忽略任何進位,然后求出其二進制補碼。執行檢 驗針對不包括起始“冒號”和結尾 CRLF 對的整個 ASCII 報文域的內容。在 ASCII 模式,LRC 的結果 被 ASCII 編碼為兩個字節并放置于 ASCII 模式報文幀的結尾,CRLF 之前。
6、Modbus的異常碼
MODBUS 事務處理的一般處理過程:
一旦服務器處理請求,使用合適的 MODBUS 服務器事務建立 MODBUS 響應。
根據處理結果,可以建立兩種類型響應:
1) 一個正確的 MODBUS 響應:響應功能碼 = 請求功能碼
2) 一個 MODBUS 異常響應
3)用來為客戶機提供處理過程中與被發現的差錯相關的信息;
4)響應功能碼 = 請求功能碼 + 0x80;
5)提供一個異常碼來指示差錯原因。
7、Modbus的功能碼
7.1、功能碼的類別
目前Modbus的功能中可以分為三類:公共功能碼、用戶定義功能碼、保留功能碼。
公共功能碼 :是已經被定義的功能碼。
用戶定義功能碼 :有兩個可以由用戶定義功能碼。范圍為:65 至 72 和十進制 100 至 110。
保留功能碼 :特殊情況下使用的,并且對公共使用是無效的功能碼。
7.2、公共功能碼
Modbus中公共功能碼的定義如下:
7.2.1、線圈操作功能碼(bit位的操作)
比如我要讀取線圈中的內容。從機地址為 11H,線圈寄存器的起始地址為 0013H,結束地址為 0037H。
需要查詢總共 37 個線圈寄存器,主機發送的RTU幀如下:
從機響應的數據幀如下:
解析:
線圈 0013H 到線圈 001AH 的狀態為 CDH,二進制值為 11001101,該字節的最高字節為線圈 001AH , 最 低 字 節 為 線 圈 0013H 。各線圈狀態與數據內容每位相對應。1 代表 ON,0 代表 OFF。線 圈 001AH 到 線 圈 0013H 的 狀態分別為:
7.2.2、保持寄存器操作功能碼
(1)寫多個保持寄存器
寫多個保持寄存器使用功能碼10H。
比如:從機地址為 11H。保持寄存器的其實地址為 0001H,寄存器的結束地址為 0002H。總共訪問 2
個寄存器。保持寄存器 0001H 的內容為 000AH,保持寄存器 0002H 的內容為 0102H。
主機請求的RTU幀數據如下:
從機返回的響應為:
(2)讀保持寄存器
讀保持寄存器使用03H功能碼。
比如:從機地址為 11H。保持寄存器的起始地址為 006BH,結束地址為 006DH。
主機發送的RTU請求幀如下:
從機的應答如下:
-
數據采集
+關注
關注
39文章
6255瀏覽量
114053 -
MODBUS
+關注
關注
28文章
1821瀏覽量
77317 -
通信系統
+關注
關注
6文章
1204瀏覽量
53460
發布評論請先 登錄
相關推薦
評論