當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]擊上方“嵌入式云IOT技術(shù)圈”,選擇“置頂/星標(biāo)公眾號”干貨福利,第一時間送達(dá)!摘要:昨天有小伙伴在群里問關(guān)于Modbus通信協(xié)議的,大家都比較積極地解答,所以今天果子哥總結(jié)一下關(guān)于Modbus相關(guān)的知識,適合正在入門的小伙伴“食用”。同樣還是理論實戰(zhàn)的方式,歡迎留言區(qū)評論。1....

擊上方“嵌入式云IOT技術(shù)圈”,選擇“置頂/星標(biāo)公眾號

干貨福利,第一時間送達(dá)!

摘要:昨天有小伙伴在群里問關(guān)于Modbus通信協(xié)議的,大家都比較積極地解答,所以今天果子哥總結(jié)一下關(guān)于Modbus相關(guān)的知識,適合正在入門的小伙伴“食用”。同樣還是理論 實戰(zhàn)的方式,歡迎留言區(qū)評論。

1.什么是Modbus?

顧名思義,它是一個Bus,即總線協(xié)議。比如串口協(xié)議、IIC協(xié)議、SPI都是通信協(xié)議。你接觸到這種協(xié)議,相信你所處的行業(yè)是工業(yè)電子方面或者你的產(chǎn)品用于工業(yè)。

好了,現(xiàn)在知道了大概知道了,這是一個總線協(xié)議,是一個Mod什么的公司發(fā)表的一個通信協(xié)議。那為什么要用這個呢? 答案就是他們都在用,你就得學(xué),啊哈哈!

正經(jīng)的說,它被工業(yè)領(lǐng)域所接受的原因是它具備一下三個優(yōu)點

  • 公開發(fā)表并且無版權(quán)要求
  • 易于部署和維護(hù)
  • 對供應(yīng)商來說,修改移動本地的比特或字節(jié)沒有很多限制
簡單的概括,就是免費 簡單 方便修改!

歸納:Modbus就是一種用在工業(yè)上的簡單協(xié)議!

2.Modbus用來干什么?

用兩個字概括:通信

是的,所有協(xié)議都是用來通信的,協(xié)議的制定就是讓兩個人根據(jù)這個協(xié)議看懂傳來的一組數(shù)據(jù)。比如我給你一個6666,你要是沒有協(xié)議,就只知道這是6666,而有了協(xié)議,你就知道了這是在問我是不是大佬?當(dāng)然,也可以表示其他意思,具體什么意思就看你協(xié)議怎么制定!

歸納:Modbus用來通信嘍,是個人都知道!

3.Modbus的內(nèi)容是什么?

大致分為以下幾種:

  • Modbus-RTU
  • Modbus-ASCII
  • Modbus-TCP
以上三種協(xié)議,一個設(shè)備只會有一種協(xié)議,如果你的設(shè)備使用的是Modbus-RTU,只需查看以下對應(yīng)部分,一般來說大部分的設(shè)備都是Modbus-RTU協(xié)議的。

4.通訊過程

Modbus是主從方式通信,也就是說,不能同步進(jìn)行通信,總線上每次只有一個數(shù)據(jù)進(jìn)行傳輸,即主機(jī)發(fā)送,從機(jī)應(yīng)答,主機(jī)不發(fā)送,總線上就沒有數(shù)據(jù)通信。(所以說,這也算是一個缺點了)

舉例1: 一個總線上有一個主機(jī),多個從機(jī),主機(jī)查詢其中一個從機(jī),首先你必須得這些從機(jī)分配地址(這樣才能知道哪個從機(jī),而且每個地址必須唯一),分配好地址后,主機(jī)要查詢,然后數(shù)據(jù)下發(fā)(數(shù)據(jù)內(nèi)容下面會介紹),從機(jī)得到主機(jī)發(fā)送的數(shù)據(jù),然后對應(yīng)地址的從機(jī)回復(fù),主機(jī)得到從機(jī)數(shù)據(jù),這樣就是一個主機(jī)到從機(jī)的通信過程,是不是很簡單呢?

舉例2: 就像打電話,你得知道對方的電話(這就是唯一地址),然后你打電話過去,相當(dāng)于主機(jī)查找從機(jī),然后對方接通電話,給你回復(fù)(返回數(shù)據(jù)),正常是這樣的。

