什么是Modbus
1. Modbus如何工作
Modbus是通過設備之間的幾根連線來傳遞數據,最簡單的設置就是主站和從站之間用一跟串口線相連。數據通過一串0或者1來傳遞,也就是位。0為正電壓,1為負電壓。位數據傳遞速度非常快,常見的傳輸速度為9600波特(即9600bits/s).
2. 標準Modbus怎么存儲數據
信息存儲在從站的四個不同的表中。兩個表存儲數字量,稱為線圈;兩個表存儲模擬量,稱為寄存器。線圈和寄存器分別有一個只讀,另一個可讀寫。每個表可存儲9999個值。線圈是一位的,地址從0000到270E;寄存器是一個字的(16位,2字節)地址也是從0000到270E.
Coil/Register Numbers | Data Addresses | Type | Table Name |
---|---|---|---|
1-9999 | 0000 to 270E | Read-Write | Discrete Output Coils |
10001-19999 | 0000 to 270E | Read-Only | Discrete Input Contacts |
30001-39999 | 0000 to 270E | Read-Only | Analog Input Registers |
40001-49999 | 0000 to 270E | Read-Write | Analog Output Holding Registers |
線圈/寄存器編號可以看做是位置的名字,它們不出現在實際發送的信息當中,數據地址(Data Address)出現在實際發送的信息中。
舉個例子,第一個Holding Register的編號為40001,數據地址為0000.這兩個數字的區別在于偏移量。
3. 什么是從站ID
在網絡中,每一個從機分配一個唯一的設備地址,從1到247.當主機請求數據時,發送的信息的第一個字節就是從機地址,這樣,從機接收到第一個字節后就知道是否忽略信息。
4. 什么是功能碼
主機發送的第二個字節就是功能碼。這個功能碼告訴從機需要訪問哪個表,是向這個表中寫數據還是讀數據。
Fun Code | Action | Table Name |
---|---|---|
01(01 hex) | Read | Discrete Output Coils |
05(05 hex) | Write single | Discrete Output Coil |
15(0F hex) | Write multiple | Discrete Output Coils |
02(02 hex) | Read | Discrete Input Contacts |
04(04 hex) | Read | Analog Input Registers |
03(03 hex) | Read | Analog Output Holding Registers |
06(06 hex) | Write single | Analog Output Holding Register |
16(10 hex) | Write multiple | Analog Output Holding Registers |
5. 什么是CRC
CRC即循環冗余校驗碼(Cyclic Redundancy check),是在每一個發送的信息后面加上的兩字節,用于檢驗發送和接受是否出錯。信息中的每一個字節都用于計算CRC。接受設備同時計算CRC,然后與發送方計算的CRC進行比較,如果兩者不同,則產生錯誤。
6. Modbus發送指令和回應的格式
Modbus發送指令和回應的格式
Data Addresses | Read | Write Single | Write Multiple |
---|---|---|---|
Discrete Output Coils 0xxxx | FC01 | FC05 | FC15 |
Discrete Input Contacts 1xxxx | FC02 | NA | NA |
Analog Input Registers 3xxxx | FC04 | NA | NA |
Analog Output Holding Registers 4xxxx | FC03 | FC06 | FC16 |
注:FC表示Function Code
eg1.
數據請求:
11 01 0013 0025 0E84
11: 從機地址 (0x11 = 17 )
01: 功能碼01(讀線圈狀態)
0013: 線圈首地址(0x0013=19,+1偏移量=#20線圈)
0025: 要讀的線圈數 (0x25 = 37, 20~56 )
0E84: CRC校驗和
回應
11 01 05 CD6BB20E1B 45E6
11: 從機地址 (0x11 = 17 )
01: 功能碼01(讀線圈狀態)
05:后面的字節數(37/8=5字節)
CD:線圈27 - 20 (1100 1101)
6B: 線圈35 - 28 (0110 1011)
B2: 線圈43 - 36 (1011 0010)
0E: 線圈51 - 44 (0000 1110)
1B: 3空格和線圈56 - 52 (0001 1011)
45E6: CRC校驗和
其他例子與此類似,不再贅述。
參考資料:simplyModbus