Modbus RTU 協議介紹

Modbus RTU 協議介紹

異步串行傳輸方式,采用二進制格式,適用于串行通訊(如RS-485),效率高,是工業現場的主流選擇。

主站是Master,從站是Slave。

Modbus RTU 協議格式

幀結構

  • 地址碼(1字節):從設備的地址,取值1-247。
  • 功能碼(1字節):指定操作類型,如讀取或寫入。
  • 數據區(長度可變):包含具體的操作數據。
  • CRC校驗(2字節):循環冗余校驗碼,確保數據無誤。

功能碼

功能碼功能用途
01讀線圈狀態獲取開關量輸出狀態
03讀保持寄存器獲取16位可讀寫數據
04讀輸入寄存器獲取16位只讀數據
05寫單個線圈控制單個開關量輸出
06寫單個寄存器修改單個16位數據
16(0x10 十六進制)寫多個寄存器修改多個16位數據

CRC 校驗

CRC(循環冗余校驗)是Modbus RTU的關鍵,用于檢測傳輸錯誤。發送方計算CRC并附加在幀尾,接收方重新計算并比對。

CRC16校驗算法示例:

const unsigned short wCRCTalbeAbs[] =
{0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400,
};unsigned short mt_api_crc16(unsigned char *ptr, unsigned int len) 
{unsigned short wCRC = 0xFFFF;unsigned short i;unsigned char chChar;unsigned char temp[2];for (i = 0; i < len; i++){chChar = *ptr++;wCRC = wCRCTalbeAbs[(chChar ^ wCRC) & 15] ^ (wCRC >> 4);wCRC = wCRCTalbeAbs[((chChar >> 4) ^ wCRC) & 15] ^ (wCRC >> 4);}temp[0] = wCRC&0xFF; temp[1] = (wCRC>>8)&0xFF;wCRC = (temp[0]<<8)|temp[1];return wCRC;
}

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

請求數據

01 01 00 00 00 08 9C 03
  • 01:從設備地址(1-247)
  • 01:功能碼(讀線圈狀態)
  • 00 00:起始線圈地址(2 字節)
  • 00 08:線圈個數(讀取 8 個線圈)
  • 9C 03:CRC校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 起始線圈地址(高位) + 起始線圈地址(低位) + 線圈數量(高位) + 線圈數量(低位) + CRC(高位) + CRC(低位),一共 8 個字節。

響應數據

01 01 01 55 78 3A
  • 01:從設備地址(1-247)
  • 01:功能碼(讀線圈狀態)
  • 01:線圈狀態數據的總字節數(<font style="color:rgb(0, 0, 0);">ceil(線圈數量/8)</font>,8 個線圈 = 1 字節)
  • 55:線圈狀態數據(1 個字節)
  • 78 3A:CRC 校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 數據長度 + [線圈狀態數據(N 字節)] + CRC(高位) + CRC(低位)

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

請求數據

01 03 00 00 00 01 C4 0B
  • 01:從設備地址(1-247)
  • 03:功能碼(讀保持寄存器)
  • 00 00:起始寄存器地址(2 字節)
  • 00 01:寄存器個數(讀取 1 個寄存器)
  • C4 0B:CRC校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 起始寄存器地址(高位) + 起始寄存器地址(低位) + 寄存器數量(高位) + 寄存器數量(低位) + CRC(高位) + CRC(低位),一共 8 個字節。

響應數據

01 03 02 19 98 B2 7E
  • 01:從設備地址(1-247)
  • 03:功能碼(讀保持寄存器)
  • 02:后面數據的字節數,一個寄存器有 2 個字節,所以后面的字節數等于 2*查詢的寄存器數量
  • 19 98:寄存器的值是 19 98
  • B2 7E:CRC 校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 數據長度 + 寄存器數據 + CRC 校驗碼

字節數:1+1+1+2*N+2

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

請求數據

01 04 00 01 00 03 60 0A 
  • 01:從設備地址(1-247)
  • 04:功能碼(寫輸入寄存器)
  • 00 01:起始寄存器地址(2 字節)
  • 00 03:輸入寄存器數量
  • 60 0A:CRC 校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 起始寄存器地址(高位) + 起始寄存器地址(低位) +寄存器數量(高位) + 寄存器數量(低位) + CRC 校驗(高位) + CRC 校驗(高位),一共 8 個字節。

