91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從零開始:LuatOS實(shí)現(xiàn)Modbus RTU通信的技術(shù)路徑

合宙LuatOS ? 來(lái)源:合宙LuatOS ? 作者:合宙LuatOS ? 2026-02-03 19:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

對(duì)于初涉嵌入式通信開發(fā)者而言,如何在LuatOS系統(tǒng)中快速搭建Modbus RTU通信通道是一大難點(diǎn)。本文以實(shí)踐為導(dǎo)向,系統(tǒng)梳理從環(huán)境搭建、串口配置、協(xié)議封裝到數(shù)據(jù)解析的完整技術(shù)路徑。結(jié)合LuatOS的API特性,逐步引導(dǎo)讀者完成一個(gè)完整的Modbus RTU通信實(shí)例,為后續(xù)工業(yè)物聯(lián)網(wǎng)項(xiàng)目開發(fā)奠定堅(jiān)實(shí)基礎(chǔ)。

一、Modbus 總體介紹

1.1 Modbus 的誕生背景

在 1979 年,那時(shí)候的中國(guó)還處于改革開放初期,而工業(yè)界正面臨一個(gè)“大麻煩”。

當(dāng)時(shí)的 PLC 廠商,例如 艾倫-布拉德利(Allen-Bradley,AB)、西門子、通用電氣(General Electric,GE)......每個(gè)公司都像是獨(dú)立的“小王國(guó)”,自己搞一套通信協(xié)議,誰(shuí)也不跟誰(shuí)兼容!

這就導(dǎo)致了一個(gè)什么結(jié)果?

你買了 A 家的 PLC,想用 B 家的上位機(jī)軟件去監(jiān)控?不行!

想把傳感器、儀表傳到 PLC 上?不好意思,得找廠家專門開發(fā)驅(qū)動(dòng),又貴又慢!

整個(gè)系統(tǒng)就像一張拼圖,每塊都是不同品牌,根本拼不到一起!

這叫啥?江湖人稱——“七國(guó)八制”

并不是說(shuō)真有七個(gè)國(guó)家,是說(shuō)市面上協(xié)議多得像戰(zhàn)國(guó)七雄,各搞各的,誰(shuí)也管不了誰(shuí)!

這種局面,不僅讓用戶頭疼,也讓整個(gè)行業(yè)的發(fā)展卡住了脖子!

于是,一家叫Modicon的公司(現(xiàn)在屬于施耐德電氣 Schneider Electric)站了出來(lái),他們的工程師 John D.(這位大佬名字有點(diǎn)模糊,但貢獻(xiàn)巨大!)帶著團(tuán)隊(duì),憋出了一個(gè)神協(xié)議——Modbus

他們?cè)O(shè)計(jì)的時(shí)候,便定了三條“鐵律”:

第一,簡(jiǎn)單到爆!

協(xié)議結(jié)構(gòu)清晰,功能碼就那么幾個(gè),工程師看一天就能上手,調(diào)試起來(lái)不頭禿!

第二,完全開源免費(fèi)!

這是最關(guān)鍵的一步!Modicon 把協(xié)議規(guī)范直接公開,誰(shuí)都能拿去用,不用交錢,不用簽合同!

——這在當(dāng)時(shí)簡(jiǎn)直是“革命性”的操作!別的廠商都在藏著掖著,它直接攤開給你看!

第三,通用性強(qiáng)!

采用“主從架構(gòu)”——一個(gè)主控電腦,管理一堆設(shè)備(PLC、傳感器、儀表)。

所以,為什么 Modbus 能活到現(xiàn)在,40 多年還被廣泛使用?

就是因?yàn)檫@三條“鐵律”!

不炫技、不復(fù)雜,但解決了最實(shí)際的問(wèn)題——讓設(shè)備之間能“說(shuō)上話”!

1.2 Modbus 的發(fā)展歷史

很多人以為 Modbus 發(fā)明完就火了——其實(shí)根本不是! 它最初只是 Modicon 自家 PLC 的“內(nèi)部通訊工具”,連名字都沒(méi)幾個(gè)人知道 至于它是怎么從“小眾協(xié)議”變成“工業(yè)普通話”的? 我們接著往下看。

發(fā)展歷史我將其分成了三個(gè)階段:

階段一:1979 – 1990s 中期 — 串口時(shí)代,野蠻生長(zhǎng)

Modbus 由Modicon 公司(后被施耐德電氣 Schneider Electric 收購(gòu))于 1979 年首創(chuàng),最初作為其 PLC 與智能設(shè)備(如傳感器、儀表)之間的專用通信協(xié)議。

協(xié)議運(yùn)行在RS-232 或 RS-485 物理層上,支持兩種傳輸方式:

Modbus RTU:緊湊的二進(jìn)制編碼,效率高,適用于噪聲環(huán)境;

Modbus ASCII:以可讀字符(十六進(jìn)制)編碼,便于調(diào)試,但效率較低。

由于協(xié)議結(jié)構(gòu)極其簡(jiǎn)單、無(wú)授權(quán)費(fèi)用、文檔易于逆向,大量第三方設(shè)備廠商在未獲官方許可的情況下自行實(shí)現(xiàn)Modbus 接口,并集成到變送器(特指將物理量(如壓力、溫度等)轉(zhuǎn)換為標(biāo)準(zhǔn)電信號(hào)(如 4–20 mA 或 0–10 V),并通過(guò) Modbus 接口(如 RTU 或 TCP)將這些數(shù)據(jù)以數(shù)字形式上傳的設(shè)備)、HMI(人機(jī)界面,用于操作人員與控制系統(tǒng)交互,顯示實(shí)時(shí)數(shù)據(jù)、報(bào)警信息,并允許操作員下發(fā)控制命令(如啟停設(shè)備、修改參數(shù)))、驅(qū)動(dòng)器(控制電機(jī)的轉(zhuǎn)速、方向、啟停等,常用于風(fēng)機(jī)、泵、傳送帶等設(shè)備)等產(chǎn)品中。

這一時(shí)期的 Modbus 雖無(wú)正式標(biāo)準(zhǔn),卻憑借“事實(shí)標(biāo)準(zhǔn)”(de facto standard)的地位,在工業(yè)現(xiàn)場(chǎng)迅速擴(kuò)散,為后續(xù)生態(tài)奠定用戶基礎(chǔ)。

階段二:1990s 末 – 2001 年 — 轉(zhuǎn)型與融合,擁抱網(wǎng)絡(luò)

關(guān)鍵轉(zhuǎn)折點(diǎn):1990 年代末,Modicon 主動(dòng)開放 Modbus 協(xié)議規(guī)范,公開技術(shù)文檔,鼓勵(lì)第三方廠商開發(fā)兼容產(chǎn)品,并停止對(duì)協(xié)議使用的法律限制。

與此同時(shí),工業(yè)以太網(wǎng)興起,傳統(tǒng)串行通信在速度、距離和 IT 融合方面面臨瓶頸。

2000 年,Modicon 正式發(fā)布Modbus TCP 規(guī)范,將 Modbus 應(yīng)用層協(xié)議映射到標(biāo)準(zhǔn) TCP/IP 協(xié)議棧上:

使用IP 地址 + 端口 502定位設(shè)備;

引入MBAP 頭部(含事務(wù) ID、協(xié)議 ID、長(zhǎng)度字段);

依賴 TCP 的可靠性,取消 CRC 校驗(yàn)和從站地址字段(Unit Identifier 保留用于網(wǎng)關(guān)場(chǎng)景)。

此階段完成了 Modbus 從“串行總線協(xié)議”到“工業(yè)網(wǎng)絡(luò)協(xié)議”的關(guān)鍵躍遷,打通 OT(運(yùn)營(yíng)技術(shù))與 IT(信息技術(shù))的邊界,為遠(yuǎn)程監(jiān)控、系統(tǒng)集成和數(shù)字化轉(zhuǎn)型鋪平道路。

階段三:2002 年至今 — 開放治理,全球標(biāo)準(zhǔn)

2002 年,為推動(dòng)協(xié)議的中立化與可持續(xù)發(fā)展,Schneider Electric 聯(lián)合多家工業(yè)自動(dòng)化廠商,發(fā)起成立 Modbus International Developers Association(Modbus-IDA),負(fù)責(zé):

制定一致性測(cè)試規(guī)范;

提供互操作性認(rèn)證

維護(hù)官方技術(shù)文檔。

2004 年,為進(jìn)一步增強(qiáng)開放性與國(guó)際代表性,Modbus-IDA 的全部職能移交至新成立的非營(yíng)利獨(dú)立組織 —— Modbus Organization, Inc.(在美國(guó)注冊(cè)),全面接管:

協(xié)議規(guī)范維護(hù)

一致性測(cè)試與認(rèn)證服務(wù);

成員協(xié)作與生態(tài)推廣。

Modbus 協(xié)議本身完全開放、免費(fèi),任何廠商均可自由實(shí)現(xiàn);但若需使用“Modbus 認(rèn)證”標(biāo)志或參與標(biāo)準(zhǔn)演進(jìn),則需加入成員計(jì)劃并通過(guò)官方測(cè)試。

協(xié)議生態(tài)持續(xù)擴(kuò)展,衍生出多種傳輸方式以適應(yīng)不同場(chǎng)景:

Modbus TCP:標(biāo)準(zhǔn)以太網(wǎng)協(xié)議,主流于現(xiàn)代工業(yè)網(wǎng)絡(luò);

Modbus RTU over Ethernet:通過(guò) TCP 或 UDP 透?jìng)髟?RTU 幀,常用于串口服務(wù)器或網(wǎng)關(guān);

Modbus Plus:施耐德專用高速令牌環(huán)網(wǎng)絡(luò)(已逐漸退出主流)。

現(xiàn)狀:據(jù)行業(yè)普遍估計(jì),Modbus 仍是全球部署最廣泛的工業(yè)通信協(xié)議之一,廣泛應(yīng)用于 PLC、HMI、變頻器、智能儀表、能源管理系統(tǒng)等設(shè)備,尤其在中小型自動(dòng)化系統(tǒng)、國(guó)產(chǎn)設(shè)備和成本敏感場(chǎng)景中占據(jù)主導(dǎo)地位

二、Modbus 通信機(jī)制與協(xié)議規(guī)范

2.1 Modbus 通信架構(gòu)模型

Modbus 協(xié)議是 OSI 七層模型中第 7 層上的應(yīng)用層報(bào)文傳輸協(xié)議,它在連接不同類型總線或網(wǎng)絡(luò)的設(shè)備之間提供客戶端/服務(wù)器通信。

它主要是定義了應(yīng)用層的消息結(jié)構(gòu)(功能碼 + 數(shù)據(jù)),其底層依賴于其他通信方式來(lái)實(shí)現(xiàn)完整的通信功能,包括傳統(tǒng)的串行總線(RS-232/RS-485)、專有網(wǎng)絡(luò)(Modbus+),以及現(xiàn)代的以太網(wǎng)(Modbus TCP/IP)。

Modbus 的通信架構(gòu)模型如下圖所示:

wKgZPGmBrCKAJILuAAGGzkT0YbA873.png

通過(guò)這張圖可以很清晰地看出 Modbus 協(xié)議的分層架構(gòu)以及在不同物理和網(wǎng)絡(luò)層上的實(shí)現(xiàn)方式,直觀說(shuō)明 Modbus 應(yīng)用層如何“嫁接”到多種底層傳輸技術(shù)上。

接下來(lái),我們從上到下、從左到右進(jìn)行解讀:

1、頂層:Modbus 應(yīng)用層

這是整張圖的核心。無(wú)論底層使用何種物理或網(wǎng)絡(luò)技術(shù),Modbus 應(yīng)用層定義了設(shè)備之間數(shù)據(jù)交換的規(guī)則和格式。這是統(tǒng)一、標(biāo)準(zhǔn)化的部分。

2、底層實(shí)現(xiàn)方式

從應(yīng)用層往下,有四條不同的“通道”,代表了 Modbus 協(xié)議在不同硬件和網(wǎng)絡(luò)環(huán)境下的具體實(shí)現(xiàn):

1.最左側(cè):“Other”

這是一個(gè)占位符,只是表示除了圖中列舉的三種方式外,Modbus 應(yīng)用層還可以運(yùn)行在其他的物理層或傳輸層上。

2.第二個(gè):“MODBUS+ / HDLC”

這是 Modicon 公司開發(fā)的一種專有高速網(wǎng)絡(luò)協(xié)議,它基于 HDLC(High-level Data Link Control)協(xié)議,并使用特定的物理介質(zhì)(例如雙絞線)。

特點(diǎn)是速度較快,但是屬于私有協(xié)議,兼容性不如 Modbus RTU、Modbus TCP。

3.第三個(gè):“Client / Server”

這是最經(jīng)典的 Modbus RTU 或 Modbus ASCII 的實(shí)現(xiàn)方式。物理層采用 EIA/TIA-232 或 EIA/TIA-485,也就是我們常說(shuō)的 RS232RS485.

在這種模式下,通信通常是主從式(Master/Slave),因此,我們也可以將客戶端稱為主站,服務(wù)器稱為從站。

4.最右側(cè):“Modbus on TCP”

這是 Modbus 應(yīng)用層數(shù)據(jù)被封裝在 TCP/IP 數(shù)據(jù)包中的形式。也被稱為 Modbus TCP/IP。通過(guò) TCP/IP 和以太網(wǎng)協(xié)議進(jìn)行通信。

2.2 Modbus 協(xié)議數(shù)據(jù)結(jié)構(gòu)

Modbus 協(xié)議定義了一個(gè)與基礎(chǔ)通信層無(wú)關(guān)的簡(jiǎn)單協(xié)議數(shù)據(jù)單元(PDU)。

這句話的意思是,不論你是使用任何方式進(jìn)行傳輸 Modbus 信息,這部分結(jié)構(gòu)都是完全一樣。

特定總線或網(wǎng)絡(luò)上的 Modbus 協(xié)議映射能夠在應(yīng)用數(shù)據(jù)單元(ADU)上引入一些附加字段。

