久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2152|回復: 4
打印 上一主題 下一主題
收起左側

說明白了,Modbus RTU通信協議解析

  [復制鏈接]
跳轉到指定樓層
樓主
Modbus協議在工業控制、電氣、電子領域是個很常見的一種通信協議,很多遇見的傳感器、控制器、變頻器、驅動器之類的基本都支持該協議,常見到什么程度呢,就是你看到的一個設備如果支持串口通信的,那么基本很多都內置了Modbus協議。
作為一個開發者,在做單片機、PLC、電路板、控制器/箱、儀器儀表、機電設備或系統、自動化、工控、傳感、數據采集、自控系統、控制系統、物聯網、電子產品、軟件、APP項目過程中也經常會使用到Modbus協議,所以不把此協議搞懂真就沒法混。
本文介紹Modbus 協議中的Modbus RTU協議的相關知識,包括理論和案例,該協議常用于串口通信。

一、 Modbus RTU是什么?
Modbus是一種串行通信協議,是Modicon公司(現在的施耐德電氣 Schneider Electric)于1979年為使用可編程邏輯控制器(PLC)通信而發表。Modbus已經成為工業領域通信協議的業界標準(De facto),并且現在是工業電子設備之間常用的連接方式。
此協議定義了一個控制器能認識使用的消息結構,而不管它們是經過何種網絡進行通信的。它描述了一控制器請求訪問其它設備的過程,如果回應來自其它設備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內容的公共格式。
其實,Modbus協議包含Modbus TCP,Modbus ASCII,Modbus RTU。Modbus TCP和Modbus ASCII本文不作深入描述,本文主要講Modbus RTU。
概括地說,Modbus RTU是一種串行通信協議, 它關注于通信數據層面,主要是規定通信雙方或者多方的每個數據幀發送和接收用什么樣的數據格式。
一般來說,串行通信中傳輸的數據是一位一位(二進制位)地按照一定速率進行傳輸的。8位數據組成一個字節,Modbus RTU是以字節為最小基本單元定義數據格式的。若干個字節的數據組成數據幀,Modbus RTU協議就關注于這個數據幀里每個字節的數據該是怎樣的。

二、 Modbus RTU協議與RS485、RS232、TTL等串口協議的關系是怎樣

它們是不同的概念,側重于不同方面。
先來看看RS485、RS232、TTL:RS485、RS232、TTL串口是串口通信中關于電氣協議的通信協議,例如,包括用什么樣的電壓表示1、用什么樣的電壓表示0,起始位、停止位、波特率等是怎樣的。具體如下:
TTL電平:全雙工(邏輯1: 2.4V--5V 邏輯0: 0V--0.5V);
RS-232電平:全雙工(邏輯1:-15V~-3V 邏輯0:+3V~+15V);
RS-485:半雙工(邏輯1:+2V~+6V 邏輯0: -6V~-2V)這里的電平指AB 兩線間的電壓差。485由于是差分信號,具有數據傳輸遠、抗干擾能力強、支持多機通信(由于是半雙工)的優點。


再看Modbus RTU:Modbus RTU是軟件層面的通信協議,它定義通信中的數據幀該是怎么樣的格式,它關注于數據,也就是一個數據幀中每個字節該是怎樣的數據。
概括地說,Modbus RTU和串口RS485、RS232、TTL是不同的概念,但是也有聯系。Modbus RTU是數據層面的,規定通信的數據格式,RS485、RS232、TTL是物理層面的,它們規定了傳輸的電氣協議,Modbus RTU協議需要運行在一定的通信載體(即電氣協議,如RS485、RS232、TTL等)上。Modbus RTU在RS485、RS232、TTL串口上都能運行,常見的是在RS485上走Modbus RTU協議。

三、 Modbus RTU協議具體是怎樣

Modbus RTU是主從通信模式,需要一個主機,一個或若干個從機。
Modbus RTU的數據幀一般包含:地址碼、功能碼、若干個數據碼、校驗碼。幀與幀之間的時間間隔為3.5個字符,即假如兩個數據傳輸位之間的時間間隔大于3.5個字符的時間,就會被認為新的一幀開始。一個Modbus RTU數據幀的組成如下:


