You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
8.2 KiB

package ADL200
import "fmt"
// ADL200 单相电表 Modbus 寄存器地址定义
// 参考《ADL200单相电子式电能表使用说明书 V1.2》
var (
// ===== 电能数据 =====
H0000 = MeterModusCmd{startAddr: 0x0000, quantity: 2, detail: "组合有功总电能"} // 4字节, 单位0.01kWh
H0002 = MeterModusCmd{startAddr: 0x0002, quantity: 2, detail: "组合有功尖电能"} // 4字节
H0004 = MeterModusCmd{startAddr: 0x0004, quantity: 2, detail: "组合有功峰电能"} // 4字节
H0006 = MeterModusCmd{startAddr: 0x0006, quantity: 2, detail: "组合有功平电能"} // 4字节
H0008 = MeterModusCmd{startAddr: 0x0008, quantity: 2, detail: "组合有功谷电能"} // 4字节
H000A = MeterModusCmd{startAddr: 0x000A, quantity: 1, detail: "密码"} // 2字节
// ===== 实时数据 =====
H000B = MeterModusCmd{startAddr: 0x000B, quantity: 1, detail: "电压"} // 单位: 0.1V
H000C = MeterModusCmd{startAddr: 0x000C, quantity: 1, detail: "电流"} // 单位: 0.01A
H000D = MeterModusCmd{startAddr: 0x000D, quantity: 1, detail: "有功功率"} // 单位: 0.001kW
H000E = MeterModusCmd{startAddr: 0x000E, quantity: 1, detail: "无功功率"} // 单位: 0.001kvar
H000F = MeterModusCmd{startAddr: 0x000F, quantity: 1, detail: "视在功率"} // 单位: 0.001kVA
H0010 = MeterModusCmd{startAddr: 0x0010, quantity: 1, detail: "功率因数"} // 单位: 0.001
H0011 = MeterModusCmd{startAddr: 0x0011, quantity: 1, detail: "频率"} // 单位: 0.01Hz
// ===== 时间设置 =====
H0012 = MeterModusCmd{startAddr: 0x0012, quantity: 1, cmdType: 1, detail: "年月"} // R/W
H0013 = MeterModusCmd{startAddr: 0x0013, quantity: 1, cmdType: 1, detail: "日时"} // R/W
H0014 = MeterModusCmd{startAddr: 0x0014, quantity: 1, cmdType: 1, detail: "分秒"} // R/W
// ===== 通信设置 =====
H0015 = MeterModusCmd{startAddr: 0x0015, quantity: 1, cmdType: 1, detail: "高8位地址/低8位波特率"} // R/W
H0016 = MeterModusCmd{startAddr: 0x0016, quantity: 1, cmdType: 1, detail: "背光时间"} // R/W
// ===== 历史电能 (上月) =====
H0022 = MeterModusCmd{startAddr: 0x0022, quantity: 2, detail: "上1月组合有功总电能"} // 4字节
H0024 = MeterModusCmd{startAddr: 0x0024, quantity: 2, detail: "上1月组合有功尖电能"}
H0026 = MeterModusCmd{startAddr: 0x0026, quantity: 2, detail: "上1月组合有功峰电能"}
H0028 = MeterModusCmd{startAddr: 0x0028, quantity: 2, detail: "上1月组合有功平电能"}
H002A = MeterModusCmd{startAddr: 0x002A, quantity: 2, detail: "上1月组合有功谷电能"}
H002C = MeterModusCmd{startAddr: 0x002C, quantity: 2, detail: "上2月组合有功总电能"}
H002E = MeterModusCmd{startAddr: 0x002E, quantity: 2, detail: "上2月组合有功尖电能"}
H0030 = MeterModusCmd{startAddr: 0x0030, quantity: 2, detail: "上2月组合有功峰电能"}
H0032 = MeterModusCmd{startAddr: 0x0032, quantity: 2, detail: "上2月组合有功平电能"}
H0034 = MeterModusCmd{startAddr: 0x0034, quantity: 2, detail: "上2月组合有功谷电能"}
H0036 = MeterModusCmd{startAddr: 0x0036, quantity: 2, detail: "上3月组合有功总电能"}
H0038 = MeterModusCmd{startAddr: 0x0038, quantity: 2, detail: "上3月组合有功尖电能"}
H003A = MeterModusCmd{startAddr: 0x003A, quantity: 2, detail: "上3月组合有功峰电能"}
H003C = MeterModusCmd{startAddr: 0x003C, quantity: 2, detail: "上3月组合有功平电能"}
H003E = MeterModusCmd{startAddr: 0x003E, quantity: 2, detail: "上3月组合有功谷电能"}
// ===== 状态和配置 =====
H0045 = MeterModusCmd{startAddr: 0x0045, quantity: 1, cmdType: 1, detail: "状态"}
// Bit0: 费率类型 0-非复费率, 1-复费率
// Bit1: 接线方向 0-上进下出, 1-下进上出
// Bit3: 视在功率 0-PQS, 1-RMS
H0048 = MeterModusCmd{startAddr: 0x0048, quantity: 1, detail: "校验方式"} // 0000=无校验, 0002=偶校验
// ===== 表号 =====
H0049 = MeterModusCmd{startAddr: 0x0049, quantity: 1, cmdType: 1, detail: "表号低"}
H004A = MeterModusCmd{startAddr: 0x004A, quantity: 1, cmdType: 1, detail: "表号中"}
H004B = MeterModusCmd{startAddr: 0x004B, quantity: 1, cmdType: 1, detail: "表号高"}
// ===== 正向有功电能 =====
H0068 = MeterModusCmd{startAddr: 0x0068, quantity: 2, detail: "正向有功总电能"} // 4字节, 单位0.01kWh
H006A = MeterModusCmd{startAddr: 0x006A, quantity: 2, detail: "正向有功尖电能"}
H006C = MeterModusCmd{startAddr: 0x006C, quantity: 2, detail: "正向有功峰电能"}
H006E = MeterModusCmd{startAddr: 0x006E, quantity: 2, detail: "正向有功平电能"}
H0070 = MeterModusCmd{startAddr: 0x0070, quantity: 2, detail: "正向有功谷电能"}
// ===== 反向有功<E69C89><E58A9F>能 =====
H0072 = MeterModusCmd{startAddr: 0x0072, quantity: 2, detail: "反向有功总电能"}
H0074 = MeterModusCmd{startAddr: 0x0074, quantity: 2, detail: "反向有功尖电能"}
H0076 = MeterModusCmd{startAddr: 0x0076, quantity: 2, detail: "反向有功峰电能"}
H0078 = MeterModusCmd{startAddr: 0x0078, quantity: 2, detail: "反向有功平电能"}
H007A = MeterModusCmd{startAddr: 0x007A, quantity: 2, detail: "反向有功谷电能"}
// ===== 无功电能 =====
H00B0 = MeterModusCmd{startAddr: 0x00B0, quantity: 2, detail: "当前总无功电能"} // 4字节, 单位0.01kVarh
H00B2 = MeterModusCmd{startAddr: 0x00B2, quantity: 2, detail: "当前无功尖电能"}
H00B4 = MeterModusCmd{startAddr: 0x00B4, quantity: 2, detail: "当前无功峰电能"}
H00B6 = MeterModusCmd{startAddr: 0x00B6, quantity: 2, detail: "当前无功平电能"}
H00B8 = MeterModusCmd{startAddr: 0x00B8, quantity: 2, detail: "当前无功谷电能"}
H00BA = MeterModusCmd{startAddr: 0x00BA, quantity: 2, detail: "当前正向总无功电能"}
H00BC = MeterModusCmd{startAddr: 0x00BC, quantity: 2, detail: "当前正向无功尖电能"}
H00BE = MeterModusCmd{startAddr: 0x00BE, quantity: 2, detail: "当前正向无功峰电能"}
H00C0 = MeterModusCmd{startAddr: 0x00C0, quantity: 2, detail: "当前正向无功平电能"}
H00C2 = MeterModusCmd{startAddr: 0x00C2, quantity: 2, detail: "当前正向无功谷电能"}
H00C4 = MeterModusCmd{startAddr: 0x00C4, quantity: 2, detail: "当前反向总无功电能"}
H00C6 = MeterModusCmd{startAddr: 0x00C6, quantity: 2, detail: "当前反向无功尖电能"}
H00C8 = MeterModusCmd{startAddr: 0x00C8, quantity: 2, detail: "当前反向无功峰电能"}
H00CA = MeterModusCmd{startAddr: 0x00CA, quantity: 2, detail: "当前反向无功平电能"}
H00CC = MeterModusCmd{startAddr: 0x00CC, quantity: 2, detail: "当前反向无功谷电能"}
)
// MeterModusCmd Modbus 寄存器命令结构体
type MeterModusCmd struct {
startAddr uint16 // 起始地址
quantity uint16 // 寄存器数量
cmdType int // 0: 只读, 1: 可读写
detail string // 描述信息
}
// SetStartAddr 设置起始地址
func (mcc *MeterModusCmd) SetStartAddr(s uint16) {
mcc.startAddr = s
}
// GetStartAddr 获取起始地址
func (mcc *MeterModusCmd) GetStartAddr() uint16 {
return mcc.startAddr
}
// SetQuantity 设置寄存器数量
func (mcc *MeterModusCmd) SetQuantity(q uint16) {
mcc.quantity = q
}
// GetQuantity 获取寄存器数量
func (mcc *MeterModusCmd) GetQuantity() uint16 {
return mcc.quantity
}
// SetCmdType 设置命令类型
func (mcc *MeterModusCmd) SetCmdType(t int) {
mcc.cmdType = t
}
// GetCmdType 获取命令类型
func (mcc *MeterModusCmd) GetCmdType() int {
return mcc.cmdType
}
// Read 读取寄存器数据
func (mmc *MeterModusCmd) Read(commUid string, addr byte) ([]uint16, error) {
return readCmd(commUid, addr, mmc.startAddr, mmc.quantity, "读取"+mmc.detail)
}
// Write 写入寄存器数据
func (mmc *MeterModusCmd) Write(commUid string, addr byte, data []uint16) error {
if mmc.cmdType == 0 {
return nil
}
return writeCmd(commUid, addr, mmc.startAddr, data, "写入"+mmc.detail)
}
// GetHistoricalMonthAddress 获取历史月份电能的起始地址
// month: 1-3 (上1月到上3月)
func GetHistoricalMonthAddress(month int) (*MeterModusCmd, error) {
if month < 1 || month > 3 {
return nil, fmt.Errorf("invalid month value: %d (valid range 1-3)", month)
}
// 上1月: 0x0022, 上2月: 0x002C, 上3月: 0x0036
address := 0x0022 + uint16((month-1)*10)
MMC := &MeterModusCmd{startAddr: address, quantity: 10, detail: fmt.Sprintf("上%d月组合有功电能", month)}
return MMC, nil
}