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

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