這句話的意思是,當(dāng)你決定通過(guò)某種方式進(jìn)行傳輸這個(gè) PDU 時(shí),你需要為其套上一個(gè)額外的附加字段,這個(gè)附加字段與 PDU 組合后稱為 ADU。

通用協(xié)議結(jié)構(gòu)的格式如下圖所示:

wKgZO2mBrPuAAghTAABZ0nXfPfo039.png

接下來(lái)對(duì) PDU 和 ADU 進(jìn)行說(shuō)明:

2.2.1 PDU(Protocol Data Unit,協(xié)議數(shù)據(jù)單元)

PDU 是獨(dú)立于通信網(wǎng)絡(luò)的、純粹的 Modbus 請(qǐng)求或響應(yīng)參數(shù),由功能碼 + 數(shù)據(jù)兩部分組成。

PDU 作為 Modbus 協(xié)議的核心,特點(diǎn)是對(duì)于任何傳輸方式來(lái)說(shuō)其結(jié)構(gòu)都是完全相同的。

例如,一個(gè)讀保持寄存器的請(qǐng)求 PDU 結(jié)構(gòu)永遠(yuǎn)都是

[功能碼][起始地址高字節(jié)][起始地址低字節(jié)][寄存器數(shù)量高字節(jié)][寄存器數(shù)量低字節(jié)]

其中,功能碼固定為0x03,起始地址、寄存器數(shù)量需要根據(jù)具體請(qǐng)求進(jìn)行修改。

2.2.2 ADU(Application Data Unit,應(yīng)用數(shù)據(jù)單元)

ADU 是實(shí)際網(wǎng)絡(luò)中傳輸?shù)耐暾麛?shù)據(jù)幀,由附加地址 + PDU + 差錯(cuò)校驗(yàn)碼三部分組成。

ADU 的特點(diǎn)是 PDU 為了在特定網(wǎng)絡(luò)(如串行線、TCP/IP)上傳輸而添加的“頭”和“尾”。

不同的傳輸方式,ADU 的結(jié)構(gòu)也會(huì)不同。

PDU 與 ADU 最大長(zhǎng)度限制說(shuō)明:Modbus PDU 最大 253 字節(jié)是歷史遺留設(shè)計(jì),源于 RS-485 ADU 最大 256 字節(jié)的限制; 在串行通信中,ADU = PDU + 1 字節(jié)地址 + 2 字節(jié) CRC = 256 字節(jié); 在 TCP 中,ADU = PDU + 7 字節(jié) MBAP = 260 字節(jié);

2.3 客戶端/服務(wù)器 與 主站/從站 的概念辨析

在 Modbus 協(xié)議中,“客戶端/服務(wù)器”和“主站/從站”是描述通信角色的兩種常用術(shù)語(yǔ),它們?cè)诠δ苌细叨认嗨疲谡Z(yǔ)義來(lái)源和適用場(chǎng)景上略有不同。

2.3.1 客戶端 (Client) 與 服務(wù)器 (Server)

來(lái)源:來(lái)源于計(jì)算機(jī)網(wǎng)絡(luò)領(lǐng)域的通用模型。

定義:

客戶端:主動(dòng)發(fā)起請(qǐng)求的一方,負(fù)責(zé)發(fā)送功能碼和數(shù)據(jù)請(qǐng)求。

服務(wù)器:被動(dòng)響應(yīng)請(qǐng)求的一方,負(fù)責(zé)執(zhí)行操作并返回結(jié)果。

適用場(chǎng)景:主要用于 Modbus TCP/IP 等基于網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)中,更符合現(xiàn)代 IT 架構(gòu)的表達(dá)習(xí)慣。

特點(diǎn):強(qiáng)調(diào)“請(qǐng)求-響應(yīng)”的交互模式,不強(qiáng)調(diào)物理拓?fù)浠蚩刂茩?quán)。

2.3.2 主站 (Master) 與 從站 (Slave)

來(lái)源:來(lái)源于工業(yè)自動(dòng)化和串行通信的歷史傳統(tǒng)。

定義:

主站:擁有通信控制權(quán)的一方,負(fù)責(zé)輪詢或指令下發(fā)。

從站:被動(dòng)響應(yīng)主站指令,無(wú)權(quán)主動(dòng)發(fā)起通信。

適用場(chǎng)景:主要用于 Modbus RTU/ASCII 等串行通信方式中,強(qiáng)調(diào)“控制權(quán)集中”和“單主多從”的物理拓?fù)洹?/p>

特點(diǎn):更強(qiáng)調(diào)控制關(guān)系和時(shí)序管理,常見于 RS-485 總線系統(tǒng)。

2.3.3 兩者關(guān)系說(shuō)明

wKgZPGmBrkOAN8iRAABN8VQUx1Y538.png

特別說(shuō)明:目前 Modbus 組織(Modbus Organization)已正式推薦使用 “客戶端/服務(wù)器” 術(shù)語(yǔ)替代“主站/從站”,以避免潛在的社會(huì)文化敏感性問(wèn)題,并統(tǒng)一跨平臺(tái)、跨協(xié)議的表述。 但在實(shí)際工程文檔和設(shè)備手冊(cè)中,“主站/從站”仍被廣泛使用。

2.4 Modbus 事務(wù)處理機(jī)制

2.4.1 正常響應(yīng)

wKgZPGmBrnuAFiNUAAFGJcJe9gg998.png

在啟動(dòng)請(qǐng)求階段,客戶端將功能碼和數(shù)據(jù)請(qǐng)求發(fā)給服務(wù)器。服務(wù)器收到客戶端發(fā)來(lái)的請(qǐng)求后進(jìn)行分析與處理操作。處理結(jié)束后,服務(wù)器向客戶端發(fā)送處理結(jié)果,即返回功能碼和數(shù)據(jù)響應(yīng)。

在正常響應(yīng)時(shí),返回的功能碼為客戶端請(qǐng)求時(shí)的功能碼,數(shù)據(jù)響應(yīng)為實(shí)際請(qǐng)求到的數(shù)據(jù)。

2.4.2 異常響應(yīng)

wKgZPGmBrteALHEyAAFpk6Ce8hM101.png

在異常響應(yīng)時(shí),返回的功能碼為客戶端請(qǐng)求時(shí)的功能碼 + 0x80,稱為差錯(cuò)碼。數(shù)據(jù)響應(yīng)為異常碼。

此處簡(jiǎn)單介紹一下什么是差錯(cuò)碼和異常碼:

1、差錯(cuò)碼(Error Code):

它本質(zhì)上是原始請(qǐng)求功能碼的最高位被置為 1

原始功能碼是一個(gè) 1 字節(jié)數(shù)值,范圍是 1~127,HEX 表示為 0x01~0x7F

將這個(gè)值加上 128,即0x80,就得到了差錯(cuò)碼。此時(shí)范圍是 129~255,HEX 表示為 0x81~0xFF

作用:告訴客戶端“你剛才發(fā)的請(qǐng)求不正確”。例如,如果客戶端請(qǐng)求時(shí)的功能碼為0x03,那么異常響應(yīng)中的差錯(cuò)碼就是0x83(0x03 + 0x80)


2、異常碼(Exception Code):

也占用 1 個(gè)字節(jié)數(shù)值,緊跟在差錯(cuò)碼后面,用于具體說(shuō)明出錯(cuò)的原因

作用:告訴客戶端究竟是哪里出了問(wèn)題

舉 4 個(gè)常見的異常碼:

01:非法功能碼,表示從站設(shè)備不支持請(qǐng)求的功能碼

02:非法數(shù)據(jù)地址,表示請(qǐng)求的寄存器地址不存在或者無(wú)效

03:非法數(shù)據(jù)值,表示請(qǐng)求的數(shù)據(jù)字段無(wú)效

04:從站設(shè)備故障,表示從站設(shè)備在執(zhí)行請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤

三、Modbus 數(shù)據(jù)模型

3.1 Modbus 四種基本數(shù)據(jù)類型

注:Modbus 協(xié)議中通常將這四類稱為“數(shù)據(jù)對(duì)象”(Data Objects),但在工程實(shí)踐中常簡(jiǎn)稱為“數(shù)據(jù)類型”,本文將沿用此習(xí)慣進(jìn)行介紹。

Modbus 協(xié)議定義了四種基本類型(線圈、離散輸入、輸入寄存器、保持寄存器)。采取這樣的劃分是基于工業(yè)控制系統(tǒng)中常見的硬件接口特性、數(shù)據(jù)訪問(wèn)需求以及通信效率的綜合考量。通過(guò)將數(shù)據(jù)按照功能、讀寫屬性和物理意義進(jìn)行分類,Modbus 在保持協(xié)議間接性的同時(shí),可以有效映射真實(shí)設(shè)備的輸入輸出行為,為不同廠商設(shè)備之間的互操作性提供清晰、一致的數(shù)據(jù)模型基礎(chǔ)。

3.1.1 線圈(Coils)

中文別名:數(shù)字輸出、開關(guān)輸出、DO(Digital Output)

存儲(chǔ)單元:?jiǎn)伪忍兀? bit)

數(shù)值范圍:兩種狀態(tài):0(OFF)或 1(ON)

訪問(wèn)權(quán)限:可讀可寫

功能碼:

01(0x01):讀單個(gè)或多個(gè)線圈

05(0x05):寫單個(gè)線圈

15(0x0F):寫多個(gè)線圈


典型用途:控制繼電器、開關(guān)、指示燈等數(shù)字輸出設(shè)備

實(shí)際應(yīng)用舉例:

控制繼電器的吸合或斷開

控制電機(jī)的啟動(dòng)或停止

控制閥門的開啟或關(guān)閉

控制指示燈的點(diǎn)亮或熄滅


3.1.2 離散輸入(Discrete Inputs)

中文別名:數(shù)字輸入、開關(guān)輸入、DI(Digital Input)

存儲(chǔ)單元:?jiǎn)伪忍兀? bit)

數(shù)值范圍:兩種狀態(tài):0(OFF)或 1(ON)

訪問(wèn)權(quán)限:只讀

功能碼:

02(0x02):讀單個(gè)或多個(gè)離散輸入


典型用途:讀取限位開關(guān)、按鈕、傳感器等數(shù)字輸入狀態(tài)

實(shí)際應(yīng)用舉例:

讀取一個(gè)按鈕是否被按下

檢測(cè)一個(gè)限位開關(guān)是否觸發(fā)

判斷門磁傳感器是否報(bào)警(門 開/關(guān))

查看故障報(bào)警信號(hào)的狀態(tài)


3.1.3 輸入寄存器(Input Registers)

中文別名:模擬量輸入、只讀寄存器、AIAnalog Input)

存儲(chǔ)單元:16 位(2 bytes)

數(shù)值范圍:0~65535(無(wú)符號(hào))或者 -32768~32767(有符號(hào),屬于非協(xié)議標(biāo)準(zhǔn),需要主/從站設(shè)備配合實(shí)現(xiàn))

訪問(wèn)權(quán)限:只讀

功能碼:

04(0x04):讀單個(gè)或多個(gè)輸入寄存器


典型用途:讀取傳感器溫度、壓力、電壓等模擬量輸入值

實(shí)際應(yīng)用舉例:

讀取溫度傳感器的測(cè)量值(如 25.4℃)

讀取壓力傳感器的實(shí)際壓力

讀取流量計(jì)的當(dāng)前流量

讀取設(shè)備運(yùn)行的累計(jì)時(shí)間(通常由設(shè)備內(nèi)部維護(hù),此處只供讀?。?/p>


3.1.4 保持寄存器(Holding Registers)

中文別名:模擬量輸出、讀寫寄存器、AO(Analog Output)

存儲(chǔ)單元:0~65535(無(wú)符號(hào))或者 -32768~32767(有符號(hào),屬于非協(xié)議標(biāo)準(zhǔn),需要主/從站設(shè)備配合實(shí)現(xiàn))

訪問(wèn)權(quán)限:可讀可寫

功能碼:

03(0x03):讀單個(gè)或多個(gè)保持寄存器

06(0x06):寫單個(gè)保持寄存器

16(0x10):寫多個(gè)保持寄存器

典型用途:存儲(chǔ)配置參數(shù)、設(shè)定值、設(shè)備狀態(tài)等可被主站設(shè)備修改的數(shù)據(jù)

實(shí)際應(yīng)用舉例:

寫入方面:設(shè)置目標(biāo)溫度、設(shè)定電機(jī)轉(zhuǎn)速、修改報(bào)警閾值、發(fā)送控制命令代碼

讀取方面:讀取設(shè)備內(nèi)部計(jì)算的參數(shù)、獲取系統(tǒng)狀態(tài)信息、讀取預(yù)置的配方數(shù)據(jù)

3.1.5 基本數(shù)據(jù)類型一覽表

wKgZPGmBsC-ASjwNAAENAVomYzI786.png

3.2 Modbus 數(shù)據(jù)區(qū)與尋址

從實(shí)現(xiàn)的角度來(lái)看,Modbus 協(xié)議將這四種數(shù)據(jù)類型概念性地組織為四個(gè)獨(dú)立的數(shù)據(jù)區(qū)。

每個(gè)數(shù)據(jù)區(qū)都是一個(gè)線性的地址空間:

wKgZPGmBsFWADS-ZAABYMXknPr8427.png

注意:表中“邏輯地址”是面向用戶的編號(hào)系統(tǒng)。實(shí)際 Modbus 報(bào)文(PDU)中傳輸?shù)氖菑?0 開始的偏移量,也正是我接下來(lái)開始介紹的 5.3 地址映射。

3.3 Modbus 地址映射

3.3.1 核心概念

1.寄存器地址/偏移量(Register Address/Offset)

含義:Modbus 報(bào)文 PDU 中實(shí)際傳輸?shù)募拇嫫?線圈起始地址,是從 0 開始的 16 位無(wú)符號(hào)整數(shù)偏移量。

