Modbus: fix writing bool values (#12972)

This commit is contained in:
andig 2024-03-15 14:04:04 +01:00 • committed by GitHub
parent 22498e1637
commit f25c0eece6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 17 additions and 6 deletions

View file

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

View file

@ -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) {

View file

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