Skip to content

Commit 4cd0d40

Browse files
committed
improve error handling for write bit and test write single bit
1 parent 8ba0cfa commit 4cd0d40

3 files changed

Lines changed: 9 additions & 5 deletions

File tree

classes/protocol_settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,7 @@ def process_register_ushort(self, registry : dict[int, int], entry : registry_ma
10581058
else:
10591059
flags : list[str] = []
10601060
if end_bit > 0:
1061-
end : int = 16 if end_bit >= 16 else end_bit
1061+
end : int = 16 if end_bit >= 16 else end_bit
10621062
for i in range(start_bit, end): # Iterate over each bit position (0 to 15)
10631063
# Check if the i-th bit is set
10641064
if (val >> i) & 1:

classes/transports/modbus_base.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -390,12 +390,12 @@ def write_variable(self, entry : registry_map_entry, value : str, registry_type
390390

391391
if not self.write_mode == TransportWriteMode.UNSAFE:
392392
if not self.protocolSettings.validate_registry_entry(entry, current_value):
393-
self._log.error(f"WRITE_ERROR: Invalid value in register '{current_value}'. Unsafe to write")
393+
return self._log.error(f"WRITE_ERROR: Invalid value in register '{current_value}'. Unsafe to write")
394394
#raise ValueError(err)
395395

396396
if not (entry.data_type == Data_Type._16BIT_FLAGS or entry.data_type == Data_Type._8BIT_FLAGS or entry.data_type == Data_Type._32BIT_FLAGS): #skip validation for write; validate further down
397397
if not self.protocolSettings.validate_registry_entry(entry, value):
398-
self._log.error(f"WRITE_ERROR: Invalid new value, '{value}'. Unsafe to write")
398+
return self._log.error(f"WRITE_ERROR: Invalid new value, '{value}'. Unsafe to write")
399399

400400
#handle codes
401401
if entry.variable_name+"_codes" in self.protocolSettings.codes:
@@ -419,8 +419,8 @@ def write_variable(self, entry : registry_map_entry, value : str, registry_type
419419
bit_size = Data_Type.getSize(entry.data_type)
420420

421421
new_val = int(value)
422-
if 0 > new_val or new_val > 2**bit_size:
423-
raise ValueError("Invalid value")
422+
if 0 > new_val or new_val > (2**bit_size -1): # Calculate max value for n bits: 2^n - 1
423+
return self._log.error(f"WRITE_ERROR: Invalid new value, '{value}'. Exceeds value range. Unsafe to write")
424424

425425
bit_index = entry.register_bit
426426
bit_mask = ((1 << bit_size) - 1) << bit_index # Create a mask for extracting X bits starting from bit_index

protocols/test.holding_registry_map.csv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ variable name,data type,writable,register,documented name,description,values,uni
2020
,,W,21,decimal,,0-59,0.1,
2121
,8bit_flags,W,22,bit_flags1,,"{""b0"": ""bit 0"", ""b1"": ""bit 1"",""b2"": ""bit 2"",""b3"": ""bit 3"", ""b4"": ""bit 4"",""b5"": ""bit 5"", ""b6"": ""bit 6"", ""b7"": ""bit 7""}",,
2222
,8bit_flags,W,22.b8,bit_flags2,,"{""b0"": ""bit 0"", ""b1"": ""bit 1"",""b2"": ""bit 2"",""b3"": ""bit 3"", ""b4"": ""bit 4"",""b5"": ""bit 5"", ""b6"": ""bit 6"", ""b7"": ""bit 7""}",,
23+
,1bit,W,23.b4,1bit,,0~1,,
24+
,1bit,W,23.b5,1bit_1,,0~1,,
25+
,1bit,W,23.b6,1bit_2,,0~1,,
26+
,1bit,W,23.b7,1bit_3,,0~1,,

0 commit comments

Comments
 (0)