fix(inputs.modbus): Handle field-measurement definitions correctly on duplicate field check (#12109)
This commit is contained in:
parent
526035fc6e
commit
e097676f71
|
|
@ -110,7 +110,7 @@ func (c *ConfigurationPerRequest) Check() error {
|
||||||
def.Fields[fidx] = f
|
def.Fields[fidx] = f
|
||||||
|
|
||||||
// Check for duplicate field definitions
|
// Check for duplicate field definitions
|
||||||
id, err := c.fieldID(seed, def, f.Name)
|
id, err := c.fieldID(seed, def, f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot determine field id for %q: %v", f.Name, err)
|
return fmt.Errorf("cannot determine field id for %q: %v", f.Name, err)
|
||||||
}
|
}
|
||||||
|
|
@ -253,7 +253,7 @@ func (c *ConfigurationPerRequest) newFieldFromDefinition(def requestFieldDefinit
|
||||||
return f, nil
|
return f, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ConfigurationPerRequest) fieldID(seed maphash.Seed, def requestDefinition, name string) (uint64, error) {
|
func (c *ConfigurationPerRequest) fieldID(seed maphash.Seed, def requestDefinition, field requestFieldDefinition) (uint64, error) {
|
||||||
var mh maphash.Hash
|
var mh maphash.Hash
|
||||||
mh.SetSeed(seed)
|
mh.SetSeed(seed)
|
||||||
|
|
||||||
|
|
@ -269,13 +269,13 @@ func (c *ConfigurationPerRequest) fieldID(seed maphash.Seed, def requestDefiniti
|
||||||
if err := mh.WriteByte(0); err != nil {
|
if err := mh.WriteByte(0); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if _, err := mh.WriteString(def.Measurement); err != nil {
|
if _, err := mh.WriteString(field.Measurement); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if err := mh.WriteByte(0); err != nil {
|
if err := mh.WriteByte(0); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if _, err := mh.WriteString(name); err != nil {
|
if _, err := mh.WriteString(field.Name); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if err := mh.WriteByte(0); err != nil {
|
if err := mh.WriteByte(0); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -2086,7 +2086,6 @@ func TestCases(t *testing.T) {
|
||||||
case 4: // 64-bit
|
case 4: // 64-bit
|
||||||
binary.BigEndian.PutUint64(buf[1:], uint64(register))
|
binary.BigEndian.PutUint64(buf[1:], uint64(register))
|
||||||
}
|
}
|
||||||
fmt.Println(buf)
|
|
||||||
return buf, &mbserver.Success
|
return buf, &mbserver.Success
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
Bitfield,name=EAP,resource=30KTL,slave_id=9,type=holding_register Alarm1=0u,Alarm2=0u,Alarm3=0u,State1=32000u,State2=0u,State3=0u
|
||||||
|
Current,name=EAP,resource=30KTL,slave_id=9,type=holding_register PV1=0,PV2=0,PV3=0,PV4=0
|
||||||
|
Power,name=EAP,resource=30KTL,slave_id=9,type=holding_register AC=32080,DC=32064,Efficiency=0
|
||||||
|
Resistance,name=EAP,resource=30KTL,slave_id=9,type=holding_register Insulation=0
|
||||||
|
Status,name=EAP,resource=30KTL,slave_id=9,type=holding_register Device=32086u
|
||||||
|
Temp,name=EAP,resource=30KTL,slave_id=9,type=holding_register Internal=0
|
||||||
|
Voltage,name=EAP,resource=30KTL,slave_id=9,type=holding_register PV1=0,PV2=0,PV3=0,PV4=0
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
# Retrieve data from MODBUS slave devices
|
||||||
|
[[inputs.modbus]]
|
||||||
|
|
||||||
|
# Hiermit wird auch _time auf 60s (also ganze Minuten) gerundet
|
||||||
|
# Sollten (nach der Timestamp Rundung) mehrere Abfragen auf denselben Timestamp (_time)
|
||||||
|
# kommen wird kein Fehler geworfen, sondern der bestehende Wert wird einfach upgedated!
|
||||||
|
precision = "60s"
|
||||||
|
|
||||||
|
|
||||||
|
## Connection Configuration
|
||||||
|
##
|
||||||
|
## The plugin supports connections to PLCs via MODBUS/TCP, RTU over TCP, ASCII over TCP or
|
||||||
|
## via serial line communication in binary (RTU) or readable (ASCII) encoding
|
||||||
|
##
|
||||||
|
## Device name
|
||||||
|
name = "EAP"
|
||||||
|
|
||||||
|
## Timeout for each request
|
||||||
|
timeout = "500ms"
|
||||||
|
|
||||||
|
## Maximum number of retries and the time to wait between retries
|
||||||
|
## when a slave-device is busy.
|
||||||
|
busy_retries = 3
|
||||||
|
busy_retries_wait = "200ms"
|
||||||
|
|
||||||
|
# TCP - connect via Modbus/TCP
|
||||||
|
controller = "tcp://192.168.254.223:502"
|
||||||
|
|
||||||
|
## Trace the connection to the modbus device as debug messages
|
||||||
|
## Note: You have to enable telegraf's debug mode to see those messages!
|
||||||
|
debug_connection = true
|
||||||
|
|
||||||
|
## Define the configuration schema
|
||||||
|
## |---register -- define fields per register type in the original style (only supports one slave ID)
|
||||||
|
## |---request -- define fields on a requests base
|
||||||
|
configuration_type = "request"
|
||||||
|
|
||||||
|
## --- "request" configuration style ---
|
||||||
|
|
||||||
|
## Per request definition
|
||||||
|
##
|
||||||
|
|
||||||
|
## Define a request sent to the device
|
||||||
|
[[inputs.modbus.request]]
|
||||||
|
slave_id = 9
|
||||||
|
byte_order = "ABCD"
|
||||||
|
register = "holding"
|
||||||
|
fields = [
|
||||||
|
{ address=32000, measurement="Bitfield", name="State1", type="UINT16" },
|
||||||
|
{ address=32002, measurement="Bitfield", name="State2", type="UINT16" },
|
||||||
|
{ address=32003, measurement="Bitfield", name="State3", type="UINT32" },
|
||||||
|
{ address=32008, measurement="Bitfield", name="Alarm1", type="UINT16" },
|
||||||
|
{ address=32009, measurement="Bitfield", name="Alarm2", type="UINT16" },
|
||||||
|
{ address=32010, measurement="Bitfield", name="Alarm3", type="UINT16" },
|
||||||
|
{ address=32016, measurement="Voltage", name="PV1", type="INT16", scale=0.1, output="FLOAT64" },
|
||||||
|
{ address=32017, measurement="Current", name="PV1", type="INT16", scale=0.01, output="FLOAT64" },
|
||||||
|
{ address=32018, measurement="Voltage", name="PV2", type="INT16", scale=0.1, output="FLOAT64" },
|
||||||
|
{ address=32019, measurement="Current", name="PV2", type="INT16", scale=0.01, output="FLOAT64" },
|
||||||
|
{ address=32020, measurement="Voltage", name="PV3", type="INT16", scale=0.1, output="FLOAT64" },
|
||||||
|
{ address=32021, measurement="Current", name="PV3", type="INT16", scale=0.01, output="FLOAT64" },
|
||||||
|
{ address=32022, measurement="Voltage", name="PV4", type="INT16", scale=0.1, output="FLOAT64" },
|
||||||
|
{ address=32023, measurement="Current", name="PV4", type="INT16", scale=0.01, output="FLOAT64" },
|
||||||
|
{ address=32064, measurement="Power", name="DC", type="INT32", output="FLOAT64" },
|
||||||
|
{ address=32080, measurement="Power", name="AC", type="INT32", output="FLOAT64" },
|
||||||
|
{ address=32086, measurement="Power", name="Efficiency", type="UINT16", scale=0.01, output="FLOAT64" },
|
||||||
|
{ address=32087, measurement="Temp", name="Internal", type="INT16", scale=0.1, output="FLOAT64" },
|
||||||
|
{ address=32088, measurement="Resistance", name="Insulation", type="UINT16", scale=0.001, output="FLOAT64" },
|
||||||
|
{ address=32089, measurement="Status", name="Device", type="UINT16" },
|
||||||
|
]
|
||||||
|
[inputs.modbus.request.tags]
|
||||||
|
resource = "30KTL"
|
||||||
Loading…
Reference in New Issue