網絡編程(5)Modbus

【1】Modbus

1. 起源

  • Modbus由Modicon公司于1979年開發,是全球第一個真正用于工業現場的總線協議
  • 在中國,Modbus 已經成為國家標準,并有專業的規范文檔,感興趣的可以去查閱相關的文件,詳情如下:標準編號為:GB/T19582-2008文件名稱:《基于 Modbus 協議的工業自動化網絡規范》
  • Modbus通信協議具有多個變種,其中有支持串口,以太網多個版本,其中最著名的是Modbus RTU、Modbus ASCII和Modbus TCP三種,其中Modbus TCP是在施耐德收購Modicon后1997年發布的。

2.?分類

1)Modbus RTU

運行在串口上的協議,采用二進制表現形式以及緊湊的數據結構,通信效率較高,應用比較廣泛

2)Modbus ASCII

運行在串口上的協議,采用ASCII碼進行傳輸,并且每個字節的開始和結束都有特殊字符作為標志,傳輸效率遠遠低于Modbus RTU,一般只有通訊量比較少時才會考慮它。

3)Modbus TCP

是一種基于以太網的協議,使用 TCP/IP 協議棧進行通信。它使用以太網幀作為數據傳輸的封裝,通過 IP 地址和端口號來標識設備

3. 優勢

簡單、免費、容易使用

4. 應用場景

Modbus協議是現在國內工業領域應用最多的協議,不只PLC設備,各種終端設備,比如水控機、水表、電表、工業秤、各種采集設備

問答

在面試中回答“Modbus 協議”相關問題時,可從協議定位、核心架構、傳輸方式、通信流程、實際應用、技術價值等維度組織內容,既體現全面性,又貼合工業/嵌入式場景:

一、協議定位與核心價值

Modbus 是工業自動化領域應用廣泛的開源通信協議,旨在解決工業現場不同設備(PLC、傳感器、執行器、網關等)間的“數據互通與指令協同”問題,讓分散的設備能像“統一系統”一樣工作,是工業物聯網(IIoT)底層設備互聯的核心協議之一。

二、核心架構:主從式通信

采用“一主多從”的主從架構:

  • 主設備(如 PLC、工業網關、上位機)主動發起通信請求;
  • 從設備(如溫濕度傳感器、電機驅動器、閥門控制器)僅響應主設備的請求,不主動發起通信。

這種架構簡化了通信沖突處理,適合工業現場“中心控制+分散設備”的管理模式。

三、主流傳輸版本與差異

Modbus 針對不同“傳輸介質”衍生出 3 類核心版本,適配從“串口總線”到“以太網”的場景:

1. Modbus RTU(串行總線,如 RS - 485/RS - 232)

  • 數據格式:二進制緊湊傳輸,每個字節為 8 位,用 CRC(循環冗余校驗) 保證數據完整性;

詳述循環冗余校驗CRC

一道題帶你搞懂CRC循環冗余校驗是如何糾錯的

  • 傳輸效率:適合長距離、低帶寬的工業現場(如車間產線設備互聯),但通信速率受串口波特率限制(常見 9600bps、19200bps);
  • 典型場景:工廠產線的傳感器(溫濕度、壓力)與 PLC 通信,單主設備可帶最多 247 個從設備。

2. Modbus ASCII(串行總線)

  • 數據格式:ASCII 字符傳輸(每個字節拆為 2 個 ASCII 字符),用 LRC(縱向冗余校驗)
  • 特點:可讀性強(便于串口調試工具抓包分析),但傳輸效率低于 RTU(相同數據,ASCII 長度是 RTU 的 2 倍),多用于對“調試友好性”要求高的場景(如實驗室設備聯調)。

3. Modbus TCP(以太網)

  • 傳輸層:基于 TCP/IP 協議,把 Modbus 應用數據封裝在 TCP 數據包中傳輸;
  • 特點:突破串口“距離與速率”限制,支持跨網絡、高速通信(千兆以太網下可近實時傳輸);
  • 典型場景:工業物聯網云平臺與邊緣網關通信、智能工廠多車間設備的跨區域集中管理。

