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.

169 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)})
}