特點(diǎn):范圍理論上為 0-65535,但具體支持的地址范圍由從站設(shè)備內(nèi)部定義的數(shù)據(jù)模型決定。

示例:讀取保持寄存器 40001 -> 實(shí)際協(xié)議地址為 0x0000;讀取 40010 -> 協(xié)議地址為 0x0009。

2.邏輯地址/參考地址(Logical Address/Reference Address)

含義:面向用戶和工程師的地址表示法,用于配置和編程時(shí)直觀區(qū)分?jǐn)?shù)據(jù)類型。由功能前綴 + 序號(hào)組成。

特點(diǎn):通常為 5 位十進(jìn)制數(shù),前綴固定表示數(shù)據(jù)區(qū)類型:

0xxxx:線圈(Coils)

1xxxx:離散輸入(Discrete Inputs)

3xxxx:輸入寄存器(Input Registers)

4xxxx:保持寄存器(Holding Registers)

示例:40001,30002,10005,00003

3.3.2 轉(zhuǎn)換關(guān)系與規(guī)則

轉(zhuǎn)換的核心規(guī)則是:協(xié)議地址 = 邏輯地址 - 基地址

這個(gè)“基地址”因數(shù)據(jù)類型而異,從而形成不同的邏輯地址范圍

wKgZPGmBsMKARiyNAACL11EzBUI626.png

重要提示:

表中的“9998”是一個(gè)常規(guī)上限,由于協(xié)議地址是 16 位無(wú)符號(hào)整數(shù),其理論范圍是 0-65535,此時(shí) 5 位數(shù)已經(jīng)無(wú)法滿足,于是也有許多廠商使用 6 位數(shù)字進(jìn)行表示:

0xxxxx:線圈(Coils)

1xxxxx:離散輸入(Discrete Inputs)

3xxxxx:輸入寄存器(Input Registers)

4xxxxx:保持寄存器(Holding Registers)

這是對(duì)原始 5 位數(shù)表示的擴(kuò)展,我們?cè)谄綍r(shí)使用時(shí),一定要先查閱各個(gè)產(chǎn)品的設(shè)備手冊(cè),查看邏輯地址和協(xié)議地址范圍。

3.3.3 轉(zhuǎn)換示例

假如你在 HMI(人機(jī)界面)或者上位機(jī)軟件中配置了一個(gè)數(shù)據(jù)標(biāo)簽,標(biāo)簽指向保持寄存器 40100。

1.確定數(shù)據(jù)類型:地址以 4 開頭,說(shuō)明是保持寄存器。

2.應(yīng)用轉(zhuǎn)換公式:協(xié)議地址 = 設(shè)備地址 - 40001。

3.進(jìn)行計(jì)算:40100 - 40001 = 99,這是十進(jìn)制數(shù)值,十六進(jìn)制表示為0x0063。

當(dāng)主站設(shè)備需要讀取這個(gè)標(biāo)簽時(shí),它會(huì)組成這樣一個(gè) PDU 報(bào)文:

功能碼:0x03(讀保持寄存器)

起始地址:0x000x63(高字節(jié)為 0,低字節(jié)為 99)

數(shù)量:0x000x01(讀取 1 個(gè)寄存器)

從站設(shè)備在收到請(qǐng)求后,便會(huì)去自己的保持寄存器數(shù)據(jù)區(qū)中,查找協(xié)議地址為 99 的寄存器,然后組成響應(yīng)報(bào)文后返回給主站設(shè)備

3.4 Modbus 數(shù)據(jù)模型相關(guān)說(shuō)明

Modbus 協(xié)議本身只定義了數(shù)據(jù)的類型和訪問(wèn)方式,但并沒(méi)有規(guī)定這些數(shù)據(jù)具體代表什么含義或如何被使用。

盡管協(xié)議定義了四種獨(dú)立的數(shù)據(jù)區(qū),但從抽象或?qū)崿F(xiàn)的角度看,可以認(rèn)為它們?cè)诠δ芑虼鎯?chǔ)上是相互重疊、相互表示的。

解釋一:從邏輯上看,一個(gè) 16 位的寄存器可以看作是 16 個(gè)獨(dú)立的比特。因此,從數(shù)據(jù)存儲(chǔ)的潛力上來(lái)說(shuō),保持寄存器的地址空間(每個(gè)地址存 16 位)可以“覆蓋”或“包含”線圈的地址空間(每個(gè)地址存 1 位)。同理,輸入寄存器的地址空間也可以“覆蓋”離散輸入的地址空間。

解釋二:在某些系統(tǒng)的內(nèi)存實(shí)現(xiàn)中,這四種數(shù)據(jù)區(qū)可能最終都會(huì)映射到同一片物理內(nèi)存或處理邏輯上。雖然 Modbus 協(xié)議將它們分為四種數(shù)據(jù)區(qū),但底層硬件可能用統(tǒng)一的方式管理它們。

對(duì)于數(shù)據(jù)區(qū)中的任何一項(xiàng),Modbus 協(xié)議都允許單個(gè)地選擇 65536 個(gè)數(shù)據(jù)項(xiàng)。

Modbus 協(xié)議允許在一次請(qǐng)求中,批量寫入多個(gè)連續(xù)的地址。你不需要為了讀取 10 個(gè)連續(xù)的保持寄存器而發(fā)送 10 次單獨(dú)的請(qǐng)求,只需要發(fā)送一次請(qǐng)求,并告訴從站設(shè)備“從地址 X 開始,給我 Y 個(gè)寄存器的值”。

雖然可以批量讀寫,但一次操作所能處理的最大數(shù)據(jù)量是有限制的。這個(gè)限制不是來(lái)自地址空間(65536),而主要取決于所使用的功能碼和 Modbus 傳輸模式。

通過(guò) Modbus 處理的所有數(shù)據(jù)放置在設(shè)備應(yīng)用存儲(chǔ)器中。但是,存儲(chǔ)器的物理地址不應(yīng)該與數(shù)據(jù)參考混淆。要求僅僅是數(shù)據(jù)參考與物理地址的鏈接。

Modbus 功能碼中使用的 Modbus 邏輯參考數(shù)字是以 0 開始的無(wú)符號(hào)整數(shù)索引

四、Modbus 功能碼

Modbus 協(xié)議定義了三類功能碼,分別為公共功能碼、用戶定義功能碼、保留功能碼。

在介紹這三類功能碼之前,有一點(diǎn)需要注意,我們平時(shí)在使用這些功能碼時(shí)需要先去查閱設(shè)備手冊(cè),查看使用的設(shè)備都支持哪些功能碼,包括公共功能碼也并非是全部都支持。

4.1 公共功能碼(Public Function Codes)

這是最常用、被官方 Modbus 協(xié)議標(biāo)準(zhǔn)明確定義、保證唯一性且得到最廣泛支持的功能碼。它們用于執(zhí)行最核心的數(shù)據(jù)讀寫操作。

這類功能碼又可細(xì)分為核心數(shù)據(jù)訪問(wèn)功能診斷功能其他專用功能三個(gè)類別。

1.核心數(shù)據(jù)訪問(wèn)功能碼

這些是用于讀寫設(shè)備基本數(shù)據(jù)(線圈、離散輸入、寄存器)的最常用功能。

wKgZO2mBsWKAQCw8AAERv4p-4sE924.png

2. 診斷功能碼

這些功能碼用于查詢通信狀態(tài)、設(shè)備異常和設(shè)備標(biāo)識(shí)信息,主要用于調(diào)試和監(jiān)控。

wKgZPGmBsYaAKVntAACfoVemer8020.png

3. 其他專用功能

wKgZO2mBsaOAA1PKAACU29uYwWs871.png

4.2 用戶定義功能碼(User-Defined Function Codes)

這類功能碼保留給公司或個(gè)人,用于為特定的設(shè)備開發(fā)自定義的功能。

范圍:65 至 72 和 100 至 110。

特點(diǎn):

Modbus 官方標(biāo)準(zhǔn)沒(méi)有為這些代碼定義任何行為。

其功能和實(shí)現(xiàn)完全由用戶(設(shè)備廠商)自行定義。

不能保證被選功能碼的使用是唯一的。

使用這些功能碼的設(shè)備之間在進(jìn)行通信時(shí)不具備通用性。必須完全依賴設(shè)備廠商提供的文檔來(lái)了解如何使用它們。


4.3 保留功能碼(Reserved Function Codes)

這些功能碼在過(guò)去被一些傳統(tǒng)的 Modbus 設(shè)備使用,或者被保留給未來(lái)可能的標(biāo)準(zhǔn)擴(kuò)展使用。在新設(shè)備和項(xiàng)目中應(yīng)避免使用它們。

范圍:8/19;8/21-65535,9,10,13,14,41,42,90,91,125,126,127 功能碼。

特點(diǎn):它們沒(méi)有公共定義,可能在某些老舊系統(tǒng)中存在,但不在現(xiàn)代 Modbus 標(biāo)準(zhǔn)之內(nèi)。

4.4 功能碼示例描述

4.4.1 (0x01)讀取線圈

該功能碼用于從從站設(shè)備中讀取1 ~ 2000 個(gè)連續(xù)的線圈(Coil)狀態(tài)

請(qǐng)求 PDU 中指定了起始地址(即所請(qǐng)求的第一個(gè)線圈的地址)以及線圈數(shù)量。

在 PDU 中,線圈地址從 0 開始。因此,編號(hào)為 1 - 16 的線圈,其地址為 0 - 15。

響應(yīng)報(bào)文中的線圈狀態(tài)以每比特表示一個(gè)線圈的方式打包在數(shù)據(jù)字段中。

狀態(tài)值1 表示 ON(開啟),0 表示 OFF(關(guān)閉)。

第一個(gè)數(shù)據(jù)字節(jié)的最低有效位(LSB)對(duì)應(yīng)查詢中指定的起始地址線圈,其余線圈依次向該字節(jié)的高位排列,并在后續(xù)字節(jié)中繼續(xù)從低位到高位依次填充。

如果返回的線圈數(shù)量不是 8 的整數(shù)倍,則最后一個(gè)數(shù)據(jù)字節(jié)的高位將用 0 填充。

字節(jié)數(shù)字段表示數(shù)據(jù)字段中完整字節(jié)的數(shù)量。

請(qǐng)求 PDU:

wKgZO2mBsgyAMMiJAAAvp_vCHgE506.png

響應(yīng) PDU:

wKgZPGmBsieALlJhAAAfYayeQJY867.png

N = 線圈數(shù)量 / 8 。

異常響應(yīng):

wKgZO2mBslSAKeZgAAAZLD3yl-E054.png


舉例分析:

以下為讀取線圈 20 - 38 的請(qǐng)求示例:

wKgZPGmBsnqAP3ObAAB3iroQLJo730.png

線圈 27 - 20 的狀態(tài)以字節(jié)值CD(十六進(jìn)制)表示,即二進(jìn)制1100 1101。

其中,線圈 27 位于該字節(jié)的最高有效位(MSB),線圈 20 位于最低有效位(LSB)。

按照慣例,字節(jié)內(nèi)的比特位從左到右依次表示 MSB 到 LSB

因此,第一個(gè)字節(jié)中的線圈從左到右依次為27、26、25、24、23、22、21、20

下一個(gè)字節(jié)則包含線圈35 - 28,同樣從左到右排列。

然而,在串行傳輸時(shí),比特位是從 LSB 到 MSB 依次發(fā)送的,即:

20 → 21 → … → 27,接著 28 → 29 → … → 35,依此類推。

在最后一個(gè)數(shù)據(jù)字節(jié)中,線圈 38 - 36 的狀態(tài)以字節(jié)值05(十六進(jìn)制)表示,即二進(jìn)制0000 0101。

其中,線圈 36 位于 LSB(最右側(cè))線圈 38 位于從左往右數(shù)的第 6 位(即 bit 2,從 0 開始計(jì)數(shù))。

該字節(jié)中剩余的高 5 位(bit 7 到 bit 3)均以 0 填充。

4.4.2 (0x02)讀取離散輸入

該功能碼用于從從站設(shè)備中讀取1 ~ 2000 個(gè)連續(xù)的離散輸入狀態(tài)。

請(qǐng)求 PDU 中指定了起始地址(即所請(qǐng)求的第一個(gè)離散輸入的地址)以及離散輸入的數(shù)量。

在 PDU 中,離散輸入的地址從 0 開始。因此,編號(hào)為 1 - 16 的離散輸入,其地址為 0 - 15。

響應(yīng)報(bào)文中的離散輸入狀態(tài)以每比特表示一個(gè)離散輸入的方式打包在數(shù)據(jù)字段中。

狀態(tài)值1 表示 ON(開啟)0 表示 OFF(關(guān)閉)。

第一個(gè)數(shù)據(jù)字節(jié)的最低有效位(LSB)對(duì)應(yīng)查詢中指定的起始地址離散輸入,其余離散輸入依次向該字節(jié)的高位排列,并在后續(xù)字節(jié)中繼續(xù)從低位到高位依次填充。

如果返回的離散輸入數(shù)量不是 8 的整數(shù)倍,則最后一個(gè)數(shù)據(jù)字節(jié)的高位將用 0 填充。

字節(jié)數(shù)字段表示數(shù)據(jù)字段中完整字節(jié)的數(shù)量。

請(qǐng)求 PDU:

wKgZPGmBstiABqpHAAAs8rgvgCk211.png

響應(yīng) PDU:

wKgZO2mBsvmALipRAAAejfaKquU169.png

N = 輸入數(shù)量 / 8 。

異常響應(yīng):

wKgZPGmBsxyAcCtvAAAZBcwwISo282.png

舉例分析:

以下為讀取離散輸入 197 - 218 的請(qǐng)求示例:

wKgZPGmBs4WALy5NAAB1dNM_xIE387.png

離散輸入 204 - 197 的狀態(tài)以字節(jié)值AC(十六進(jìn)制)表示,即二進(jìn)制1010 1100。

