Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信.它已經(jīng)成為一通用工業(yè)標(biāo)準(zhǔn)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。
此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請(qǐng)求訪問(wèn)其它設(shè)備的過(guò)程,如果回應(yīng)來(lái)自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共格式.
當(dāng)在一Modbus網(wǎng)絡(luò)上通信時(shí),此協(xié)議決定了每個(gè)控制器須要知道它們的設(shè)備地址,識(shí)別按地址發(fā)來(lái)的消息,決定要產(chǎn)生何種行動(dòng)。如果需要回應(yīng),控制器將生成反饋信息并用Modbus協(xié)議發(fā)出.在其它網(wǎng)絡(luò)上,包含了Modbus協(xié)議的消息轉(zhuǎn)換為在此網(wǎng)絡(luò)上使用的幀或包結(jié)構(gòu).這種轉(zhuǎn)換也擴(kuò)展了根據(jù)具體的網(wǎng)絡(luò)解決節(jié)地址、路由路徑及錯(cuò)誤檢測(cè)的方法。
協(xié)議在一根通訊線上使用應(yīng)答式連接(半雙工),這意味著在一根單獨(dú)的通訊線上信號(hào)沿著相反的兩個(gè)方向傳輸.首先,主計(jì)算機(jī)的信號(hào)尋址到一臺(tái)唯一的終端設(shè)備(從機(jī)),然后,在相反的方向上終端設(shè)備發(fā)出的應(yīng)答信號(hào)傳輸給主機(jī)。 協(xié)議只允許在主計(jì)算機(jī)和終端設(shè)備之間,而不允許獨(dú)立的設(shè)備之間的數(shù)據(jù)交換,這就不會(huì)在使它們初始化時(shí)占據(jù)通訊線路,而僅限于響應(yīng)到達(dá)本機(jī)的查詢信號(hào)。
1. 1 傳輸方式
傳輸方式是一個(gè)信息幀內(nèi)一系列獨(dú)立的數(shù)據(jù)結(jié)構(gòu)以及用于傳輸數(shù)據(jù)的有限規(guī)則,以RTU模式在Modbus總線上進(jìn)行通訊時(shí),信息中的每8位字節(jié)分成2個(gè)4位16進(jìn)制的字符,每個(gè)信息必須連續(xù)傳輸下面定義了與Modebus 協(xié)議– RTU方式相兼容的傳輸方式。
代碼系統(tǒng)
· 8位二進(jìn)制,十六進(jìn)制數(shù)0。。.9,A。.。F
· 消息中的每個(gè)8位域都是一個(gè)兩個(gè)十六進(jìn)制字符組成
每個(gè)字節(jié)的位 1-8-N-1
· 1個(gè)起始位
· 8個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送
· 1個(gè)奇偶校驗(yàn)位,無(wú)校驗(yàn)則無(wú)
· 1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)Bit(無(wú)校驗(yàn)時(shí))
錯(cuò)誤檢測(cè)域
· CRC(循環(huán)冗長(zhǎng)檢測(cè))
1.2 協(xié)議
當(dāng)信息幀到達(dá)終端設(shè)備時(shí),它通過(guò)一個(gè)簡(jiǎn)單的“口”進(jìn)入尋址到的設(shè)備,該設(shè)備去掉數(shù)據(jù)幀的“信封”(數(shù)據(jù)頭),讀取數(shù)據(jù),如果沒(méi)有錯(cuò)誤,就執(zhí)行數(shù)據(jù)所請(qǐng)求的任務(wù),然后,它將自己生成的數(shù)據(jù)加入到取得的“信封”中,把數(shù)據(jù)幀返回給發(fā)送者。返回的響應(yīng)數(shù)據(jù)中包含了以下內(nèi)容:終端從機(jī)地址(Address)、被執(zhí)行了的命令(Function)、執(zhí)行命令生成的被請(qǐng)求數(shù)據(jù)(Data)和一個(gè)校驗(yàn)碼(Check)。發(fā)生任何錯(cuò)誤都不會(huì)有成功的響應(yīng)。
1.2.1 信息幀
Address
Function
Data
Check
8—Bits
8—Bits
N x 8-Bits
16—Bits
圖 1 – 1 . 信息幀格式
特注:Modbus信息幀所允許的最大長(zhǎng)度為256個(gè)字節(jié),即N的范圍是大于等于零且小于等于252(N{0,252})。
即,所有的數(shù)據(jù)一共256個(gè),數(shù)據(jù)剩下253個(gè)。
1.2.2 地址(Address)域
信息幀地址域(信息地址)在幀的開(kāi)始部分,由8位組成,有效的從機(jī)設(shè)備地址范圍0-247(十進(jìn)制),各從機(jī)設(shè)備的尋址范圍為1-247。主機(jī)把從機(jī)地址放入信息幀的地址區(qū),并向從機(jī)尋址.從機(jī)響應(yīng)時(shí),把自己的地址放入響應(yīng)信息的地址區(qū),讓主機(jī)識(shí)別已作出響應(yīng)的從機(jī)地址。
地址0為廣播地址,所有從機(jī)均能識(shí)別.當(dāng)Modbus協(xié)議用于高級(jí)網(wǎng)絡(luò)時(shí),則不允許廣播或其它方式替代。
1.2.3 功能(Function)域
信息幀功能域代碼告訴了被尋址到的終端執(zhí)行何種功能.有效碼范圍1—225(十進(jìn)制),有些代碼是適用于所有控制器,有些適應(yīng)于某種控制器,還有些保留以備后用。有關(guān)功能代替碼的全部?jī)?nèi)容見(jiàn)附錄A。
當(dāng)主機(jī)向從句發(fā)送信息時(shí),功能代碼向從機(jī)說(shuō)明應(yīng)執(zhí)行的動(dòng)作。如讀一組離散式線圈或輸入信號(hào)的ON/OFF狀態(tài),讀一組寄存器的數(shù)據(jù),讀從機(jī)的診斷狀態(tài),寫(xiě)線圈(或寄存器),允許下截、記錄、確認(rèn)從機(jī)內(nèi)的程序等。當(dāng)從機(jī)響應(yīng)主機(jī)時(shí),功能代碼可說(shuō)明從機(jī)正常響應(yīng)或出現(xiàn)錯(cuò)誤(即不正常響應(yīng)),正常響應(yīng)時(shí),從句簡(jiǎn)單返回原始功能代碼;不正常響應(yīng)時(shí),從機(jī)返回與原始代碼相等效的一個(gè)碼,并把最高有效位設(shè)定為“1”。
如,主機(jī)要求從機(jī)讀一組保持寄存器時(shí),則發(fā)送信息的功能碼為:
0000 0011 (十六進(jìn)制03)若從機(jī)正確接收請(qǐng)求的動(dòng)作信息后,則返回相同的代碼值作為正常響應(yīng)。發(fā)現(xiàn)錯(cuò)時(shí),則返回一個(gè)不正常響信息:
1000 0011(十六進(jìn)制83)
從機(jī)對(duì)功能代碼作為了修改,此外,還把一個(gè)特殊碼放入響應(yīng)信息的數(shù)據(jù)區(qū)中,告訴主機(jī)出現(xiàn)的錯(cuò)誤類(lèi)型和不正常響應(yīng)的原因,不正常響應(yīng)見(jiàn)附錄B。主機(jī)設(shè)備的應(yīng)用程序負(fù)責(zé)處理不正常響應(yīng),典型處理過(guò)程是主機(jī)把對(duì)信息的測(cè)試和診斷送給從機(jī),并通知操作者.表 1 – 1列出了所有設(shè)備常用的功能碼、它們的意義及它們的初始功能。
表 1– 1 常用功能碼
代碼
名稱(chēng)
作用
01
讀取線圈狀態(tài)
取得一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF)
02
讀取輸入狀態(tài)
取得一組開(kāi)關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF)
03
讀取保持寄存器
在一個(gè)或多個(gè)保持寄存器中取得當(dāng)前的二進(jìn)制值
04
讀取輸入寄存器
在一個(gè)或多個(gè)輸入寄存器中取得當(dāng)前的二進(jìn)制值
05
強(qiáng)置單線圈
強(qiáng)置一個(gè)邏輯線圈的通斷狀態(tài)
06
預(yù)置單寄存器
放置一個(gè)特定的二進(jìn)制值到一個(gè)單寄存器中
07
讀取異常狀態(tài)
取得8個(gè)內(nèi)部線圈的通斷狀態(tài)
15
強(qiáng)置多線圈
強(qiáng)置一串連續(xù)邏輯線圈的通斷
16
預(yù)置多寄存器
放置一系列特定的二進(jìn)制值到一系列多寄存器中
17
報(bào)告從機(jī)標(biāo)識(shí)
可使主機(jī)判斷編址從機(jī)的類(lèi)型及該從機(jī)運(yùn)行指示燈的狀態(tài)
1.2.4 數(shù)據(jù)域
數(shù)據(jù)域包含了終端執(zhí)行特定功能所需要的數(shù)據(jù)或者終端響應(yīng)查詢時(shí)采集到的數(shù)據(jù)。這些數(shù)據(jù)的內(nèi)容可能是數(shù)值、參考地址或者極限值。他由數(shù)據(jù)區(qū)有2個(gè)16進(jìn)制的數(shù)據(jù)位(2的8次方256),數(shù)據(jù)范圍為00—FF(16進(jìn)制)。例如:功能域碼告訴終端讀取一個(gè)寄存器,數(shù)據(jù)域則需要指明從哪個(gè)寄存器開(kāi)始及讀取多少個(gè)數(shù)據(jù),內(nèi)嵌的地址和數(shù)據(jù)依照類(lèi)型和從機(jī)之間的不同能力而有所不同.若無(wú)錯(cuò)誤出現(xiàn),從機(jī)向主機(jī)的響應(yīng)信息中包含了請(qǐng)求數(shù)據(jù),若有錯(cuò)誤出現(xiàn),則數(shù)據(jù)中有一個(gè)不正常代碼,使主機(jī)能判斷并作出下一步的動(dòng)作。數(shù)據(jù)區(qū)的長(zhǎng)度可為“零”以表示某類(lèi)信息。
1.2.5 錯(cuò)誤校驗(yàn)域
該域允許主機(jī)和終端檢查傳輸過(guò)程中的錯(cuò)誤。有時(shí),由于電噪聲和其它干擾,一組數(shù)據(jù)在從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備時(shí)在線路上可能會(huì)發(fā)生一些改變,出錯(cuò)校驗(yàn)?zāi)軌虮WC主機(jī)或者終端不去響應(yīng)那些傳輸過(guò)程中發(fā)生了改變的數(shù)據(jù),這就提高了系統(tǒng)的安全性和效率,出錯(cuò)校驗(yàn)使用了16位循環(huán)冗余的方法,即CRC校驗(yàn)。
錯(cuò)誤檢測(cè)域包含一16Bits值(用兩個(gè)8位的字符來(lái)實(shí)現(xiàn))。錯(cuò)誤檢測(cè)域的內(nèi)容是通過(guò)對(duì)消息內(nèi)容進(jìn)行循環(huán)冗長(zhǎng)檢測(cè)方法得出的.CRC域附加在消息的最后,添加時(shí)先是低字節(jié)然后是高字節(jié)。故CRC的高位字節(jié)是發(fā)送消息的最后一個(gè)字節(jié)。
1.2.6 字符的連續(xù)傳輸
當(dāng)消息在標(biāo)準(zhǔn)的Modbus系列網(wǎng)絡(luò)傳輸時(shí),每個(gè)字符或字節(jié)按由左到右的次序方式發(fā)送:
最低有效位(LSB)。。.最高有效位(MSB)。
位的序列是:
有奇偶校驗(yàn)
啟始位
1
2
3
4
5
6
7
8
奇偶位
停止位
無(wú)奇偶校驗(yàn)
啟始位
1
2
3
4
5
6
7
8
停止位
停止位
圖 1 –2 . 位順序(RTU)
1.2 錯(cuò)誤檢測(cè)
1、奇偶校驗(yàn)
用戶可以配置控制器是奇或偶校驗(yàn),或無(wú)校驗(yàn)。這將決定了每個(gè)字符中的奇偶校驗(yàn)位是如何設(shè)置的。
如果指定了奇或偶校驗(yàn),“1”的位數(shù)將算到每個(gè)字符的位數(shù)中(ASCII模式7個(gè)數(shù)據(jù)位,RTU中8個(gè)數(shù)據(jù)位)。例如RTU字符幀中包含以下8個(gè)數(shù)據(jù)位:1 1 0 0 0 1 0 1
整個(gè)“1″的數(shù)目是4個(gè)。如果便用了偶校驗(yàn),幀的奇偶校驗(yàn)位將是0,便得整個(gè)“1″的個(gè)數(shù)仍是4個(gè)。如果便用了奇校驗(yàn),幀的奇偶校驗(yàn)位將是1,便得整個(gè)“1″的個(gè)數(shù)是5個(gè).
如果沒(méi)有指定奇偶校驗(yàn)位,傳輸時(shí)就沒(méi)有校驗(yàn)位,也不進(jìn)行校驗(yàn)檢測(cè)。代替一附加的停止位填充至要傳輸?shù)淖址麕?
2、CRC檢測(cè)
RTU方式時(shí),采用CRC方法計(jì)算錯(cuò)誤校驗(yàn)碼,CRC校驗(yàn)傳送的全部數(shù)據(jù).它忽略信息中單個(gè)字符數(shù)據(jù)的奇偶校驗(yàn)方法。
循環(huán)冗余校驗(yàn)(CRC)域占用兩個(gè)字節(jié),包含了一個(gè)16位的二進(jìn)制值。CRC值由傳送設(shè)備計(jì)算出來(lái),然后附加到數(shù)據(jù)幀上,接收設(shè)備在接收數(shù)據(jù)時(shí)重新計(jì)算CRC值,然后與接收到的CRC域中的值進(jìn)行比較,如果這兩個(gè)值不相等,就發(fā)生了錯(cuò)誤。
CRC開(kāi)始時(shí)先把寄存器的16位全部置成“1”,然后把相鄰2個(gè)8位字節(jié)的數(shù)據(jù)放入當(dāng)前寄存器中,只有每個(gè)字符的8位數(shù)據(jù)用作產(chǎn)生CRC,起始位,停止位和奇偶校驗(yàn)位不加到CRC中。
在生成CRC時(shí),每個(gè)8位字節(jié)與寄存器中的內(nèi)容進(jìn)行異或,然后將結(jié)果向低位移位,高位則用“0”補(bǔ)充,最低位(LSB)移出并檢測(cè),如果是1,該寄存器就與一個(gè)預(yù)設(shè)的固定值進(jìn)行一次異或運(yùn)算,如果最低位為0,不作任何處理。
上述處理重復(fù)進(jìn)行,知道執(zhí)行完了8次移位操作,當(dāng)最后一位(第8位)移完以后,下一個(gè)8位字節(jié)與寄存器材的當(dāng)前值進(jìn)行異或運(yùn)算,同樣進(jìn)行上述的另一個(gè)8次移位異或操作,當(dāng)數(shù)據(jù)幀中的所有字節(jié)都作了處理,生成的最終值就是CRC值。
生成一個(gè)CRC的流程為:
1、 預(yù)置一個(gè)16位寄存器為0FFFFH(全1),稱(chēng)之為CRC寄存器。
2、 把數(shù)據(jù)幀中的第一個(gè)8位字節(jié)與CRC寄存器中的低字節(jié)進(jìn)行異或運(yùn)算,結(jié)果存回CRC寄存器。
3、 將CRC寄存器向右移一位,最高位填以0,最低位移出并檢測(cè)。
4、 如果最低位為0:重復(fù)第3步(下一次移位)。
如果最低位為1:將CRC寄存器與一個(gè)預(yù)設(shè)的固定值(0A001H)進(jìn)行異或運(yùn)算。
5、 重復(fù)第3步和第4步直到8次移位。這樣處理完了一個(gè)完整的八位.
6、 重復(fù)第2步到第5步來(lái)處理下一個(gè)八位,直到所有的字節(jié)處理結(jié)束.
7、 最終CRC寄存器得值就是CRC的值。
CRC值附加到信息時(shí),低位在先,高位在后.查閱附錄C中的一個(gè)實(shí)例,它詳細(xì)說(shuō)明了CRC的校驗(yàn)。