色婷婷丁香精品亚洲69,国产999精品免费国产,操女生黄色视频,骚女啊啊啊啊啊啊啊啊啊

您的位置:首頁 > 財(cái)經(jīng)資訊 >

詳解Modbus通信協(xié)議_觀天下

2023-06-07 18:12:40 來源:面包芯語

本文總結(jié)關(guān)于 Modbus 相關(guān)的知識(shí),淺顯易懂,旨在對 Modbus 有一個(gè)很直觀的了解。如有錯(cuò)誤,歡迎修改意見和建議。


【資料圖】

什么是協(xié)議

在了解什么是Modbus之前,我們先來看下什么是協(xié)議。

協(xié)議是一個(gè)漢語詞匯,讀音為xié yì,意思是共同計(jì)議,協(xié)商;經(jīng)過談判、協(xié)商而制定的共同承認(rèn)、共同遵守的文件。

簡單地說,在我們的單片機(jī)之間互相通信,以及單片機(jī)和上位機(jī)通信中,規(guī)定了不同的內(nèi)容規(guī)范,這個(gè)規(guī)范是通信的雙方都需要遵守的,這樣就可以實(shí)現(xiàn)兩者的通信。

而這個(gè)協(xié)議規(guī)范可以有很多種,來適應(yīng)不同的設(shè)備以及通信要求等,我們常見的就有 IIC SPI UART 串口通信協(xié)議等等。而 Modbus 也是一個(gè)串行通信協(xié)議。

什么是 RS-485 RS-232

我們在看Modbus的時(shí)候,經(jīng)常會(huì)看到485串口,232串口,這些是什么呢?

RS232,RS485是一種電平標(biāo)準(zhǔn)。

數(shù)據(jù)在通信雙方之間傳輸,本質(zhì)是傳輸物理的電平,比方說傳輸5V的電壓 -1V的電壓信號,這些物理信號在傳輸過程中會(huì)受到很多干擾,比方說你傳輸一個(gè)5V的電壓,到了接收端可能就變成了4.8V,并且通信的雙方高低電平的參考電壓可能不同。

那么這個(gè)時(shí)候就需要一個(gè)電平標(biāo)準(zhǔn),來判斷多少V的電壓是高電平 1,多少V的電壓是低電平 0,這就誕生了 RS-485 RS-232

RS232:是電子工業(yè)協(xié)會(huì)(Electronic Industries Association,EIA) 制定的異步傳輸標(biāo)準(zhǔn)接口,同時(shí)對應(yīng)著電平標(biāo)準(zhǔn)和通信協(xié)議(時(shí)序),其電平標(biāo)準(zhǔn):+3V~+15V對應(yīng)0,-3V~-15V對應(yīng)1。

邏輯0:+3V–+15V

RS485:RS485是一種串口接口標(biāo)準(zhǔn),為了長距離傳輸采用差分方式傳輸,傳輸?shù)氖遣罘中盘?,抗干擾能力比RS232強(qiáng)很多。兩線壓差為-2~-6V表示0,兩線壓差為+2~+6V表示1。

注意485的電平指的是485-A和485-B兩根傳輸線,兩線間的電壓差。而不是傳輸線上的電壓。

也就是 RS-485 電平標(biāo)準(zhǔn)確定傳輸過來的數(shù)據(jù)是 0 還是 1,在此基礎(chǔ)上,這些字節(jié)數(shù)據(jù)根據(jù) modbus 通信協(xié)議來進(jìn)行數(shù)據(jù)的交互傳輸。

硬件層協(xié)議:解決0和1的可靠傳輸,常有RS232、RS485、CAN、IIC、SPI …

軟件層協(xié)議:解決傳輸目的,常有Modbus、TCP/IP、CANopen …

Modbus 協(xié)議說明

最簡單的說,Modbus 就是一個(gè)總線通信協(xié)議,像IIC SPI這種,但是他不依賴于硬件總線。

Modbus協(xié)議消息幀格式簡單、緊湊、通俗易懂。用戶理解和使用簡單,廠商容易開發(fā)和集成,方便形成工業(yè)控制網(wǎng)絡(luò)

舉一個(gè)簡單的例子,我們常用的IIC通信協(xié)議,需要在物理上連接iic總線,然后加上拉電阻,規(guī)定好物理層的高低電平。

而 Modbus協(xié)議是一種應(yīng)用層報(bào)文傳輸協(xié)議,協(xié)議本身并沒有定義物理層,定義了控制器能夠認(rèn)識(shí)和使用的消息結(jié)構(gòu),不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的。所以能夠適應(yīng)多種電氣接口,因此使用非常廣泛。

Modebus 通信過程

注意,Modbus 是一主多從的通信協(xié)議。

Modbus通信中只有一個(gè)設(shè)備可以發(fā)送請求。其他從設(shè)備接收主機(jī)發(fā)送的數(shù)據(jù)來進(jìn)行響應(yīng),從機(jī)是任何外圍設(shè)備,如I/O傳感器,閥門,網(wǎng)絡(luò)驅(qū)動(dòng)器,或其他測量類型的設(shè)備。從機(jī)處理信息后用 Modbus 將其數(shù)據(jù)發(fā)送給主站。

