@@ -29,7 +29,6 @@ class RegisterSpec:
2929 Attributes:
3030 address (int): Modbus register address.
3131 count (int): Number of consecutive registers to read.
32- scale (int): Scaling factor to apply to the raw integer value.
3332 decimals (int): Number of decimal places to round the scaled value to.
3433 writable (bool): Whether this register can be written to.
3534 range (bool): Whether range validation should be performed.
@@ -39,8 +38,8 @@ class RegisterSpec:
3938
4039 address : int
4140 count : int
41+ reg_type : int
4242 decimals : int = 0
43- scale : int = 1
4443 range : bool = False
4544 min : int = 0
4645 max : int = 0x7FFFFFFF
@@ -127,7 +126,7 @@ class Dcm230:
127126 MAX_REGS = 2
128127
129128 _register_specs : Final [dict [str , RegisterSpec ]] = {
130- "V" : RegisterSpec (address = 0x0000 , count = 2 , decimals = 1 ),
129+ "V" : RegisterSpec (address = 0x0000 , count = 2 , decimals = 1 , reg_type = 0x03 ),
131130 }
132131
133132 def __init__ (self , device_address : int , client : ModbusSerialClient ) -> None :
@@ -140,8 +139,8 @@ def __init__(self, device_address: int, client: ModbusSerialClient) -> None:
140139 self .device_address = device_address
141140 self .client = client
142141
143- def _read_input_registers (self , address : int , count : int ) -> list [int ]:
144- """Safely read input registers from the Modbus device.
142+ def _read_registers (self , address : int , count : int , reg_type : int ) -> list [int ]:
143+ """Safely read input or holding registers from the Modbus device.
145144
146145 Args:
147146 address: Starting register address to read.
@@ -152,10 +151,20 @@ def _read_input_registers(self, address: int, count: int) -> list[int]:
152151
153152 Raises:
154153 ModbusException: If the read operation fails or returns an error.
154+ ValueError: If register type is incorrect.
155155 """
156- result = self .client .read_input_registers (
157- address = address , count = count , device_id = self .device_address
158- )
156+ if reg_type == 0x03 :
157+ result = self .client .read_input_registers (
158+ address = address , count = count , device_id = self .device_address
159+ )
160+ elif reg_type == 0x04 :
161+ result = self .client .read_holding_registers (
162+ address = address , count = count , device_id = self .device_address
163+ )
164+ else :
165+ msg = f"Unsupported reg_type: { reg_type } "
166+ raise ValueError (msg )
167+
159168 if result .isError ():
160169 msg = (
161170 "Failed to read input register. "
@@ -178,7 +187,7 @@ def _read_register(self, register_name: str) -> Decimal | int:
178187 ModbusException: If Modbus read operation fails.
179188 """
180189 spec = self ._register_specs [register_name ]
181- regs = self ._read_input_registers (spec .address , spec .count )
190+ regs = self ._read_registers (spec .address , spec .count , spec . reg_type )
182191
183192 if len (regs ) < self .MAX_REGS :
184193 regs .append (0 )
0 commit comments