其中,離散輸入 204 位于該字節(jié)的最高有效位(MSB,最左側(cè)),離散輸入 197 位于最低有效位(LSB,最右側(cè))。

離散輸入 218 - 213 的狀態(tài)以字節(jié)值35(十六進(jìn)制)表示,即二進(jìn)制0011 0101。 其中,離散輸入 213 位于 LSB(最右側(cè)),離散輸入 218 位于從左往右數(shù)的第 3 位(即 bit 5,從 0 開始計(jì)數(shù))。

4.4.3 (0x03)讀取保持寄存器

該功能碼用于讀取從從站設(shè)備中讀取1 ~ 125 個(gè)連續(xù)的保持寄存器

請(qǐng)求 PDU 中指定了寄存器起始地址要讀取的寄存器數(shù)量。

在 PDU 中,寄存器地址從 0 開始。因此,編號(hào)為 1 - 16 的寄存器,其地址為 0 - 15。

響應(yīng)報(bào)文中的寄存器數(shù)據(jù)以每個(gè)寄存器占用兩個(gè)字節(jié)的方式打包,二進(jìn)制數(shù)值在 16 位空間中右對(duì)齊(即采用標(biāo)準(zhǔn)整數(shù)格式)。

對(duì)于每個(gè)寄存器,第一個(gè)字節(jié)包含高字節(jié)(高 8 位)第二個(gè)字節(jié)包含低字節(jié)(低 8 位)。

請(qǐng)求 PDU:

wKgZPGmBs6qAGUWZAAAumJ0-PaM325.png

響應(yīng) PDU:

wKgZPGmBs8-AIJPGAAAfum5y7Oo121.png

N = 保持寄存器的數(shù)量 。

異常響應(yīng):

wKgZO2mBs-6AGEKZAAAYnJWZS7Q236.png

舉例分析:

以下為讀取保持寄存器 108 - 110 的請(qǐng)求示例:

wKgZPGmBtBWAfmbiAACb9MOmrjQ534.png

保持寄存器 108 的內(nèi)容以兩個(gè)字節(jié)表示為02 2B(十六進(jìn)制),即十進(jìn)制555。

保持寄存器 109 - 110 的內(nèi)容分別為00 0000 64(十六進(jìn)制),即十進(jìn)制0100。

4.4.4 (0x04)讀取輸入寄存器

該功能碼用于從從站設(shè)備中讀取1 ~ 125 個(gè)連續(xù)的輸入寄存器。

請(qǐng)求 PDU 中指定了寄存器起始地址要讀取的寄存器數(shù)量

在 PDU 中,寄存器地址從 0 開始。因此,編號(hào)為 1 - 16 的輸入寄存器,其地址為 0 - 15。

響應(yīng)報(bào)文中的寄存器數(shù)據(jù)以每個(gè)寄存器占用兩個(gè)字節(jié)的方式打包,二進(jìn)制數(shù)值在 16 位空間中右對(duì)齊(即采用標(biāo)準(zhǔn)整數(shù)格式)。

對(duì)于每個(gè)寄存器,第一個(gè)字節(jié)包含高字節(jié)(高 8 位)第二個(gè)字節(jié)包含低字節(jié)(低 8 位)。

請(qǐng)求 PDU:

wKgZO2mBtEKAMHpUAAAu0-hCKes400.png

響應(yīng) PDU:

wKgZPGmBtF-AWmQAAAAfC70fUt8122.png

N = 輸入寄存器的數(shù)量 。

異常響應(yīng):

wKgZO2mBtICAY0B7AAAZPlKYWcI331.png

舉例分析:

以下是讀取輸入寄存器 9 的請(qǐng)求示例:

wKgZPGmBtJ6APwlHAABqMaqZCC8097.png

輸入寄存器 9 的內(nèi)容以兩個(gè)字節(jié)表示為00 0A(十六進(jìn)制),即十進(jìn)制10

4.4.5 (0x05)寫入單個(gè)線圈

該功能碼用于將從站設(shè)備中的單個(gè)線圈強(qiáng)制置為 ON 或 OFF。

請(qǐng)求數(shù)據(jù)字段中的一個(gè)常量用于指定所需的 ON/OFF 狀態(tài):

值為FF00(十六進(jìn)制)表示將線圈置為ON;

值為0000(十六進(jìn)制)表示將線圈置為OFF;

所有其他值均為非法,不會(huì)對(duì)線圈狀態(tài)產(chǎn)生任何影響。

請(qǐng)求 PDU 中指定了要操作的線圈地址。線圈地址從 0 開始,因此編號(hào)為 1 的線圈,其地址為0。

ON/OFF 狀態(tài)由輸出值字段中的常量指定:

0xFF00表示 ON,

0x0000表示 OFF,

其他值無(wú)效,線圈狀態(tài)保持不變。

正常響應(yīng)是在線圈狀態(tài)成功寫入后,原樣返回請(qǐng)求報(bào)文的內(nèi)容(即請(qǐng)求的回顯)。

請(qǐng)求 PDU:

wKgZO2mBtQOAbmjIAAAn_BgukSI125.png

響應(yīng) PDU:

wKgZO2mBtSyASPcCAAAo7wsZLCo548.png

異常響應(yīng):

wKgZPGmBtXSAdms7AAAY9balt58646.png

舉例分析:

以下是將線圈 173 置為 ON 的寫請(qǐng)求示例:

4.4.6 (0x06)寫入單個(gè)寄存器

該功能碼用于向從站設(shè)備中寫入一個(gè)保持寄存器。

請(qǐng)求 PDU 中指定了要寫入的寄存器地址。寄存器地址從 0 開始,因此編號(hào)為 1 的寄存器,其地址為0。

正常響應(yīng)是在寄存器內(nèi)容成功寫入后,原樣返回請(qǐng)求報(bào)文的內(nèi)容(即請(qǐng)求的回顯)。

請(qǐng)求 PDU:

wKgZO2mBta6AKiBEAAAtkprexrY057.png

響應(yīng) PDU:

wKgZPGmBtpOAZvD5AAAtr7cgN0k584.png

異常響應(yīng):

wKgZO2mBtqmACQmOAAAZDd4ULsY877.png

舉例分析:

以下是將寄存器 2 寫入值 00 03(十六進(jìn)制)的請(qǐng)求示例:

wKgZPGmBtseAOaAiAABy3C7xZGc729.png

4.4.7 (0x0F)寫多個(gè)線圈

該功能碼用于將從站設(shè)備中一段連續(xù)線圈序列中的每一個(gè)線圈強(qiáng)制置為 ON 或 OFF。

請(qǐng)求 PDU 中指定了要操作的線圈起始地址和數(shù)量。線圈地址從 0 開始,因此編號(hào)為 1 的線圈,其地址為 0。

請(qǐng)求數(shù)據(jù)字段中的每一位指定了對(duì)應(yīng)線圈的目標(biāo)狀態(tài):

某一位為邏輯 ‘1’,表示將對(duì)應(yīng)的線圈置為ON;

某一位為邏輯 ‘0’,表示將對(duì)應(yīng)的線圈置為OFF。

正常響應(yīng)將返回功能碼、起始地址以及被強(qiáng)制寫入的線圈數(shù)量。

請(qǐng)求 PDU:

wKgZO2mBtt6Ad3xmAABC5ylurQo146.png

N = 線圈數(shù)量 / 8 。

響應(yīng) PDU:

wKgZPGmBuyOASH84AAAvJD8PGgw026.png

異常響應(yīng):

wKgZO2mBu0qAOds9AAAZOJghxSo828.png

舉例分析:

以下是一個(gè)從線圈 20 開始,連續(xù)寫入 10 個(gè)線圈的請(qǐng)求示例:

請(qǐng)求的數(shù)據(jù)內(nèi)容為兩個(gè)字節(jié):CD 01(十六進(jìn)制),即二進(jìn)制 1100 1101 0000 0001。

這些二進(jìn)制位與線圈的對(duì)應(yīng)關(guān)系如下:

wKgZO2mBu26AKcvdAABCUxHRjPI515.png

第一個(gè)傳輸?shù)淖止?jié)(CD hex)對(duì)應(yīng)線圈 27 - 20,其中最低有效位(LSB)對(duì)應(yīng)線圈 20。

下一個(gè)傳輸?shù)淖止?jié)(01 hex)對(duì)應(yīng)線圈 29 - 28,同樣,最低有效位對(duì)應(yīng)線圈 28。

最后一個(gè)數(shù)據(jù)字節(jié)中未使用的高位應(yīng)填充為 0。

wKgZO2mBu5SAHliSAACLGQNr6vc520.png

4.4.8 (0x10)寫多個(gè)寄存器

該功能碼用于向從站設(shè)備中寫入1 - 123 個(gè)連續(xù)的寄存器塊

請(qǐng)求數(shù)據(jù)字段中指定了要寫入的寄存器值,數(shù)據(jù)以每個(gè)寄存器兩個(gè)字節(jié)的方式打包。

正常響應(yīng)將返回功能碼、寄存器起始地址以及成功寫入的寄存器數(shù)量。

請(qǐng)求 PDU:

wKgZPGmBu8SASo5yAABDhdCLmqs720.png

N = 寄存器數(shù)量 。

響應(yīng) PDU:

wKgZPGmBu-WAHHaXAAAuqA-UZKk895.png

異常響應(yīng):

wKgZO2mBvAKASI3fAAAY2Aw0lBw082.png

舉例分析:

以下是一個(gè)從寄存器 2 開始,連續(xù)寫入 2 個(gè)寄存器的請(qǐng)求示例:

請(qǐng)求寫入的寄存器內(nèi)容分別為 00 0A(十六進(jìn)制)01 02(十六進(jìn)制)。

wKgZPGmBvCqAQe3ZAACnWSuohJw129.png

4.5 異常響應(yīng)

4.5.1 異常碼說(shuō)明

當(dāng)主站設(shè)備向從站設(shè)備發(fā)送請(qǐng)求時(shí),它期望得到一個(gè)正常響應(yīng)。主站設(shè)備的查詢可能導(dǎo)致以下四種情況發(fā)生其一:

如果從站設(shè)備收到請(qǐng)求且無(wú)通信錯(cuò)誤,并能正常處理該查詢,則返回一個(gè)正常響應(yīng)。

如果從站設(shè)備因通信錯(cuò)誤未能收到請(qǐng)求,則不會(huì)返回任何響應(yīng)。主站設(shè)備程序最終將處理此請(qǐng)求的超時(shí)狀態(tài)。

如果從站設(shè)備收到請(qǐng)求,但檢測(cè)到通信錯(cuò)誤(奇偶校驗(yàn)、LRC、CRC 等錯(cuò)誤),則不會(huì)返回任何響應(yīng)。主站設(shè)備程序最終將處理此請(qǐng)求的超時(shí)狀態(tài)。

如果從站設(shè)備收到請(qǐng)求且無(wú)通信錯(cuò)誤,但無(wú)法處理它(例如,請(qǐng)求讀取一個(gè)不存在的輸出或寄存器),從站設(shè)備將返回一個(gè)異常響應(yīng),通知主站設(shè)備錯(cuò)誤的性質(zhì)。

異常響應(yīng)消息有兩個(gè)字段,使其與正常響應(yīng)區(qū)分開來(lái):

功能碼字段:

在正常響應(yīng)中,從站設(shè)備會(huì)在響應(yīng)的功能碼字段中原樣回顯原始請(qǐng)求的功能碼。

所有功能碼的最高有效位(MSB)均為 0(它們的值都低于 80 十六進(jìn)制)。

在異常響應(yīng)中,從站設(shè)備會(huì)將功能碼的 MSB 設(shè)置為 1。

這使得異常響應(yīng)中的功能碼值恰好比正常響應(yīng)時(shí)的值高 80 十六進(jìn)制。

通過(guò)設(shè)置功能碼的 MSB,主站設(shè)備應(yīng)用程序可以識(shí)別出異常響應(yīng),并可以檢查數(shù)據(jù)字段中的異常代碼。

數(shù)據(jù)字段:

在正常響應(yīng)中,從站設(shè)備可能在數(shù)據(jù)字段中返回?cái)?shù)據(jù)或統(tǒng)計(jì)信息(即請(qǐng)求中所要求的任何信息)。

在異常響應(yīng)中,從站設(shè)備則在數(shù)據(jù)字段中返回一個(gè)異常代碼。

該代碼定義了導(dǎo)致此次異常的從站設(shè)備端的具體情況。

主站設(shè)備請(qǐng)求與從站設(shè)備異常響應(yīng)示例:

wKgZPGmBvMiAbKF4AABXZyCvs0Q421.png

在這個(gè)示例中,主站設(shè)備向從站設(shè)備發(fā)送了一個(gè)請(qǐng)求。功能碼(01)用于讀取輸出狀態(tài)操作。它請(qǐng)求讀取線圈地址 1185(04A1 十六進(jìn)制) 的輸出狀態(tài)。

需要注意的是,此處設(shè)置的輸出數(shù)量字段的值為 0001 ,因此只讀取一個(gè)輸出。

如果設(shè)置的地址在從站設(shè)備中不存在,從站設(shè)備將會(huì)返回異常碼為 02 的異常響應(yīng)。表示從站設(shè)備接收到的是非法數(shù)據(jù)地址。

4.5.2 異常碼列表

異常碼列表如下:

wKgZO2mBvQKAHOxbAAJOpo6c6ig461.png

五、Modbus 通信協(xié)議模式

下面將詳細(xì)介紹三種常見的 Modbus 通信協(xié)議模式以及擴(kuò)展協(xié)議模式。

5.1 Modbus RTU 通信協(xié)議模式

Modbus RTU 是 Modbus 協(xié)議最早、最常用的串行傳輸模式,以其高效率和二進(jìn)制傳輸著稱,廣泛應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域。

5.1.1 物理層與網(wǎng)絡(luò)基礎(chǔ)

Modbus RTU 協(xié)議通常運(yùn)行在串行通信物理層上,最常用的是 RS-485 標(biāo)準(zhǔn),在某些點(diǎn)對(duì)點(diǎn)場(chǎng)景下也會(huì)使用 RS-232。