也就是說, Modbus 不能同步進(jìn)行通信,主機(jī)在同一時(shí)間內(nèi)只能向一個(gè)從機(jī)發(fā)送請求,總線上每次只有一個(gè)數(shù)據(jù)進(jìn)行傳輸。即主機(jī)發(fā)送,從機(jī)應(yīng)答,主機(jī)不發(fā)送,總線上就沒有數(shù)據(jù)通信。

從機(jī)不會(huì)自己發(fā)送消息給主機(jī),只能回復(fù)主機(jī)發(fā)送的消息請求。

并且,Modbus并沒有忙機(jī)制判斷,比方說主機(jī)給從機(jī)發(fā)送命令,從機(jī)沒有收到或者正在處理其他東西,這時(shí)候就不能響應(yīng)主機(jī),因?yàn)?modbus 的總線只是傳輸數(shù)據(jù),沒有其他仲裁機(jī)制,所以需要通過軟件的方式來判斷是否正常接收。

現(xiàn)在,我們來探討 Modbus 數(shù)據(jù)傳輸?shù)姆绞?,可以簡單地理解成打電話。并且是單向通信的打電話?/p>

主機(jī)發(fā)送數(shù)據(jù),首先需要從機(jī)的電話號碼(區(qū)分每個(gè)從機(jī),每個(gè)地址必須唯一),告訴從機(jī)打電話要干什么事情,然后是需要發(fā)送的內(nèi)容,最后再問問從機(jī),我說的話你都聽清楚了沒有呀,沒有聽錯(cuò)吧?

然后從機(jī)這里,得到了主機(jī)打過來的電話,從機(jī)回復(fù)主機(jī)需要的內(nèi)容,主機(jī)得到從機(jī)數(shù)據(jù)。這樣就是一個(gè)主機(jī)到從機(jī)的通信過程。

就好比老師和你打電話,老師撥通了你的電話號,然后老師跟你說,小王呀,我這里需要你給我發(fā)東西,發(fā)的內(nèi)容是上周的一周總結(jié),你說好的,然后打開你電腦的文件夾,把你的周報(bào)發(fā)給老師,這就是一個(gè)通信過程。

既然從機(jī)存儲(chǔ)數(shù)據(jù),那么肯定要有一個(gè)存儲(chǔ)區(qū),那就需要文件操作,我們都知道這文件可以分為只讀(-r)和讀寫(-wr)兩種類型。

并且存儲(chǔ)的數(shù)據(jù)類型可以分為 :布爾量 和 16位寄存器。

Modbus 協(xié)議類型

在上面我們已經(jīng)說明了 Modbus 可以在各種介質(zhì)上傳輸,那么他的傳輸模式也分為三種:包括ASCII、RTU(遠(yuǎn)程終端控制系統(tǒng))、TCP三種報(bào)文類型。

Modbus協(xié)議使用串口傳輸時(shí)可以選擇RTU或ASCII模式,并規(guī)定了消息、數(shù)據(jù)結(jié)構(gòu)、命令和應(yīng)答方式并需要對數(shù)據(jù)進(jìn)行校驗(yàn)。ASCII 模式采用LRC校驗(yàn),RTU模式采用16 位CRC校驗(yàn)。通過以太網(wǎng)傳輸時(shí)使用TCP,這種模式不使用校驗(yàn),因?yàn)門CP協(xié)議是一個(gè)面向連接的可靠協(xié)議。

舉一個(gè)簡單的例子,如果我們需要發(fā)送一個(gè)數(shù)字 10 那么RTU模式下,只需要發(fā)送0x0A 總線上傳輸數(shù)據(jù)形式為:0000 1010

而ASCII碼模式則將數(shù)據(jù)1和0轉(zhuǎn)為’1’和’0’,需要發(fā)送0x31(1) 0x30(0)兩個(gè)字節(jié)數(shù)據(jù)??偩€上傳輸數(shù)據(jù)形式為:0011 0001 0011 0000

詳細(xì)的我們等下再闡述

Modbus-RTU協(xié)議

Modbus報(bào)文幀結(jié)構(gòu)

一個(gè)報(bào)文就是一幀數(shù)據(jù),一個(gè)數(shù)據(jù)幀就一個(gè)報(bào)文:指的是一串完整的指令數(shù)據(jù),本質(zhì)就是一串?dāng)?shù)據(jù)。

Modbus報(bào)文是指主機(jī)發(fā)送給從機(jī)的一幀數(shù)據(jù),其中包含著從機(jī)的地址,主機(jī)想執(zhí)行的操作,校驗(yàn)碼等內(nèi)容。

Modbus協(xié)議在串行鏈路上的報(bào)文格式如下所示:

幀結(jié)構(gòu) = 從機(jī)地址 + 功能碼 + 數(shù)據(jù) + 校驗(yàn)

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