四、通信流程(以“主設備讀從設備數據”為例)

以 Modbus RTU 為例,核心流程分“請求 - 響應 - 錯誤處理”:

  1. 主設備請求:主設備發送“請求幀”,包含: 從設備地址(指定和哪個從設備通信);
    1. 功能碼(如 0x03 表示“讀保持寄存器”,0x01 表示“讀線圈狀態”);
    2. 數據地址(要讀的寄存器/線圈起始地址);
    3. 數據長度(讀多少個寄存器/線圈);
    4. CRC 校驗(確保幀傳輸無錯)。
  2. 從設備響應:從設備收到請求后,先校驗地址和 CRC: 若匹配且能執行操作,返回“響應幀”:包含從設備地址、功能碼、實際讀取的數據、CRC 校驗;
    1. 若出錯(如地址不存在、功能不支持),返回“異常響應幀”:功能碼最高位設為 1(表示異常),并附帶“異常碼”(說明錯誤原因,如 0x01 表示“不支持的功能碼”)。
  3. 錯誤處理:主設備收到異常響應后,可根據異常碼重試、切換從設備或報警。

五、在工業/嵌入式場景的典型應用

Modbus 是工業設備互聯的“通用語言”,典型應用場景包括:

  • 設備數據采集:PLC 通過 Modbus 讀取車間溫濕度傳感器、壓力變送器的實時數據,為生產決策(如空調啟停、產線速度調整)提供依據;
  • 設備遠程控制:上位機通過 Modbus TCP 向邊緣網關下發指令,網關再通過 Modbus RTU 控制車間電機轉速、閥門開關;
  • 多系統集成:把采用不同通信協議的設備(如老產線的 Modbus 傳感器、新系統的 Profinet 執行器)通過“Modbus 網關”橋接,實現跨協議協同。

六、技術優勢(為什么工業領域廣泛用 Modbus)

  • 開源免費:無授權費用,降低工業企業/嵌入式開發者的使用成本;
  • 易實現:協議格式簡單,嵌入式端(如 STM32、Arduino)可通過串口庫+CRC 校驗庫快速開發從設備/主設備;
  • 兼容性強:幾乎所有工業設備廠商(西門子、施耐德、國產 PLC 等)都支持 Modbus,不同品牌設備能“即連即用”。

【2】Modbus TCP協議

1. 特點

  • 遵循主從問答協議 (主機 從機 主從問答:采集信息 控制)
  • (主機問---從機答247 1-247:從機 0:廣播 248-255:保留 )
  • Modbus TCP協議是應用層協議,基于傳輸層TCP通信
  • Modbus TCP的默認端口號是502

2.?組成

Modbus TCP協議包含三部分:報文頭、功能碼、數據

報文頭有7個字節,功能碼有1個字節,Modbus TCP協議最大數據幀長度為260個字節,數據最多為252個字節。

2.1 報文頭:7個字節

事務處理標識符:包的標識,沒有什么限制,一般主機發什么從機回什么

協議標識符:0x0000 兩個字節

長度:長度后面的字節個數,必須占2個字節

單元標識符:從機地址,從機ID

2.2?寄存器(存儲數據) ******

Modbus TCP通過寄存器的方式存儲數據。

一共有四種類型的寄存器,分別是:離散量輸入寄存器、線圈寄存器、輸入寄存器、保持寄存器。

1) 離散量和線圈其實就是位寄存器(每個寄存器數據占1字節),工業上主要用于控制IO設備。

線圈寄存器,類比為開關量,每一個bit都對應一個信號的開關狀態。所以一個byte就可以同時控制8路的信號。比如控制外部8路io的高低。 線圈寄存器支持讀也支持寫,寫在功能碼里面又分為寫單個線圈寄存器和寫多個線圈寄存器。

對應的功能碼也就是:0x01 0x05 0x0f

離散輸入寄存器,離散輸入寄存器就相當于線圈寄存器的只讀模式,他也是每個bit表示一個開關量,而他的開關量只能讀取輸入的開關信號,是不能夠寫的。比如我讀取外部按鍵的按下還是松開。