傳輸介質(zhì):

RS-485:使用雙絞線(屏蔽雙絞線更佳)進(jìn)行傳輸。支持多點(diǎn)通信,是構(gòu)建工業(yè)設(shè)備網(wǎng)絡(luò)的首選。

RS-232:通常使用 DB9 或 DB25 連接器和電纜。主要用于點(diǎn)對(duì)點(diǎn)短距離通信。


網(wǎng)絡(luò)拓?fù)洌?/strong>

RS-485 網(wǎng)絡(luò):采用總線型拓?fù)洌ɑ蚍Q“手拉手”連接),所有設(shè)備并聯(lián)在同一條總線上。網(wǎng)絡(luò)兩端需要安裝終端電阻(通常為 120 歐姆)以抑制信號(hào)反射。

RS-232 連接:嚴(yán)格的點(diǎn)對(duì)點(diǎn)拓?fù)洌瑑H支持一臺(tái)主站和一臺(tái)從站通信。

核心關(guān)系:

協(xié)議:Modbus RTU(定義幀格式和通信規(guī)則)

物理層標(biāo)準(zhǔn):RS-485(多設(shè)備網(wǎng)絡(luò))或 RS-232(點(diǎn)對(duì)點(diǎn)連接)

5.1.2 幀格式

Modbus RTU 協(xié)議報(bào)文(或稱數(shù)據(jù)幀)由以下幾個(gè)部分組成,它們按順序連續(xù)傳輸,共同構(gòu)成一次完整的通信:

wKgZO2mBvhiAPtdlAAAhwBB-Ai4105.png

1. 從站地址

wKgZPGmBvlCAHVaYAAAUs1OPbA0440.png

該字段占 1 個(gè)字節(jié)。取值范圍為 1 ~ 247(十進(jìn)制)。

其中地址 0 被保留為廣播地址,設(shè)置為廣播地址時(shí),所有從站設(shè)備都會(huì)接收并處理數(shù)據(jù),但是不會(huì)向主站設(shè)備進(jìn)行響應(yīng)。

2.功能碼

該字段占 1 個(gè)字節(jié)。作用是指示從站設(shè)備執(zhí)行操作,詳細(xì)說(shuō)明在“第六部分:Modbus 功能碼”。

3.數(shù)據(jù)

根據(jù) Modbus RTU 幀格式規(guī)范,該字段占 0 ~ 252 個(gè)字節(jié)。實(shí)際長(zhǎng)度和內(nèi)容完全由功能碼決定。它包含了請(qǐng)求的詳細(xì)信息(例如: 要讀取的寄存器起始地址和數(shù)量)或者要寫入的具體數(shù)值。

4.CRC-16 校驗(yàn)

該字段占 2 個(gè)字節(jié)。CRC-16 校驗(yàn)即循環(huán)冗余校驗(yàn)碼。由主站設(shè)備根據(jù)前面所有字節(jié)(從站地址、功能碼、數(shù)據(jù))計(jì)算得出,并附在報(bào)文末尾。從站設(shè)備收到報(bào)文后會(huì)用相同算法重新計(jì)算 CRC,并與接收到的 CRC 值進(jìn)行比對(duì)。如果兩者不匹配,則表明傳輸過(guò)程中發(fā)生錯(cuò)誤,該幀報(bào)文將被丟失,從而保證數(shù)據(jù)完整性。

示例:

向單個(gè)保持寄存器寫入數(shù)據(jù):

請(qǐng)求報(bào)文格式:[從站地址][功能碼][寄存器起始地址 寄存器值][CRC16 校驗(yàn)]

舉例:01 06 00 00 00 01 48 0A

01 :從站地址

06 :向單個(gè)保持寄存器寫入數(shù)據(jù)功能碼

00 00 :寄存器起始地址

00 01 :寫入的單個(gè)寄存器數(shù)據(jù)

48 0A :CRC16 校驗(yàn)值

響應(yīng)報(bào)文格式:[從站地址][功能碼][寄存器起始地址 寄存器值][CRC16 校驗(yàn)]

舉例:01 06 00 00 00 01 48 0A

01 :從站地址

06 :向單個(gè)保持寄存器寫入數(shù)據(jù)功能碼

00 00 :寄存器起始地址

00 01 :寫入的單個(gè)寄存器數(shù)據(jù)

48 0A :CRC16 校驗(yàn)值

異常響應(yīng)報(bào)文格式:[從站地址][功能碼][異常碼][CRC16 校驗(yàn)]

舉例:01 86 02 83 A0

01 :從站地址

86 :原功能碼為 06,最高位為 1 表示異常響應(yīng)

02 :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的)

83 A0 :CRC16 校驗(yàn)值

向多個(gè)保持寄存器寫入數(shù)據(jù):

請(qǐng)求報(bào)文格式:[從站地址][功能碼][寄存器起始地址 寄存器數(shù)量 寄存器值字節(jié)數(shù) 寄存器值][CRC16 校驗(yàn)]

舉例:01 10 00 00 00 02 04 00 01 00 05 62 6C

01 :從站地址

10 :寫多個(gè)寄存器功能碼

00 00 :寄存器起始地址

00 02 :要寫入的寄存器數(shù)量

04 :寄存器值的字節(jié)數(shù)

00 01 :寫入的第一個(gè)寄存器值

00 05 :寫入的第二個(gè)寄存器值

62 6C :CRC16 校驗(yàn)值

響應(yīng)報(bào)文格式:[從站地址][功能碼][寄存器起始地址 寄存器數(shù)量][CRC16 校驗(yàn)]

舉例:01 10 00 00 00 02 41 C8

01 :從站地址

10 :寫多個(gè)寄存器功能碼

00 00 :寄存器起始地址

00 02 :要寫入的寄存器數(shù)量

41 C8 :CRC16 校驗(yàn)值

異常響應(yīng)報(bào)文格式:[從站地址][功能碼][異常碼][CRC16 校驗(yàn)]

舉例:01 90 02 CD C1

01 :從站地址

90 :原功能碼為 10,最高位為 1 表示異常響應(yīng)

02 :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的)

CD C1 :CRC16 校驗(yàn)值

讀取保持寄存器數(shù)據(jù):

請(qǐng)求報(bào)文格式:[從站地址][功能碼][寄存器起始地址 寄存器數(shù)量][CRC16 校驗(yàn)]

舉例:01 03 00 00 00 02 C4 0B

01 :從站地址

03 :讀單/多個(gè)保持寄存器功能碼

00 00 :寄存器起始地址

00 02 :要讀取的寄存器數(shù)量

C4 0B :CRC16 校驗(yàn)值

響應(yīng)報(bào)文格式:[從站地址][功能碼][寄存器值字節(jié)數(shù) 寄存器值][CRC16 校驗(yàn)]

舉例:01 03 04 00 01 00 05 6B F0

01 :從站地址

03 :讀單/多個(gè)保持寄存器功能碼

04 :寄存器值字節(jié)數(shù)

00 01 :讀取的第一個(gè)寄存器值

00 05 :讀取的第二個(gè)寄存器值

6B F0 :CRC16 校驗(yàn)值

異常響應(yīng)報(bào)文格式:[從站地址][功能碼][異常碼][CRC16 校驗(yàn)]

舉例:01 83 02 C0 F1

01 :從站地址

83 :原功能碼為 03,最高位為 1 表示異常響應(yīng)

02 :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的)

C0 F1 :CRC16 校驗(yàn)值


5.1.3 傳輸特點(diǎn)

1.二進(jìn)制傳輸

數(shù)據(jù)以原始的 8 位二進(jìn)制字節(jié)流形式直接傳輸。在文檔或調(diào)試中,每個(gè)字節(jié)通常用兩個(gè)十六進(jìn)制字符表示(如0x4A),但這僅用于人類閱讀,實(shí)際串口上不傳輸任何十六進(jìn)制字符。該模式編碼效率高,在相同波特率下比 ASCII 模式具有更高的數(shù)據(jù)吞吐量。

2.波特率與同步

通信雙方(主站設(shè)備和所有從站設(shè)備)必須設(shè)置為相同的波特率(如 9600, 19200 等),否則無(wú)法正確解碼。

依靠起始位和停止位來(lái)實(shí)現(xiàn)字符幀的同步。每個(gè)字節(jié)都封裝在起始位和停止位之間,接收方通過(guò)起始位來(lái)同步并讀取后續(xù)的數(shù)據(jù)位。

3.空閑間隔要求

報(bào)文幀之間必須保持一定的靜默時(shí)間(總線空閑時(shí)間),該時(shí)間必須大于傳輸 3.5 個(gè)字符所需的時(shí)間。

幀內(nèi)的字符間隔必須小于傳輸 1.5 個(gè)字符的時(shí)間。

這些要求是 RTU 模式區(qū)分報(bào)文開始與結(jié)束的關(guān)鍵機(jī)制(幀分隔),替代了 ASCII 模式中的特定起始/結(jié)束字符。

4.特別說(shuō)明:

由于需要遵循 t1.5 和 t3.5 定時(shí)器規(guī)則,Modbus RTU 接收驅(qū)動(dòng)器可能會(huì)涉及大量中斷處理。在高通信波特率下,將會(huì)導(dǎo)致較高的 CPU 負(fù)載。因此,當(dāng)波特率等于或者低于 19200Baud 時(shí),必須嚴(yán)格遵守這兩個(gè)定時(shí)器的時(shí)限要求。對(duì)于大于 19200Baud 的波特率,這兩個(gè)定時(shí)器應(yīng)采用固定值:建議將字符間超時(shí)(t1.5)設(shè)置為 750us ,幀間延遲(t3.5)設(shè)置為 1.750ms 。

5.1.4 參數(shù)配置

在一個(gè) Modbus RTU 模式中,所有設(shè)備的串行通信參數(shù)必須完全一致,否則無(wú)法通信。主要參數(shù)配置包括:

注:以下為官方文檔描述,在實(shí)際使用時(shí)需要查閱設(shè)備手冊(cè),與設(shè)備手冊(cè)中規(guī)定的參數(shù)一致。

1.波特率 (Baud Rate)- 定義通信速度(比特每秒)。常見值有:9600、19200、38400 等。9600 是最常用的默認(rèn)值。

2.數(shù)據(jù)位 (Data Bits)- 固定為 8 位,最低有效位最先發(fā)送。這是 Modbus RTU 標(biāo)準(zhǔn)的規(guī)定。

3.停止位 (Stop Bits)- 可以是 1 位 或 2 位。該設(shè)置與校驗(yàn)位的選擇直接相關(guān)。

4.校驗(yàn)位 (Parity)-無(wú) (None):無(wú)奇偶校驗(yàn)。此時(shí)停止位必須設(shè)置為 2 位。 -奇 (Odd):奇校驗(yàn)。 -偶 (Even):偶校驗(yàn)。這是 Modbus 協(xié)議規(guī)定的默認(rèn)和首選模式。當(dāng)使用奇校驗(yàn)或偶校驗(yàn)時(shí),停止位設(shè)置為 1 位。

5.2 Modbus ASCII(American Standard Code for Information Interchange)

Modbus ASCII 是 Modbus 協(xié)議的另一種串行傳輸模式,它采用可打印的 ASCII 字符編碼,犧牲了效率但換來(lái)了極強(qiáng)的可讀性,便于調(diào)試和診斷。

5.2.1 物理層與網(wǎng)絡(luò)基礎(chǔ)

與 Modbus RTU 相同,Modbus ASCII 協(xié)議也運(yùn)行在串行通信物理層上,主要基于 RS-485 或 RS-232 標(biāo)準(zhǔn)。其物理層特性和網(wǎng)絡(luò)拓?fù)渑c RTU 模式完全一致。

傳輸介質(zhì):雙絞線(用于 RS-485)或 串行電纜(用于 RS-232)。

網(wǎng)絡(luò)拓?fù)洌?/strong>

RS-485:總線型拓?fù)?,需注意終端電阻。

RS-232:點(diǎn)對(duì)點(diǎn)拓?fù)洹?/p>

核心關(guān)系:

協(xié)議:Modbus ASCII(采用 ASCII 編碼的 Modbus 協(xié)議)

物理層標(biāo)準(zhǔn):RS-485 或 RS-232

注意:Modbus ASCII 和 Modbus RTU 可以共享相同的物理網(wǎng)絡(luò)(如相同的 RS-485 總線),但絕不能在同一個(gè)網(wǎng)絡(luò)上混合使用,因?yàn)樗鼈兊膸袷胶途幋a完全不同,會(huì)導(dǎo)致通信失敗。

5.2.2 幀格式

Modbus ASCII 協(xié)議報(bào)文有明確的開始和結(jié)束標(biāo)志,其幀結(jié)構(gòu)如下:

wKgZO2mBv--AImS8AAAr8ZhmHb4257.png

1.起始符

起始符字段占 1 個(gè)字符。固定為冒號(hào)字符:(ASCII 值為0x3A)。

它標(biāo)志著報(bào)文的開始,接收方通過(guò)檢測(cè)起始符來(lái)同步并開始接收一個(gè)新幀。

2.從站地址

從站地址字段占 2 個(gè)字符。使用 ASCII 字符表示。

例如,地址為17(十六進(jìn)制0x11) 的從站,在幀中會(huì)以兩個(gè)字符'1''1'(ASCII 值為0x31,0x31) 表示。

3.功能碼

功能碼字段占 2 個(gè)字符。使用 ASCII 字符表示。

例如,功能碼03(讀保持寄存器) 會(huì)以兩個(gè)字符'0''3'(ASCII 值為0x30,0x33) 表示。

4.數(shù)據(jù)

Modbus 協(xié)議規(guī)定,Modbus ASCII 模式中,數(shù)據(jù)字段占 0 ~ 2 × 252 個(gè)字符。使用 ASCII 字符表示。