3.1 Modbus RTU的地址碼
地址碼,用于定義和識別設備的地址,地址碼存儲空間為1個字節,所以其范圍為0-255,其中0表示廣播.
3.2 Modbus RTU的功能碼和寄存器分區
表 2 Modbus RTU功能碼
功能碼        名稱        寄存器地址        位/字操作        操作數量
01        讀線圈狀態        00001~09999        位操作        單個或多個
02        讀離散輸入狀態        10001~19999        位操作        單個或多個
03        讀保持寄存器        40001~49999        字操作        單個或多個
04        讀輸入寄存器        30001~39999        字操作        單個或多個
05        寫單個線圈        00001~09999        位操作        單個
06        寫單個保持寄存器        40001~49999        字操作        單個
15        寫多個線圈        00001~09999        位操作        多個
16        寫多個保持寄存器        40001~49999        字操作        多個
常見的功能碼有01、02、03、04、05、06、15、16等,分別表示著讀線圈狀態、讀離散輸入狀態、讀保持寄存器、讀輸入寄存器、寫單個線圈、寫單個保持寄存器、寫多個線圈、寫多個保持寄存器的功能。
寄存器分區:
線圈,可以看作是一個可讀可寫的位變量,Modbus RTU支持對其的讀寫操作。允許多位操作。
離散輸入寄存器,可以看作是一個只讀的位變量,Modbus RTU支持對其的讀操作。
保持寄存器,可以看作是一個可讀可寫的字節變量,Modbus RTU支持對其的讀寫操作。允許多字節操作。一個保持寄存器為2個字節。
輸入寄存器,可以看作是一個只讀的字節變量,Modbus RTU支持對其的讀操作。一個輸入寄存器為2個字節。
寄存器地址:Modbus RTU的寄存器地址有00001~09999(0區,表示線圈寄存器)、10001~19999(1區,表示離散輸入寄存器)、30001~39999(3區,表示輸入寄存器)、40001~49999(4區,表示保持寄存器),其中3區和4區,每個寄存器由2個字節組成。
注意:在Modbus二進制數據指令里,表示寄存器地址的指令數據是從0開始的,Modbus RTU的寄存器地址是從1開始,注意對應關系。
用功能碼是可以識別到Modbus寄存器分區的,所以在Modbus二進制數據指令里,是不填寫分區代碼的,這在第四、節的案例里可以看出對應關系。
3.3 Modbus RTU的數據位
Modbus RTU的數據位根據不同的功能碼有不同的長度。
3.4 Modbus RTU的數據校驗
Modbus RTU采用CRC-16校驗,對一個數據幀里校驗數據前面所有的數據進行CRC校驗,得出的校驗結果為2個字節,低字節在前(先發),高字節在后(后發)。
一個參考的單片機CRC計算C程序如下:
#include "crc16.h"
unsigned short modbus_crc_16(unsigned char *adata,unsigned int asize)        //CRC計算:計算結果為16位數據,CRC低字節在左,高字節在右
{
unsigned short crc_out=0xffff;
unsigned int i,j;
unsigned char crc_low,crc_high;
for(i=0;i<asize;i++)
        {
        crc_out^=adata[ i];
        for(j=0;j<8;j++)
                {
                if ((crc_out&0x01)==0x01)
                        {
                        crc_out>>=1;
                        crc_out^=0xa001;
                        }
                else
                        {
                        crc_out>>=1;
                        }
                }
        }
//exchange high and low 8 bits
crc_low=(unsigned char)crc_out;
crc_high=(unsigned char)(crc_out>>8);
crc_out=(unsigned int)((crc_low<<8)+crc_high);
return crc_out;
}

四、 不理解嗎?來點例子,Modbus RTU數據幀案例詳解(重點)

為了更清晰地理解,本節介紹Modbus RTU的通信例子。本章節大部分內容引用自網絡文獻。
4.1 讀取輸出線圈狀態
01功能碼的作用是讀取從站里輸出線圈的狀態,主站發送指令后從站響應并返回數據,返回的線圈數據由低位線圈到高位線圈,注意這里的線圈數量是表示有多少個二進制位。


