Modbus 支援哪些數據類型?全面解析與實例說明
 在工業自動化和控制系統中,Modbus 通訊協議被廣泛應用於設備之間的數據交換。對於初學者來說,了解 Modbus 支援的數據類型是正確實施通訊的關鍵。本篇文章將從初學者的角度,詳細介紹 Modbus 支援的數據類型,並提供實際範例,幫助您更好地理解和應用。
 什麼是 Modbus 通訊協議?
 在深入探討數據類型之前,我們先簡單介紹一下 Modbus。Modbus 是由 Modicon(現為施耐德電氣)於 1979 年開發的串行通訊協議,具有開放性和簡單性的特點。它支援主從(Master-Slave)架構,廣泛應用於工業控制和自動化領域。
 Modbus 的資料模型
 Modbus 通訊協議定義了四種不同的資料區域,每個區域都有特定的功能和數據類型:
  - 線圈(Coils):單位元的讀寫位,用於控制數位輸出。
- 離散輸入(Discrete Inputs):單位元的只讀位,用於監控數位輸入。
- 輸入暫存器(Input Registers):16 位元(2 位元組)的只讀寄存器,用於類比輸入。
- 保持暫存器(Holding Registers):16 位元的讀寫寄存器,用於類比輸出和一般數據存儲。
Modbus 支援的數據類型
 雖然 Modbus 本身是基於 16 位元寄存器設計的,但通過組合和擴展,可以支援多種數據類型:
 1. 單位元(Boolean)
 單位元數據表示真(1)或假(0),主要用於線圈和離散輸入。
  - 線圈(Coils):可讀寫。
- 離散輸入(Discrete Inputs):只讀。
範例:控制一個開關的開啟或關閉狀態。
 2. 16 位元無符號整數(Unsigned Integer 16-bit)
 範圍為 0 到 65,535,存儲在一個 16 位元的保持暫存器或輸入暫存器中。
 範例:讀取一個 0-10V 的類比輸入信號,轉換為 0-65535 的數值。
 3. 16 位元有符號整數(Signed Integer 16-bit)
 範圍為 -32,768 到 32,767,也存儲在一個 16 位元的寄存器中。
 範例:測量溫度範圍在 -50°C 到 150°C 之間的感測器數據。
 4. 32 位元無符號整數(Unsigned Integer 32-bit)
 範圍為 0 到 4,294,967,295,需要兩個連續的 16 位元寄存器來存儲。
 範例:累計計數器,用於記錄大型數值,如總流量。
 5. 32 位元有符號整數(Signed Integer 32-bit)
 範圍為 -2,147,483,648 到 2,147,483,647,同樣需要兩個連續的 16 位元寄存器。
 範例:電機轉速的正負值表示方向和速度。
 6. 浮點數(Floating Point 32-bit)
 使用 IEEE 754 標準的單精度浮點數,需要兩個連續的 16 位元寄存器。
 範例:精確測量壓力、溫度或其他需要小數點的數據。
 7. 64 位元整數與雙精度浮點數
 需要四個連續的 16 位元寄存器,用於更高精度和更大範圍的數據。
 範例:高精度的能源計量或財務計算。
 8. 字符串(String)
 字符數據可以存儲在一系列的 16 位元寄存器中,每個寄存器存放兩個 ASCII 字符。
 範例:設備名稱、狀態信息或報警描述。
 注意數據對齊和字節序
 在處理多寄存器數據類型時,需要注意數據的對齊和字節序(Endianness)。常見的字節序有:
  - 大端(Big Endian):高位字節在前。
- 小端(Little Endian):低位字節在前。
不同的設備可能採用不同的字節序,務必參考設備手冊,並在程式中進行相應的處理。
 實際範例:讀取浮點數數據
 假設我們有一個溫度感測器,將溫度以浮點數形式存儲在保持暫存器 40001 和 40002 中。
 步驟:
  - 從保持暫存器 40001 讀取第一個 16 位元數據。
- 從保持暫存器 40002 讀取第二個 16 位元數據。
- 根據設備的字節序,將兩個數據組合成一個 32 位元的浮點數。
範例程式碼(Python):
 from pymodbus.client.sync import ModbusSerialClient client = ModbusSerialClient(method='rtu', port='COM3', baudrate=9600, parity='N', stopbits=1, bytesize=8) connection = client.connect() if connection: result = client.read_holding_registers(address=0, count=2, unit=1) if not result.isError(): # 假設設備使用大端格式 decoder = BinaryPayloadDecoder.fromRegisters(result.registers, byteorder=Endian.Big) temperature = decoder.decode_32bit_float() print(f"溫度值: {temperature} °C") else: print("讀取失敗") client.close() else: print("連接失敗") 
 常見問題與解答
 問題一:為什麼需要關注字節序?
 解答:因為不同的設備可能採用不同的字節序,如果不正確處理,可能導致數據錯誤解讀。
 問題二:如何知道設備支援哪些數據類型?
 解答:參考設備的技術手冊或通訊協議說明,了解其支援的數據類型和寄存器映射。
 問題三:如何處理字符串數據?
 解答:將連續的寄存器數據轉換為 ASCII 字符串,需要注意字符編碼和字節順序。
 結論
 Modbus 通訊協議雖然基於簡單的 16 位元寄存器設計,但通過合理的組合和擴展,可以支援多種數據類型。理解並正確處理這些數據類型,對於成功實施 Modbus 通訊至關重要。希望本篇文章能夠幫助初學者深入了解 Modbus 支援的數據類型,為您的工業自動化項目提供有力的支持。
 參考資料