所以功能碼也簡單就一個讀的 0x02

2) 輸入和保持寄存器字寄存器每個寄存器數據占2個字節),工業上主要用于存儲工業設備的值。

保持寄存器,這個寄存器的單位不再是bit而是兩個byte,也就是可以存放具體的數據量的,并且是可讀寫的。比如我設置時間年月日,不但可以寫也可以讀出來現在的時間。寫也分為單個寫和多個寫

所以功能碼有對應的三個:0x03 0x06 0x10

輸入寄存器,這個和保持寄存器類似,但是也是只支持讀而不能寫。一個寄存器也是占據兩個byte的空間。類比我通過讀取輸入寄存器獲取現在的AD采集值

對應的功能碼也就一個 0x04

2.3?功能碼(記住)

寄存器PLC地址和寄存器的對應關系:

線圈: 00001-09999

離散量輸入:10001-19999

輸入寄存器:30001-39999

保持寄存器:40001-49999

開燈:05

讀溫度傳感器數據:03 04

具體協議分析:

總結

數據:

主機--》從機:

報文頭(7字節)+功能碼(1)+起始地址(2)+數量(2)

從機--》主機:

報文頭(7)+功能碼(1)+字節計數(1)+數據(?)

寫數據:

寫單個:

主機--》從機:

報文頭(7)+功能碼(1)+地址(2)+斷通標志/數據(2)

(線圈:斷通標志 0x0000:復位 0xff00:置位 保持寄存器:數據)

從機--》主機:

原文返回

對于讀數據和寫單個主機--》從機來說,報文頭中字節長度固定為0x0006,(1個字節的單元標識符+1個字節的功能碼+4個字節的數據)

多個:

主機--》從機:

報文頭(7)功能碼(2)+起始地址(2)+數量(2)+字節計數(1)+數據(?)

從機--》主機:

報文頭(7)功能碼(2)+起始地址(2)+數量(2)(原文返回)

練習

主機--》從機:

12 34 00 00 00 06 01 03 00 63 00 03

從機--》主機:

12 34 00 00 00 09 01 03 06 45 69 11 11 66 66

1.讀傳感器數據,讀1個寄存器數據,寫出主從數據收發協議。

主機--》從機:12 34 00 00 00 06 11 03 00 01 00 01

從機--》主機:12 34 00 00 00 05 11 03 02 12 34

2. 寫出控制IO設備開關的協議數據,操作1個線圈,置1。

主機--》從機:12 34 00 00 00 06 01 05 00 63 ff 00

從機--》主機:12 34 00 00 00 06 01 05 00 63 ff 00

【3】工具使用

1.Modbus Slave、Poll安裝

1)默認安裝

2)破解:點擊connection-》connect,輸入序列號(序列號在SN.txt)

3)使用:

從機:Modbus Slave

先設置:

再連接:點擊connection-》connect

主機:

先設置

再連接:(一定要先開啟從機(salve端),再開啟主機(poll端))

2. 網絡調試助手

linux下編程

在虛擬機寫程序實現poll端功能,編寫客戶端實現和Slave通信,實現03功能碼。

uint8_t data[12]={0x00,0x00,0x00,0x00,0x00,0x06,0x01....};

主機要先建立連接---》發送協議(modbus tcp協議)---》接收數據(modbus tcp協議)--》打印數據

1. 功能碼0x01(讀線圈狀態)

示例1:讀取地址0x0000的兩個線圈

主機->從機:00 01 00 00 00 06 01 01 00 00 00 02 
從機->主機:00 01 00 00 00 04 01 01 01 03 
# 解析:線圈0狀態為1(ON),線圈1狀態為1(ON),其余線圈狀態無效

示例2:讀取地址0x0003的四個線圈

主機->從機:00 02 00 00 00 06 01 01 00 03 00 04 
從機->主機:00 02 00 00 00 04 01 01 01 0F 
# 解析:二進制0F轉換為十進制為15,即00001111,線圈3至6狀態為1(ON)(有效位為1)

2. 功能碼0x02(讀離散輸入)

示例1:讀取地址0x0001的三個離散輸入

