新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Modbus TCP/RTU/ASCII 總論

Modbus TCP/RTU/ASCII 總論

作者: 時間:2016-12-14 來源:網(wǎng)絡(luò) 收藏
Modbus協(xié)議】
Modbus協(xié)議是OSI模型的第七層的應(yīng)用層通訊協(xié)議,定義了不同類型設(shè)備間交換信息方式,以及信息的格式。

【Modbus工作方式】
Modbus的工作方式是請求/應(yīng)答,每次通訊都是主站先發(fā)送指令,可以是廣播,或是向特定從站的單播,從站響應(yīng)指令,并按要求應(yīng)答,或者報告異常。當(dāng)主站不發(fā)送請求時,從站不會自己發(fā)出數(shù)據(jù),從站和從站之間不能直接通訊。

【Modbus報文格式】
Modbus協(xié)議的報文(或幀)的基本格式是:表頭 + 功能碼 + 數(shù)據(jù)區(qū) + 校驗碼
功能碼和數(shù)據(jù)區(qū)在不同類型的網(wǎng)絡(luò)都是固定不變的,表頭和校驗碼則因網(wǎng)絡(luò)底層的實現(xiàn)方式不同而有所區(qū)別。表頭包含了從站的地址,功能碼告訴從站要執(zhí)行何種功能,數(shù)據(jù)區(qū)是具體的信息。圖1是一次請求和應(yīng)答的過程。

本文引用地址:http://m.butianyuan.cn/article/201612/330081.htm

【Modbus數(shù)據(jù)交換示例】

先以串行通訊的Modbus為例(注意Modbus TCP的報文表頭和校驗碼是不一樣的),主站發(fā)送了:09 03 00 04 00 03 XX。主站告訴從站09,我要讀取的地址偏移為4、5、6的Holding Register的數(shù)值。其中"03"是讀Holding Register的功能碼,"00 04 00 01"是數(shù)據(jù)區(qū),"00 04"是寄存器的地址,"00 03"說明要連續(xù)讀三個寄存器的值。"XX"代表最后的校驗位,校驗方法是LRC或CRC。從站收到信息后,就從對應(yīng)的寄存器找到數(shù)值,回復(fù):09 03 06 02 2B 00 01 00 64 XX。從站回答,該地址偏移為4的寄存器值為02 2B,地址偏移為5的寄存器值為00 01,地址偏移為6的寄存器值為00 64。其中"09 03"是復(fù)制了主站發(fā)來的地址和功能碼,"06"代表接下來的數(shù)據(jù)共有6個字節(jié)。如果從站收到了一個錯誤的請求,例如發(fā)現(xiàn)要讀的寄存器地址是錯誤的,則回復(fù):09 83 02 XX。其中"83"是把功能碼"03"的最高位置1,告訴主站發(fā)生了異常,"02"是異常碼,說明發(fā)生了無效地址的異常。

【Modbus的四種數(shù)據(jù)類型】
Coil:大小只有1位,ON或OFF,可讀可寫,既可以是一個輸出量輸出點,也可以是數(shù)字量輸入點,有效的地址范圍是1-9999。Input Status:大小只有1位,ON或OFF,只讀,即數(shù)字量輸出點,有效地址范圍是10001-19999。Input Register:16位的寄存器,只讀,可以用作模擬量或16位打包輸入點,有效地址范圍是30001-39999。Holding Register:16位的寄存器,可讀可寫,既可以是一個模擬量或16位打包輸入點,也可以是模擬量或16位打包輸出點,有效地址范圍是40001-49999。在 PLC或DCS上用點名標(biāo)記不同的變量,在Modbus則以數(shù)據(jù)地址來標(biāo)記每個點。以上所說的地址都是參考地址,而不是實際的物理地址。上述的地址是在設(shè)備中的地址,按照PLC的習(xí)慣從1開始遞增,而Modbus報文中是從0開始遞增。例如地址偏移為4、5、6的Holding Register,其實是指參考地址是40005、40006、40007的寄存器。

【Modbus TCP、Modbus RTU和Modbus ASCII的區(qū)別】
對于不同類型的網(wǎng)絡(luò),Modbus的第7層實現(xiàn)是一樣的,區(qū)別在于下層的實現(xiàn)方式,常見的有TCP/IP和串行通訊兩種。Modbus TCP基于以太網(wǎng)和TCP/IP協(xié)議,Modbus RTU和Modbus ASCII則是使用異步串行傳輸(通常是RS-232/422/485)。


對于Modbus TCP而言,主站通常稱為Client,從站稱為Server;而對于Modbus RTU和Modbus ASCII來說,主站是Master,從站是Slave。如圖2所示,串行傳輸?shù)奈锢韺邮荝S-485或RS-232,數(shù)據(jù)鏈路層是Modbus的串行傳輸協(xié)議;Modbus TCP的1、2、3、4層實現(xiàn)和日常所見的以太網(wǎng)、因特網(wǎng)一樣。Modbus默認(rèn)采用的TCP端口號是502。圖3說明了Modbus TCP的改動:
  1. 取消了校驗位。數(shù)據(jù)鏈路層上就進(jìn)行了CRC-32的校驗,TCP/IP是面向連接的可靠性的協(xié)議,因此沒必要再加上校驗位。
  2. Slave 地址換成了Unit Identifier。當(dāng)網(wǎng)絡(luò)里的設(shè)備全是使用TCP/IP,這個地址是沒有意義的,因為IP就能進(jìn)行路由尋址。如果網(wǎng)絡(luò)里還有串行通訊的設(shè)備,則需要網(wǎng)關(guān)來實現(xiàn)Modbus TCP到Modbus RTU或ASCII之間的協(xié)議轉(zhuǎn)換,這時用Unit Identifier來標(biāo)識網(wǎng)關(guān)后面的每個串行通訊設(shè)備。
  3. Length是指后面的字節(jié)總數(shù)。實際上數(shù)據(jù)區(qū)的長度是能確定的,有的功能碼就可以確定數(shù)據(jù)區(qū)的長度,有的功能碼雖不能確定數(shù)據(jù)區(qū)長度,但是數(shù)據(jù)區(qū)有字節(jié)計數(shù),參見上文舉的從站應(yīng)答的例子。表頭增加的Length是為了應(yīng)對有些情況下TCP/IP協(xié)議會將應(yīng)用層的數(shù)據(jù)拆包傳輸。
  4. Transaction Identifier和Protocol Identifier由Client生成,Server的響應(yīng)將復(fù)制這些參數(shù)。


【RTU和ASCII的區(qū)別】

RTU模式下,一個字節(jié)的數(shù)據(jù),傳輸?shù)木褪且粋€字節(jié)。ASCII模式下,同樣一個字節(jié)數(shù)據(jù)用了兩個字節(jié)來傳輸。例如,要傳輸數(shù)字0x5B,RTU傳輸?shù)氖?101 1011(二進(jìn)制),而ASCII傳輸?shù)氖?0110101和01000010??梢姡珹SCII傳輸?shù)乃俾适荝TU的一半。ASCII模式采用LRC校驗,RTU模式采用16位CRC校驗。

【Modbus資料】

MODBUS Protocol Specification——Modbus總體功能介紹

Modbus Serial Line Protocol and Implementation Guide V1.02——串行通訊的實現(xiàn)MODBUS TCP/IP——Modbus TCP的實現(xiàn)

Modicon Modbus Protocol Reference Guide——Modbus最早起源于Modicon



關(guān)鍵詞: ModbusTCPRTUASCI

評論


技術(shù)專區(qū)

關(guān)閉