詳解MODBUS標(biāo)準(zhǔn)協(xié)議——上篇

2021-11-30 11:33:24 668

一、什么是MODBUS?


1.基本概念:

MODBUS 是MODICON公司(現(xiàn)為施耐德電氣公司的一個(gè)品牌)最先倡導(dǎo)的一種軟的通訊規(guī)約,經(jīng)過(guò)大多數(shù)公司  的實(shí)際應(yīng)用,逐漸被認(rèn)可,成為一種標(biāo)準(zhǔn)的通訊規(guī)約,只要按照這種規(guī)約進(jìn)行 數(shù)據(jù)通訊或傳輸,不同的系統(tǒng)就可以通訊。目前,在RS232/RS485通訊過(guò)程中, 更是廣泛采用這種規(guī)約。

常用的MODBUS 通訊規(guī)約有兩種,一種是MODBUS ASCII,一種是MODBUS RTU。 一般來(lái)說(shuō),通訊數(shù)據(jù)量少而且主要是文本的通訊則采用MODBUS ASCII規(guī)約,通訊數(shù)據(jù)數(shù)據(jù)量大而且是二進(jìn)制數(shù)值時(shí),多采用MODBUS RTU規(guī)約。

在實(shí)際的應(yīng)用過(guò)程中,為了解決某一個(gè)特殊問(wèn)題,人們喜歡自己修改MODBUS規(guī)約來(lái)滿足自己的需要(事實(shí)上,人們經(jīng)常使用自己定義的規(guī)約來(lái)通訊,這樣能解決問(wèn)題,但不太規(guī)范)。更為普通的用法是,少量修改規(guī)約,但將規(guī)約格式附在軟件說(shuō)明書(shū)一起,或直接放在幫助中,這樣就方便了用戶的通訊。

2.MODBUS協(xié)議簡(jiǎn)述:

ACRXXXE系列儀表使用的是MODBUS-RTU通訊協(xié)議,MODBUS協(xié)議詳細(xì)定義了校驗(yàn)碼、數(shù)據(jù)序列等,這些都是特定數(shù)據(jù)交換的必要內(nèi)容。MODBUS協(xié)議在一根通訊線上 使用主從應(yīng)答式連接(半雙工),這意味著在一根單獨(dú)的通訊線上信號(hào)沿著相反的兩個(gè)方向傳輸。首先,主計(jì)算機(jī)的信號(hào)尋址到一臺(tái)唯一的終端設(shè)備(從機(jī)),然 后,終端設(shè)備發(fā)出的應(yīng)答信號(hào)以相反的方向傳輸給主機(jī)。

MODBUS協(xié)議只允許在主機(jī)(PC,PLC等)和終端設(shè)備之間通訊,而不允許獨(dú)立的終端設(shè)備之間的數(shù)據(jù)交換,這樣各終端設(shè)備不會(huì)在它們初始化時(shí)占據(jù)通訊線路,而僅限于響應(yīng)到達(dá)本機(jī)的查詢信號(hào)。

3.查詢—回應(yīng)周期:

查詢

查詢消息中的功能代碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的任何附加信息。例如功能代碼03是要求從設(shè)備讀保持寄存器并返回它 們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設(shè)備的信息:從何寄存器開(kāi)始讀及要讀的寄存器數(shù)量。錯(cuò)誤檢測(cè)域?yàn)閺脑O(shè)備提供了一種驗(yàn)證消息內(nèi)容是否正確的方法。

回應(yīng)

如果從設(shè)備產(chǎn)生一正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢消息中的功能代碼的回應(yīng)。數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù):如寄存器值或狀態(tài)。如果有錯(cuò)誤發(fā)生, 功能代碼將被修改以用于指出回應(yīng)消息是錯(cuò)誤的,同時(shí)數(shù)據(jù)段包含了描述此錯(cuò)誤信息的代碼。錯(cuò)誤檢測(cè)域允許主設(shè)備確認(rèn)消息內(nèi)容是否可用。

4.傳輸方式:

傳輸方式是指一個(gè)數(shù)據(jù)幀內(nèi)一系列獨(dú)立的數(shù)據(jù)結(jié)構(gòu)以及用于傳輸數(shù)據(jù)的有限規(guī)則,下面定義了與MODBUS 協(xié)議– RTU方式相兼容的傳輸方式。

每個(gè)字節(jié)的位:

·  1個(gè)起始位

·  8個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送

·  無(wú)奇偶校驗(yàn)位

·  1個(gè)停止位