主機->從機:00 03 00 00 00 06 01 02 00 01 00 03 
從機->主機:00 03 00 00 00 04 01 02 01 05 
# 解析:二進制05轉換為十進制為5,即00000101,輸入1狀態為1(ON),輸入3狀態為1(ON)

示例2:讀取地址0x0005的兩個離散輸入

主機->從機:00 04 00 00 00 06 01 02 00 05 00 02 
從機->主機:00 04 00 00 00 04 01 02 01 01 
# 解析:二進制01轉換為十進制為1,即00000001,僅輸入5狀態為1(ON)

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

示例1:讀取地址0x0002的兩個保持寄存器

主機->從機:00 05 00 00 00 06 01 03 00 02 00 02 
從機->主機:00 05 00 00 00 07 01 03 04 12 34 56 78 
# 解析:寄存器2的值為0x1234,寄存器3的值為0x5678

示例2:讀取地址0x000A的一個保持寄存器

主機->從機:00 06 00 00 00 06 01 03 00 0A 00 01 
從機->主機:00 06 00 00 00 05 01 03 02 FF FF 
# 解析:寄存器10的值為0xFFFF(典型錯誤狀態碼)

4. 功能碼0x04(讀輸入寄存器)

示例1:讀取地址0x0000的三個輸入寄存器

主機->從機:00 07 00 00 00 06 01 04 00 00 00 03 
從機->主機:00 07 00 00 00 09 01 04 06 00 64 01 F4 FF FF 
# 解析:寄存器0的值為100(0x0064),寄存器1的值為500(0x01F4),寄存器2的值為65535(0xFFFF)

示例2:讀取地址0x0005的兩個輸入寄存器

主機->從機:00 08 00 00 00 06 01 04 00 05 00 02 
從機->主機:00 08 00 00 00 07 01 04 04 80 00 40 00 
# 解析:寄存器5的值為32768(0x8000),寄存器6的值為16384(0x4000)

5. 功能碼0x05(寫單個線圈)

示例1:開啟地址0x0063的線圈

主機->從機:00 09 00 00 00 06 01 05 00 63 FF 00 
從機->主機:00 09 00 00 00 06 01 05 00 63 FF 00 
# 說明:0xFF00表示置ON,成功時返回相同數據

示例2:關閉地址0x001A的線圈

主機->從機:00 0A 00 00 00 06 01 05 00 1A 00 00 
從機->主機:00 0A 00 00 00 06 01 05 00 1A 00 00 
# 說明:0x0000表示置OFF

6. 功能碼0x06(寫單個寄存器)

示例1:寫地址0x0003的寄存器值為0x55AA

主機->從機:00 0B 00 00 00 06 01 06 00 03 55 AA 
從機->主機:00 0B 00 00 00 06 01 06 00 03 55 AA 
# 成功時回顯寫入值

示例2:寫地址0x0010的寄存器值為0x1234

主機->從機:00 0C 00 00 00 06 01 06 00 10 12 34 
從機->主機:00 0C 00 00 00 06 01 06 00 10 12 34 

7. 功能碼0x0F(寫多個線圈)

示例1:寫地址0x0010的3個線圈為ON

主機->從機:00 0D 00 00 00 08 01 0F 00 10 00 03 01 07 
從機->主機:00 0D 00 00 00 06 01 0F 00 10 00 03 
# 解析:二進制07轉換為十進制為7,即00000111,線圈16至18置ON
???????

示例2:寫地址0x0020的5個線圈(二進制10101)

主機->從機:00 0E 00 00 00 08 01 0F 00 20 00 05 01 15 
從機->主機:00 0E 00 00 00 06 01 0F 00 20 00 05 
# 解析:二進制15轉換為十進制為15,即00010101,僅偶數位生效(線圈32、34、36置ON)

8. 功能碼0x10(寫多個寄存器)

示例1:寫地址0x0004的2個寄存器(值0xAABB和0xCCDD)

主機->從機:00 0F 00 00 00 0B 01 10 00 04 00 02 04 AA BB CC DD 
從機->主機:00 0F 00 00 00 06 01 10 00 04 00 02 
# 數據部分以四字節表示兩個寄存器的值

