Modbus協(xié)議是一個(gè)master/slave架構(gòu)的協(xié)議。有一個(gè)節(jié)點(diǎn)是master(主站)節(jié)點(diǎn),其他使用Modbus協(xié)議參與通信的節(jié)點(diǎn)是slave(從站)節(jié)點(diǎn)。每一個(gè)slave設(shè)備都有一個(gè)****的地址。在串行網(wǎng)絡(luò)中,只有被指定為master的節(jié)點(diǎn)可以啟動(dòng)一個(gè)命令(在以太網(wǎng)上,任何一個(gè)設(shè)備都能發(fā)送一個(gè)Modbus命令,但是通常也只有一個(gè)主節(jié)點(diǎn)設(shè)備啟動(dòng)指令)。 一個(gè)ModBus命令包含了打算執(zhí)行的設(shè)備的Modbus地址。所有設(shè)備都會(huì)收到命令,但只有指定位置的設(shè)備才會(huì)執(zhí)行及回應(yīng)指令(地址0例外,指定地址0的指令是廣播指令,所有收到指令的設(shè)備都會(huì)運(yùn)行,不過(guò)不回應(yīng)指令)。所有的Modbus命令包含了校驗(yàn)碼,以確定到達(dá)的命令沒(méi)有被破壞。基本的ModBus命令能指令一個(gè)RTU改變它的寄存器的某個(gè)值,控制或者讀取一個(gè)I/O端口,以及指揮設(shè)備回送一個(gè)或者多個(gè)其寄存器中的數(shù)據(jù)。 數(shù)據(jù)結(jié)構(gòu)
通訊消息幀
ASCII消息幀 (在消息中的每個(gè)8Bit 字節(jié)都作為兩個(gè)ASCII字符發(fā)送) 十六進(jìn)制,ASCII字符0...9,A...F 消息中的每個(gè)ASCII字符都是一個(gè)十六進(jìn)制字符組成 每個(gè)字節(jié)的位 1個(gè)起始位 n個(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è)域 LRC(縱向冗長(zhǎng)檢測(cè))

有奇偶校驗(yàn) 
RTU消息幀 8位二進(jìn)制,十六進(jìn)制數(shù)0...9,A...F 消息中的每個(gè)8位域都是一個(gè)兩個(gè)十六進(jìn)制字符組成 每個(gè)字節(jié)的位 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è)域
LRC(縱向冗長(zhǎng)檢測(cè))
有奇偶校驗(yàn)
無(wú)奇偶校驗(yàn)
ModBus協(xié)議中,CRC校驗(yàn)碼計(jì)算方法為: 1、預(yù)置1個(gè)16位的寄存器為十六進(jìn)制FFFF(即全為1);稱(chēng)此寄存器為CRC寄存器; 2、把第一個(gè)8位二進(jìn)制數(shù)據(jù)(既通訊信息幀的第一個(gè)字節(jié))與16位的CRC寄存器的低8位相異或,把結(jié)果放于CRC寄存器; 3、把CRC寄存器的內(nèi)容右移一位(朝低位)用0填補(bǔ)****位,并檢查右移后的移出位;4、如果移出位為0:重復(fù)第3步(再次右移一位); 如果移出位為1:CRC寄存器與多項(xiàng)式A001(1010 0000 0000 0001)進(jìn)行異或; 5、重復(fù)步驟3和4,直到右移8次,這樣整個(gè)8Bit數(shù)據(jù)全部進(jìn)行了處理; 6、重復(fù)步驟2到步驟5,進(jìn)行通訊消息幀下一個(gè)字節(jié)的處理; 7、將該通訊消息幀所有字節(jié)按上述步驟計(jì)算完成后,得到的16位CRC寄存器的高、低字節(jié)進(jìn)行交換; 8、最后得到的CRC寄存器內(nèi)容即為:CRC碼Modbus的使用限制 ● Modbus是在1970年為可編程邏輯控制器通信開(kāi)發(fā)的,這些有限的數(shù)據(jù)類(lèi)型在那個(gè)時(shí)代是可以被PLC理解的,大型二進(jìn)制對(duì)象數(shù)據(jù)是不支持的; ● 對(duì)節(jié)點(diǎn)而言,沒(méi)有一個(gè)標(biāo)準(zhǔn)的方法找到數(shù)據(jù)對(duì)象的描述信息,舉個(gè)例子:確定一個(gè)寄存器的數(shù)據(jù)是否表示一個(gè)介于30-175度之間的溫度; ● 由于Modbus是一個(gè)主/從協(xié)議,沒(méi)有辦法要求設(shè)備"報(bào)告異常"(構(gòu)建在以太網(wǎng)的TCP/IP協(xié)議之上,被稱(chēng)為open-mbus除外)- 主站節(jié)點(diǎn)必須循環(huán)的詢(xún)問(wèn)每個(gè)節(jié)點(diǎn)設(shè)備,并查找數(shù)據(jù)中的變化。在帶寬可能比較寶貴的應(yīng)用中,這種方式在應(yīng)用中消耗帶寬和網(wǎng)絡(luò)時(shí)間,例如在低速率的無(wú)線(xiàn)鏈路上; ● Modbus在一個(gè)數(shù)據(jù)鏈路上只能處理247個(gè)地址,這種情況限制了可以連接到主控站點(diǎn)的設(shè)備數(shù)量(再一次指出以太網(wǎng)TCP/IP除外); ● Modbus傳輸在遠(yuǎn)端通訊設(shè)備之間緩沖數(shù)據(jù)的方式進(jìn)行,有對(duì)通信一定是連續(xù)的限制,避免了傳輸中的緩沖區(qū)漏洞的問(wèn)題; ●Modbus協(xié)議自身提供針對(duì)未經(jīng)授權(quán)的命令或截取數(shù)據(jù)沒(méi)有安全性。 
|