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

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