錯(cuò)誤檢測(cè)(Error checking):CRC(循環(huán)冗余校驗(yàn)

5.協(xié)議

當(dāng)數(shù)據(jù)幀到達(dá)終端設(shè)備時(shí), 它通過(guò)一個(gè)簡(jiǎn)單的“端口”進(jìn)入被尋址到的設(shè)備,該設(shè)備去掉數(shù)據(jù)幀的“信封”(數(shù)據(jù)頭),讀取數(shù)據(jù),如果沒(méi)有錯(cuò)誤,就執(zhí)行數(shù)據(jù)所請(qǐng)求的任務(wù),然后,它將自己 生成的數(shù)據(jù)加入到取得的“信封”中,把數(shù)據(jù)幀返回給發(fā)送者。返回的響應(yīng)數(shù)據(jù)中包含了以下內(nèi)容:終端從機(jī)地址(Address)、被執(zhí)行了的命令(Function)、執(zhí)行命令生成的被請(qǐng)求數(shù)據(jù)(Data)和一個(gè)校驗(yàn)碼(Check)。發(fā)生任何錯(cuò)誤都不會(huì)有成功的響應(yīng),或者返回一個(gè)錯(cuò)誤指示幀。

6.數(shù)據(jù)幀格式

Address

Function

Data

Check

8-Bits

8-Bits

N x 8-Bits

16-Bits

7.地址(Address)域

IC卡讀寫(xiě)卡器,充電樁計(jì)費(fèi)閱讀器,RFID閱讀器,金融IC卡QuickPass讀卡器,NFC讀寫(xiě)器,二代證閱讀器,工業(yè)物聯(lián)網(wǎng),串口轉(zhuǎn)以太網(wǎng)模塊

地址域在幀的開(kāi)始部分,由 一個(gè)字節(jié)(8位二進(jìn)制碼)組成,十進(jìn)制為0~255,在我們的系統(tǒng)中只使用1~247,其它地址保留。這些位標(biāo)明了用戶指定的終端設(shè)備的地址,該設(shè)備將接 收來(lái)自與之相連的主機(jī)數(shù)據(jù)。每個(gè)終端設(shè)備的地址必須是唯一的,僅僅被尋址到的終端會(huì)響應(yīng)包含了該地址的查詢。當(dāng)終端發(fā)送回一個(gè)響應(yīng),響應(yīng)中的從機(jī)地址數(shù)據(jù) 便告訴了主機(jī)哪臺(tái)終端正與之進(jìn)行通信。

8.功能(Function)域

功能域代碼告訴了被尋址到的終端執(zhí)行何種功能。下表列出了該系列儀表用到的功能碼,以及它們的意義和功能。

代碼

意義

行為

03

讀數(shù)據(jù)寄存器

獲得一個(gè)或多個(gè)寄存器的當(dāng)前二進(jìn)制值

16

預(yù)置多寄存器

設(shè)定二進(jìn)制值到一系列多寄存器中(不對(duì)ACRXXXE開(kāi)放)

9.數(shù)據(jù)(Data)域

數(shù)據(jù)域包含了終端執(zhí)行特定 功能所需要的數(shù)據(jù)或者終端響應(yīng)查詢時(shí)采集到的數(shù)據(jù)。這些數(shù)據(jù)的內(nèi)容可能是數(shù)值、參考地址或者設(shè)置值。例如:功能域碼告訴終端讀取一個(gè)寄存器,數(shù)據(jù)域則需要 指明從哪個(gè)寄存器開(kāi)始及讀取多少個(gè)數(shù)據(jù),內(nèi)嵌的地址和數(shù)據(jù)依照類型和從機(jī)之間的不同內(nèi)容而有所不同。

10.錯(cuò)誤校驗(yàn)(Check)域

該域允許主機(jī)和終端檢查傳 輸過(guò)程中的錯(cuò)誤。有時(shí),由于電噪聲和其它干擾,一組數(shù)據(jù)在從一個(gè)設(shè)備傳輸?shù)搅硪粋€(gè)設(shè)備時(shí)在線路上可能會(huì)發(fā)生一些改變,出錯(cuò)校驗(yàn)?zāi)軌虮WC主機(jī)或者終端不去響 應(yīng)那些傳輸過(guò)程中發(fā)生了改變的數(shù)據(jù),這就提高了系統(tǒng)的安全性和效率,錯(cuò)誤校驗(yàn)使用了16位循環(huán)冗余的方法(CRC16)。

11.錯(cuò)誤檢測(cè)的方法

錯(cuò)誤校驗(yàn)(CRC)域占用兩個(gè)字節(jié),包含了一個(gè)16位的二進(jìn)制值。CRC值由傳輸設(shè)備計(jì)算出來(lái),然后附加到數(shù)據(jù)幀上,接收設(shè)備在接收數(shù)據(jù)時(shí)重新計(jì)算CRC值,然后與接收到的CRC域中的值進(jìn)行比較,如果這兩個(gè)值不相等,就發(fā)生了錯(cuò)誤。

CRC運(yùn)算時(shí),首先將一個(gè) 16位的寄存器預(yù)置為全1,然后連續(xù)把數(shù)據(jù)幀中的每個(gè)字節(jié)中的8位與該寄存器的當(dāng)前值進(jìn)行運(yùn)算,僅僅每個(gè)字節(jié)的8個(gè)數(shù)據(jù)位參與生成CRC,起始位和終止位 以及可能使用的奇偶位都不影響CRC。在生成CRC時(shí),每個(gè)字節(jié)的8位與寄存器中的內(nèi)容進(jìn)行異或,然后將結(jié)果向低位移位,高位則用“0”補(bǔ)充,最低位 (LSB)移出并檢測(cè),如果是1,該寄存器就與一個(gè)預(yù)設(shè)的固定值(0A001H)進(jìn)行一次異或運(yùn)算,如果最低位為0,不作任何處理。

