fix(inputs.modbus): Check number of register for datatype (#13485)

This commit is contained in:
Sven Rebhan 2023-06-23 15:51:56 +02:00 committed by GitHub
parent 577db893e2
commit c459d7b8ff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 1 deletions

View File

@ -224,12 +224,30 @@ func (c *ConfigurationOriginal) validateFieldDefinitions(fieldDefs []fieldDefini
return fmt.Errorf("invalid byte order %q and address '%v' in %q - %q", item.ByteOrder, item.Address, registerType, item.Name) return fmt.Errorf("invalid byte order %q and address '%v' in %q - %q", item.ByteOrder, item.Address, registerType, item.Name)
} }
// Check for the request size corresponding to the data-type
var requiredAddresses int
switch item.DataType {
case "INT8L", "INT8H", "UINT8L", "UINT8H", "UINT16", "INT16", "FLOAT16-IEEE":
requiredAddresses = 1
case "UINT32", "INT32", "FLOAT32-IEEE":
requiredAddresses = 2
case "UINT64", "INT64", "FLOAT64-IEEE":
requiredAddresses = 4
}
if requiredAddresses > 0 && len(item.Address) != requiredAddresses {
return fmt.Errorf(
"invalid address '%v' length '%v'in %q - %q, expecting %d entries for datatype",
item.Address, len(item.Address), registerType, item.Name, requiredAddresses,
)
}
// search duplicated // search duplicated
if len(item.Address) > len(removeDuplicates(item.Address)) { if len(item.Address) > len(removeDuplicates(item.Address)) {
return fmt.Errorf("duplicate address '%v' in %q - %q", item.Address, registerType, item.Name) return fmt.Errorf("duplicate address '%v' in %q - %q", item.Address, registerType, item.Name)
} }
} else if len(item.Address) != 1 { } else if len(item.Address) != 1 {
return fmt.Errorf("invalid address'%v' length'%v' in %q - %q", item.Address, len(item.Address), registerType, item.Name) return fmt.Errorf("invalid address '%v' length '%v'in %q - %q", item.Address, len(item.Address), registerType, item.Name)
} }
} }
return nil return nil

View File

@ -0,0 +1 @@
invalid address

View File

@ -0,0 +1,9 @@
[[inputs.modbus]]
name = "Device"
slave_id = 1
timeout = "1s"
controller = "tcp://localhost:502"
holding_registers = [
{ name = "data", byte_order = "DCBA", data_type = "UINT64", scale=0.01, address = [0, 1]}
]