關于CRC:
上圖中從站返回的除了校驗碼的數據是0x11 0x 01 0x 04 0x cd 0x 6b 0x b2 0x 05,那么計算出來的CRC結果為0x 11 0x C3,其中0x 11是低字節,0x C3是高字節,那么完整的數據幀是:0x11 0x 01 0x 04 0x cd 0x 6b 0x b2 0x 05 0x 11 0x C3。CRC可以通過3.4節中的程序計算,或者使用網絡上的CRC在線計算工具。
4.2 讀取離散輸入狀態
    02功能碼的作用是讀取從站輸入線圈的狀態,主站發送指令后從站響應并返回數據,返回的線圈數據由低位線圈到高位線圈,注意這里的線圈數量也是表示有多少個二進制位。


4.3 讀取保持寄存器
     03功能碼的作用是讀取從站保持寄存器的狀態,主站發送指令后從站響應并返回數據,返回的寄存器數據由低位寄存器到高位寄存器,注意這里的每個寄存器有2個字節組成,寄存器先發低的再發高的,每個寄存器先發高字節,再發低字節。


4.4 讀取輸入寄存器
    04功能碼的作用是讀取從站輸入寄存器的狀態,主站發送指令后從站響應并返回數據,返回的寄存器數據由低位寄存器到高位寄存器,注意這里的每個寄存器有2個字節組成,寄存器先發低的再發高的,每個寄存器先發高字節,再發低字節。


4.5 強制單個線圈
05功能碼的作用是設置從站的單個線圈值,主站發送指令后從站響應并返回數據。


4.6 強制多個線圈
0F功能碼的作用是設置從站的多個線圈值,主站發送指令后從站響應并返回數據。


4.7 預置單個寄存器
06功能碼的作用是設置從站的單個寄存器值,主站發送指令后從站響應并返回數據。


4.8 預置多個寄存器
10功能碼的作用是設置從站的多個寄存器值,主站發送指令后從站響應并返回數據。


編程時,可以把Modbus RTU的線圈看作為位變量,寄存器看作為雙字節變量(一個寄存器為2個字節,16位)。
可以看出,Modbus RTU是主從模式,是主站發出指令,從站響應,從站不能直接主動地向主站發出指令。
Modbus RTU基本可以在所有串行通信里面使用,但是Modbus RTU一般在RS485通信里使用得較多一些。
后續大可能會寫單片機與昆侖通態觸摸屏通信的實操,如有興趣可以關注避免失誤。
如有錯誤,感謝指正。本文有一部分資料來自網絡資源,感謝其他大牛的分享,綠水青山,后會有期,全文暫時完。
沙鷗 成都 2024-6

評分

參與人數 1黑幣 +15 收起 理由
lkc8210 + 15 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:226055 發表于 2024-7-3 17:08 | 只看該作者
寫得太好了
回復

使用道具 舉報

板凳
ID:1104568 發表于 2024-7-23 20:55 | 只看該作者
對初學者很明了
回復

使用道具 舉報

地板
ID:221178 發表于 2024-7-25 12:16 | 只看該作者
寫的很好,學習了
回復

使用道具 舉報

5#
ID:1117489 發表于 2024-7-26 09:43 | 只看該作者
對初學RS485的,真是太好了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日产欧产精品精品推荐蛮挑 | 欧美一级免费黄色片 | 亚洲国产精品一区二区第一页 | 久久精品国产亚洲 | 91久久夜色精品国产网站 | 欧美伊人久久久久久久久影院 | 色综合久 | 午夜午夜精品一区二区三区文 | 久久夜视频 | 亚洲国产成人av好男人在线观看 | 欧美亚洲另类在线 | 亚洲精品一区中文字幕乱码 | 在线观看黄色电影 | 精品欧美一区二区三区免费观看 | 天天草天天干天天 | 99成人在线视频 | 我要看免费一级毛片 | 亚洲黄色av | 亚洲欧美自拍偷拍视频 | 久久99精品久久久久久国产越南 | 久久久久久久久久久一区二区 | 一区二区手机在线 | 国产精品影视在线观看 | 欧美乱码精品一区二区三区 | 欧美a级成人淫片免费看 | 我我色综合| 天堂在线网 | 狠狠综合网 | 久久综合久久久 | 精品日韩在线观看 | 国产精品精品视频 | 成人av高清 | 久久69精品久久久久久久电影好 | www四虎影视| 欧美国产91 | 国产免费一区二区三区 | 欧美久久久网站 | 久久久久久免费毛片精品 | 一区二区亚洲 | 亚洲天堂免费在线 | 国产精品一区二区不卡 |