|
|
package Adl200Impl
|
|
|
|
|
|
import (
|
|
|
"encoding/binary"
|
|
|
"tgk-touch/internal/library/ADL200"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
// ===== 时间写入 =====
|
|
|
|
|
|
// WriteYear 写入电表年份
|
|
|
func (a *Adl200Impl) WriteYear(commUid string, addr byte, year int) error {
|
|
|
// 读取当前年月
|
|
|
result, err := ADL200.H0012.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
value := result[0]
|
|
|
// 高字节=年,低字节=月
|
|
|
month := byte(value)
|
|
|
data := uint16(year)<<8 | uint16(month)
|
|
|
return ADL200.H0012.Write(commUid, addr, []uint16{data})
|
|
|
}
|
|
|
|
|
|
// WriteMonth 写入电表月份
|
|
|
func (a *Adl200Impl) WriteMonth(commUid string, addr byte, month int) error {
|
|
|
// 读取当前年月
|
|
|
result, err := ADL200.H0012.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
value := result[0]
|
|
|
// 高字节=年,低字节=月
|
|
|
year := byte(value >> 8)
|
|
|
data := uint16(year)<<8 | uint16(month)
|
|
|
return ADL200.H0012.Write(commUid, addr, []uint16{data})
|
|
|
}
|
|
|
|
|
|
// WriteDay 写入电表日期
|
|
|
func (a *Adl200Impl) WriteDay(commUid string, addr byte, day int) error {
|
|
|
// 读取当前日时
|
|
|
read, err := ADL200.H0013.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
value := read[0]
|
|
|
// 高字节=时,低字节=日
|
|
|
hour := byte(value >> 8)
|
|
|
data := make([]byte, 2)
|
|
|
data[0] = hour
|
|
|
data[1] = byte(day)
|
|
|
writeData := binary.BigEndian.Uint16(data)
|
|
|
return ADL200.H0013.Write(commUid, addr, []uint16{writeData})
|
|
|
}
|
|
|
|
|
|
// WriteHour 写入电表小时
|
|
|
func (a *Adl200Impl) WriteHour(commUid string, addr byte, hour int) error {
|
|
|
// 读取当前日时
|
|
|
read, err := ADL200.H0013.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
value := read[0]
|
|
|
// 高字节=时,低字节=日
|
|
|
day := byte(value)
|
|
|
data := make([]byte, 2)
|
|
|
data[0] = byte(hour)
|
|
|
data[1] = day
|
|
|
writeData := binary.BigEndian.Uint16(data)
|
|
|
return ADL200.H0013.Write(commUid, addr, []uint16{writeData})
|
|
|
}
|
|
|
|
|
|
// WriteMinute 写入电表分钟
|
|
|
func (a *Adl200Impl) WriteMinute(commUid string, addr byte, minute int) error {
|
|
|
// 读取当前分秒
|
|
|
read, err := ADL200.H0014.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
value := read[0]
|
|
|
// 高字节=秒,低字节=分
|
|
|
second := byte(value >> 8)
|
|
|
data := make([]byte, 2)
|
|
|
data[0] = second
|
|
|
data[1] = byte(minute)
|
|
|
writeData := binary.BigEndian.Uint16(data)
|
|
|
return ADL200.H0014.Write(commUid, addr, []uint16{writeData})
|
|
|
}
|
|
|
|
|
|
// WriteSecond 写入电表秒数
|
|
|
func (a *Adl200Impl) WriteSecond(commUid string, addr byte, second int) error {
|
|
|
// 读取当前分秒
|
|
|
read, err := ADL200.H0014.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
value := read[0]
|
|
|
// 高字节=秒,低字节=分
|
|
|
minute := byte(value)
|
|
|
data := make([]byte, 2)
|
|
|
data[0] = byte(second)
|
|
|
data[1] = minute
|
|
|
writeData := binary.BigEndian.Uint16(data)
|
|
|
return ADL200.H0014.Write(commUid, addr, []uint16{writeData})
|
|
|
}
|
|
|
|
|
|
// WriteTime 写入电表完整时间
|
|
|
func (a *Adl200Impl) WriteTime(commUid string, addr byte, t time.Time) error {
|
|
|
err := a.WriteYear(commUid, addr, t.Year()-2000)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
err = a.WriteMonth(commUid, addr, int(t.Month()))
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
err = a.WriteDay(commUid, addr, t.Day())
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
err = a.WriteHour(commUid, addr, t.Hour())
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
err = a.WriteMinute(commUid, addr, t.Minute())
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
err = a.WriteSecond(commUid, addr, t.Second())
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
// ===== 通信地址写入 =====
|
|
|
|
|
|
// WriteMsgAddr 写入通信地址
|
|
|
func (a *Adl200Impl) WriteMsgAddr(commUid string, addr byte, newAddr byte) error {
|
|
|
// 读取当前值 (高8位=地址,低8位=波特率)
|
|
|
read, err := ADL200.H0015.Read(commUid, addr)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
currentValue := read[0]
|
|
|
// 低8位保留波特率设置
|
|
|
currentBaud := byte(currentValue)
|
|
|
// 高8位=新地址,低8位=原波特率
|
|
|
newValue := uint16(newAddr)<<8 | uint16(currentBaud)
|
|
|
return ADL200.H0015.Write(commUid, addr, []uint16{newValue})
|
|
|
}
|
|
|
|
|
|
// ===== 额外写入方法 =====
|
|
|
|
|
|
// WriteBacklightTime 写入背光时间
|
|
|
// minute: 0-255分钟,0为常亮
|
|
|
func (a *Adl200Impl) WriteBacklightTime(commUid string, addr byte, minute byte) error {
|
|
|
data := []uint16{uint16(minute)}
|
|
|
return ADL200.H0016.Write(commUid, addr, data)
|
|
|
}
|
|
|
|
|
|
// WriteStatus 写入状态配置
|
|
|
// bit0: 费率类型 0-非复费率, 1-复费率
|
|
|
// bit1: 接线方向 0-上进下出, 1-下进上出
|
|
|
// bit3: 视在功率 0-PQS, 1-RMS
|
|
|
func (a *Adl200Impl) WriteStatus(commUid string, addr byte, status byte) error {
|
|
|
return ADL200.H0045.Write(commUid, addr, []uint16{uint16(status)})
|
|
|
}
|