數(shù)據(jù):根據(jù)功能碼不同,有不同功能,比方說功能碼是查詢從機(jī)的數(shù)據(jù),這里就是查詢數(shù)據(jù)的地址和查詢字節(jié)數(shù)等。

校驗(yàn):在數(shù)據(jù)傳輸過程中可能數(shù)據(jù)會(huì)發(fā)生錯(cuò)誤,CRC檢驗(yàn)檢測接收的數(shù)據(jù)是否正確。

Modbus功能碼

Modbus 規(guī)定了多個(gè)功能,那么為了方便的使用這些功能,我們給每個(gè)功能都設(shè)定一個(gè)功能碼,也就是指代碼。

CRC校驗(yàn)

比如主機(jī)發(fā)出 01 06 00 01 00 17 98 04, 98 04 兩個(gè)字節(jié)是校驗(yàn)位,那么從機(jī)接收到后要根據(jù) 01 06 00 01 00 17 再計(jì)算CRC校驗(yàn)值,從機(jī)判斷自己計(jì)算出來的CRC校驗(yàn)是否與接收的CRC校驗(yàn)(98 04主機(jī)計(jì)算的)相等,如果不相等那么說明數(shù)據(jù)傳輸有錯(cuò)誤,這些數(shù)據(jù)就不能要。

CRC校驗(yàn)流程:

7、最終CRC寄存器的值就是CRC的值。

此外還有一種利用預(yù)設(shè)的表格計(jì)算CRC的方法,它的主要特點(diǎn)是計(jì)算速度快,但是表格需要較大的存儲(chǔ)空間,該方法此處不再闡述。

下面我們來看詳細(xì)的發(fā)送和接收數(shù)據(jù):

1、主機(jī)對從機(jī)讀數(shù)據(jù)操作

主機(jī)發(fā)送報(bào)文格式如下:

0xD5 0xCA:循環(huán)冗余校驗(yàn) CRC

0xF8 0x4A:循環(huán)冗余校驗(yàn) CRC

2、主機(jī)對從機(jī)寫數(shù)據(jù)操作

主機(jī)發(fā)送報(bào)文格式如下:

含義:

0x98 0x04:循環(huán)冗余校驗(yàn) CRC

從機(jī)回復(fù)報(bào)文格式如下:

0x98 0x04:循環(huán)冗余校驗(yàn) CRC

從機(jī)的回復(fù)和主機(jī)的發(fā)送是一樣的,如果不一樣說明出現(xiàn)了錯(cuò)誤。

Modbus-ACSII協(xié)議

在消息中的每個(gè)字節(jié)都作為兩個(gè)ASCII字符發(fā)送。

十六進(jìn)制的0-F 分別對應(yīng)ASCII字符的0…9,A…F

下方是ascii的報(bào)文幀

可以看到數(shù)據(jù)部分更加繁瑣,正常我們使用都是用RTU格式,ASCII碼格式有了解即可。

總結(jié):

Modbus ASCII 有開始字符(和結(jié)束字符(CR LF),可以作為一幀數(shù)據(jù)開始和結(jié)束的標(biāo)志。而Modbus RTU沒有這樣的標(biāo)志,需要用時(shí)間間隔來判斷一幀報(bào)文的開始和結(jié)束,協(xié)議規(guī)定的時(shí)間為3.5個(gè)字符周期,就是說一幀報(bào)文開始前,必須有大于3.5個(gè)字符周期的空閑時(shí)間,一幀報(bào)文結(jié)束后,也必須要有3.5個(gè)字符周期的空閑時(shí)間否則就會(huì)出現(xiàn)粘包的情況。

在串口通信中,1個(gè)字符包括1位起始位、8位數(shù)據(jù)位(一般情況)、1位校驗(yàn)位(或者沒有)、1位停止位(一般情況下),因此1個(gè)字符包括11個(gè)位,那么3.5個(gè)字符就是38.5個(gè)位,波特率表示的含義是每秒傳輸?shù)亩M(jìn)制位的個(gè)位,因此如果是9600波特率,3.5個(gè)字符周期=38.5/9600 = 0.00401s = 4.01ms

MBAP報(bào)文頭格式如下:

關(guān)注公眾號,點(diǎn)擊公眾號主頁右上角“ ··· ”,設(shè)置星標(biāo),實(shí)時(shí)關(guān)注智能汽車電子與軟件最新資訊

最近更新

且末县| 五原县| 荃湾区| 巴马| 牙克石市| 津南区| 曲麻莱县| 扶沟县| 阳新县| 精河县| 万年县| 穆棱市| 玛沁县| 博客| 河北区| 枞阳县| 彰化县| 宿迁市| 方正县| 永登县| 普洱| 渭源县| 车险| 科技| 永登县| 阿鲁科尔沁旗| 谷城县| 陵水| 日喀则市| 丰原市| 读书| 孝昌县| 宜章县| 濮阳市| 彰化县| 宝山区| 芷江| 塘沽区| 丽江市| 大竹县| 南江县|