首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Modbus 協議核心功能碼詳解:線圈、保持暫存器、輸入暫存器的實際意義

     編輯:關於C++

Modbus 是工業自動化最普及的通訊協議。本文釐清四大核心功能碼的實際應用場景,協助開發者正確對應現場訊號類型。

功能碼對照表

功能碼名稱資料類型存取典型應用
0x01 Read Coils 離散輸出 讀取 讀取繼電器、指示燈、電磁閥等**輸出裝置狀態**(ON/OFF)
0x02 Read Discrete Inputs 離散輸入 讀取 讀取按鈕、限位開關、接近開關等**輸入裝置狀態**
0x03 Read Holding Registers 類比/暫存器 讀/寫 讀寫**可保持參數**:設定值、時間、變比、PID 參數、裝置 ID
0x04 Read Input Registers 類比/暫存器 唯讀 讀取**即時測量值**:電壓、電流、溫度、壓力、流量、AD 採樣結果
0x05 Write Single Coil 離散輸出 寫入 控制單一輸出:啟動/停止馬達、開關閥門
0x06 Write Single Register 暫存器 寫入 設定單一參數
0x0F Write Multiple Coils 離散輸出 寫入 批次控制多路輸出
0x10 Write Multiple Registers 暫存器 寫入 批次設定多個參數

關鍵觀念釐清

「線圈」≠ 輸入

原文中「寫線圈:就是說讀開關量輸入的狀態」錯誤。正確定義:

  • Coil (0x/1x):輸出**端**,主控站可讀寫,對應現場執行器(繼電器、電磁閥)。
  • Discrete Input (1x/2x):輸入**端**,唯讀,對應現場感測器(按鈕、限位開關)。

保持暫存器 vs 輸入暫存器

特性Holding Register (4x)Input Register (3x)
來源主控站寫入 / 從站內部參數從站即時測量(ADC、感測器)
屬性可讀寫,斷電保持(非易失性)唯讀,即時更新
應用設定值、配方參數、裝置配置類比量測值、計數器即時值

實際開發對應建議

  1. SCADA/HMI 畫面設計:
    • 狀態指示燈 → Read Coils (0x01) / Read Discrete Inputs (0x02)
    • 數值顯示(電壓/溫度) → Read Input Registers (0x04)
    • 參數設定頁面 → Read/Write Holding Registers (0x03/0x06/0x10)
  2. 從站裝置開發:
    • 將可配置參數映射至 Holding Register 區塊
    • 將感測器即時值映射至 Input Register 區塊
    • 將可控制輸出映射至 Coil 區塊
    • 將唯讀狀態映射至 Discrete Input 區塊
  3. 位元組序處理:Modbus 規定大端序(High Byte first),跨平台傳輸時務必轉換(htons/htonl 或手動位移)。

常見功能碼組合範例

// 讀取 10 個溫度感測器值(Input Registers, 起始位址 0)
// 請求: 01 04 00 00 00 0A CRC
// 回應: 01 04 14 [20 bytes data] CRC

// 設定 PID 參數(Holding Registers, 位址 100 起)
// 請求: 01 10 00 64 00 03 06 [6 bytes data] CRC
// 回應: 01 10 00 64 00 03 CRC
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved