工控室中打開的控制櫃 端子台與 I/O 模組 筆電顯示暫存器資料
TECHNICAL NOTE

Modbus 位址怎麼對:40001、功能碼與 Register 換算

設備手冊寫 40001,封包裡送的卻是 0x0000。弄懂這個換算,大部分「讀不到值」的問題就解決了。

發布
BASICS

40001 是什麼意思

這是 Modicon 留下的寫法:第一碼表示資料區,後面四碼是第幾筆。

4=Holding Register

第一碼只表示資料在哪一區。

0001=第 1 筆

編號從 1 起算;封包裡的位址從 0 起算,所以要減 1。

四種資料區,各自的編號與功能碼

Coil

編號
00001–09999
讀
01
寫
0515

每筆 1 bit
常見:DO、繼電器輸出

Discrete Input

編號
10001–19999
讀
02
寫
不可寫

每筆 1 bit
常見:DI、開關接點狀態

Input Register

編號
30001–39999
讀
04
寫
不可寫

每筆 16 bit
常見:量測值

Holding Register

編號
40001–49999
讀
03
寫
0616

每筆 16 bit
常見:設定值、AO、量測值

CONVERT

輸入編號,看資料怎麼走一趟

範例
Master換算編號
資料區
Holding Register
功能碼
03
位址
0x000C(DEC 12)

40013 − 40001 = 12

讀到的值
0x26F4
(DEC 9972)
示意值
請求Master → Slave
01站號
03功能碼
00 0C位址
00 01數量
44 09CRC
回應Slave → Master
01站號
03功能碼
02位元組數
26 F4數值
A3 A3CRC
Slave 1Holding Register
編號位址值
400110x000A0x213E
400120x000B0x2419
400130x000C0x26F4
400140x000D0x02BF
400150x000E0x059A

點一列即可切換。

讀到的值
0x26F4
(DEC 9972)
示意值
自家產品實作

套用到 RIO 遠端 I/O

每槽 4 個位址;DI 在 Discrete Input 區、DO 在 Coil 區、AI/AO 在 Holding Register 區,三區用同一組位址。

在 RIO 配置器組出你的 I/O →
LLD-Modbus32E-01 裸板正面 模組槽 Module 01–05 與 Module EXT 遠端 I/O 控制器
Module 040x000C–0x000F4 個位址
槽位
模組
通道
ModIO-AICH 01
動作
功能碼
03
位址(DEC 12)
0x000C
編號Holding Register
40013
請求封包(站號 1)
01站號
03功能碼
00 0C位址
00 01數量
44 09CRC

怎麼用:先選型號,在照片或按鈕上點槽位,再選模組、通道與讀寫,就會換算出功能碼、位址、編號與請求封包。

TROUBLESHOOTING

讀不到值時,先看有沒有回應

有回應,但是異常碼

線路是通的,問題在請求內容。異常回應的功能碼會加 0x80,例如 03 失敗回 0x83。

這四種是 Modbus 規範共通的異常碼,任何廠牌都一樣。規範另有 05、06、08、0A、0B,用在特殊情境與網關。
碼意思先檢查
01不支援此功能碼功能碼選錯,或設備不支援這個功能碼
02位址不被接受差 1、減錯起點,或讀取範圍超出位址表
03請求內容不被接受格式或長度不對,例如 03 一次超過 125 筆
04設備無法完成重新上電再試,仍發生請聯絡原廠

完全沒有回應

設備沒收到請求、或收到時同位元/CRC 錯誤,都不會回應。通常是線路或參數問題。

  • Slave 位址一致
  • 鮑率、同位元、停止位元一致
  • RS-485 D+/D− 沒有接反