Temperature Measurement & MODBUS Integration #17
|
@ -2,11 +2,10 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/simonvetter/modbus"
|
"github.com/simonvetter/modbus"
|
||||||
|
"k8s.io/klog"
|
||||||
)
|
)
|
||||||
|
|
||||||
func modbusValuesToFloat(v uint16) float32 {
|
func modbusValuesToFloat(v uint16) float32 {
|
||||||
|
@ -39,7 +38,7 @@ func (d *daemon) modbusConnect() error {
|
||||||
// There are currently two devices connected to the modbus.
|
// There are currently two devices connected to the modbus.
|
||||||
// The first one (slave 1) is a temperature/humidity sensor.
|
// The first one (slave 1) is a temperature/humidity sensor.
|
||||||
// The second one (slave 2) is a PTA8D08 transmitter
|
// The second one (slave 2) is a PTA8D08 transmitter
|
||||||
func (d *daemon) modbusUpdate() error {
|
func (d *daemon) modbusUpdate() {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
// Switch to slave 1 (BTA1)
|
// Switch to slave 1 (BTA1)
|
||||||
|
@ -49,19 +48,16 @@ func (d *daemon) modbusUpdate() error {
|
||||||
var registersBTA1 []uint16 // temperature, humidity
|
var registersBTA1 []uint16 // temperature, humidity
|
||||||
registersBTA1, err = d.modbusClient.ReadRegisters(1, 2, modbus.INPUT_REGISTER)
|
registersBTA1, err = d.modbusClient.ReadRegisters(1, 2, modbus.INPUT_REGISTER)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
klog.Warningf("error while reading registers from BTA1 %v", err)
|
||||||
|
} else if len(registersBTA1) != 2 {
|
||||||
|
klog.Warningf("expected two registers from modbus slave 1, but got %d", len(registersBTA1))
|
||||||
|
} else {
|
||||||
|
d.mu.Lock()
|
||||||
|
d.daemonState.tempSEM = modbusValuesToFloat(registersBTA1[0])
|
||||||
|
d.daemonState.humiditySEM = modbusValuesToFloat(registersBTA1[1])
|
||||||
|
d.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(registersBTA1) != 2 {
|
|
||||||
msg := fmt.Sprintf("Expected two registers from modbus slave 1, but got %d", len(registersBTA1))
|
|
||||||
return errors.New(msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
d.mu.Lock()
|
|
||||||
d.daemonState.tempSEM = modbusValuesToFloat(registersBTA1[0])
|
|
||||||
d.daemonState.humiditySEM = modbusValuesToFloat(registersBTA1[1])
|
|
||||||
d.mu.Unlock()
|
|
||||||
|
|
||||||
// Switch to slave 2 (KEC2)
|
// Switch to slave 2 (KEC2)
|
||||||
d.modbusClient.SetUnitId(2)
|
d.modbusClient.SetUnitId(2)
|
||||||
|
|
||||||
|
@ -72,19 +68,17 @@ func (d *daemon) modbusUpdate() error {
|
||||||
var registersKEC2 []uint16 // temperatures dp
|
var registersKEC2 []uint16 // temperatures dp
|
||||||
registersKEC2, err = d.modbusClient.ReadRegisters(0, 3, modbus.HOLDING_REGISTER)
|
registersKEC2, err = d.modbusClient.ReadRegisters(0, 3, modbus.HOLDING_REGISTER)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
klog.Warningf("error while reading registers from KEC2 %v", err)
|
||||||
|
} else if len(registersKEC2) != 3 {
|
||||||
|
klog.Warningf("expected three registers from modbus slave 2, but got %d", len(registersKEC2))
|
||||||
|
} else {
|
||||||
|
d.mu.Lock()
|
||||||
|
d.daemonState.tempDPBottom = modbusValuesToFloat(registersKEC2[0])
|
||||||
|
d.daemonState.tempDPInlet = modbusValuesToFloat(registersKEC2[1])
|
||||||
|
d.daemonState.tempDPTop = modbusValuesToFloat(registersKEC2[2])
|
||||||
|
d.mu.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(registersKEC2) != 3 {
|
|
||||||
return fmt.Errorf("expected three registers from modbus slave 2, but got %d", len(registersKEC2))
|
|
||||||
}
|
|
||||||
|
|
||||||
d.mu.Lock()
|
|
||||||
d.daemonState.tempDPBottom = modbusValuesToFloat(registersKEC2[0])
|
|
||||||
d.daemonState.tempDPInlet = modbusValuesToFloat(registersKEC2[1])
|
|
||||||
d.daemonState.tempDPTop = modbusValuesToFloat(registersKEC2[2])
|
|
||||||
d.mu.Unlock()
|
|
||||||
|
|
||||||
// Switch to slave 3 (KEC1)
|
// Switch to slave 3 (KEC1)
|
||||||
d.modbusClient.SetUnitId(3)
|
d.modbusClient.SetUnitId(3)
|
||||||
|
|
||||||
|
@ -94,17 +88,18 @@ func (d *daemon) modbusUpdate() error {
|
||||||
|
|
||||||
digitalInputRegisters, err = d.modbusClient.ReadRegisters(0x81, 8, modbus.HOLDING_REGISTER)
|
digitalInputRegisters, err = d.modbusClient.ReadRegisters(0x81, 8, modbus.HOLDING_REGISTER)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
klog.Warningf("error while reading digital inputs from KEC1 %v", err)
|
||||||
}
|
} else {
|
||||||
// Convert MODBUS words into bools
|
// Convert MODBUS words into bools
|
||||||
for idx, value := range digitalInputRegisters {
|
for idx, value := range digitalInputRegisters {
|
||||||
if value != 0 {
|
if value != 0 {
|
||||||
digitalInputs[idx] = true
|
digitalInputs[idx] = true
|
||||||
} else {
|
} else {
|
||||||
digitalInputs[idx] = false
|
digitalInputs[idx] = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// TODO: Input mapping goes here
|
||||||
}
|
}
|
||||||
// TODO: Input mapping goes here
|
|
||||||
|
|
||||||
// KFA1-KFA8
|
// KFA1-KFA8
|
||||||
var relayState [8]bool
|
var relayState [8]bool
|
||||||
|
@ -140,10 +135,8 @@ func (d *daemon) modbusUpdate() error {
|
||||||
|
|
||||||
err = d.modbusClient.WriteRegisters(0x01, registerValuesKEC1[:])
|
err = d.modbusClient.WriteRegisters(0x01, registerValuesKEC1[:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
klog.Warningf("error while updating registers %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call modbusUpdate every 100 milliseconds
|
// Call modbusUpdate every 100 milliseconds
|
||||||
|
|
Loading…
Reference in a new issue