Modbus協(xié)議
概述
Modbus是全球第一個(gè)真正用于工業(yè)現(xiàn)場(chǎng)的總線協(xié)議。Modbus網(wǎng)絡(luò)是一個(gè)工業(yè)通信系統(tǒng),由帶智能終端的可編程序控制器和計(jì)算機(jī)通過公用線路或局部專用線路連接而成。其系統(tǒng)結(jié)構(gòu)既包括硬件、亦包括軟件。它可應(yīng)用于各種數(shù)據(jù)采集和過程監(jiān)控。
現(xiàn)在Modbus支持串行鏈路和以太網(wǎng)鏈路兩種硬件形式,從協(xié)議上說有Modbus RTU、Modbus ASCII、Modbus TCP。現(xiàn)在用的最多的就是基于串行鏈路的Modbus RTU和基于以太網(wǎng)的Modbus TCP兩種。在國(guó)標(biāo)中規(guī)定,在串行鏈路上,Modbus RTU協(xié)議是默認(rèn)項(xiàng),而Modbus ASCII為可選項(xiàng)。
Modbus協(xié)議說明
包字節(jié)順序都是按照高位在前,低位在后(大端模式)
Unit 1Byte設(shè)備碼,1byte功能碼,N數(shù)據(jù),
RTU 2byteCRC(小端)
網(wǎng)絡(luò) 6Byte包頭
網(wǎng)絡(luò)6Byte包頭
2byte包計(jì)數(shù)(小端),2byte協(xié)議(置0),2byte數(shù)據(jù)段長(zhǎng)度
Unit
1byte設(shè)備碼,1-255范圍
1byte功能碼,
功能碼 | 描述 |
---|---|
1 | 讀取01,DO |
2 | 讀取02,DI |
3 | 讀取03,AO |
4 | 讀取04,AI |
5 | 寫入單個(gè)01,DO |
6 | 寫入單個(gè)03,AO |
15 | 寫入多個(gè)01,DO |
16 | 寫入多個(gè)03,AO |
N數(shù)據(jù)可歸類為讀取,單次寫,多次寫
1.讀取時(shí)發(fā)送請(qǐng)求包unit結(jié)構(gòu):
設(shè)備碼 | 功能碼 | 起始地址 | 寄存器(2byte)個(gè)數(shù)M |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
正常回復(fù)
設(shè)備碼 | 功能碼 | 數(shù)據(jù)段字節(jié)個(gè)數(shù)N | 數(shù)據(jù)段字節(jié) |
---|---|---|---|
1byte | 1byte | 1byte | N個(gè)byte |
1,2數(shù)據(jù)表時(shí)存在 (M+7)/8 = N
3,4數(shù)據(jù)表時(shí)存在M*2=N
異常回復(fù)
設(shè)備碼 | 功能碼F | 錯(cuò)誤碼E | |
---|---|---|---|
1byte | 1byte(F | 0x80) | 1byte |
E錯(cuò)誤碼情況
01 所請(qǐng)求的數(shù)據(jù)表不存在
02 讀溢出(起始地址+長(zhǎng)度找不到)
- 單個(gè)寫
設(shè)備碼 | 功能碼 | 起始地址 | 目標(biāo)寄存器的設(shè)置值 |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
回復(fù)幀
設(shè)備碼 | 功能碼 | 起始地址 | 目標(biāo)寄存器的設(shè)置值 |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
異常回復(fù)(同上異常回復(fù))
3.多個(gè)寫
設(shè)備碼 | 功能碼 | 起始地址 | 寄存器個(gè)數(shù)n | 數(shù)據(jù)byte長(zhǎng)度 | 數(shù)據(jù)byte |
---|---|---|---|---|---|
1byte | 1byte | 2byte | 2byte | 1byte | Nbyte |
其中,當(dāng)寄存器個(gè)數(shù)為n時(shí),對(duì)應(yīng)的數(shù)據(jù)長(zhǎng)度的byte長(zhǎng)度為:
當(dāng)為1,2表時(shí),所占用字節(jié)數(shù)為: (n+7)/8
當(dāng)為3,4表時(shí),所占字節(jié)數(shù)為: n*2
正常回復(fù)
設(shè)備碼 | 功能碼 | 起始地址 | 寄存器個(gè)數(shù)n |
---|---|---|---|
1byte | 1byte | 2byte | 2byte |
異常回復(fù)(同上異常回復(fù))
網(wǎng)絡(luò)Modbus TCP
6byte包頭+ModbusUnit
包計(jì)數(shù)(小端) | 協(xié)議 | Unit部分的字節(jié)數(shù) | Modbus-unit部分 |
---|---|---|---|
2byte | 2byte協(xié)議(置0) | Nbyte | Nbyte |
數(shù)據(jù)轉(zhuǎn)換
float 3.14
mem 0xF5C3 0x4048
mem C3 F5 48 40
大端數(shù)據(jù)+大端傳輸
transfer 40 48 F5 C3
convert 1 C3 F5 48 40
小端數(shù)據(jù)
傳輸 C3 F5 48 40
大端swap
傳輸 48 40 C3 F5 uint8[]
convert 1 0x4048 0xF5C3 uint16[]
0xF5C3 0x4048
C3 F5 48 40 UINT8[]
小端swap
傳輸 F5 C3 40 48
convert1 48 40 c3 f5
0x4048 0xf5c3
0xf5c3 0x4048
libmodbus中文手冊(cè)詳解
https://blog.csdn.net/qq_23670601/article/details/82155378
Libmodbus Manual Page
https://libmodbus.org/docs/v3.1.4/
工業(yè)控制系統(tǒng)安全之——Modbus學(xué)習(xí)筆記
https://cloud.tencent.com/developer/article/1045841
Modbus協(xié)議中涉及到DI、DO、AI、DO四張表
控制數(shù)據(jù)四種型式:
DI:DigitalInput(數(shù)字輸入,離散輸入),一個(gè)地址一個(gè)數(shù)據(jù)位,用戶只能讀取它的狀態(tài),不能修改。以一個(gè) bit表示 On/Off,用來記錄控制信號(hào)的狀態(tài)輸入,例如:開關(guān),接觸點(diǎn),馬達(dá)運(yùn)轉(zhuǎn),超限switch…等等。于PLC上被稱為Input relay、input coil等。
DO:DigitalOutput(數(shù)字輸出,線圈輸出),一個(gè)地址一個(gè)數(shù)據(jù)位,用戶可以置位、復(fù)位,可以回讀狀態(tài)。以一個(gè) bit表示 On/Off,用來輸出控制信號(hào),以激活或停止馬達(dá),警鈴,燈光…等等。于PLC上被稱為Output relay、Output coil等。
AI:Analog Input(模擬輸入,輸入寄存器),一個(gè)地址16位數(shù)據(jù),用戶只能讀,不能修改,,以16 bits integer表示一個(gè)數(shù)值,用來記錄控制信號(hào)的數(shù)值輸入,例如:溫度、流量、料量、速度、轉(zhuǎn)速、文件板開度、液位、重量…等等。于PLC上被稱為Input register。
AO:AnalogOutput(模擬輸出,保持寄存器),一個(gè)地址16位數(shù)據(jù),用戶可以寫,也可以回讀,以16 bits integer表示一個(gè)數(shù)值,用來輸出控制信號(hào)的數(shù)值,例如:溫度、流量、速度、轉(zhuǎn)速、文件板開度、飼料量…等等設(shè)定值。于PLC上被稱為Output register、Holding register。
Modbus-TCP和Modbus-RTU的區(qū)別:http://www.szyuanhao.com/news/573.html
Modbus rtu和Modbus tcp兩個(gè)協(xié)議的本質(zhì)都是MODBUS協(xié)議,都是靠MODBUS寄存器地址來交換數(shù)據(jù);但所用的硬件接口不一樣,Modbus RTU一般采用串口RS232C或RS485/422,而Modbus TCP一般采用以太網(wǎng)口。現(xiàn)在市場(chǎng)上有很多協(xié)議轉(zhuǎn)換器,可以輕松的將這些不同的協(xié)議相互轉(zhuǎn)換 如:Intesisbox可以把modbus rtu轉(zhuǎn)換成Modbus tcp
實(shí)際上Modbus協(xié)議包括ASCII、RTU、TCP。
標(biāo)準(zhǔn)的Modicon控制器使用RS232C實(shí)現(xiàn)串行的Modbus。Modbus的ASCII、RTU協(xié)議規(guī)定了消息、數(shù)據(jù)的結(jié)構(gòu)、命令和就答的方式,數(shù)據(jù)通訊采用Maser/Slave方式。Modbus的TCP協(xié)議規(guī)定了消息、數(shù)據(jù)的結(jié)構(gòu)、命令和應(yīng)答的方式,數(shù)據(jù)通訊采用Server/Client的方式。
Modbus協(xié)議需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),串行協(xié)議中除有奇偶校驗(yàn)外,ASCII模式采用LRC校驗(yàn),RTU模式采用16位CRC校驗(yàn).
ModbusTCP模式?jīng)]有額外規(guī)定校驗(yàn),因?yàn)門CP協(xié)議是一個(gè)面向連接的可靠協(xié)議。
TCP和RTU協(xié)議非常類似,只要把RTU協(xié)議的兩個(gè)字節(jié)的校驗(yàn)碼去掉,然后在RTU協(xié)議的開始加上5個(gè)0和一個(gè)6并通過TCP/IP網(wǎng)絡(luò)協(xié)議發(fā)送出去即可。