示例2:寫地址0x0010的三個寄存器(十進制值100、200、300)

主機->從機:00 10 00 00 00 0D 01 10 00 10 00 03 06 00 64 00 C8 01 2C 
從機->主機:00 10 00 00 00 06 01 10 00 10 00 03 
# 數值轉換:100轉換為十六進制為0x0064,200轉換為十六進制為0x00C8,300轉換為十六進制為0x012C

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95998.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95998.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95998.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WordPress性能優化全攻略:從插件實戰到系統級優化

一、性能診斷:定位瓶頸是優化第一步 在對 WordPress 進行性能優化前,精準定位性能瓶頸至關重要。這就好比醫生看病,只有先準確診斷,才能對癥下藥。下面將從核心性能指標檢測工具和服務器基礎性能排查兩個方面展開。 1.1 核心性能…

十、網絡與信息安全基礎知識

1 網絡概述 1.1 計算機網絡的概念 1.1.1 計算機網絡的發展 計算機網絡的發展經歷了四個主要階段: 具有通信功能的單機系統: 早期形式:一臺計算機連接多個終端。例子:20 世紀 50 年代的 SAGE 系統。 具有通信功能的多機系統&#x…

校園管理系統|基于SpringBoot和Vue的校園管理系統(源碼+數據庫+文檔)

項目介紹 : SpringbootMavenMybatis PlusVue Element UIMysql 開發的前后端分離的校園管理系統,項目分為管理端和用戶端和院校管理員端 項目演示: 基于SpringBoot和Vue的校園管理系統 運行環境: 最好是java jdk 1.8,我們在這個平臺上運行的。其他版本理…

新后端漏洞(上)- Weblogic SSRF漏洞

漏洞介紹:Weblogic中存在一個SSRF漏洞,利用該漏洞可以發送任意HTTP請求,進而攻擊內網中redis、fastcgi等脆弱組件。編譯及啟動測試環境docker-compose up -d訪問http://127.0.0.1:7001/uddiexplorer/,無需登錄即可查看uddiexplore…

Fiddler 實戰案例解析,開發者如何用抓包工具快速解決問題

在現代軟件開發中,網絡通信問題幾乎是最常見的 Bug 來源。無論是前端調用后端 API、移動端與服務端交互,還是第三方 SDK 請求,都會因為參數錯誤、環境差異、網絡條件不穩定而出現各種難以復現的問題。 在這些場景下,日志往往并不…

【佳易王藥品進銷存軟件實測】:操作簡單 + 全流程管理,醫藥臺賬管理好幫手#軟件教程全解析

前言: (一)試用版獲取方式 資源下載路徑:進入博主頭像主頁第一篇文章末尾,點擊卡片按鈕;或訪問左上角博客主頁,通過右側按鈕獲取詳細資料。 說明:下載文件為壓縮包,使用…

【設計模式】UML 基礎教程總結(軟件設計師考試重點)

【設計模式】UML 基礎教程總結(軟件設計師考試重點) 統一建模語言(Unified Modeling Language,UML),是一種標準化的面向對象建模語言,用于可視化、規范化和文檔化軟件系統設計。 參考資料:UML基礎教程資料(可用于軟件設計師考試)! (關注不迷路哈!!!) 文章目錄 【…

vite_react 插件 find_code 最終版本

vite_react 插件 find_code 最終版本當初在開發一個大型項目的時候,第一次接觸 vite 構建,由于系統功能很龐大,在問題排查上和模塊開發上比較耗時,然后就開始找解決方案,find-code 插件方案就這樣實現出來了&#xff0…

Python+DRVT 從外部調用 Revit:批量創建梁(2)

接著昨天的示例,繼續創建梁,這次展示以橢圓弧、Nurbs為軸線。 創建以橢圓弧為軸線的梁 橢圓弧曲線的創建: # 創建橢圓弧 def CreateEllipse(ctx : MyContext, z: float) -> DB.Curve:"""create a horizontal partial el…

Flutter × 鴻蒙系統:一文搞懂如何將你的 App 移植到 HarmonyOS!

