ModBus,是一種通訊協定,可細分為RTU、ASCII、TCP,
RTU、ASCII是透過COM Port 的串列傳輸;TCP 則是透過以太網路的串列傳輸。
它的架構是,一個主站,而多個從站。例如下圖,PLC設定成主站,向三台變頻器下達指令。
它的運作方是,主站(Master)傳送指令給所有從站,指令含有站號。
而從站(Slave)收到指令,確認是自己的指令,就回資料給主站,一問一答。
ModBus ASCII格式,會有表頭(:)、從站(Slave)、功能(Function)、暫存器位址(Address)、數據(長度、資料...)、檢查碼(LRC)、表尾(\r\n)。
ModBus RTU 格式,會有從站(Slave)、功能(Function)、暫存器位址(Address)、數據(長度、資料...)、檢查碼(CRC)。
依照功能碼的不同,數據的內容也會有差異,然後回碼也會不同。
大部分設備的手冊都會詳細介紹這部分。
在深入了解之前,下面這些項目是必需先了解,我就先不多敘述了。
二進制(BIN)
十六進制(HEX)
Bit (最小單位)
Byte (= 8 Bit)
Word (= 16 Bit)
DWORD (= 32 Bit)
二的補數、一的補數 (負數計算)
ASCII (編碼)
一般分為兩類:
Bit 型暫存器
Word型暫存器
以下我以十六進制表示一些常用的功能碼:
01h 讀取多個Bit 暫存器
03h 讀取多個Word 暫存器
05h 寫入單個Bit 暫存器
06h 寫入單個Word 暫存器
0Fh 寫入多個Bit 暫存器
10h 寫入多個Word 暫存器
但不是每個設備都會有這些功能碼,也會有一些不常見的功能碼。
簡單講就是1的補數
舉個例子 :
010300000002 拆成 01 03 00 00 00 02 加總 = 06 轉為1的補數 = FA
什麼是CRC-16?可以看Wiki這篇:循環冗餘校驗
Modbus RTU 格式使用的就是CRC 校驗
多項式為:
CRC 規則 :
初始值為FFFFH
算初始值(FFFFH)與從站地址的XOR
將步驟2的結果向右移動1位。繼續移動直到剩餘的位為"1"。
剩餘的位為"1"後,利用上述步驟3的結果和A001H來計算XOR。
重複操作步驟3和4,直到右移8次。
利用步驟5的結果和該資訊的下一個資料(功能碼、暫存器位址、數據)來計算XOR。重複步驟3~5的計算,直到得出最後的資料。
最後的右移結果或者最後的XOR計算值即為CRC-16的計算結果。
假設資料為十六進制的 02 07