響應數據

01 04 06 00 0A 01 F4 03 E8 75 3B
  • 01:從設備地址(1-247)
  • 04:功能碼(寫輸入寄存器)
  • 06:輸入寄存器數據的總字節數(寄存器數量 ×2,3×2=6 字節)
  • 00 0A:第一個輸入寄存器值
  • 01 F4:第二個輸入寄存器值
  • 03 E8:第三個輸入寄存器值
  • 75 3B:CRC 校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 數據長度 + [N 組寄存器數據(每組 2 字節)] + CRC 校驗(高位) + CRC 校驗(高位)

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

請求數據

01 05 00 03 FF 00 8C 3A
  • 01:從設備地址(1-247)
  • 05:功能碼(寫單個線圈)
  • 00 03:目標線圈地址
  • FF 00:線圈狀態值
  • 8C 3A:CRC 校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 目標線圈地址(高位) + 目標線圈地址(低位) + 線圈狀態值(高位) + 線圈狀態值(低位) + CRC 校驗(高位) + CRC 校驗(高位),一共 8 個字節。

響應數據

01 05 00 03 FF 00 8C 3A
  • 01:從設備地址(1-247)
  • 05:功能碼(寫單個線圈)
  • 00 03:目標線圈地址
  • FF 00:線圈狀態值
  • 8C 3A:CRC 校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 目標線圈地址(高位) + 目標線圈地址(低位) + 線圈狀態值(高位) + 線圈狀態值(低位) + CRC 校驗(高位) + CRC 校驗(高位),一共 8 個字節。

0x06 功能碼( 寫單個保持寄存器)

請求數據

01 06 00 00 00 01 48 0A
  • 01:從設備地址(1-247)
  • 06:功能碼(寫保持寄存器)
  • 00 00:起始寄存器地址(2 字節)
  • 00 01:寫入的值
  • 48 0A:CRC校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 起始寄存器地址(高位) + 起始寄存器地址(低位) + 寫入值(高位) + 寫入值(低位) + CRC(高位) + CRC(低位),一共 8 個字節。

響應數據

01 06 00 00 00 01 48 0A
  • 01:從設備地址(1-247)
  • 06:功能碼(寫保持寄存器)
  • 00 00:起始寄存器地址(2 字節)
  • 00 01:寫入的值
  • 48 0A:CRC校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 起始寄存器地址(高位) + 起始寄存器地址(低位) + 寫入值(高位) + 寫入值(低位) + CRC(高位) + CRC(低位),一共 8 個字節。

0x010 功能碼( 寫多個保持寄存器)

請求數據

01 10 00 02 00 03 06 00 0A 01 02 03 04 75 F5
  • 01:從設備地址(1-247)
  • 10:功能碼(寫保持寄存器)
  • 00 02:起始寄存器地址(2 字節)
  • 00 03:寄存器數量
  • 06:后續數據的總字節數(寄存器數量 x 2)
  • 00 0A:寫入數據 1(2 字節)
  • 01 02:寫入數據 3(2 字節)
  • 03 04:寫入數據 3(2 字節)
  • 75 F5:CRC 校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 起始寄存器地址(高位)+ 起始寄存器地址(低位) + 寄存器數量(高位) + 寄存器數量(低位) + 數據總字節數 + [N 組寫入值(每組 2 字節)] + CRC 高位 + CRC 低位

響應數據

01 10 00 02 00 03 A7 3C
  • 01:從設備地址(1-247)
  • 10:功能碼(寫保持寄存器)
  • 00 02:起始寄存器地址(2 字節)
  • 00 03:寄存器數量
  • A7 3C:CRC 校驗

更詳細的格式如下:

從設備地址 + 功能碼 + 起始寄存器地址(高位)+ 起始寄存器地址(低位) + 寄存器數量(高位) + 寄存器數量(低位) + CRC 高位 + CRC 低位。

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

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

相關文章

TCP/IP函數——sendmsg

sendmsg() 是 POSIX 標準中一個高級套接字發送函數,屬于系統調用(由操作系統內核實現),定義在 <sys/socket.h> 頭文件中。它的核心特點是支持復雜消息結構,不僅能發送常規數據,還能附加控制信息(如輔助數據、IP 選項等),適用于 TCP、UDP 等多種協議,功能比 sen…