上述處理重復(fù)進(jìn)行,直到執(zhí)行完了8次移位操作,當(dāng)最后一位(第8位)移完以后,下一個(gè)8位字節(jié)與寄存器的當(dāng)前值進(jìn)行異或運(yùn)算,同樣進(jìn)行上述的另一個(gè)8次移位異或操作,當(dāng)數(shù)據(jù)幀中的所有字節(jié)都作了處理,生成的最終值就是CRC值。

12.生成一個(gè)CRC的流程為:

1、預(yù)置一個(gè)16位寄存器為0FFFFH(全1),稱之為CRC寄存器。

2 、把數(shù)據(jù)幀中的第一個(gè)字節(jié)的8位與CRC寄存器中的低字節(jié)進(jìn)行異或運(yùn)算,結(jié)果存回CRC寄存器。

3、將CRC寄存器向右移一位,最高位填以0,最低位移出并檢測(cè)。

4 、如果最低位為0:重復(fù)第三步(下一次移位);如果最低位為1:將CRC寄存器與一個(gè)預(yù)設(shè)的固定值(0A001H)進(jìn)行異或運(yùn)算。

5、重復(fù)第三步和第四步直到8次移位。這樣處理完了一個(gè)完整的八位。

6 、重復(fù)第2步到第5步來(lái)處理下一個(gè)八位,直到所有的字節(jié)處理結(jié)束。

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

此外還有一種利用預(yù)設(shè)的表格計(jì)算CRC的方法,它的主要特點(diǎn)是計(jì)算速度快,但是表格需要較大的存儲(chǔ)空間,該方法此處不再贅述,請(qǐng)參閱相關(guān)資料。

13.通訊應(yīng)用格式祥解

本節(jié)所舉實(shí)例將盡可能的使用如圖所示的格式,(數(shù)字為16進(jìn)制)。

Addr

Fun

Data start  reg hi

Data start  reg lo

Data #of regs hi

Data #of regs lo

CRC16 lo

CRC16hi

01H

03H

00H

00H

00H

03H

05H

CBH

Addr:從機(jī)地址

Fun:功能碼

Data start reg hi:數(shù)據(jù)起始地址 寄存器高字節(jié)

Data start reg lo:數(shù)據(jù)起始地址 寄存器低字節(jié)

Data #of reg hi:數(shù)據(jù)讀取個(gè)數(shù) 寄存器高字節(jié)

Data #of reg lo:數(shù)據(jù)讀取個(gè)數(shù) 寄存器低字節(jié)

CRC16 Hi: 循環(huán)冗余校驗(yàn) 高字節(jié)

CRC16 Lo: 循環(huán)冗余校驗(yàn) 低字節(jié)

14.讀數(shù)據(jù)(功能碼03)

l    查詢數(shù)據(jù)幀

此功能允許用戶獲得設(shè)備采集與記錄的數(shù)據(jù)及系統(tǒng)參數(shù)。主機(jī)一次請(qǐng)求的數(shù)據(jù)個(gè)數(shù)沒(méi)有限制,但不能超出定義的地址范圍。

下面的例子是從01號(hào)從機(jī)讀3個(gè)采集到的基本數(shù)據(jù)(數(shù)據(jù)幀中每個(gè)地址占用2個(gè)字節(jié))UA、UB、UC,其中UA的地址為0025H, UB的地址為0026H, UC的地址為0027H。

Addr

Fun

Data start

Addr hi

Datastart

Addr lo

Data#of

regs hi

Data #of

regs lo

CRC16 lo

CRC16 hi

01H

03H

00H

25H

00H

03H

14H

00H

l    響應(yīng)數(shù)據(jù)幀

響應(yīng)包含從機(jī)地址、功能碼、數(shù)據(jù)的數(shù)量和CRC錯(cuò)誤校驗(yàn)。

下面的例子是讀取UA、UB、UC (UA=082CH,UB=082AH,UC=082CH的響應(yīng)。

Addr

Fun

Byte count

Data1 hi

Data1 lo

Data2 hi

Data2 lo

Data3 hi

Data3 lo

CRC16 lo

CRC16 hi

01H

03H

06H

08H

2CH

08H

2AH

08H

2CH

94H

4EH

l  錯(cuò)誤指示碼

如果主機(jī)請(qǐng)求的地址不存在則返回錯(cuò)誤指示碼:FFH。






女人被c软件漫画,jmcomic.2.mic传送门,大象回家永久不迷路2023,罗宾被小麋鹿,日本porono,内衣柜办公室,打扑克生猴子图片,黄色软件,黄金仓库星空传媒,w98动漫