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