Skip to content

Commit

Permalink
Modbus: fix writing bool values (#12972)
Browse files Browse the repository at this point in the history
  • Loading branch information
andig authored Mar 15, 2024
1 parent 22498e1 commit f25c0ee
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 6 deletions.
14 changes: 11 additions & 3 deletions provider/modbus.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions util/modbus/modbus.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
5 changes: 4 additions & 1 deletion util/modbus/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit f25c0ee

Please sign in to comment.