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.
130 lines
5.5 KiB
130 lines
5.5 KiB
package ADL400
|
|
|
|
import "fmt"
|
|
|
|
var (
|
|
H0000 = MeterModusCmd{startAddr: 0x00, quantity: 2}
|
|
H0002 = MeterModusCmd{startAddr: 0x02, quantity: 2}
|
|
H0004 = MeterModusCmd{startAddr: 0x04, quantity: 2}
|
|
H0006 = MeterModusCmd{startAddr: 0x06, quantity: 2}
|
|
H0008 = MeterModusCmd{startAddr: 0x08, quantity: 2}
|
|
H000A = MeterModusCmd{startAddr: 0x0A, quantity: 2, detail: "当前正向总有功电能"}
|
|
H000C = MeterModusCmd{startAddr: 0x0C, quantity: 2}
|
|
H000E = MeterModusCmd{startAddr: 0x0E, quantity: 2}
|
|
H0010 = MeterModusCmd{startAddr: 0x10, quantity: 2}
|
|
H0012 = MeterModusCmd{startAddr: 0x12, quantity: 2}
|
|
H0014 = MeterModusCmd{startAddr: 0x14, quantity: 2}
|
|
H0016 = MeterModusCmd{startAddr: 0x16, quantity: 2}
|
|
H0018 = MeterModusCmd{startAddr: 0x18, quantity: 2}
|
|
H001A = MeterModusCmd{startAddr: 0x1A, quantity: 2}
|
|
H001C = MeterModusCmd{startAddr: 0x1C, quantity: 2}
|
|
H001E = MeterModusCmd{startAddr: 0x1E, quantity: 2}
|
|
H0020 = MeterModusCmd{startAddr: 0x20, quantity: 2}
|
|
H0022 = MeterModusCmd{startAddr: 0x22, quantity: 2}
|
|
H0024 = MeterModusCmd{startAddr: 0x24, quantity: 2}
|
|
H0026 = MeterModusCmd{startAddr: 0x26, quantity: 2}
|
|
H0028 = MeterModusCmd{startAddr: 0x28, quantity: 2}
|
|
H002A = MeterModusCmd{startAddr: 0x2A, quantity: 2}
|
|
H002C = MeterModusCmd{startAddr: 0x2C, quantity: 2}
|
|
H002E = MeterModusCmd{startAddr: 0x2E, quantity: 2}
|
|
H0030 = MeterModusCmd{startAddr: 0x30, quantity: 2}
|
|
H0032 = MeterModusCmd{startAddr: 0x32, quantity: 2}
|
|
H0034 = MeterModusCmd{startAddr: 0x34, quantity: 2}
|
|
H0036 = MeterModusCmd{startAddr: 0x36, quantity: 2}
|
|
H0038 = MeterModusCmd{startAddr: 0x38, quantity: 2}
|
|
H003A = MeterModusCmd{startAddr: 0x3A, quantity: 2}
|
|
|
|
H003C = MeterModusCmd{startAddr: 0x3C, quantity: 1, cmdType: 1, detail: "秒、分"}
|
|
H003D = MeterModusCmd{startAddr: 0x3D, quantity: 1, cmdType: 1, detail: "时、日"}
|
|
H003E = MeterModusCmd{startAddr: 0x3E, quantity: 1, cmdType: 1, detail: "月、年"}
|
|
H003F = MeterModusCmd{startAddr: 0x3F, quantity: 1, cmdType: 1, detail: "通信地址"}
|
|
|
|
H0040 = MeterModusCmd{startAddr: 0x40, quantity: 1}
|
|
|
|
H0041 = MeterModusCmd{startAddr: 0x41, quantity: 1, cmdType: 1}
|
|
H0042 = MeterModusCmd{startAddr: 0x42, quantity: 1, cmdType: 1}
|
|
H0043 = MeterModusCmd{startAddr: 0x43, quantity: 1, cmdType: 1}
|
|
H0044 = MeterModusCmd{startAddr: 0x44, quantity: 1, cmdType: 1}
|
|
H0045 = MeterModusCmd{startAddr: 0x45, quantity: 1, cmdType: 1}
|
|
H0046 = MeterModusCmd{startAddr: 0x46, quantity: 1, cmdType: 1}
|
|
H0061 = MeterModusCmd{startAddr: 0x61, quantity: 1, detail: "A相电压"}
|
|
H0062 = MeterModusCmd{startAddr: 0x62, quantity: 1, detail: "B相电压"}
|
|
H0063 = MeterModusCmd{startAddr: 0x63, quantity: 1, detail: "C相电压"}
|
|
H0064 = MeterModusCmd{startAddr: 0x64, quantity: 1, detail: "A相电流"}
|
|
H0065 = MeterModusCmd{startAddr: 0x65, quantity: 1, detail: "B相电流"}
|
|
H0066 = MeterModusCmd{startAddr: 0x66, quantity: 1, detail: "C相电流"}
|
|
H0067 = MeterModusCmd{startAddr: 0x67, quantity: 1, detail: "A相有功功率"}
|
|
H0068 = MeterModusCmd{startAddr: 0x68, quantity: 1, detail: "B相有功功率"}
|
|
H0069 = MeterModusCmd{startAddr: 0x69, quantity: 1, detail: "C相有功功率"}
|
|
H006A = MeterModusCmd{startAddr: 0x6A, quantity: 1, detail: "总有功功率"}
|
|
H0087 = MeterModusCmd{startAddr: 0x87, quantity: 2, detail: "A相正向有功电能"}
|
|
H0089 = MeterModusCmd{startAddr: 0x89, quantity: 2, detail: "B相正向有功电能"}
|
|
H008B = MeterModusCmd{startAddr: 0x8B, quantity: 2, detail: "C相正向有功电能"}
|
|
H0073 = MeterModusCmd{startAddr: 0x73, quantity: 2, detail: "A相功率因数"}
|
|
H0074 = MeterModusCmd{startAddr: 0x74, quantity: 2, detail: "B相功率因数"}
|
|
H0075 = MeterModusCmd{startAddr: 0x75, quantity: 2, detail: "C相功率因数"}
|
|
H0076 = MeterModusCmd{startAddr: 0x76, quantity: 2, detail: "总功率因数"}
|
|
H0121 = MeterModusCmd{startAddr: 0x0121, quantity: 1, cmdType: 1, detail: "日冻结时间 时"}
|
|
H0122 = MeterModusCmd{startAddr: 0x0121, quantity: 1, cmdType: 1, detail: "月冻结 日时"}
|
|
H6000 = MeterModusCmd{startAddr: 0x6000, quantity: 34}
|
|
H6001 = MeterModusCmd{startAddr: 0x6001, quantity: 1}
|
|
H6022 = MeterModusCmd{startAddr: 0x6022, quantity: 34}
|
|
)
|
|
|
|
type MeterModusCmd struct {
|
|
startAddr uint16
|
|
quantity uint16
|
|
cmdType int // 0 R , 1 R/W
|
|
detail string
|
|
}
|
|
|
|
func (mcc *MeterModusCmd) SetStartAddr(s uint16) {
|
|
mcc.startAddr = s
|
|
}
|
|
func (mcc *MeterModusCmd) GetStartAddr() uint16 {
|
|
return mcc.startAddr
|
|
}
|
|
func (mcc *MeterModusCmd) SetQuantity(q uint16) {
|
|
mcc.quantity = q
|
|
}
|
|
func (mcc *MeterModusCmd) GetQuantity() uint16 {
|
|
return mcc.quantity
|
|
}
|
|
func (mcc *MeterModusCmd) SetCmdType(t int) {
|
|
mcc.cmdType = t
|
|
}
|
|
func (mcc *MeterModusCmd) GetCmdType() int {
|
|
return mcc.cmdType
|
|
}
|
|
|
|
func (mmc *MeterModusCmd) Read(commUid string, addr byte) ([]uint16, error) {
|
|
|
|
return readCmd(commUid, addr, mmc.startAddr, mmc.quantity, "读取"+mmc.detail)
|
|
|
|
}
|
|
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)
|
|
}
|
|
|
|
// 获取日冻结数据块地址
|
|
func GetDailyBlockAddress(day int) (*MeterModusCmd, error) {
|
|
if day < 1 || day > 90 {
|
|
return nil, fmt.Errorf("invalid day value: %d (valid range 1-90)", day)
|
|
}
|
|
MMC := &MeterModusCmd{startAddr: 0x6000 + uint16(34*(day-1)), quantity: 34}
|
|
return MMC, nil
|
|
}
|
|
|
|
// 获取月冻结数据块地址
|
|
func GetMonthlyBlockAddress(month int) (*MeterModusCmd, error) {
|
|
if month < 1 || month > 48 {
|
|
return nil, fmt.Errorf("invalid month value: %d (valid range 1-48)", month)
|
|
}
|
|
MMC := &MeterModusCmd{startAddr: 0x7000 + uint16(34*(month-1)), quantity: 34}
|
|
|
|
return MMC, nil
|
|
}
|