本文說明 DEM510C 電表的 PC 端 RS485 通訊方式,涵蓋 Modbus RTU 封包、電度資料、輸出控制及通訊設定。設備行為以 C29 版功能為整理範圍,尚未以實體電表驗證;不確定的參數與行為列於「待確認事項」。
| 項目 | 參數 | 使用時的解讀 |
|---|---|---|
| 實體介面 | 兩組 RS485,分別供 IC 卡機及 PC 使用 | 本文封包以 PC 端為主 |
| 通訊角色 | DEM510C 為 SLAVE;PC 或 IC 卡機為 HOST | 由主機送出命令,電表回覆 |
| IC 卡機鮑率 | 固定 1200 bps | 不等同於 PC 端設定 |
| PC 鮑率 | 2400 或 9600 bps,預設值待確認 | 需確認實機設定 |
| PC 鮑率設定碼 | 00 至 03 |
各代碼對應的 bps 待確認 |
| 通訊位址 | 00~99 與設定欄位 00~FFH 的可用範圍待確認 |
範圍有差異,不能將全部值視為一般可用站號 |
| 資料位元、同位檢查、停止位元 | 待確認 | 不把 8N1 當成已確認的設備參數 |
連線時先使用已知的 PC 端參數與站號讀取電度;若設定不明,可將 2400、9600 bps 作為確認候選。主機仍須使用與實機相符的同位檢查及停止位元設定。
本文件所有封包均以十六進位位元組表示;例如 10 代表功能碼 0x10,不是十進位 10。H 是十六進位後綴,例如 0AH = 0x0A。封包中的空白只是閱讀分隔,實際傳送的是位元組,不是十六進位字串。
站號 功能碼 資料... CRC_L CRC_H
| 符號 | 意義 |
|---|---|
AA |
電表的 PC 端通訊站號 |
YY |
命令或設定項目的低位址位元組 |
ZZ |
命令值或設定值的高位元組,意義依指令而定 |
GG |
群控位址 |
CRC_L、CRC_H |
CRC 的低、高位元組,低位元組先傳 |
R0_H、R0_L |
暫存器 0 的高、低位元組;其他暫存器同理 |
資料編碼有三個不同層次:
- 單一 16 位元暫存器內:高位元組先傳。 例如
0x1234傳送為12 34。 - DEM510C 的兩個電度暫存器:低字在前、高字在後。 總累計值先回傳暫存器 0(low word),再回傳暫存器 1(high word)。
- CRC:低位元組先傳。 順序與單一暫存器的資料位元組不同。
單一暫存器的編碼亦符合 Modbus 應用協定 §4.2。組合累計電度時,請特別區分位元組順序與兩個暫存器的順序。
本文使用的功能碼如下:
| 功能碼 | 本機用途 |
|---|---|
03 |
讀取電度、狀態及位址資訊 |
05 |
DO 控制、清除 Delta、設定寫入致能/除能 |
10 |
寫入設定暫存器;本文範例一次寫 1 個暫存器 |
一般 Modbus 的 05 寫入值為 FF 00 或 00 00;本機另有 AC 00 的 24 小時 DO LOCK 命令,屬於設備特定用法,不能假設一般布林型 coil API 能表達所有命令。參見 Modbus 應用協定 §6.5。
每個暫存器皆為 2 bytes;下列為封包使用的零起算位址,不是 40001 類型的顯示編號。
| 位址標記 | 封包位址 | 名稱 | 意義與單位 |
|---|---|---|---|
| 0 | 0x0000 |
Ep,low word | 總累計電度值低 16 位元,組合後每單位為 0.01 kWh |
| 1 | 0x0001 |
Ep,high word | 總累計電度值高 16 位元 |
| 2 | 0x0002 |
Delta Ep | 電度變化量,每單位為 0.01 kWh;數值範圍 0 至 65535 |
| 3 | 0x0003 |
state | DO 狀態,低位元組有效;數值範圍 0 至 255 |
| 4 | 0x0004 |
未列名稱 | 讀取用途待確認;04H 可用於寫入 DO 計時時間,但不據此保證可讀回 |
| 5 | 0x0005 |
address | 高位元組為群控位址,低位元組為本機位址 |
| 22 | 待確認進位制 | credit Ep,low word | 電度儲值餘額低 16 位元,組合後每單位為 0.01 kWh |
| 23 | 待確認進位制 | credit Ep,high word | 電度儲值餘額高 16 位元 |
累計電度的候選範圍為 0 至 1000000,儲值餘額為 0 至 99999,但最大值代表原始計數或換算後電度仍待確認,不據此推定溢位、歸零或儲值上限行為。
儲值餘額位址標記 22、23 的進位制尚待確認。若為十進位,封包位址為 0x0016、0x0017;若為十六進位,則為 0x0022、0x0023。實作餘額讀取前須先確認;本文不提供未確認的儲值寫入命令。
依 low word/high word 與 0.01 kWh 單位,組合方式如下:
累計原始值 = (R1 << 16) | R0
累計電度(kWh)= 累計原始值 / 100
變化電度(kWh)= R2 / 100
例如累計資料位元組為 E2 40 00 01,則低字 R0=0xE240、高字 R1=0x0001,組合為 0x0001E240 = 123456,即 1234.56 kWh。這是編碼示例,並非實機讀值。
面板最小顯示單位為 0.1 kWh,最小記錄單位為 0.01 kWh;因此通訊資料可能比面板多一位小數。
請求:AA 03 00 00 00 02 CRC_L CRC_H
回覆:AA 03 04 R0_H R0_L R1_H R1_L CRC_L CRC_H
00 00 為起始位址,00 02 為暫存器數,回覆的 04 為資料位元組數。正常回覆共 9 bytes。
此命令可能同時關閉 PC 端 RS485 通訊位址的顯示;觸發條件與持續時間尚待確認。
請求:AA 03 00 00 00 03 CRC_L CRC_H
回覆:AA 03 06 R0_H R0_L R1_H R1_L R2_H R2_L CRC_L CRC_H
正常回覆共 11 bytes,其中 06 表示 6 個資料位元組,即 3 個暫存器。
另有清除 Delta 的指令,但每次讀取是否也會清除 Delta、Delta 的確切累計期間及溢位行為仍待確認;不可自行假設為「距上次讀取的用量」。
請求:AA 03 00 03 00 01 CRC_L CRC_H
回覆:AA 03 02 00 ST CRC_L CRC_H
ST 為狀態低位元組,正常回覆共 7 bytes。
| 位元 | 遮罩 | 意義 |
|---|---|---|
| B7 | 0x80 |
IC 卡機:1 為除能,0 為致能 |
| B6 | 0x40 |
PC 儲值模式;1/0 的對應待確認 |
| B5 | 0x20 |
DO LOCK 狀態;1/0 的對應待確認 |
| B4 | 0x10 |
X,未定義 |
| B3 | 0x08 |
X,未定義 |
| B2 | 0x04 |
X,未定義 |
| B1 | 0x02 |
L3 指示燈:1 為夏月,0 為非夏月 |
| B0 | 0x01 |
Latch Relay:1 為 on,0 為 off |
DO 指數位輸出相關命令。
請求:AA 05 00 YY ZZ 00 CRC_L CRC_H
回覆:AA 05 00 YY ZZ 00 CRC_L CRC_H
正常回覆與請求相同,共 8 bytes。各命令的 YY、ZZ 定義如下:
YY |
ZZ |
功能 | 註記 |
|---|---|---|---|
00 |
FF |
Latch Relay on | 開啟繼電器 |
00 |
00 |
Latch Relay off | 同一封包亦對應解除 24 小時 DO LOCK |
01 |
FF |
開啟夏月指示燈 | L3 |
01 |
00 |
關閉夏月指示燈 | L3 |
02 |
FF |
DO Lock on | 鎖定的完整作用範圍未說明 |
02 |
00 |
DO Lock off | 解除鎖定 |
03 |
FF |
DO on | 與 YY=00 的差異未說明 |
03 |
00 |
DO off | 與 YY=00 的差異未說明 |
07 |
FF |
Relay on,計時控制 | 此時 IC 卡機讀到的 Delta 為 F1H |
07 |
00 |
Relay off,計時控制 | 此時 IC 卡機讀到的 Delta 為 F1H |
0A |
FF |
IC 卡機致能 | Enable |
0A |
00 |
IC 卡機除能 | 通訊仍正常;此時卡機讀到的 Delta 為 F0H |
0B |
FF |
啟動 PC 儲值、電表自行計度及扣款 | 必須先執行 IC 卡機除能指令 |
0B |
00 |
關閉 PC 儲值、電表自行計度及扣款 | 是否自動恢復卡機致能待確認 |
00 |
AC |
設定 24 小時 DO LOCK | 寫入值為 AC 00 |
F0H、F1H 是卡機端 Delta 特殊回傳值,不應直接套用到 PC 端暫存器 0x0002 或當作一般 kWh 數值解碼。
請求:AA 05 00 40 FF 00 CRC_L CRC_H
回覆:AA 05 00 40 FF 00 CRC_L CRC_H
這是清除變化量的寫入操作,不應當作清除總累計電度的命令。
請求:AA 05 GG YY ZZ 00 CRC_L CRC_H
回覆:AA 05 GG YY ZZ 00 CRC_L CRC_H
GG 為群控位址,命令欄位範圍為 1 至 255;YY、ZZ 同 DO Command 表。群號放在命令位址的高位元組,並未取代封包首位元組 AA。
群控時 AA 應填哪個站號、哪些電表會回覆,以及如何避免同群多台同時回覆,仍待確認;群號設定寫入範圍為 00~7FH,與群控命令欄位範圍有差異。群控封包需實機確認,不宜直接視為標準 Modbus 廣播。
請求:AA 05 00 YY ZZ 00 CRC_L CRC_H
回覆:AA 05 00 YY ZZ 00 CRC_L CRC_H
此表的 ZZ=00 是允許設定寫入,ZZ=FF 是禁止設定寫入,不可套用 DO 開關的語意。
YY |
設定項目 | 允許寫入 ZZ |
禁止寫入 ZZ |
|---|---|---|---|
28 |
IC 卡機端通訊位址 | 00 |
FF |
30 |
PC 端通訊位址 | 00 |
FF |
37 |
PC 端鮑率 | 00 |
FF |
31 |
群控通訊位址 | 00 |
FF |
請求:AA 10 00 YY 00 01 02 ZZ 00 CRC_L CRC_H
回覆:AA 10 00 YY 00 01 CRC_L CRC_H
00 01 代表寫入 1 個暫存器,02 為資料位元組數。設定值放在高位元組,故資料是 ZZ 00,即暫存器值 ZZ << 8,不是 00 ZZ。請求共 11 bytes,正常回覆共 8 bytes。
YY |
ZZ 範圍 |
設定項目 |
|---|---|---|
28 |
00 至 FF |
IC 卡機端通訊位址 |
30 |
00 至 FF |
PC 端通訊位址 |
37 |
00 至 03 |
PC 端鮑率代碼,對應 bps 未提供 |
31 |
00 至 7F |
群控通訊位址;00 的特殊意義未說明 |
04 |
01 至 FF |
DO 計時時間,單位為分鐘,即 1 至 255 分鐘 |
YY=04 是否需要寫入致能/除能,以及設定保存、重新上電或立即生效的條件,仍待確認。
依前兩類命令可安排「允許寫入 → 寫入設定 → 使用有效通訊參數確認 → 禁止寫入」的主機操作流程;這是實作建議,完整時序仍需實機驗證。修改站號或鮑率後,回覆使用舊值或新值仍待確認,須留意後續通訊參數。
以下先省略 CRC 計算結果,用來顯示欄位關係;這些都是會改變設備設定的命令。
允許 PC 位址寫入:01 05 00 30 00 00 CRC_L CRC_H
將設定值寫成 02:01 10 00 30 00 01 02 02 00 CRC_L CRC_H
待確認站號 02 已生效後,使用 02 05 00 30 FF 00 CRC_L CRC_H 禁止 PC 位址設定寫入。不要在尚未確認生效時,就假設所有後續回覆都會使用新站號。
這項尋址命令使用固定站號 FF:
請求:FF 03 00 05 00 01 CRC_L CRC_H
回覆:FF 03 02 GG AA CRC_L CRC_H
資料的高位元組 GG 為群控位址,低位元組 AA 為本機位址。
FF 的接受範圍或多台回覆的處理方式仍待確認。若用這項命令尋址,建議先在匯流排僅連一台電表時確認;不能把 FF 解釋成一般 Modbus 廣播位址。
以下演算法依 Modbus Serial Line 規格 §2.5.1.2、附錄 B:CRC-16/MODBUS,初值 0xFFFF,右移形式多項式 0xA001,不做最終 XOR。計算範圍從站號到最後一個資料位元組,不含待附加的 CRC;傳送時低位元組在前。
def crc16_modbus(data: bytes) -> int:
crc = 0xFFFF
for byte in data:
crc ^= byte
for _ in range(8):
crc = (crc >> 1) ^ 0xA001 if crc & 1 else crc >> 1
return crc
def append_crc(payload: bytes) -> bytes:
return payload + crc16_modbus(payload).to_bytes(2, "little")
def crc_is_valid(frame: bytes) -> bool:
return len(frame) >= 4 and crc16_modbus(frame[:-2]) == int.from_bytes(
frame[-2:], "little"
)
payload = bytes.fromhex("01 03 00 00 00 02")
frame = append_crc(payload)
assert frame.hex(" ").upper() == "01 03 00 00 00 02 C4 0B"
assert crc_is_valid(frame)下表除固定 FF 尋址範例外皆假設站號為 01。CRC 已用程式計算核對,不代表命令已通過實機測試。
| 操作 | 完整請求封包 | 類型 |
|---|---|---|
| 讀取累計電度 | 01 03 00 00 00 02 C4 0B |
讀取;另見顯示副作用註記 |
| 讀取累計電度與 Delta | 01 03 00 00 00 03 05 CB |
讀取 |
| 讀取 DO 狀態 | 01 03 00 03 00 01 74 0A |
讀取 |
| Latch Relay on | 01 05 00 00 FF 00 8C 3A |
改變輸出 |
| Latch Relay off | 01 05 00 00 00 00 CD CA |
改變輸出;亦對應解除 24 小時 DO LOCK |
| 清除 Delta | 01 05 00 40 FF 00 8D EE |
清除變化量 |
固定 FF 讀取群號及本機位址 |
FF 03 00 05 00 01 81 D5 |
設備特定尋址命令 |
對應前述 1234.56 kWh 編碼示例的完整模擬回覆為:
01 03 04 E2 40 00 01 0C 5F
接收端除了 CRC,還應核對站號、功能碼、資料長度及命令回顯。通用 Modbus 異常回覆的功能碼為原功能碼加 0x80,例如 03 對應 83;DEM510C 實際支援的異常碼仍待確認。格式依 Modbus 應用協定 §7。
Modbus Serial Line 規格 §2.5.1.1 要求 RTU 訊框間至少保留 3.5 個字元時間的靜默間隔;實作時應由通訊程式按實際鮑率與字元格式處理。DEM510C 的最大回覆時間、建議輪詢週期及重試次數仍待確認。
C29 版提供卡機計費及 PC 儲值兩種方式:原模式由卡機計費並控制 relay;PC 儲值模式則由 PC 儲值至電表,由電表自行計度扣款並控制 relay。自動扣款模式下,面板每隔 3 秒交替顯示總累計電度與儲值電度餘額,餘額畫面最左一位為 C。
啟動 PC 儲值模式的必要先後順序為:
AA 05 00 0A 00 00 CRC_L CRC_H:IC 卡機除能。AA 05 00 0B FF 00 CRC_L CRC_H:啟動 PC 儲值、自行計度扣款。
這兩個命令僅切換模式,不等於寫入儲值餘額。 餘額暫存器的確切位址、完整的儲值寫入封包、加值是累加或覆寫、資料格式、寫入授權及扣款細節仍待確認。
斷訊相關行為有兩種不同的觸發條件:
| 條件 | 行為 |
|---|---|
| IC 卡機通訊中斷 | 開機時置於 NC;連續 12 秒未收到 IC 卡機通訊信號,切至 NO |
| IC 卡機 RELAY ON 指令中斷 | 開機後連續 30 秒未收到 IC 卡機 RELAY ON 指令,視為斷訊並關閉 Latch Relay |
兩者的觸發條件不同,彼此優先序、與 PC 儲值模式的關係,以及 NC/NO 與各命令狀態的完整對應仍待確認;因此不能將 12 秒或 30 秒直接當成 PC 端請求逾時。
電度值另有斷電前記錄,以及每 24 小時備份至 EEPROM 的行為;這不代表所有通訊設定也以相同方式保存。
以下項目會影響實作,應保留為待確認資訊:
| 項目 | 待確認內容 | 實作注意事項 |
|---|---|---|
| PC 鮑率 | 2400 與 9600 bps 的預設值及適用條件 | 兩者並列,不指定唯一預設值 |
| 鮑率代碼 | 00~03 的 bps 對照 |
不自行填入各代碼的 bps 對照 |
| 序列埠格式 | 未明載同位檢查、停止位元等 | 不宣稱已確認為 8N1 |
| 本機位址 | 00~99 與 00~FFH 的實際可用範圍 |
區分數值範圍與實際一般可用站號;00、FF 的特殊行為待確認 |
| 群控位址 | 群控命令 1 至 255,設定寫入 00~7FH |
記錄差異與回覆機制缺漏 |
| 電度上限與餘額位址 | 最大值語意及 22/23 的進位制 |
不推定溢位及儲值寫入位址 |
| 斷訊時間 | 12 秒無卡機通訊及 30 秒無 RELAY ON 的適用條件 | 保留兩種條件,不合併為單一逾時 |
05 00 00 00 00 |
relay off 與解除 24 小時 DO LOCK 的關係 | 保留兩種用途 |
| DO、DO LOCK | YY=00 與 03 差異、鎖定效果及 B5/B6 極性未完整說明 |
不增補確定行為 |
| Delta | 累計起點、讀取是否清除、溢位未說明 | 區分讀取命令、清除命令與卡機端特殊值 |
| 儲值 | 有模式命令及餘額表,無完整加值命令 | 不把模式啟用當作加值,也不臆造儲值流程 |
| 設定生效與保存 | 改站號/鮑率後的回覆參數及保存方式未說明 | 實機確認後再固化流程 |
- Modbus Application Protocol Specification V1.1b3:僅補充通用資料編碼、功能碼及異常回覆格式。
- Modbus over Serial Line Specification and Implementation Guide V1.02:僅補充通用 RTU 時序及 CRC 計算。
本文尚未完成韌體實測;若後續取得實機封包,可依版本逐項補上已驗證的行為。