生活随笔
收集整理的這篇文章主要介紹了
ModbusRTU协议数据格式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Modbus通信協(xié)議由Modicon公司(現(xiàn)在的施耐德電氣Schneider Electric)于1979年為可編程邏輯控制(即PLC)通信而發(fā)表。目前,Modbus已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式。Modbus作為目前工業(yè)領(lǐng)域應(yīng)用最廣泛的協(xié)議,與其他通信協(xié)議相比,有以下特點(diǎn):
1. Modbus協(xié)議標(biāo)準(zhǔn)開放、公開發(fā)表且無(wú)版權(quán)要求
2. Modbus協(xié)議支持多種電氣接口,包括RS232、RS485、TCP/IP等,還可以在各種介質(zhì)上傳輸,如雙絞線、光纖、紅外、無(wú)線等
3. Modbus協(xié)議消息幀格式簡(jiǎn)單、緊湊、通俗易懂。用戶理解和使用簡(jiǎn)單,廠商容易開發(fā)和集成,方便形成工業(yè)控制網(wǎng)絡(luò)
?? ?? ?
? ?? ?Modbus協(xié)議是一種應(yīng)用層報(bào)文傳輸協(xié)議,包括ASCII、RTU、TCP三種報(bào)文類型,協(xié)議本身并沒(méi)有定義物理層,定義了控制器能夠認(rèn)識(shí)和使用的消息結(jié)構(gòu),不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。
Modbus協(xié)議使用串口傳輸時(shí)可以選擇RTU或ASCII模式,并規(guī)定了消息、數(shù)據(jù)結(jié)構(gòu)、命令和應(yīng)答方式并需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)。ASCII 模式采用LRC校驗(yàn),RTU模式采用16 位CRC校驗(yàn)。通過(guò)以太網(wǎng)傳輸時(shí)使用TCP,這種模式不使用校驗(yàn),因?yàn)門CP協(xié)議是一個(gè)面向連接的可靠協(xié)議。
Modbus協(xié)議規(guī)定了4個(gè)存儲(chǔ)區(qū),如下表所示:
?? 區(qū)號(hào) ?? 名稱 讀寫 范圍 0區(qū) 輸出線圈 可讀可寫 00001-09999 1區(qū) 輸入線圈 只讀 10001-19999 3區(qū) 輸入寄存器 只讀 30001-39999 4區(qū) 保持寄存器 可讀可寫 40001-49999
Modbus協(xié)議同時(shí)規(guī)定了二十幾種功能碼,但是常用的只有8種,用于針對(duì)上述存儲(chǔ)區(qū)的讀寫,如下表所示:
?? 功能碼 ?? 功能說(shuō)明 01H 讀取輸出線圈 02H 讀取輸入線圈 03H 讀取保持寄存器 04H 讀取輸入寄存器 05H 預(yù)置單線圈 06H 預(yù)置單寄存器 0FH 預(yù)置多線圈 10H 預(yù)置多寄存器
工欲善其事,必先利其器,Modbus學(xué)習(xí)配合相關(guān)的調(diào)試軟件,可以達(dá)到事半功倍的效果,Modbus學(xué)習(xí)必備的三大神器分別是ModbusPoll、ModbusSlave及VSPD,ModbusPoll軟件主要用于仿真Modbus主站或Modbus客戶端,ModbusSlave軟件主要用于仿真Modbus從站或Modbus服務(wù)器,而VSPD全稱Configure Virtual Serial Port Driver,是用來(lái)給電腦創(chuàng)建虛擬串口使用的。
1.2??ModbusRTU/ASCII協(xié)議分析 ?
ModbusRTU與ModbusASCII在報(bào)文數(shù)據(jù)發(fā)送格式上幾乎一樣,但也存在一些區(qū)別,具體體現(xiàn)在:
1) ModbusASCII有開始字符(和結(jié)束字符(CR LF),可以作為一幀數(shù)據(jù)開始和結(jié)束的標(biāo)志,而ModbusRTU沒(méi)有這樣的標(biāo)志,需要用時(shí)間間隔來(lái)判斷一幀報(bào)文的開始和結(jié)束,協(xié)議規(guī)定的時(shí)間為3.5個(gè)字符周期,就是說(shuō)一幀報(bào)文開始前,必須有大于3.5個(gè)字符周期的空閑時(shí)間,一幀報(bào)文結(jié)束后,也必須要有3.5個(gè)字符周期的空閑時(shí)間否則就會(huì)出現(xiàn)粘包的情況。
注意:針對(duì)3.5個(gè)字符周期,其實(shí)是一個(gè)具體時(shí)間,但是這個(gè)時(shí)間跟波特率相關(guān)。
在串口通信中,1個(gè)字符包括1位起始位、8位數(shù)據(jù)位(一般情況)、1位校驗(yàn)位(或者沒(méi)有)、1位停止位(一般情況下),因此1個(gè)字符包括11個(gè)位,那么3.5個(gè)字符就是38.5個(gè)位,波特率表示的含義是每秒傳輸?shù)亩M(jìn)制位的個(gè)位,因此如果是9600波特率,3.5個(gè)字符周期=1000/9600*38.5=4.01ms。
2) 兩者校驗(yàn)方式不同,ModbusRTU是CRC循環(huán)冗余校驗(yàn),ModbusASCII是LCR縱向冗余校驗(yàn)。
3) 在Modbus標(biāo)準(zhǔn)中,RTU是必須要求的,而ASCII是可選項(xiàng),即作為一個(gè)Modbus通信設(shè)備可以只支持RTU,也可以同時(shí)支持RTU和ASCII,但不能只支持ASCII。
下面針對(duì)具體報(bào)文進(jìn)行分析,Modbus協(xié)議在串行鏈路上的報(bào)文格式如下所示:
?? 從站地址 ?? 功能碼 數(shù)據(jù) CRC/LRC 1 byte 1 byte N bytes 2 bytes
有了以上理論基礎(chǔ)之后,下面針對(duì)各個(gè)功能碼進(jìn)行詳細(xì)分析:
1.2.1? ?? ? 讀取輸出線圈 ?
發(fā)送報(bào)文格式如下:
?? 從站地址 ?? 功能碼 起始(高) 起始(低) 數(shù)量(高) 數(shù)量(低) 校驗(yàn) 0x01 0x01 0x00 0x13 0x00 0x1B XXXX
發(fā)送報(bào)文含義:讀取1號(hào)從站輸出線圈,起始地址為0x13=19,對(duì)應(yīng)地址為00020,線圈數(shù)量為0x1B=27,即讀取1號(hào)從站輸出線圈,地址從00020-00046,共27個(gè)線圈的狀態(tài)值。
注意:協(xié)議中的起始地址指的是索引,后面的地址指的是具體地址,對(duì)于任意一個(gè)存儲(chǔ)區(qū),索引都是從0開始的,但是對(duì)應(yīng)的具體地址,與存儲(chǔ)區(qū)是相關(guān)的,比如輸出線圈,0對(duì)應(yīng)00001;輸入線圈,0對(duì)應(yīng)10001;輸入寄存器,0對(duì)應(yīng)30001;保持寄存器,0對(duì)應(yīng)40001。
返回報(bào)文格式如下:
?? 從站地址 ?? 功能碼 字節(jié)計(jì)數(shù) 字節(jié)1 字節(jié)2 字節(jié)3 字節(jié)4 校驗(yàn) 0x01 0x01 0x04 0xCD 0x6B 0xB2 0x05 XXXX
返回報(bào)文含義:返回1號(hào)從站輸出線圈00020-00046,共27個(gè)線圈的狀態(tài)值,返回字節(jié)數(shù)為4個(gè),分別為CD 6B B2 05。
CD=1100 1101 對(duì)應(yīng) 00020-00027? ?? ???6B=01101011 對(duì)應(yīng) 00028-00035
B2=1011 0010 對(duì)應(yīng) 00036-00043? ?? ?? ?05=00000101 對(duì)應(yīng) 00044-00046
1.2.2讀取輸入線圈
?
發(fā)送報(bào)文格式如下:
?? 從站地址 ?? 功能碼 起始(高) 起始(低) 數(shù)量(高) 數(shù)量(低) 校驗(yàn) 0x01 0x02 0x00 0xC4 0x00 0x1D XXXX
發(fā)送報(bào)文含義:讀取1號(hào)從站輸入線圈,起始地址為0xC4=196,對(duì)應(yīng)地址為10197,線圈數(shù)量為0x1D=29,即讀取1號(hào)從站輸入線圈,地址從10197-10225,共29個(gè)線圈的狀態(tài)值。
返回報(bào)文格式如下:
?? 從站地址 ?? 功能碼 字節(jié)計(jì)數(shù) 字節(jié)1 字節(jié)2 字節(jié)3 字節(jié)4 校驗(yàn) 0x01 0x02 0x04 0xCD 0x6B 0xB2 0x05 XXXX
返回報(bào)文含義:返回1號(hào)從站輸入線圈10197-10225,共29個(gè)線圈的狀態(tài)值,返回字節(jié)數(shù)為4個(gè),分別為CD 6B B2 05。
CD=1100 1101 對(duì)應(yīng) 10197-10204? ?? ???6B=01101011 對(duì)應(yīng) 10205-10212
B2=1011 0010 對(duì)應(yīng) 10213-10220? ?? ?? ?05=00000101 對(duì)應(yīng) 10221-10225
1.2.3讀取保持寄存器
發(fā)送報(bào)文格式如下:
?? 從站地址 ?? 功能碼 起始(高) 起始(低) 數(shù)量(高) 數(shù)量(低) 校驗(yàn) 0x01 0x03 0x00 0x6B 0x00 0x02 XXXX
發(fā)送報(bào)文含義:讀取1號(hào)從站保持寄存器,起始地址為0x6B=107,對(duì)應(yīng)地址為40108,寄存器數(shù)量為0x02=2,即讀取1號(hào)從站保持寄存器,地址從40108-40109,共2個(gè)寄存器的數(shù)值。
返回報(bào)文格式如下:
?? 從站地址 ?? 功能碼 字節(jié)計(jì)數(shù) 1高 1低 2高 2低 校驗(yàn) 0x01 0x03 0x04 0x02 0x2B 0x01 0x06 XXXX
返回報(bào)文含義:返回1號(hào)從站保持寄存器40108-40109,共2個(gè)寄存器的數(shù)值,返回字節(jié)數(shù)為4個(gè),分別為02 2B 01 06,40108對(duì)應(yīng)數(shù)值為0x022B,40109對(duì)應(yīng)數(shù)值為0x0106。
1.2.4??讀取輸入寄存器
發(fā)送報(bào)文格式如下:
?? 從站地址 ?? 功能碼 起始(高) 起始(低) 數(shù)量(高) 數(shù)量(低) 校驗(yàn) 0x01 0x04 0x00 0x6B 0x00 0x02 XXXX
發(fā)送報(bào)文含義:讀取1號(hào)從站輸入寄存器,起始地址為0x6B=107,對(duì)應(yīng)地址為30108,寄存器數(shù)量為0x02=2,即讀取1號(hào)從站保持寄存器,地址從30108-30109,共2個(gè)寄存器的數(shù)值。
返回報(bào)文格式如下:
?? 從站地址 ?? 功能碼 字節(jié)計(jì)數(shù) 1高 1低 2高 2低 校驗(yàn) 0x01 0x04 0x04 0x02 0x2B 0x01 0x06 XXXX
返回報(bào)文含義:返回1號(hào)從站輸入寄存器30108-30109,共2個(gè)寄存器的數(shù)值,返回字節(jié)數(shù)為4個(gè),分別為02 2B 01 06,30108對(duì)應(yīng)數(shù)值為0x022B,30109對(duì)應(yīng)數(shù)值為0x0106。
1.2.5? ?? ? 預(yù)置單線圈
發(fā)送報(bào)文格式如下:
?? 從站地址 ?? 功能碼 線圈(高) 線圈(低) 斷通標(biāo)志 斷通標(biāo)志 校驗(yàn) 0x01 0x05 0x00 0xAC 0xFF 0x00 XXXX
發(fā)送報(bào)文含義:預(yù)置1號(hào)從站單個(gè)線圈的值,線圈地址為0x00AC=172,對(duì)應(yīng)地址為00173,斷通標(biāo)志0xFF00表示置位,0x0000表示復(fù)位,即置位1號(hào)從站輸出線圈00173。
返回報(bào)文格式如下:
?? 從站地址 ?? 功能碼 線圈(高) 線圈(低) 斷通標(biāo)志 斷通標(biāo)志 校驗(yàn) 0x01 0x05 0x00 0xAC 0xFF 0x00 XXXX
返回報(bào)文含義:預(yù)置單輸出線圈原報(bào)文返回。
1.2.6 預(yù)置單寄存器
發(fā)送報(bào)文格式如下:
?? 從站地址 ?? 功能碼 寄存器高 寄存器低 寫入值高 寫入值低 校驗(yàn) 0x01 0x06 0x00 0x87 0x03 0x9E XXXX
發(fā)送報(bào)文含義:預(yù)置1號(hào)從站單個(gè)保持寄存器的值,寄存器地址為0x0087=135,對(duì)應(yīng)地址為40136,寫入值為0x039E,即預(yù)置1號(hào)從站保持寄存器40136值為0x039E。
返回報(bào)文格式如下:
?? 從站地址 ?? 功能碼 寄存器高 寄存器低 寫入值高 寫入值低 校驗(yàn) 0x01 0x06 0x00 0x87 0x03 0x9E XXXX
返回報(bào)文含義:預(yù)置單保持寄存器原報(bào)文返回。
1.2.7??預(yù)置多線圈
發(fā)送報(bào)文格式如下:
?? 從站地址 ?? 功能碼 起始高 起始低 數(shù)量高 數(shù)量低 字節(jié)數(shù) 字節(jié) 校驗(yàn) 0x01 0x0F 0x00 0x13 0x00 0x0A 0x02 0xCD00 XXXX
發(fā)送報(bào)文含義:預(yù)置1號(hào)從站多個(gè)線圈的值,線圈地址為0x0013=19,對(duì)應(yīng)地址為00020,線圈數(shù)為0x0A=10,寫入值為0xCD00,即預(yù)置1號(hào)從站線圈00020-00027=0xCD=11001101,00028-00029=0x00=0000 0000。
返回報(bào)文格式如下:
?? 從站地址 ?? 功能碼 起始高 起始低 數(shù)量高 數(shù)量低 校驗(yàn) 0x01 0x0F 0x00 0x13 0x00 0x0A XXXX
返回報(bào)文含義:預(yù)置多輸出線圈返回報(bào)文是在原報(bào)文基礎(chǔ)上除去字節(jié)數(shù)及具體字節(jié)后返回。
1.2.8 預(yù)置多寄存器
?
發(fā)送報(bào)文格式如下:
?? 從站地址 ?? 功能碼 起始高 起始低 數(shù)量高 數(shù)量低 字節(jié)數(shù) 字節(jié) 校驗(yàn) 0x01 0x10 0x00 0x87 0x00 0x02 0x04 0x01050A10 XXXX
發(fā)送報(bào)文含義:預(yù)置1號(hào)從站多個(gè)寄存器的值,寄存器地址為0x0087=135,起始地址為40136,寄存器數(shù)量為0x02=2,結(jié)束地址為40137,寫入值為0x0105和0x0A10,即預(yù)置1號(hào)從站寄存器40136=0x0105,40137=0x0A10。
返回報(bào)文格式如下:
?? 從站地址 ?? 功能碼 起始高 起始低 數(shù)量高 數(shù)量低 校驗(yàn) 0x01 0x10 0x00 0x87 0x00 0x02 XXXX
返回報(bào)文含義:預(yù)置多保持寄存器返回報(bào)文是在原報(bào)文基礎(chǔ)上除去字節(jié)數(shù)及具體字節(jié)后返回。
總結(jié)
以上是生活随笔 為你收集整理的ModbusRTU协议数据格式 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。