摘要 Flutter 是一個高效的跨平臺框架,開發者可以使用同一套代碼快速部署到 Android、iOS 等主流平臺。隨著華為鴻蒙系統(HarmonyOS)的崛起,越來越多開發者希望能將已有的 Flutter 應用遷移到鴻蒙生態中運行。目前,通過…

QML Charts組件之主題與動畫

目錄前言相關系列ChartView 概述:主題與動畫示例一:主題設置(ChartTheme.qml)圖表與主題設置主題切換部分示例二:動畫設置(ChartAnimation.qml)圖表與動畫屬性部分分類軸與柱狀圖數據部分交互與…

【論文閱讀】Security of Language Models for Code: A Systematic Literature Review

Security of Language Models for Code: A Systematic Literature Review 該論文于2025年被CCF A類期刊TOSEM收錄,作者來自南京大學和南洋理工大學。 概述 代碼語言模型(CodeLMs)已成為代碼相關任務的強大工具,其性能優于傳統方法…

[光學原理與應用-422]:非線性光學 - 計算機中的線性與非線性運算

在計算機科學中,線性運算和非線性運算是兩類核心的數學操作,它們在算法設計、數據處理、機器學習等領域有廣泛應用。兩者的核心區別在于是否滿足疊加原理(即輸入信號的線性組合的輸出是否等于輸出信號的線性組合)。以下是詳細解釋…

Day21_【機器學習—決策樹(3)—剪枝】

決策樹剪枝是一種防止決策樹過擬合的一種正則化方法;提高其泛化能力。決策樹在訓練過程中如果生長過深、過于復雜,會過度擬合訓練數據中的噪聲和異常值,導致在新數據上表現不佳。剪枝通過簡化樹結構,去除不必要的分支,…

從零構建企業級LLMOps平臺:LMForge——支持多模型、可視化編排、知識庫與安全審核的全棧解決方案

🚀 從零構建企業級LLMOps平臺:LMForge——支持多模型、可視化編排、知識庫與安全審核的全棧解決方案 🔗 項目地址:https://github.com/Haohao-end/LMForge-End-to-End-LLMOps-Platform-for-Multi-Model-Agents ? 歡迎 Star &…

如何使顯示器在筆記本蓋上蓋子時還能正常運轉

1、搜索找到控制面板,打開進入 2、找到硬件和聲音,進入 3、選擇電源選項 4、選擇 選擇關閉筆記本計算機蓋的功能 5、把關閉子蓋時,改成不采取任何操作 參考鏈接:筆記本電腦合上蓋子外接顯示器依然能夠顯示設置_筆記本合上外接顯示…

FPGA學習筆記——SDR SDRAM的讀寫(調用IP核版)

目錄 一、任務 二、需求分析 三、Visio圖 四、具體分析 1.需要注意的問題 (1)器件SDRAM需要的時鐘 (2)跨時鐘域(異步FIFO) 2.模塊分析和調用 (1)SDR SDRAM IP核調用 &…

離散數學學習指導與習題解析

《離散數學學習指導與習題解析(第2版)》是屈婉玲、耿素云、張立昂編著的《離散數學(第2版)》的配套參考書,旨在為學生提供系統的學習指導和豐富的習題解析。本書內容全面,涵蓋數理邏輯、集合論、代數結構、…

Qt網絡通信服務端與客戶端學習

Qt網絡通信服務端與客戶端學習 一、項目概述 本項目基于Qt框架實現了TCP服務端與客戶端的基本通信,涵蓋連接、消息收發、斷開管理等功能,適合初學者系統學習Qt網絡模塊的實際用法。 二、項目結構 52/ 服務端:main.cpp、widget.cpp、widget.h5…

神馬 M60S++ 238T礦機參數解析:高效SHA-256算法比拼

1. 算法與適用幣種神馬 M60S 238T采用SHA-256算法,適用于挖掘主流的加密貨幣,包括比特幣(BTC)和比特幣現金(BCH)。SHA-256(安全哈希算法256位)是一種廣泛應用于比特幣等加密貨幣挖礦…