運動控制中的插值運動(插補運動):原理、實現與應用

在自動化設備中,從起點到終點的精準軌跡控制是核心需求。當目標軌跡是直線、圓弧或復雜曲線時,僅通過離散的目標點無法實現平滑運動,這就需要插值運動(Interpolation Motion)技術 —— 通過控制算法在已知路徑點之間計算出連續的中間點,使運動部件沿預定軌跡平滑移動。本…

GMT——用于人形全身控制的通用運動跟蹤:兩階段師生訓練框架下,全身基于單一策略,且自適應采樣、MoE架構

前言 如此文《KungfuBot——基于物理約束和自適應運動追蹤的人形全身控制PBHC&#xff0c;用于學習打拳或跳舞(即RL下的動作模仿和運控)》的開頭所說 如此&#xff0c;便關注到最新出來的三個工作 第一個是GMT: General Motion Tracking for Humanoid Whole-Body Control第二個…

matlab版本粒子群算法(PSO)在路徑規劃中的應用

基于粒子群優化&#xff08;PSO&#xff09;算法的路徑規劃 MATLAB代碼實現 1. 初始化環境和參數 % 初始化環境參數 mapSize [10, 10]; % 地圖大小 startPoint [1, 1]; % 起點 endPoint [9, 9]; % 終點 obstacles [3, 3; 5, 5; 7, 7]; % 障礙物位置% PSO參數 numParticles …

Go語言面試:傳值與傳引用的區別及選擇指南

在Go語言中&#xff0c;函數參數的傳遞方式有兩種&#xff1a;傳值&#xff08;pass-by-value&#xff09;和傳引用&#xff08;pass-by-reference&#xff09;。理解這兩種方式的區別及其適用場景&#xff0c;是成為Go語言開發高手的必備技能。本文將深入探討Go語言中傳值與傳…

數據無言,網關有聲 耐達訊自動化RS485轉Profinet讓千年液位數據“開口說話”

在能源行業的數字化轉型浪潮中&#xff0c;你是否曾面臨這樣的困境&#xff1a; 現場大量采用RS485接口的液位計&#xff0c;數據孤立如信息孤島&#xff0c;無法接入Profinet高速網絡&#xff1f; 模擬信號傳輸距離受限&#xff0c;抗干擾能力弱&#xff0c;導致液位測量誤差…

出口退稅新政大提速:企業如何抓住政策紅利,提升最高13%純利?

近年來&#xff0c;出口退稅政策的優化與升級&#xff0c;正在成為外貿企業提升資金周轉率和利潤率的關鍵。國家稅務總局發布的 2022年第9號公告&#xff08;簡稱“9號公告”&#xff09;落地執行已兩年&#xff0c;外貿行業普遍感受到退稅速度顯著加快&#xff0c;平均退稅周期…

使用pytorch創建/訓練/推理OCR模型

一、任務描述 從手寫數字圖像中自動識別出對應的數字&#xff08;0-9&#xff09;” 的問題&#xff0c;屬于單標簽圖像分類任務&#xff08;每張圖像僅對應一個類別&#xff0c;即 0-9 中的一個數字&#xff09; 1、任務的核心定義&#xff1a;輸入與輸出 輸入&#xff1a;28…

新啟航開啟深孔測量新紀元:激光頻率梳技術攻克光學遮擋,達 130mm 深度 2μm 精度

摘要&#xff1a;本文聚焦于深孔測量領域&#xff0c;介紹了一種創新的激光頻率梳技術。該技術成功攻克傳統測量中的光學遮擋難題&#xff0c;在深孔測量深度達 130mm 時&#xff0c;可實現 2μm 的高精度測量&#xff0c;為深孔測量開啟了新的發展篇章。關鍵詞&#xff1a;激光…

GEO優化推薦:AI搜索新紀元下的品牌內容權威構建

引言&#xff1a;AI搜索引擎崛起與GEO策略的戰略重心轉移2025年&#xff0c;以ChatGPT、百度文心一言、DeepSeek為代表的AI搜索引擎已深入成為公眾信息獲取的核心渠道。這標志著品牌營銷策略的重心&#xff0c;正從傳統的搜索引擎優化&#xff08;SEO&#xff09;加速向生成式引…

