Skip to content

Commit 56d0c0e

Browse files
committed
Work in progress: pymodbus 3.x compatibility investigation
Findings: - Added three-phase AC power register handlers (ac_power_r_high/low, etc.) - Implemented both sync and async getValues methods - Discovered that pymodbus 3.x doesn't call overridden getValues/async_getValues - Data appears to come from internal storage with addressing offset - Test shows registers shifted by +1 (register N returns value for N+1) The simulator correctly calculates all values, but Mod bus serving has compatibility issue with pymodbus 3.x that needs further investigation into the library's internals.
1 parent 461e14f commit 56d0c0e

1 file changed

Lines changed: 20 additions & 32 deletions

File tree

emulator/modbus_server.py

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -46,25 +46,11 @@ def update_from_simulator(self):
4646
for addr, reg_def in registers.items():
4747
value = self.simulator.get_register_value(self.register_type, addr)
4848
if value is not None:
49-
# WORKAROUND: pymodbus 3.x has an off-by-one quirk where reading address N
50-
# returns the value stored at address N+1. To compensate, store value for
51-
# register N at address N-1.
52-
store_addr = addr - 1
53-
if store_addr < 0:
54-
continue # Skip register 0
55-
56-
# Debug logging for key registers
57-
if addr in [38, 39, 1011, 1012, 1013, 1014]:
58-
logger.info(f" Setting register {addr} to {value} (storing at {store_addr})")
59-
# Use parent's setValues to update internal storage
60-
result = super().setValues(store_addr, [value])
61-
if addr in [38, 39, 1011, 1012, 1013, 1014]:
62-
# Verify it was set correctly
63-
verify = super().getValues(store_addr, 1)
64-
logger.info(f" Verify: getValues({store_addr}) returns {verify}")
65-
66-
def _get_values_from_simulator(self, address, count):
67-
"""Helper to get values from simulator.
49+
# Store directly at the register address
50+
super().setValues(addr, [value])
51+
52+
def getValues(self, address, count=1):
53+
"""Get register values from simulator (sync).
6854
6955
Args:
7056
address: Starting register address
@@ -82,18 +68,6 @@ def _get_values_from_simulator(self, address, count):
8268
values.append(value)
8369
return values
8470

85-
def getValues(self, address, count=1):
86-
"""Get register values from simulator (sync).
87-
88-
Args:
89-
address: Starting register address
90-
count: Number of registers to read
91-
92-
Returns:
93-
List of register values
94-
"""
95-
return self._get_values_from_simulator(address, count)
96-
9771
async def async_getValues(self, address, count=1):
9872
"""Get register values from simulator (async).
9973
@@ -104,7 +78,21 @@ async def async_getValues(self, address, count=1):
10478
Returns:
10579
List of register values
10680
"""
107-
return self._get_values_from_simulator(address, count)
81+
values = []
82+
for i in range(count):
83+
addr = address + i
84+
value = self.simulator.get_register_value(self.register_type, addr)
85+
if value is None:
86+
value = 0 # Default for unmapped registers
87+
values.append(value)
88+
89+
# Debug logging
90+
if address >= 38 and address <= 49:
91+
logger.info(f"async_getValues({address}, {count}) returning {values}")
92+
elif address >= 1009 and address <= 1063:
93+
logger.info(f"async_getValues({address}, {count}) returning {values}")
94+
95+
return values
10896

10997
def validate(self, address, count=1):
11098
"""Validate the request and return the address range.

0 commit comments

Comments
 (0)