每個(gè) 8 位二進(jìn)制字節(jié)被拆分為兩個(gè) 4 位半字節(jié),并分別轉(zhuǎn)換為對(duì)應(yīng)的 ASCII 字符。

例如,數(shù)據(jù)字節(jié)0x4B會(huì)轉(zhuǎn)換為'4'(0x34) 和'B'(0x42) 兩個(gè)字符進(jìn)行傳輸。

5.LRC 校驗(yàn)

LRC 校驗(yàn)字段占 2 個(gè)字符。

LRC 校驗(yàn)即縱向冗余校驗(yàn)。發(fā)送方計(jì)算一個(gè)校驗(yàn)和,并將其轉(zhuǎn)換為兩個(gè) ASCII 字符附加在報(bào)文末尾。接收方執(zhí)行相同的計(jì)算進(jìn)行驗(yàn)證。

6.結(jié)束符

結(jié)束符字段占 2 個(gè)字節(jié)。固定為回車符和換行符CRLF(ASCII 值為0x0D,0x0A)。它們標(biāo)志著報(bào)文的結(jié)束。

示例:

向單個(gè)保持寄存器寫入數(shù)據(jù):

報(bào)文格式:[:][從站地址][功能碼][寄存器起始地址 寄存器值][LRC 校驗(yàn)][rn]

舉例::010600000001B8rn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘0’ ‘6’ :向單個(gè)保持寄存器寫入數(shù)據(jù)功能碼,HEX 值為 30 36

‘0’ ‘0’ ‘0’ ‘0’ :寄存器起始地址,HEX 值為 30 30 30 30

‘0’ ‘0’ ‘0’ ‘1’ :寫入的單個(gè)寄存器數(shù)據(jù),HEX 值為 30 30 30 31

‘B’ ‘8’ :LRC 校驗(yàn)值,HEX 值為 42 38

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A


響應(yīng)報(bào)文格式:[:][從站地址][功能碼][寄存器起始地址 寄存器值][LRC 校驗(yàn)][rn]

舉例::010600000001B8rn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘0’ ‘6’ :向單個(gè)保持寄存器寫入數(shù)據(jù)功能碼,HEX 值為 30 36

‘0’ ‘0’ ‘0’ ‘0’ :寄存器起始地址,HEX 值為 30 30 30 30

‘0’ ‘0’ ‘0’ ‘1’ :寫入的單個(gè)寄存器數(shù)據(jù),HEX 值為 30 30 30 31

‘B’ ‘8’ :LRC 校驗(yàn)值,HEX 值為 42 38

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A


異常響應(yīng)報(bào)文格式:[:][從站地址][功能碼][異常碼][LRC 校驗(yàn)][rn]

舉例::018602CFrn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘8’ ‘6’ :原功能碼為 06,最高位為 1 表示異常響應(yīng),HEX 值為 38 36

‘0’ ‘2’ :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的),HEX 值為 30 36

‘C’ ‘F’ :LRC 校驗(yàn)值,HEX 值為 43 46

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A


向多個(gè)保持寄存器寫入數(shù)據(jù):

請(qǐng)求報(bào)文格式:[:][從站地址][功能碼][寄存器起始地址 寄存器數(shù)量 寄存器值字節(jié)數(shù) 寄存器值][LRC 校驗(yàn)][rn]

舉例::0110000000020400010005D2rn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘1’ ‘0’ :寫多個(gè)寄存器功能碼,HEX 值為 31 30

‘0’ ‘0’ ‘0’ ‘0’ :寄存器起始地址,HEX 值為 30 30 30 30

‘0’ ‘0’ ‘0’ ‘2’ :要寫入的寄存器數(shù)量,HEX 值為 30 30 30 32

‘0’ ‘4’ :寄存器值的字節(jié)數(shù),HEX 值為 30 34

‘0’ ‘0’ ‘0’ ‘1’ :寫入的第一個(gè)寄存器值,HEX 值為 30 30 30 31

‘0’ ‘0’ ‘0’ ‘5’ :寫入的第二個(gè)寄存器值,HEX 值為 30 30 30 35

‘D’ ‘2’ :LRC 校驗(yàn)值,HEX 值為 44 32

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A


響應(yīng)報(bào)文格式:[:][從站地址][功能碼][寄存器起始地址 寄存器數(shù)量][LRC 校驗(yàn)][rn]

舉例::011000000002BCrn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘1’ ‘0’ :寫多個(gè)寄存器功能碼,HEX 值為 31 30

‘0’ ‘0’ ‘0’ ‘0’ :寄存器起始地址,HEX 值為 30 30 30 30

‘0’ ‘0’ ‘0’ ‘2’ :要寫入的寄存器數(shù)量,HEX 值為 30 30 30 32

‘B’ ‘C’ :LRC 校驗(yàn)值,HEX 值為 42 43

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A


異常響應(yīng)報(bào)文格式:[:][從站地址][功能碼][異常碼][LRC 校驗(yàn)][rn]

舉例::019002D4rn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘9’ ‘0’ :原功能碼為 10,最高位為 1 表示異常響應(yīng),HEX 值為 39 30

‘0’ ‘2’ :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的),HEX 值為 30 36

‘D’ ‘4’ :LRC 校驗(yàn)值,HEX 值為 44 34

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A


讀取保持寄存器數(shù)據(jù):

請(qǐng)求報(bào)文格式:[:][從站地址][功能碼][寄存器起始地址 寄存器數(shù)量][LRC 校驗(yàn)][rn]

舉例::010300000002BArn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘0’ ‘3’ :讀單/多個(gè)保持寄存器功能碼,HEX 值為 30 33

‘0’ ‘0’ ‘0’ ‘0’ :寄存器起始地址,HEX 值為 30 30 30 30

‘0’ ‘0’ ‘0’ ‘2’ :要讀取的寄存器數(shù)量,HEX 值為 30 30 30 32

‘B’ ‘A’ :LRC 校驗(yàn)值,HEX 值為 42 41

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A

響應(yīng)報(bào)文格式:[:][從站地址][功能碼][寄存器值字節(jié)數(shù) 寄存器值][LRC 校驗(yàn)][rn]

舉例::0103040001000552rn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘0’ ‘3’ :讀單/多個(gè)保持寄存器功能碼,HEX 值為 30 33

‘0’ ‘4’ :寄存器值字節(jié)數(shù),HEX 值為 30 34

‘0’ ‘0’ ‘0’ ‘1’ :讀取的第一個(gè)寄存器值,HEX 值為 30 30 30 31

‘0’ ‘0’ ‘0’ ‘5’ :讀取的第二個(gè)寄存器值,HEX 值為 30 30 30 35

‘5’ ‘2’ :LRC 校驗(yàn)值,HEX 值為 35 32

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A

異常響應(yīng)報(bào)文格式:[:][從站地址][功能碼][異常碼][LRC 校驗(yàn)][rn]

舉例::018302D2rn

‘:’ :起始符,HEX 值為 3A

‘0’ ‘1’ :從站地址,HEX 值為 30 31

‘8’ ‘3’ :原功能碼為 03,最高位為 1 表示異常響應(yīng),HEX 值為 38 33

‘0’ ‘2’ :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的),HEX 值為 30 36

‘D’ ‘2’ :LRC 校驗(yàn)值,HEX 值為 44 32

‘r’ ‘n’ :結(jié)束符,HEX 值為 0D 0A


5.2.3 傳輸特點(diǎn)

1.ASCII 字符傳輸

所有數(shù)據(jù),包括地址、命令和校驗(yàn)值,都以可打印的 ASCII 字符(0-9, A-F)形式在網(wǎng)絡(luò)上傳輸。

這使得任何能夠顯示 ASCII 碼的終端軟件或簡(jiǎn)單的調(diào)試工具都可以直接監(jiān)控、解析和調(diào)試通信過(guò)程,數(shù)據(jù)一目了然。

2.效率低但可讀性強(qiáng)

效率低:這是 ASCII 模式最大的缺點(diǎn)。因?yàn)槊總€(gè)信息字節(jié)都需要用兩個(gè) ASCII 字符來(lái)傳輸,有效數(shù)據(jù)的吞吐量?jī)H為 RTU 模式的一半。例如,傳輸一個(gè)二進(jìn)制值0xFE,RTU 只需傳 1 個(gè)字節(jié)(0xFE),而 ASCII 需要傳'F''E'這 2 個(gè)字節(jié)(0x46,0x45)。

可讀性強(qiáng):這是其最大優(yōu)點(diǎn)。人類可以直接讀懂線上的數(shù)據(jù)。一個(gè)典型的 ASCII 幀看起來(lái)像::1103006B0003E9,很容易識(shí)別出地址、功能碼和數(shù)據(jù)。

5.2.4 參數(shù)配置

在一個(gè) Modbus ASCII 模式中,所有設(shè)備的串行通信參數(shù)必須完全一致,否則無(wú)法通信。主要參數(shù)配置包括:

注:以下為官方文檔描述,在實(shí)際使用時(shí)需要查閱設(shè)備手冊(cè),與設(shè)備手冊(cè)中規(guī)定的參數(shù)一致。

1.波特率 (Baud Rate)- 定義通信速度(比特每秒)。常見值有:9600、19200、38400 等。9600 是最常用的默認(rèn)值。

2.數(shù)據(jù)位 (Data Bits)- 固定為 7 位,最低有效位最先發(fā)送。這是 Modbus ASCII 標(biāo)準(zhǔn)的規(guī)定。

3.停止位 (Stop Bits)- 可以是 1 位 或 2 位。該設(shè)置與校驗(yàn)位的選擇直接相關(guān)。

4.校驗(yàn)位 (Parity)

無(wú) (None):無(wú)奇偶校驗(yàn)。此時(shí)停止位必須設(shè)置為 2 位。

奇 (Odd):奇校驗(yàn)。

偶 (Even):偶校驗(yàn)。這是 Modbus 協(xié)議規(guī)定的默認(rèn)和首選模式。當(dāng)使用奇校驗(yàn)或偶校驗(yàn)時(shí),停止位設(shè)置為 1 位。

5.3 Modbus TCP(Transmission Control Protocol)

Modbus TCP 是 Modbus 協(xié)議家族中為適應(yīng)現(xiàn)代工業(yè)以太網(wǎng)環(huán)境而發(fā)展的變種。它將傳統(tǒng)的 Modbus 應(yīng)用層協(xié)議封裝在標(biāo)準(zhǔn)的 TCP/IP 協(xié)議棧中,使其能夠通過(guò)以太網(wǎng)進(jìn)行通信,從而實(shí)現(xiàn)了高速、遠(yuǎn)距離、多設(shè)備的網(wǎng)絡(luò)化集成。

5.3.1 物理層與網(wǎng)絡(luò)基礎(chǔ)

Modbus TCP 運(yùn)行在完整的 TCP/IP 協(xié)議棧之上,其物理層依賴于標(biāo)準(zhǔn)的以太網(wǎng)技術(shù)。

物理介質(zhì):

雙絞線(如 CAT5e、CAT6):最常見的選擇,通信距離約 100 米。

光纖:用于長(zhǎng)距離通信(可達(dá)數(shù)公里)和高電磁干擾環(huán)境。

無(wú)線:通過(guò) Wi-Fi 等無(wú)線以太網(wǎng)技術(shù)實(shí)現(xiàn)靈活部署。

網(wǎng)絡(luò)拓?fù)洌?/strong>

支持星型、環(huán)型(需配合交換機(jī)協(xié)議)等復(fù)雜拓?fù)洹?/p>

通過(guò)交換機(jī)和路由器可以輕松組建大規(guī)模、分層級(jí)的網(wǎng)絡(luò)。

協(xié)議棧關(guān)系:

應(yīng)用層:Modbus 協(xié)議

傳輸層:TCP(提供可靠連接)

網(wǎng)絡(luò)層:IP(處理尋址和路由)

數(shù)據(jù)鏈路層/物理層:以太網(wǎng)(如 IEEE 802.3 標(biāo)準(zhǔn))

5.3.2 幀格式

Modbus TCP 協(xié)議報(bào)文在標(biāo)準(zhǔn)的 Modbus 協(xié)議數(shù)據(jù)單元(PDU)前添加了 MBAP 頭,形成完整的應(yīng)用數(shù)據(jù)單元(ADU)。其幀結(jié)構(gòu)如下:

wKgZPGmBwiWAO5h_AAAYH4ESZ6A084.png

1.MBAP 頭 (MBAP Header - Modbus Application Protocol Header)

共 7 字節(jié),專門為 TCP/IP 傳輸設(shè)計(jì),包含路由和管理信息。

事務(wù)標(biāo)識(shí)符 (Transaction Identifier)

該字段占 2 個(gè)字節(jié)。由客戶端(主站)生成,用于將請(qǐng)求與響應(yīng)配對(duì)。服務(wù)器(從站)在回應(yīng)中必須復(fù)制相同的事務(wù)標(biāo)識(shí)符。這在異步通信中尤為重要,可以區(qū)分多個(gè)并發(fā)請(qǐng)求的響應(yīng)。

協(xié)議標(biāo)識(shí)符 (Protocol Identifier)

該字段占 2 個(gè)字節(jié)。對(duì)于 Modbus TCP,此值固定為0x0000。其他值保留用于未來(lái)擴(kuò)展。

長(zhǎng)度 (Length)

該字段占 2 個(gè)字節(jié)。表示其后所有字節(jié)的數(shù)量,包括單元標(biāo)識(shí)符(1 個(gè)字節(jié))、功能碼(1 個(gè)字節(jié)) 和數(shù)據(jù)域(0 ~ 252 個(gè)字節(jié))。

計(jì)算公式:長(zhǎng)度 = 1 (單元標(biāo)識(shí)符) + 1 (功能碼) + N (數(shù)據(jù)長(zhǎng)度)

單元標(biāo)識(shí)符 (Unit Identifier)

