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