diff --git a/provider/modbus.go b/provider/modbus.go index fe37a703f..b92f55d02 100644 --- a/provider/modbus.go +++ b/provider/modbus.go @@ -174,12 +174,20 @@ func (m *Modbus) writeFunc() (func(float64) error, error) { return func(val float64) error { val *= m.scale - switch { - case op.FuncCode == gridx.FuncCodeWriteSingleRegister: + switch op.FuncCode { + case gridx.FuncCodeWriteSingleCoil: + var uval uint16 + if val != 0 { + uval = 0xFF00 + } + _, err = m.conn.WriteSingleCoil(op.Addr, uval) + return err + + case gridx.FuncCodeWriteSingleRegister: _, err = m.conn.WriteSingleRegister(op.Addr, uint16(val)) return err - case op.FuncCode == gridx.FuncCodeWriteMultipleRegisters: + case gridx.FuncCodeWriteMultipleRegisters: b, err := encode(val) if err == nil { _, err = m.conn.WriteMultipleRegisters(op.Addr, op.Length, b) diff --git a/util/modbus/modbus.go b/util/modbus/modbus.go index c71dbc679..d8833e30c 100644 --- a/util/modbus/modbus.go +++ b/util/modbus/modbus.go @@ -182,8 +182,8 @@ func (mb *Connection) ReadCoils(address, quantity uint16) ([]byte, error) { return mb.ReadCoilsWithSlave(mb.slaveID, address, quantity) } -func (mb *Connection) WriteSingleCoil(address, quantity uint16) ([]byte, error) { - return mb.WriteSingleCoilWithSlave(mb.slaveID, address, quantity) +func (mb *Connection) WriteSingleCoil(address, value uint16) ([]byte, error) { + return mb.WriteSingleCoilWithSlave(mb.slaveID, address, value) } func (mb *Connection) ReadInputRegisters(address, quantity uint16) ([]byte, error) { diff --git a/util/modbus/register.go b/util/modbus/register.go index 8a5cbcc09..85e277564 100644 --- a/util/modbus/register.go +++ b/util/modbus/register.go @@ -51,7 +51,7 @@ func (r Register) Length() (uint16, error) { case strings.Contains(enc, "64"): return 4, nil default: - return 0, fmt.Errorf("invalid register encoding: %s", enc) + return 0, fmt.Errorf("invalid register length: %s", enc) } } @@ -171,6 +171,9 @@ func (r Register) EncodeFunc() (func(float64) ([]byte, error), error) { enc := strings.ToLower(r.encoding()) switch { + case strings.HasPrefix(enc, "bool"): + fallthrough + case strings.HasPrefix(enc, "int") || strings.HasPrefix(enc, "uint"): return r.encodeToBytes(func(v float64) uint64 { return uint64(v)