package Adl200Impl import ( "fmt" "tgk-touch/internal/global" "tgk-touch/internal/library/ADL200" "time" ) // ===== 时间读取 ===== // ReadYear 读取电表年份 func (a *Adl200Impl) ReadYear(commUid string, addr byte) (int, error) { read, err := ADL200.H0012.Read(commUid, addr) if err != nil { return 0, err } value := read[0] // 高字节=年 (如 0x07 表示 2007) year := int(byte(value >> 8)) return year, nil } // ReadMonth 读取电表月份 func (a *Adl200Impl) ReadMonth(commUid string, addr byte) (int, error) { read, err := ADL200.H0012.Read(commUid, addr) if err != nil { return 0, err } value := read[0] // 低字节=月 month := int(byte(value)) return month, nil } // ReadDay 读取电表日期 func (a *Adl200Impl) ReadDay(commUid string, addr byte) (int, error) { read, err := ADL200.H0013.Read(commUid, addr) if err != nil { return 0, err } value := read[0] // 低字节=日 day := int(byte(value)) return day, nil } // ReadHour 读取电表小时 func (a *Adl200Impl) ReadHour(commUid string, addr byte) (int, error) { read, err := ADL200.H0013.Read(commUid, addr) if err != nil { return 0, err } value := read[0] // 高字节=时 hour := int(byte(value >> 8)) return hour, nil } // ReadMinute 读取电表分钟 func (a *Adl200Impl) ReadMinute(commUid string, addr byte) (int, error) { read, err := ADL200.H0014.Read(commUid, addr) if err != nil { return 0, err } value := read[0] // 低字节=分 minute := int(byte(value)) return minute, nil } // ReadSecond 读取电表秒数 func (a *Adl200Impl) ReadSecond(commUid string, addr byte) (int, error) { read, err := ADL200.H0014.Read(commUid, addr) if err != nil { return 0, err } value := read[0] // 高字节=秒 second := int(byte(value >> 8)) return second, nil } // ReadTime 读取电表完整时间 func (a *Adl200Impl) ReadTime(commUid string, addr byte) (time.Time, error) { // 读取各个时间组件 year, err := a.ReadYear(commUid, addr) if err != nil { return time.Time{}, fmt.Errorf("读取年份失败: %v", err) } month, err := a.ReadMonth(commUid, addr) if err != nil { return time.Time{}, fmt.Errorf("读取月份失败: %v", err) } day, err := a.ReadDay(commUid, addr) if err != nil { return time.Time{}, fmt.Errorf("读取日期失败: %v", err) } hour, err := a.ReadHour(commUid, addr) if err != nil { return time.Time{}, fmt.Errorf("读取小时失败: %v", err) } minute, err := a.ReadMinute(commUid, addr) if err != nil { return time.Time{}, fmt.Errorf("读取分钟失败: %v", err) } second, err := a.ReadSecond(commUid, addr) if err != nil { return time.Time{}, fmt.Errorf("读取秒数失败: %v", err) } // 构建时间对象 (年份为 2 位数字,加 2000) loc, _ := time.LoadLocation("Local") t := time.Date( year+2000, time.Month(month), day, hour, minute, second, 0, loc, ) return t, nil } // ===== 电气参数读取 ===== // ReadVoltage 读取电压 (单相电表只有单相电压) func (a *Adl200Impl) ReadVoltage(commUid string, addr byte) (totalVoltage, aVoltage, bVoltage, cVoltage float64, err error) { read, err := ADL200.H000B.Read(commUid, addr) if err != nil { return } // 单位: 0.1V aVoltage = float64(read[0]) * 0.1 // ADL200 是单相电表,总电压即为 A 相电压 totalVoltage = aVoltage return totalVoltage, aVoltage, bVoltage, cVoltage, err } // ReadElectricCurrent 读取电流 (单相电表只有单相电流) func (a *Adl200Impl) ReadElectricCurrent(commUid string, addr byte) (totalElectricCurrent, aElectricCurrent, bElectricCurrent, cElectricCurrent float64, err error) { read, err := ADL200.H000C.Read(commUid, addr) if err != nil { return } // 单位: 0.01A aElectricCurrent = float64(read[0]) * 0.01 totalElectricCurrent = aElectricCurrent return totalElectricCurrent, aElectricCurrent, bElectricCurrent, cElectricCurrent, err } // ReadPower 读取功率 (单相电表只有总有功功率) func (a *Adl200Impl) ReadPower(commUid string, addr byte) (totalPower, aPower, bPower, cPower float64, err error) { read, err := ADL200.H000D.Read(commUid, addr) if err != nil { return } // 单位: 0.001kW totalPower = float64(read[0]) * 0.001 aPower = totalPower return totalPower, aPower, bPower, cPower, err } // ReadTotalPower 读取总有功功率 func (a *Adl200Impl) ReadTotalPower(commUid string, addr byte) (totalPower float64, err error) { read, err := ADL200.H000D.Read(commUid, addr) if err != nil { return 0, err } // 单位: 0.001kW totalPower = float64(read[0]) * 0.001 return totalPower, err } // ReadEnergy 读取电能 (4 字节数据,需要两个寄存器) func (a *Adl200Impl) ReadEnergy(commUid string, addr byte) (totalEnergy, aEnergy, bEnergy, cEnergy float64, err error) { read, err := ADL200.H0068.Read(commUid, addr) if err != nil { return } // 高16位在前,低16位在后 (大端序) high := uint32(read[0]) // 高16位 low := uint32(read[1]) // 低16位 value := (high << 16) | low // 组合为32位整数 // 单位: 0.01kWh totalEnergy = float64(value) * 0.01 aEnergy = totalEnergy // 单相电表,A相电能即为总电能 return totalEnergy, aEnergy, bEnergy, cEnergy, err } // ReadPowerFactor 读取功率因数 (单相电表) func (a *Adl200Impl) ReadPowerFactor(commUid string, addr byte) (totalPf, aPf, bPf, cPf float64, err error) { read, err := ADL200.H0010.Read(commUid, addr) if err != nil { return } // 单位: 0.001 aPf = float64(read[0]) * 0.001 totalPf = aPf return totalPf, aPf, bPf, cPf, err } // ===== 其他读取 ===== // ReadMsgAddr 读取通信地址 func (a *Adl200Impl) ReadMsgAddr(commUid string, addr byte) (msgAddr byte, err error) { read, err := ADL200.H0015.Read(commUid, addr) if err != nil { return 0, err } value := read[0] // 高8位=通信地址 (0~254) msgAddr = byte(value >> 8) g.Log().Infof("ADL200 ReadMsgAddr raw: 0x%X, msgAddr: 0x%X (%d)", value, msgAddr, msgAddr) return msgAddr, nil } // ReadMainAddr 读取主控地址 (DL/T645 表号,暂不支持) func (a *Adl200Impl) ReadMainAddr(commUid string, addr byte) (byte, error) { // ADL200 使用表号代替主控地址,此处返回通信地址作为占位 return a.ReadMsgAddr(commUid, addr) } // ReadDailyFreezingTime 读取日冻结时间 (ADL200 不支持日冻结,返回默认) func (a *Adl200Impl) ReadDailyFreezingTime(commUid string, addr byte) (dailyFreezingTime string, err error) { // ADL200 单相电表不支持日冻结时间设置 return "00:00", nil } // ReadMonthlyFreezingTime 读取月冻结时间 (ADL200 不支持月冻结,返回默认) func (a *Adl200Impl) ReadMonthlyFreezingTime(commUid string, addr byte) (day, hour string, err error) { // ADL200 单相电表不支持月冻结时间设置 return "01", "00", nil } // ===== 额外的数据读取方法 ===== // ReadFrequency 读取电网频率 func (a *Adl200Impl) ReadFrequency(commUid string, addr byte) (frequency float64, err error) { read, err := ADL200.H0011.Read(commUid, addr) if err != nil { return 0, err } // 单位: 0.01Hz frequency = float64(read[0]) * 0.01 return frequency, nil } // ReadReactivePower 读取无功功率 func (a *Adl200Impl) ReadReactivePower(commUid string, addr byte) (reactivePower float64, err error) { read, err := ADL200.H000E.Read(commUid, addr) if err != nil { return 0, err } // 单位: 0.001kvar reactivePower = float64(read[0]) * 0.001 return reactivePower, nil } // ReadApparentPower 读取视在功率 func (a *Adl200Impl) ReadApparentPower(commUid string, addr byte) (apparentPower float64, err error) { read, err := ADL200.H000F.Read(commUid, addr) if err != nil { return 0, err } // 单位: 0.001kVA apparentPower = float64(read[0]) * 0.001 return apparentPower, nil } // ReadCombinedEnergy 读取组合有功总电能 func (a *Adl200Impl) ReadCombinedEnergy(commUid string, addr byte) (energy float64, err error) { read, err := ADL200.H0000.Read(commUid, addr) if err != nil { return 0, err } high := uint32(read[0]) low := uint32(read[1]) value := (high << 16) | low // 单位: 0.01kWh energy = float64(value) * 0.01 return energy, nil } // ReadReactiveEnergy 读取总无功电能 func (a *Adl200Impl) ReadReactiveEnergy(commUid string, addr byte) (energy float64, err error) { read, err := ADL200.H00B0.Read(commUid, addr) if err != nil { return 0, err } high := uint32(read[0]) low := uint32(read[1]) value := (high << 16) | low // 单位: 0.01kVarh energy = float64(value) * 0.01 return energy, nil }