如果這時候,對方正在打電話,你應(yīng)該聽到的是"sorry,you…"這一串英文,說明對方忙,但是Modbus總線不能判斷對方是否忙,也沒有對應(yīng)的仲裁機(jī)制,好了你又知道了一個缺點了!但是,你可以用軟件的辦法進(jìn)行適當(dāng)?shù)奶幚頂?shù)據(jù)!

5 Modbus-RTU協(xié)議

設(shè)備必須要有RTU協(xié)議!這是Modbus協(xié)議上規(guī)定的,且默認(rèn)模式必須是RTU,ASCII作為選項。(也就是說,一般的設(shè)備只有RTU這個協(xié)議,ASCII一般很少)所以說,一般學(xué)習(xí)Modbus協(xié)議,只需要了解RTU的協(xié)議,ASCII作為學(xué)習(xí)的了解就足夠了。

1、幀結(jié)構(gòu)

幀結(jié)構(gòu) = 地址 功能碼 數(shù)據(jù) 校驗

  • 地址: 占用一個字節(jié),范圍0-255,其中有效范圍是1-247,其他有特殊用途,比如255是廣播地址(廣播地址就是應(yīng)答所有地址,正常的需要兩個設(shè)備的地址一樣才能進(jìn)行查詢和回復(fù))。

  • 功能碼:占用一個字節(jié),功能碼的意義就是,知道這個指令是干啥的,比如你可以查詢從機(jī)的數(shù)據(jù),也可以修改數(shù)據(jù),所以不同功能碼對應(yīng)不同功能。

  • 數(shù)據(jù):根據(jù)功能碼不同,有不同結(jié)構(gòu),在下面的實例中有說明。

  • 校驗:為了保證數(shù)據(jù)不錯誤,增加這個,然后再把前面的數(shù)據(jù)進(jìn)行計算看數(shù)據(jù)是否一致,如果一致,就說明這幀數(shù)據(jù)是正確的,我再回復(fù);如果不一樣,說明你這個數(shù)據(jù)在傳輸?shù)臅r候出了問題,數(shù)據(jù)不對的,所以就拋棄了。

2、實戰(zhàn)

只談理論大家可能不太明白,下面舉一個例子。Modbus-RTU協(xié)議一般我們用的最多功能碼就是0306,大部分都是用modbus來查詢傳感器上的信息用03查詢功能碼,如果需要修改傳感器寄存器的值就用06修改功能碼,其他的不需要過多關(guān)注,學(xué)多了你也記不住,哈哈哈!

2.1 查詢功能碼0x03

功能描述:現(xiàn)在我是主機(jī),我要查詢從機(jī)地址為01的數(shù)據(jù)。我現(xiàn)在用電腦的modbus調(diào)試助手來代替主機(jī),stm32來代替從機(jī)。

我需要發(fā)送以下數(shù)據(jù):

主機(jī)發(fā)送:?01?03?00?00?00?01?84?0A
從機(jī)回復(fù):?01?03?02?19?98?B2?7E
那么這一組數(shù)據(jù)是什么意思呢?

從上面的結(jié)構(gòu)圖中,可以看出,主機(jī)發(fā)送的數(shù)據(jù)大致是?地址 功能碼 數(shù)據(jù) 校驗;

所以解析如下:

發(fā)送數(shù)據(jù)解析

01-地址,也就是你傳感器的地址
03-功功能碼,03代表查詢功能,查詢傳感器的數(shù)據(jù)
00?00-代表查詢的起始寄存器地址.說明從0x0000開始查詢。這里需要說明以下,Modbus把數(shù)據(jù)存放在寄存器中,通過查詢寄存器來得到不同變量的值,一個寄存器地址對應(yīng)2字節(jié)數(shù)據(jù)
00?01-代表查詢了一個寄存器.結(jié)合前面的00?00,意思就是查詢從0開始的1個寄存器值
84?0A-循環(huán)冗余校驗,是modbus的校驗公式,從首個字節(jié)開始到84前面為止;

回復(fù)數(shù)據(jù)解析