該字段占 1 個(gè)字節(jié)。用于標(biāo)識(shí)連接在網(wǎng)關(guān)后面的子設(shè)備。在簡(jiǎn)單的單設(shè)備網(wǎng)絡(luò)中,此字段常被用作從站地址,功能與 Modbus RTU/ASCII 中的從站地址相同。如果不需要網(wǎng)關(guān)路由,通常設(shè)置為0x00或0xFF,或者直接使用從站地址(如0x01)。


2.功能碼 (Function Code)- 該字段占 1 個(gè)字節(jié)。與 Modbus RTU/ASCII 中的功能碼完全一致。例如:01(讀線圈)、03(讀保持寄存器)、05(寫單個(gè)線圈)、06(寫單個(gè)寄存器)等。

3.數(shù)據(jù) (Data)- 該字段占 0 ~ 252 個(gè)字節(jié)。含義和內(nèi)容與 Modbus RTU 完全相同,由功能碼決定。包含請(qǐng)求或響應(yīng)的具體參數(shù)或數(shù)值。

示例:

向單個(gè)保持寄存器寫入數(shù)據(jù):

請(qǐng)求報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][寄存器起始地址 寄存器值]

舉例:00 01 00 00 00 06 01 06 00 00 00 01

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 06 :后續(xù)字節(jié)數(shù)

01 :從站地址

06 :向單個(gè)保持寄存器寫入數(shù)據(jù)功能碼

00 00 :寄存器起始地址

00 01 :寫入的單個(gè)寄存器數(shù)據(jù)

響應(yīng)報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][寄存器起始地址 寄存器值]

舉例:00 01 00 00 00 06 01 06 00 00 00 01

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 06 :后續(xù)字節(jié)數(shù)

01 :從站地址

06 :向單個(gè)保持寄存器寫入數(shù)據(jù)功能碼

00 00 :寄存器起始地址

00 01 :寫入的單個(gè)寄存器數(shù)據(jù)

異常響應(yīng)報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][異常碼]

舉例:00 01 00 00 00 03 01 86 02

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 03 :后續(xù)字節(jié)數(shù)

01 :從站地址

86 :原功能碼為 06,最高位為 1 表示異常響應(yīng)

02 :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的)

向多個(gè)保持寄存器寫入數(shù)據(jù):

請(qǐng)求報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][寄存器起始地址 寄存器數(shù)量 寄存器值字節(jié)數(shù) 寄存器值]

舉例:00 01 00 00 00 0B 01 10 00 00 00 02 04 00 01 00 05

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 0B :后續(xù)字節(jié)數(shù)

01 :從站地址

10 :寫多個(gè)寄存器功能碼

00 00 :寄存器起始地址

00 02 :要寫入的寄存器數(shù)量

04 :寄存器值的字節(jié)數(shù)

00 01 :寫入的第一個(gè)寄存器值

00 05 :寫入的第二個(gè)寄存器值

響應(yīng)報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][寄存器起始地址 寄存器數(shù)量]

舉例:00 01 00 00 00 06 01 10 00 00 00 02

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 06 :后續(xù)字節(jié)數(shù)

01 :從站地址

10 :寫多個(gè)寄存器功能碼

00 00 :寄存器起始地址

00 02 :要寫入的寄存器數(shù)量

異常響應(yīng)報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][異常碼]

舉例:00 01 00 00 00 03 01 90 02

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 03 :后續(xù)字節(jié)數(shù)

01 :從站地址

90 :原功能碼為 10,最高位為 1 表示異常響應(yīng)

02 :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的)

讀取保持寄存器數(shù)據(jù):

請(qǐng)求報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][寄存器起始地址 寄存器數(shù)量]

舉例:00 01 00 00 00 06 01 03 00 00 00 02

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 06 :后續(xù)字節(jié)數(shù)

01 :從站地址

03 :讀單/多個(gè)保持寄存器功能碼

00 00 :寄存器起始地址

00 02 :要讀取的寄存器數(shù)量

響應(yīng)報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][寄存器值字節(jié)數(shù) 寄存器值]

舉例:00 01 00 00 00 07 01 03 04 00 01 00 05

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 07 :后續(xù)字節(jié)數(shù)

01 :從站地址

03 :讀單/多個(gè)保持寄存器功能碼

00 01 :讀取的第一個(gè)寄存器值

00 05 :讀取的第二個(gè)寄存器值

異常響應(yīng)報(bào)文格式:[事務(wù)標(biāo)識(shí)符 協(xié)議標(biāo)識(shí)符 后續(xù)字節(jié)數(shù) 從站地址][功能碼][異常碼]

舉例:00 01 00 00 00 03 01 83 02

00 01 :事務(wù)標(biāo)識(shí)符

00 00 :協(xié)議標(biāo)識(shí)符(modbus 固定為 00 00)

00 03 :后續(xù)字節(jié)數(shù)

01 :從站地址

83 :原功能碼為 03,最高位為 1 表示異常響應(yīng)

02 :非法數(shù)據(jù)地址(請(qǐng)求中指定的數(shù)據(jù)地址是從站設(shè)備不允許的或不存在的)


5.3.3 傳輸特點(diǎn)

1.基于以太網(wǎng)/TCP/IP

Modbus TCP 運(yùn)行在標(biāo)準(zhǔn)的以太網(wǎng)物理層和數(shù)據(jù)鏈路層之上,使用 TCP(傳輸控制協(xié)議)作為傳輸層協(xié)議。

這使得它可以利用現(xiàn)有的企業(yè)局域網(wǎng)(LAN)和互聯(lián)網(wǎng)基礎(chǔ)設(shè)施進(jìn)行通信,傳輸距離遠(yuǎn),布線方便。

2.端口 502

雖然標(biāo)準(zhǔn)規(guī)定使用 502 端口,但許多設(shè)備允許用戶自定義其他端口號(hào)以適應(yīng)特定的網(wǎng)絡(luò)安全策略(如防火墻規(guī)則)。然而,502 端口是 Modbus TCP 的默認(rèn)和標(biāo)準(zhǔn)端口,在未明確指定的情況下應(yīng)使用此端口。

3.無(wú)校驗(yàn)(依賴 TCP)

取消了 CRC 校驗(yàn)。這是因?yàn)?TCP 協(xié)議本身已經(jīng)提供了連接導(dǎo)向、數(shù)據(jù)包排序、重傳機(jī)制和錯(cuò)誤校驗(yàn),確保了數(shù)據(jù)的可靠、有序和無(wú)誤傳輸。在可靠的 TCP 連接上增加 CRC 校驗(yàn)是冗余的。

因此,Modbus TCP 幀結(jié)構(gòu)比 RTU 幀更簡(jiǎn)潔,效率更高。

4.客戶端/服務(wù)器模型

Modbus TCP 將傳統(tǒng)的主站(Master)改稱為客戶端(Client),從站(Slave)改稱為服務(wù)器(Server)。

客戶端主動(dòng)向服務(wù)器發(fā)起 TCP 連接并發(fā)送請(qǐng)求,服務(wù)器被動(dòng)監(jiān)聽并響應(yīng)請(qǐng)求。一個(gè)服務(wù)器可以同時(shí)處理多個(gè)客戶端的連接。

5.3.4 參數(shù)配置

在 Modbus TCP 模式中,通信雙方需要配置正確的網(wǎng)絡(luò)參數(shù)才能建立連接。主要參數(shù)包括:

1.IP 地址 (IP Address)

每個(gè)設(shè)備(客戶端和服務(wù)器)必須在網(wǎng)絡(luò)中擁有唯一的 IP 地址。

2.子網(wǎng)掩碼 (Subnet Mask)

用于判斷設(shè)備是否位于同一局域網(wǎng)內(nèi)。

3.網(wǎng)關(guān) (Gateway)

當(dāng)需要與不同網(wǎng)段的設(shè)備通信時(shí),需要設(shè)置網(wǎng)關(guān)地址。

4.TCP 端口號(hào) (TCP Port)

服務(wù)器監(jiān)聽的端口號(hào),默認(rèn)為 502??蛻舳诵枰蚍?wù)器的 IP 地址和此端口發(fā)起連接。

5.連接超時(shí) (Connection Timeout)

客戶端等待服務(wù)器建立連接或響應(yīng)的最長(zhǎng)時(shí)間。

5.4 擴(kuò)展協(xié)議模式

除了最常見的 Modbus RTU、Modbus ASCII 和 Modbus TCP 之外,還存在其他一些協(xié)議形式或變種。 它們主要是為了適應(yīng)不同的物理介質(zhì)或滿足特定的行業(yè)需求。

wKgZO2mBwzGAczOCAAEdc4wQtbA051.png

六、LuatOS 上的 exmodbus 擴(kuò)展庫(kù)

6.1 常量詳解

6.1.1 通信模式常量

6.1.1.1 exmodbus.RTU_MASTER

wKgZO2mBw-yAYVQhAAGVyevoRkg310.png


6.1.1.2 exmodbus.RTU_SLAVE

wKgZPGmBxAeAMV_VAAGXX9qzvjc360.png


6.1.1.3 exmodbus.ASCII_MASTER

wKgZPGmBxB-AB7njAAGerC8eThg670.png


6.1.1.4 exmodbus.ASCII_SLAVE

wKgZO2mBxDWAS0tdAAGcihzU8Rw698.png


6.1.1.5 exmodbus.TCP_MASTER

wKgZPGmBxEuAdzhfAAER4Uzw4a4082.png


6.1.1.6 exmodbus.TCP_SLAVE

wKgZO2mBxGuADX0gAAEYqE6MUBI099.png


6.1.2 數(shù)據(jù)類型常量

6.1.2.1 exmodbus.COIL_STATUS

wKgZO2mBxIqAQ6AyAAFzhI-arg4771.png

6.1.2.2 exmodbus.INPUT_STATUS

wKgZPGmBxaOAQBGlAAF8IvS73oU309.png

6.1.2.3 exmodbus.INPUT_REGISTER

wKgZO2mBxdSANBy7AAF59Kokxv0619.png


6.1.2.4 exmodbus.HOLDING_REGISTER

wKgZPGmBxfOAHcG4AAF7UTzmOUk414.png


6.1.3 操作類型常量

6.1.3.1 exmodbus.READ_COILS

wKgZO2mBxg6ASh0NAAFbovYMSao300.png


6.1.3.2 exmodbus.READ_DISCRETE_INPUTS

wKgZPGmBxiqAQuplAAFmRQQ4aoM740.png


6.1.3.3 exmodbus.READ_HOLDING_REGISTERS

wKgZO2mBxkOAc5a4AAFinliTO6A732.png


6.1.3.4 exmodbus.READ_INPUT_REGISTERS

wKgZPGmBxlyAEF3CAAFgelRQFRA910.png


6.1.3.5 exmodbus.WRITE_SINGLE_COIL

wKgZO2mBxnKAeMHyAAFhzeSgPho744.png


6.1.3.6 exmodbus.WRITE_SINGLE_HOLDING_REGISTER

wKgZO2mBxpuAUd3DAAFs0_Qp1B4232.png


6.1.3.7 exmodbus.WRITE_MULTIPLE_HOLDING_REGISTERS

wKgZPGmBxrSAcKvAAAF0eaD1CDU088.png


6.1.3.8 exmodbus.WRITE_MULTIPLE_COILS

wKgZPGmBxv2ARnuSAAFkDPInUsA715.png


6.1.4 異常碼常量

6.1.4.1 exmodbus.ILLEGAL_FUNCTION

wKgZPGmByAmADqDQAAJcb60zlw8676.png

6.1.4.2 exmodbus.ILLEGAL_DATA_ADDRESS

wKgZPGmByOKAdAESAAJ1lhc-dlU465.png


6.1.4.3 exmodbus.ILLEGAL_DATA_VALUE

wKgZO2mByP-Aaef3AAJecAILKFg244.png


6.1.4.4 exmodbus.SLAVE_DEVICE_FAILURE

wKgZPGmByReAFH71AAJwMRhobWk647.png


6.1.4.5 exmodbus.ACKNOWLEDGE

wKgZO2mBySyAcIN3AAJmcWsAwus813.png


6.1.4.6 exmodbus.SLAVE_DEVICE_BUSY

wKgZPGmByW2AWVHUAAJhfw64Lik490.png


6.1.4.7 exmodbus.NEGATIVE_ACKNOWLEDGE

wKgZO2mByYaAQVLlAAJiL3UCKGM928.png


6.1.4.8 exmodbus.MEMORY_PARITY_ERROR

wKgZO2mByaCAJewMAAJgEkNzzGo032.png


6.1.4.9 exmodbus.GATEWAY_PATH_UNAVAILABLE

wKgZO2mBybmAGFyZAAJec2yb0DM462.png


6.1.4.10 exmodbus.GATEWAY_TARGET_NO_RESPONSE

wKgZO2mByeWAMokVAAJqHaB-XNs380.png

6.1.5 響應(yīng)結(jié)果常量

6.1.5.1 exmodbus.STATUS_SUCCESS

wKgZPGmBygGAZLeqAAHoCxCEXVs868.png

6.1.5.2 exmodbus.STATUS_DATA_INVALID

wKgZPGmByo-ACdLfAAH8UzCPpjY637.png


6.1.5.3 exmodbus.STATUS_EXCEPTION

wKgZO2mByraAVIXeAAHtHNGwaO8040.png


6.1.5.4 exmodbus.STATUS_TIMEOUT

wKgZPGmBysyAO2AOAAHensvcUKk147.png


6.2 函數(shù)詳解

6.2.1 exmodbus.create(config)

功能

創(chuàng)建并返回一個(gè)新的 modbus 主/從站實(shí)例;

注意事項(xiàng)

1、創(chuàng)建實(shí)例時(shí)需要將串口或者網(wǎng)絡(luò)參數(shù)填寫完整并且正確;

參數(shù)

由于 rtu/ascii 與 tcp 需要配置不同的 config 配置文件,因此下方將會(huì)分別進(jìn)行介紹:

config(創(chuàng)建 RTU/ASCII 實(shí)例時(shí))

wKgZO2mByuiAIK_WAAmwDGJdHCM005.png

config(創(chuàng)建 TCP 實(shí)例時(shí))

