package relay import ( "github.com/grid-x/modbus" "io" ) type Relay interface { io.Closer // SetSlave 设置继电器的 UnitID SetSlave(byte) // On 打开继电器 On(int) error // Off 关闭继电器 Off(int) error // OnAll 打开所有继电器 OnAll() error // OffAll 关闭所有继电器 OffAll() error } type device struct { h modbus.ClientHandler c modbus.Client } func (r *device) SetSlave(slaveID byte) { r.h.SetSlave(slaveID) } func (r *device) Close() error { return r.h.Close() } func (r *device) OnAll() error { _, err := r.c.WriteMultipleCoils(uint16(0), 16, []byte{0xFF, 0xFF}) return err } func (r *device) OffAll() error { _, err := r.c.WriteMultipleCoils(uint16(0), 16, []byte{0x00, 0x00}) return err } func (r *device) On(num int) error { _, err := r.c.WriteSingleCoil(uint16(num), 0xFF00) return err } func (r *device) Off(num int) error { _, err := r.c.WriteSingleCoil(uint16(num), 0x0000) return err } func New(address string) (Relay, error) { h := modbus.NewRTUClientHandler(address) h.SlaveID = 1 h.BaudRate = 9600 h.DataBits = 8 h.Parity = "N" h.StopBits = 1 if err := h.Connect(); err != nil { return nil, err } c := modbus.NewClient(h) return &device{h, c}, nil }