01-地址,也就是你傳感器的地址
03-功功能碼,03代表查詢功能,查詢傳感器的數(shù)據(jù)。這里要注意的是注意發(fā)給從機(jī)的功能碼是啥,從機(jī)就要回復(fù)同樣的功能碼,如果不一樣說明這一幀數(shù)據(jù)有錯誤
02-代表后面數(shù)據(jù)的字節(jié)數(shù),因為上面說到,一個寄存器有2個字節(jié),所以后面的字節(jié)數(shù)肯定是2*查詢的寄存器個數(shù);
19?98-寄存器的值是19?98,結(jié)合發(fā)送的數(shù)據(jù)看出,01這個寄存器的值為19?98
B2?7E-循環(huán)冗余校驗
好了,是不是很簡單呢?基本流程就是:

  • 發(fā)送:從機(jī)的地址 我要干嘛的功能碼 我要查的寄存器的地址 我要查的寄存器地址的個數(shù) 校驗碼

  • 回復(fù):從機(jī)的地址 主機(jī)發(fā)我的功能碼 要發(fā)送給主機(jī)數(shù)據(jù)的字節(jié)數(shù) 數(shù)據(jù) 校驗碼

就是這么簡單!

2.2 修改功能碼0x06

如果我要修改從機(jī)的數(shù)據(jù)呢?那么這個協(xié)議有嗎?當(dāng)然有,那就是0x06

1、修改—0x06功能碼

主機(jī)發(fā)送:?01?06?00?00?00?01?48?0A
從機(jī)回復(fù):?01?06?00?00?00?01?48?0A
誒,看上去怎么一樣的啊?是不是錯了?答案是這是正確的;

發(fā)送數(shù)據(jù)解析

01-主機(jī)要查詢的從機(jī)地址
06-功能碼,06代表修改單個寄存器功能,修改有些不同,有修改一個寄存器和修改多個寄存器;
00?00-代表修改的起始寄存器地址.說明從0x0000開始.
00?01-代表修改的值為00?01.結(jié)合前面的00?00,意思就是修改0號寄存器值為00?01;
48?0A-循環(huán)冗余校驗,是modbus的校驗公式,從首個字節(jié)開始到48前面為止;

回復(fù)數(shù)據(jù)解析

01-從機(jī)返回給主機(jī)自己的地址,說明這就是主機(jī)查的從機(jī)
06-功能碼,代表修改單個寄存器功能,主機(jī)發(fā)啥功能碼,從機(jī)就必須回什么功能碼;
00?00-代表修改的起始寄存器地址.說明是0x0000.
00?01-代表修改的值為00?01.結(jié)合前面的00?00,意思就是修改0號寄存器值為00?01;
48?0A-循環(huán)冗余校驗,是modbus的校驗公式,從首個字節(jié)開始到48前面為止;
如果回復(fù)的一樣,說明這個數(shù)據(jù)是修改成功的;如果功能碼不是06,而是別的,說明從機(jī)回復(fù)的數(shù)據(jù)有誤,主機(jī)可以做相應(yīng)的處理。

2、修改-0x10功能碼

如果我要修改多個寄存器,難道用06發(fā)好幾次,這樣不會太傻了嗎?所以Modbus RTU協(xié)議包含了修改連續(xù)多個寄存器的方法,就是功能碼為0x10;這個大家自己去查詢,基本和上面的數(shù)據(jù)格式差不多。

歸納

Modbus-RTU協(xié)議只需要看懂功能碼0x03、0x060x10這三個基本的就已經(jīng)足夠了,分別回想下其數(shù)據(jù)域部分:

0x03—主機(jī)需要發(fā)送起始地址 寄存器數(shù)量,從機(jī)回復(fù)總字節(jié)數(shù) 數(shù)據(jù);