wKgZPGmByzOATt8JAA4H18OZKuI280.png

返回值

local mb = exmodbus.create(config)

mb

wKgZO2mBy1-AHy-PAAHStNiryaQ129.png

示例

wKgZPGmBy6KAP0s9AAGWlclyFqU788.png


6.2.2 modbus:read(config)

功能

主站向從站發(fā)送讀取操作請(qǐng)求(阻塞接口);

支持通過(guò)“字段參數(shù)方式”或“原始幀方式”傳入 config 配置參數(shù),傳入格式詳見下方 config 參數(shù)示例;

如果你需要發(fā)送的請(qǐng)求報(bào)文是符合 modbus 標(biāo)準(zhǔn)格式,可以使用“字段參數(shù)方式”或者“原始幀方式”;

如果你需要發(fā)送的請(qǐng)求報(bào)文是非標(biāo)準(zhǔn)格式,必須使用“原始幀方式”,使用“字段參數(shù)方式”會(huì)導(dǎo)致解析的數(shù)據(jù)不正確;

注意事項(xiàng)

1、在調(diào)用此接口之前,需要先確保對(duì)應(yīng)實(shí)例對(duì)象有效;

2、請(qǐng)求范圍需要符合 modbus 標(biāo)準(zhǔn)協(xié)議要求;

參數(shù)

由于該接口支持通過(guò)“字段參數(shù)方式”或“原始幀方式”傳入 config 配置參數(shù),因此下方將會(huì)分別進(jìn)行介紹:

config(字段參數(shù)方式傳入時(shí))

wKgZPGmBy7yACe8HAAVpMlpmMTY024.png

config(原始幀方式傳入時(shí))

wKgZO2mBzFeAOJ1OAAQXxPBiSXI289.png

返回值

local result = modbus:read(config)

result

wKgZPGmBzHeAWN_VAAQ_9O2mQqk446.png

示例

wKgZPGmBzJeAQCfHAAGtT77lOaM214.png


6.2.3 modbus:write(config)

功能

主站向從站發(fā)送寫入操作請(qǐng)求(阻塞接口);

支持通過(guò)“字段參數(shù)方式”或“原始幀方式”傳入 config 配置參數(shù),傳入格式詳見下方 config 參數(shù)示例;

如果你需要發(fā)送的請(qǐng)求報(bào)文是符合 modbus 標(biāo)準(zhǔn)格式,可以使用“字段參數(shù)方式”或者“原始幀方式”;

如果你需要發(fā)送的請(qǐng)求報(bào)文是非標(biāo)準(zhǔn)格式,必須使用“原始幀方式”,使用“字段參數(shù)方式”會(huì)導(dǎo)致解析的數(shù)據(jù)不正確;

注意事項(xiàng)

1、在調(diào)用此接口之前,需要先確保對(duì)應(yīng)實(shí)例對(duì)象有效;

2、請(qǐng)求范圍需要符合 modbus 標(biāo)準(zhǔn)協(xié)議要求;

參數(shù)

由于該接口支持通過(guò)“字段參數(shù)方式”或“原始幀方式”傳入 config 配置參數(shù),因此下方將會(huì)分別進(jìn)行介紹:

config(字段參數(shù)方式傳入時(shí))

wKgZPGmBzLqAKDpQAAgIuB0s0II852.png

config(原始幀方式傳入時(shí))

wKgZO2mBzV2AfJTmAARpkz-6MEU906.png

返回值

local result = modbus:write(config)

result

wKgZO2mBzXmAaNA7AAOnLNvImZA164.png

示例

wKgZPGmBzcWAbG90AAGwA1k4i4s756.png

6.2.4 modbus:destroy()

功能

銷毀已創(chuàng)建的主/從站示例對(duì)象;

注意事項(xiàng)

暫無(wú);

參數(shù)

無(wú);

返回值

無(wú);

示例

wKgZO2mBzd-AQir-AAAiI1xDDag467.png


6.2.5 modbus:on(callback)

功能

此接口僅限設(shè)備做從站時(shí)使用;

當(dāng)收到主站請(qǐng)求數(shù)據(jù)時(shí),通過(guò) callback 通知應(yīng)用腳本處理;

應(yīng)用腳本處理完之后,在 callback 中通知返回值,告知 exmodbus 擴(kuò)展庫(kù)返回給主站;

注意事項(xiàng)

1、在調(diào)用此接口之前,需要先確保對(duì)應(yīng)實(shí)例對(duì)象有效;

參數(shù)

callback

wKgZO2mBzf6AT17dAAR9RXplBdI016.png

返回值

無(wú);

示例

wKgZO2mBzl6AcknVAAk6y8w0yBI914.png

七、LuatOS 上的 Modbus 應(yīng)用開發(fā)流程

本部分將針對(duì)一種通信模式進(jìn)行實(shí)踐:Modbus RTU 通信協(xié)議模式下的 Modbus 應(yīng)用開發(fā)。

7.1 分析項(xiàng)目代碼

7.1.2 Modbus RTU 主站

文件說(shuō)明:

1. main.lua:主程序入口文件。

2. param_field.lua:RTU 主站應(yīng)用模塊(字段參數(shù)方式)。

3. raw_frame.lua:RTU 主站應(yīng)用模塊(原始幀方式)。

4. temp_hum_sensor.lua:485 溫濕度傳感器讀取模塊。

演示功能:

1. 將設(shè)備配置為 modbus RTU 主站模式

2. 與從站 1 和 從站 2 進(jìn)行通信 - 對(duì)從站 1 進(jìn)行 2 秒一次的讀取保持寄存器 0-1 操作 - 對(duì)從站 2 進(jìn)行 4 秒一次的寫入保持寄存器 0-1 操作

3. 讀取溫濕度傳感器數(shù)據(jù) - 配置 modbus RTU 主站,讀取溫濕度傳感器數(shù)據(jù) - 每 2 秒讀取一次傳感器數(shù)據(jù)并解析溫度和濕度值

注意事項(xiàng):

1. 該示例程序需要搭配 exmodbus 擴(kuò)展庫(kù)使用。

2. 在 main.lua 中 require "param_field" 模塊,可以演示標(biāo)準(zhǔn) modbus RTU 請(qǐng)求報(bào)文格式的使用方式。

3. 在 main.lua 中 require "raw_frame" 模塊,可以演示非標(biāo)準(zhǔn) modbus RTU 請(qǐng)求報(bào)文格式的使用方式。

4. 在 main.lua 中 require "temp_hum_sensor" 模塊,可以演示讀取 485 溫濕度傳感器數(shù)值的使用方式。

5. require "param_field"、require "raw_frame" 和 require "temp_hum_sensor",不要同時(shí)打開,否則功能會(huì)有沖突。

特別說(shuō)明:

關(guān)于 RTU 報(bào)文,exmodbus 擴(kuò)展庫(kù)支持通過(guò) 字段參數(shù) 或 原始幀 兩種方式進(jìn)行配置。

這兩種配置方式本質(zhì)都由用戶將其放入 table 中在調(diào)用接口時(shí)傳入,區(qū)別如下:

1. 字段參數(shù)方式

這種方式需要用戶將請(qǐng)求報(bào)文進(jìn)行解析后,將其放入 table 中,例如:

wKgZO2mBzx6AJeg_AAInJwTLgy8882.png

2. 原始幀方式

這種方式只需要用戶將原始請(qǐng)求報(bào)文放入 table 中,例如:

wKgZPGmBz0GAeAe_AAH_5dhxaXA170.png

如果你需要發(fā)送的請(qǐng)求報(bào)文是符合 modbus RTU 標(biāo)準(zhǔn)格式,可以使用 字段參數(shù) 或者 原始幀 方式。

如果你需要發(fā)送的請(qǐng)求報(bào)文是非標(biāo)準(zhǔn)格式,必須使用 原始幀 方式,使用 字段參數(shù) 方式會(huì)導(dǎo)致解析的數(shù)據(jù)不正確。

7.1.3 Modbus RTU 從站

文件說(shuō)明:

1. main.lua:主程序入口文件。

2. rtu_slave_manage.lua:RTU 從站應(yīng)用模塊;

演示功能:

1. 將設(shè)備配置為 modbus RTU 從站模式

2. 等待并且應(yīng)答主站請(qǐng)求

注意事項(xiàng):

1. 該示例程序需要搭配 exmodbus 擴(kuò)展庫(kù)使用

2. 設(shè)備作為 modbus RTU 從站模式時(shí),僅支持接收 modbus RTU 標(biāo)準(zhǔn)格式的請(qǐng)求報(bào)文

3. 進(jìn)行回應(yīng)時(shí)也需要符合 modbus RTU 標(biāo)準(zhǔn)格式

今天的內(nèi)容就分享到這里了~

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6389

    瀏覽量

    140036
  • MODBUS RTU
    +關(guān)注

    關(guān)注

    0

    文章

    140

    瀏覽量

    3689
  • LuatOS
    +關(guān)注

    關(guān)注

    0

    文章

    156

    瀏覽量

    2689
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    從零開始學(xué)電路基礎(chǔ)》(從零開始學(xué)電子技術(shù)叢書)

    從零開始學(xué)電路基礎(chǔ)》(從零開始學(xué)電子技術(shù)叢書)下載地址如下http://www.verycd.com/topics/2798785/[從零開始學(xué)電路基礎(chǔ)].劉建清.掃描版.pdf[
    發(fā)表于 06-05 23:12

    從零開始學(xué)低壓

    從零開始學(xué)低壓電工技術(shù)下載
    發(fā)表于 07-02 21:50

    從零開始學(xué)觸摸屏技術(shù)

    從零開始學(xué)觸摸屏技術(shù)
    發(fā)表于 08-15 20:50

    Modbus TCP轉(zhuǎn)Modbus RTU實(shí)現(xiàn)

    使用ZLSN2040、NETCOM2040實(shí)現(xiàn)Modbus TCP到Modbus RTU的轉(zhuǎn)化。1.Modbus TCP與
    發(fā)表于 08-10 10:04

    基于Modbus RTU的串口調(diào)試軟件的實(shí)現(xiàn)

    摘 要:文中介紹了Modbus RTU通訊協(xié)議的特點(diǎn),闡述了該協(xié)議在VC2005編程環(huán)境下串口調(diào)試軟件的具體實(shí)現(xiàn)方法。并編制了相關(guān)的程序,該程序采用了模塊化思想,結(jié)構(gòu)清晰,操作簡(jiǎn)便,實(shí)現(xiàn)
    發(fā)表于 12-18 19:18

    【下載】《從零開始學(xué)電子測(cè)量技術(shù)

    `編輯推薦  電子測(cè)量是電子技術(shù)工作者必須掌握的一項(xiàng)基本技術(shù),本書是為使初學(xué)者從零開始,快速掌握電子測(cè)量技術(shù)而編寫的。本書以應(yīng)用與實(shí)戰(zhàn)為出發(fā)點(diǎn),首先介紹了電子測(cè)量的基礎(chǔ)知識(shí),然后介紹了
    發(fā)表于 01-04 17:47

    從零開始學(xué)電子》叢書全套網(wǎng)盤分享

    從零開始學(xué)電子叢書】從零開始學(xué)電子元器件識(shí)別與檢測(cè)技術(shù)鏈接:https://pan.baidu.com/s/1hBdNAFXv-WN_vgjQMIICXQ提取碼:tsh1【從零開始學(xué)
    發(fā)表于 06-28 18:45

    力控modbus通信方法modbus-tcp、modbus-rtu***康通信配置步驟

    本文結(jié)合綜科智控品牌的io模塊詳細(xì)講解力控modbus通信方法modbus-tcp、modbus-rtu***康通信配置步驟,見附件下載:
    發(fā)表于 11-18 15:22

    Modbus RTU模式時(shí)沒(méi)有起始位那怎么判通信開始呢?

    Modbus RTU模式時(shí)沒(méi)有起始位那怎么判通信開始呢?
    發(fā)表于 05-05 16:00

    從零開始學(xué)電路基礎(chǔ)

    從零開始學(xué)電路基礎(chǔ) 電路基礎(chǔ)是學(xué)習(xí)電子技術(shù)的起步知識(shí)。本書就是為使初學(xué)者從零開始,快速掌握電路基礎(chǔ)知識(shí)而編寫的。與傳統(tǒng)的電路基礎(chǔ)教材不同的是,本書擯棄了
    發(fā)表于 03-15 16:12 ?0次下載

    電腦組裝從零開始

    電腦組裝從零開始問(wèn)題解答
    發(fā)表于 06-29 17:34 ?148次下載

    從零開始android游戲編程

    從零開始android游戲編程
    發(fā)表于 03-19 11:23 ?3次下載

    PyTorch教程之從零開始的遞歸神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程之從零開始的遞歸神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 09:55 ?2次下載
    PyTorch教程之<b class='flag-5'>從零開始</b>的遞歸神經(jīng)網(wǎng)絡(luò)<b class='flag-5'>實(shí)現(xiàn)</b>

    RS485與MODBUS RTU的區(qū)別 如何選擇合適的通信技術(shù)?

    RS485與MODBUS RTU的區(qū)別 如何選擇合適的通信技術(shù)? RS485是一種通信總線標(biāo)準(zhǔn),而MOD
    的頭像 發(fā)表于 02-01 10:27 ?1.4w次閱讀

    LuatOSModbus RTU通信開發(fā)指南

    ?在實(shí)際工業(yè)控制場(chǎng)景中,Modbus RTU常以主從結(jié)構(gòu)實(shí)現(xiàn)多設(shè)備協(xié)同工作。LuatOS不僅支持標(biāo)準(zhǔn)串口通信,更提供了靈活的任務(wù)調(diào)度與內(nèi)存管
    的頭像 發(fā)表于 02-03 19:34 ?537次閱讀
    <b class='flag-5'>LuatOS</b>中<b class='flag-5'>Modbus</b> <b class='flag-5'>RTU</b><b class='flag-5'>通信</b>開發(fā)指南