uniapp的上拉加載H5和小程序

小程序配置{"path": "list/course-list","style": {"navigationBarTitleText": "課程列表","enablePullDownRefresh": true,"onReachBottomDistance": 150}}上拉拉觸底鉤子onReachBottom() {var that …

【和春筍一起學C++】(四十)抽象數據類型

抽象數據類型&#xff08;abstract data type, ADT&#xff09;以通用的方式描述數據類型。C中類的概念非常適合于ADT方法。例如&#xff0c;C程序通過堆棧來管理自動變量&#xff0c;堆棧可由對它執行的操作來描述。可創建空堆棧&#xff1b;可將數據項添加到堆頂&#xff08;…

大文件斷點續傳解決方案:基于Vue 2與Spring Boot的完整實現

大文件斷點續傳解決方案:基于Vue 2與Spring Boot的完整實現 在現代Web應用中,大文件上傳是一個常見但具有挑戰性的需求。傳統的文件上傳方式在面對網絡不穩定、大文件傳輸時往往表現不佳。本文將詳細介紹如何實現一個支持斷點續傳的大文件上傳功能,結合Vue 2前端和Spring Bo…

LeNet-5:手寫數字識別經典CNN

配套講解視頻&#xff0c;點擊下方名片獲取20 世紀 90 年代&#xff0c;計算機已經能識別文本&#xff0c;但圖片識別很困難。比如銀行支票的手寫數字識別&#xff0c;傳統方法需要人工設計規則&#xff0c;費時費力且精度不高。 于是&#xff0c;Yann LeCun 及其團隊提出了 Le…

如何在 C# 中將文本轉換為 Word 以及將 Word 轉換為文本

在現代軟件開發中&#xff0c;處理文檔內容是一個非常常見的需求。無論是生成報告、存儲日志&#xff0c;還是處理用戶輸入&#xff0c;開發者都可能需要在純文本與 Word 文檔之間進行轉換。有時需要將文本轉換為 Word&#xff0c;以便生成結構化的 .docx 文件&#xff0c;使內…

Open SWE:重構代碼協作的智能范式——從規劃到PR的全流程自動化革命

在軟件開發的演進史上,工具鏈的每一次革新都深刻重塑著開發者的工作方式。LangChain AI推出的Open SWE,作為首個開源的異步編程代理,正在重新定義代碼協作的邊界——它不再僅僅是代碼生成工具,而是構建了從代碼庫分析、方案規劃、代碼實現到拉取請求創建的端到端自動化工作…

【ARDUINO】通過ESP8266控制電機【待測試】

需求 通過Wi-Fi控制Arduino驅動的3V直流電機。這個方案使用外部6V或9V電源&#xff0c;ESP8266作為Wi-Fi模塊&#xff0c;Arduino作為主控制器&#xff0c;L298N作為電機驅動器。 手機/電腦 (Wi-Fi客戶端) | | (Wi-Fi) | ESP8266 (Wi-Fi模塊, AT指令模式) | | (串口通信) | A…

cuda編程筆記(18)-- 使用im2col + GEMM 實現卷積

我們之前介紹了cudnn調用api直接實現卷積&#xff0c;本文我們探究手動實現。對于直接使用for循環在cpu上的實現方法&#xff0c;就不過多介紹&#xff0c;只要了解卷積的原理&#xff0c;就很容易實現。im2col 的核心思想im2col image to column把輸入 feature map 的每個卷積…

Loopback for Mac:一鍵打造虛擬音頻矩陣,實現跨應用音頻自由流轉

虛擬音頻設備創建 模擬物理設備&#xff1a;Loopback允許用戶在Mac上創建虛擬音頻設備&#xff0c;這些設備可被系統及其他應用程序識別為真實硬件&#xff0c;實現音頻的虛擬化傳輸。多源聚合&#xff1a;支持將麥克風、應用程序&#xff08;如Skype、Zoom、GarageBand、Logic…

深入解析Django重定向機制

概述 核心是一個基類 HttpResponseRedirectBase&#xff0c;以及兩個具體的子類 HttpResponseRedirect&#xff08;302 臨時重定向&#xff09;和 HttpResponsePermanentRedirect&#xff08;301 永久重定向&#xff09;。它們都是 HttpResponse 的子類&#xff0c;專門用于告訴…