0x06—主機(jī)發(fā)送起始地址 數(shù)據(jù)內(nèi)容(因為你只需要修改一個,所以起始地址就是所要修改的地址),從機(jī)返回起始地址 數(shù)據(jù)內(nèi)容(發(fā)現(xiàn)居然一樣?。?/p>0x10—主機(jī)發(fā)送起始地址 寄存器個數(shù) 總字節(jié)數(shù) 數(shù)據(jù),從機(jī)返回起始地址 寄存器數(shù)量

6 Modbus-ACSII協(xié)議

一般只需要了解RTU協(xié)議,因為前面有說過,必須要有RTU協(xié)議的,所以只需要了解了RTU協(xié)議,就可以讀出設(shè)備信息了,至于ACSII協(xié)議,做個大概了解即可。

1.幀形式

對于RTU協(xié)議,比如RTU發(fā)送一個字節(jié):0x12;ASCII協(xié)議則需要發(fā)送2個字節(jié):一個字節(jié)代表ASCII碼1,一個代表ASCII碼2,即0x310x32,才能代表0x12。所以,ASCII協(xié)議的效率比較低。但是ASCII更符合串口打印查看,因為串口發(fā)送的數(shù)據(jù)一般都是文本模式(ASCII)。

比如用RTU方式,也叫16進(jìn)制方式,要發(fā)0x03數(shù)據(jù),RTU方式就發(fā)送00000011。用ASCII發(fā)送0x03,就要發(fā)送0的ASCII碼0x30和3的ASCII碼0x33,對應(yīng)到2進(jìn)制也就是發(fā)送0011000000110011。很顯然RTU方式只需要發(fā)送8位就可以了(加上起始位和停止位就是10位數(shù)據(jù))。那么ASCII碼方式發(fā)送就需要兩個8位(每個8位分別加上起始位和停止位就是20位數(shù)據(jù))。也就是說ASCII碼發(fā)送數(shù)據(jù)量是RTU方式的2倍,所以ASCII碼效率更低。

那么ASCII碼效率更低,數(shù)據(jù)發(fā)送量大為啥還采用這種方式呢?

因為假如你要發(fā)送數(shù)據(jù)0x03,采用RTU方式(16進(jìn)制發(fā)送),計算機(jī)中端設(shè)備接收到0x03后是不可以顯示的,就是不能把0x03打印出來。因為可見字符的ASCII碼是從32—126,不是這個范圍以外的顯示屏上都看不到,會出現(xiàn)亂碼,如果是串口助手的話就會顯示□□□□。如果采用ASCII方式(文本模式發(fā)送),就不會出現(xiàn)不可顯示和亂碼的情況,因為文本模式發(fā)送0x03,就是發(fā)送ASCII碼0和ASCII碼3,也就是0x300x33,是可以正常顯示在計算機(jī)中端的。所以現(xiàn)在知道為什么還要使用ASCII效率比較低的方式發(fā)送了吧,只是為了方便調(diào)試顯示而已。


從上面的圖中,看出:

1)比RTU多了起始段:,多個結(jié)束符CR,LF

2)地址和功能都變成了2個字節(jié);

3)數(shù)據(jù)部分更加繁瑣,但是更符合人們的查看;

2.歸納

由于Modbus-RTU和Modbus-ACSII都是基于232和485鏈路的,所以其通訊模式半雙工,一般是主機(jī)和從機(jī)的模式。其差別就是其字節(jié)的格式不同,一個是16進(jìn)制的數(shù)據(jù),一個是ASCII數(shù)據(jù)。ASCII多了幀頭和幀尾,也就是說可以有用這個頭尾判斷一幀字節(jié)來判斷是否結(jié)束;而RTU沒有幀頭和幀尾,所以協(xié)議里明確兩幀之間要大于3.5個字節(jié)時間間隔,作為一幀結(jié)束的判斷依據(jù)。對于RS485來說,總線上一般允許最大32個設(shè)備。

7 備注

最后再補(bǔ)充點:Modbus從設(shè)備的回應(yīng)數(shù)據(jù)格式是:1、回應(yīng)的數(shù)據(jù)包與主機(jī)查詢的數(shù)據(jù)包格式一致。從機(jī)正?;貞?yīng)時:功能碼與主機(jī)發(fā)送的功能碼一致(1-127) 如果異?;貞?yīng)時:功能碼要在收的主機(jī)的功能碼的基礎(chǔ)上加128。不要問為啥加128,你去問造協(xié)議的那一幫人吧!

因為電腦只支持USB,所以我們需要把USB轉(zhuǎn)TTL串口,再轉(zhuǎn)成485接口之后與單片機(jī)相連,這是硬件最基本的,但是也需要注意。

最后修改了一下串口調(diào)試助手,加了一個CRC校驗的功能,后臺回復(fù):Modbus-ly,就可以獲取。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