Skip to content

Latest commit

 

History

History
357 lines (255 loc) · 17.2 KB

File metadata and controls

357 lines (255 loc) · 17.2 KB

DEM510C 電表通訊協定

本文說明 DEM510C 電表的 PC 端 RS485 通訊方式,涵蓋 Modbus RTU 封包、電度資料、輸出控制及通訊設定。設備行為以 C29 版功能為整理範圍,尚未以實體電表驗證;不確定的參數與行為列於「待確認事項」。

目錄

通訊介面與參數

項目 參數 使用時的解讀
實體介面 兩組 RS485,分別供 IC 卡機及 PC 使用 本文封包以 PC 端為主
通訊角色 DEM510C 為 SLAVE;PC 或 IC 卡機為 HOST 由主機送出命令,電表回覆
IC 卡機鮑率 固定 1200 bps 不等同於 PC 端設定
PC 鮑率 2400 或 9600 bps,預設值待確認 需確認實機設定
PC 鮑率設定碼 0003 各代碼對應的 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_LCRC_H CRC 的低、高位元組,低位元組先傳
R0_HR0_L 暫存器 0 的高、低位元組;其他暫存器同理

資料編碼有三個不同層次:

  1. 單一 16 位元暫存器內:高位元組先傳。 例如 0x1234 傳送為 12 34
  2. DEM510C 的兩個電度暫存器:低字在前、高字在後。 總累計值先回傳暫存器 0(low word),再回傳暫存器 1(high word)。
  3. CRC:低位元組先傳。 順序與單一暫存器的資料位元組不同。

單一暫存器的編碼亦符合 Modbus 應用協定 §4.2。組合累計電度時,請特別區分位元組順序與兩個暫存器的順序。

本文使用的功能碼如下:

功能碼 本機用途
03 讀取電度、狀態及位址資訊
05 DO 控制、清除 Delta、設定寫入致能/除能
10 寫入設定暫存器;本文範例一次寫 1 個暫存器

一般 Modbus 的 05 寫入值為 FF 0000 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,但最大值代表原始計數或換算後電度仍待確認,不據此推定溢位、歸零或儲值上限行為。

儲值餘額位址標記 2223 的進位制尚待確認。若為十進位,封包位址為 0x00160x0017;若為十六進位,則為 0x00220x0023。實作餘額讀取前須先確認;本文不提供未確認的儲值寫入命令。

電度換算

依 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 通訊位址的顯示;觸發條件與持續時間尚待確認。

同時讀取累計電度與 Delta

請求: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 的確切累計期間及溢位行為仍待確認;不可自行假設為「距上次讀取的用量」。

讀取 DO 狀態

請求: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 與繼電器控制

DO 指數位輸出相關命令。

請求:AA 05 00 YY ZZ 00 CRC_L CRC_H
回覆:AA 05 00 YY ZZ 00 CRC_L CRC_H

正常回覆與請求相同,共 8 bytes。各命令的 YYZZ 定義如下:

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

F0HF1H卡機端 Delta 特殊回傳值,不應直接套用到 PC 端暫存器 0x0002 或當作一般 kWh 數值解碼。

清除 Delta kWh

請求:AA 05 00 40 FF 00 CRC_L CRC_H
回覆:AA 05 00 40 FF 00 CRC_L CRC_H

這是清除變化量的寫入操作,不應當作清除總累計電度的命令。

DO 群控

請求:AA 05 GG YY ZZ 00 CRC_L CRC_H
回覆:AA 05 GG YY ZZ 00 CRC_L CRC_H

GG 為群控位址,命令欄位範圍為 1 至 255;YYZZ 同 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 00FF IC 卡機端通訊位址
30 00FF PC 端通訊位址
37 0003 PC 端鮑率代碼,對應 bps 未提供
31 007F 群控通訊位址;00 的特殊意義未說明
04 01FF DO 計時時間,單位為分鐘,即 1 至 255 分鐘

YY=04 是否需要寫入致能/除能,以及設定保存、重新上電或立即生效的條件,仍待確認。

依前兩類命令可安排「允許寫入 → 寫入設定 → 使用有效通訊參數確認 → 禁止寫入」的主機操作流程;這是實作建議,完整時序仍需實機驗證。修改站號或鮑率後,回覆使用舊值或新值仍待確認,須留意後續通訊參數。

範例:將 PC 站號由 1 改成 2

以下先省略 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 廣播位址。

CRC 與完整封包範例

以下演算法依 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 儲值模式的必要先後順序為:

  1. AA 05 00 0A 00 00 CRC_L CRC_H:IC 卡機除能。
  2. 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~9900~FFH 的實際可用範圍 區分數值範圍與實際一般可用站號;00FF 的特殊行為待確認
群控位址 群控命令 1 至 255,設定寫入 00~7FH 記錄差異與回覆機制缺漏
電度上限與餘額位址 最大值語意及 22/23 的進位制 不推定溢位及儲值寫入位址
斷訊時間 12 秒無卡機通訊及 30 秒無 RELAY ON 的適用條件 保留兩種條件,不合併為單一逾時
05 00 00 00 00 relay off 與解除 24 小時 DO LOCK 的關係 保留兩種用途
DO、DO LOCK YY=0003 差異、鎖定效果及 B5/B6 極性未完整說明 不增補確定行為
Delta 累計起點、讀取是否清除、溢位未說明 區分讀取命令、清除命令與卡機端特殊值
儲值 有模式命令及餘額表,無完整加值命令 不把模式啟用當作加值,也不臆造儲值流程
設定生效與保存 改站號/鮑率後的回覆參數及保存方式未說明 實機確認後再固化流程

延伸閱讀

本文尚未完成韌體實測;若後續取得實機封包,可依版本逐項補上已驗證的行為。