介紹
簡介
Modbus 是一種應(yīng)用層報文傳輸協(xié)議怀读,由 Modicon 公司在 1979 年發(fā)布,是為了解決 PLC 通信而研發(fā)的協(xié)議靠粪。
因為 Modbus 是開源的且無著作權(quán)要求洲胖、易于部署維護峦失、可靠性強的特性,所以 Modbus 已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議事實上的業(yè)界標準筒严,并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式丹泉。
MODBUS 是一個請求/應(yīng)答協(xié)議,包括ASCII鸭蛙、RTU摹恨、TCP等,是1979年開發(fā)出的一種工業(yè)通信協(xié)議娶视,并沒有規(guī)定物理層晒哄。此協(xié)議定義了控制器能夠認識和使用的消息結(jié)構(gòu),而不管它們是通過何種硬件方式進行通信的
硬件接口
- RS-232
- RS-422
- RS-485
- 以太網(wǎng)
傳輸模式
- RTU
- ASII
- TCP
TCP和RTU比ASCII常見肪获,其中TCP的使用頻率更高一些
主站與從站
通訊只能由主站發(fā)起寝凌,從站回應(yīng)
一個主站可以連接多個從站,且主站有且只能有一個贪磺,從站至少一個
tcp模式下:一般分為服務(wù)器與客戶端硫兰,可認為客戶端為主站,服務(wù)器為從站
協(xié)議及相關(guān)術(shù)語
存儲區(qū)數(shù)據(jù)模型
在modbus中定義了4種不同的數(shù)據(jù)模型寒锚,具體如下
名稱 | 數(shù)據(jù)類型 | 訪問類型 | 操作碼(功能碼) |
---|---|---|---|
線圈 | 位(bit) | 讀寫 | 01H 05H 0FH |
離散量輸入 | 位(bit) | 只讀 | 02H |
保持寄存器 | 字(word,ushort) | 讀寫 | 03H 06H 10H |
輸入寄存器 | 字(word,ushort) | 只讀 | 04H |
對應(yīng)英文(一個表有些擁擠)
中文 | 英文 |
---|---|
線圈 | Coils |
離散量輸入 | Discrete Inputs |
保持寄存器 | Holding Registers |
輸入寄存器 | Input Registers |
同許多規(guī)范一樣劫映,不同行業(yè)可能會有不同的稱呼。如保持寄存器可以被稱為輸出寄存器
刹前,而線圈可以被稱為數(shù)字
或離散輸出
泳赋。
功能碼
一般常用到的有以下幾種:
功能碼 | 描述 | PLC地址 | 寄存器地址 | 位/字操作 | 操作數(shù)量 |
---|---|---|---|---|---|
01H | 讀線圈 | 00001-09999 | 0000H-FFFFH | 位 | 單個或多個 |
02H | 讀離散量輸入 | 10001-19999 | 0000H-FFFFH | 位 | 單個或多個 |
03H | 讀保持寄存器 | 40001-49999 | 0000H-FFFFH | 字 | 單個或多個 |
04H | 讀輸入寄存器 | 30001-39999 | 0000H-FFFFH | 字 | 單個或多個 |
05H | 寫線圈 | 00001-09999 | 0000H-FFFFH | 位 | 單個 |
06H | 寫保持寄存器 | 40001-49999 | 0000H-FFFFH | 字 | 單個 |
0FH | 寫線圈 | 00001-09999 | 0000H-FFFFH | 位 | 多個 |
10H | 寫保持寄存器 | 40001-49999 | 0000H-FFFFH | 字 | 多個 |
數(shù)據(jù)幀
RTU
從站地址 | 功能碼 | 數(shù)據(jù) | CRC |
---|---|---|---|
1byte(1字節(jié))(8bit) | 1byte | 0-252byte | 2字節(jié)(CRC低|CRC高) |
數(shù)據(jù)位
一般請求為 2字節(jié) 表示要讀取的 線圈(或寄存器)的起始地址 + 2字節(jié)數(shù)據(jù)表示要讀取的線圈(或寄存器)的個數(shù)
應(yīng)答數(shù)據(jù)位為 1字節(jié)表示數(shù)據(jù)的字節(jié)數(shù) + N字節(jié)表示讀取的線圈狀態(tài)(或寄存器)數(shù)據(jù)
在讀線圈時,如果讀取到的線圈狀態(tài)數(shù)據(jù)不是8的整數(shù)喇喉,則會在后面填充0使其滿足 8 位的倍數(shù)
用表格展示(這里使用線圈
演示)
請求PDU
功能碼 | 1個字節(jié) | 0x01 |
---|---|---|
起始地址 | 2個字節(jié) | 0x0000-0xFFFF |
線圈數(shù)量 | 2個字節(jié) | 1-2000(0x7D0) |
響應(yīng)PDU
功能碼 | 1個字節(jié) | 0x01 |
---|---|---|
字節(jié)數(shù) | 1個字節(jié) | *N(輸入數(shù)量/8祖今,余數(shù)不等于0,那么N = N+1) |
線圈狀態(tài) | n | n=N 或N+1 |
樣例
線圈讀取(0x01)樣例
發(fā)送:
假設(shè)從站地址為01H千诬,讀取線圈寄存器的起始地址為0017H耍目,讀取38(十進制)個寄存器,指令結(jié)構(gòu)如下表:
從站地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 寄存器數(shù)量高位 | 寄存器數(shù)量低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 01 | 00 | 17 | 00 | 26 | 0D | D4 |
響應(yīng)
各線圈的狀態(tài)與數(shù)據(jù)內(nèi)容的每個bit對應(yīng)徐绑,1代表ON邪驮,0代表OFF.若查詢線圈的數(shù)量不是8的倍數(shù),則在最后一個字節(jié)的高位補0.
從站地址 | 功能碼 | 返回字節(jié)數(shù) | 數(shù)據(jù)1 | 數(shù)據(jù)2 | 數(shù)據(jù)3 | 數(shù)據(jù)4 | 數(shù)據(jù)5 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|---|---|
01 | 01 | 05 | CD | 6B | B2 | 0E | 1B | 44 | EA |
第一個字節(jié)CDH(0xCD)對應(yīng)線圈0017H到001E的狀態(tài)傲茄,轉(zhuǎn)為二進制是11001101毅访,其中bit0對應(yīng)0017H,bit7對應(yīng)001E盘榨,如下表:
001EH | 001DH | 001CH | 001BH | 001AH | 0019H | 0018H | 0017H |
---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
ON | ON | OFF | OFF | ON | ON | OFF | ON |
保持寄存器讀扔鞔狻(0x03)樣例
發(fā)送
有一個從站是溫濕度傳感器,從站地址為 1草巡,它會將采集到的濕度寫入保持寄存器的 40001 區(qū)塊中守呜;溫度寫入保持寄存器的 40002 區(qū)塊中。此時我們發(fā)送讀取保持寄存器請求去獲取它的溫濕度信息山憨。
從站地址 | 功能碼 | 起始地址高位 | 起始地址低位 | 寄存器數(shù)量高位 | 寄存器數(shù)量低位 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|
01 | 03 | 00 | 00 | 00 | 02 | C4 | 0B |
響應(yīng)
從站地址 | 功能碼 | 返回字節(jié)數(shù) | 數(shù)據(jù)1 | 數(shù)據(jù)2 | 數(shù)據(jù)3 | 數(shù)據(jù)4 | CRC高位 | CRC低位 |
---|---|---|---|---|---|---|---|---|
01 | 03 | 04 | 01 | 46 | 01 | 3B | 5A | 59 |
前兩個字節(jié)為濕度(換算成十進制為 326 弛饭,即 32.6% ),后兩個字節(jié)為溫度(十進制為 315萍歉,即 31.5 攝氏度)
注:以上部分樣例來源于網(wǎng)上公開數(shù)據(jù)