| 1234567891011121314151617181920212223242526272829303132333435363738 |
- """Readonly Modbus server context."""
- import logging
- from pymodbus.constants import ExcCodes
- from pymodbus.datastore import ModbusServerContext
- from register_store import RegisterStore
- logger = logging.getLogger(__name__)
- class ReadonlyHoldingRegisterContext(ModbusServerContext):
- def __init__(self, store: RegisterStore):
- self.simdevices = []
- self.store = store
- self._illegal_address_log_count = 0
- def device_ids(self) -> list[int]:
- return sorted(self.store._registers.keys())
- async def async_getValues(self, device_id: int, func_code: int, address: int, count: int = 1):
- if func_code != 3:
- return ExcCodes.ILLEGAL_FUNCTION
- result = self.store.read_holding_registers(device_id, address, count)
- if result == ExcCodes.ILLEGAL_ADDRESS and self._illegal_address_log_count < 20:
- self._illegal_address_log_count += 1
- logger.warning(
- "Modbus读取非法地址,slave_id=%s,address=%s,count=%s,寄存器概况=%s",
- device_id,
- address,
- count,
- self.store.describe(),
- )
- return result
- async def async_setValues(self, device_id: int, func_code: int, address: int, values: list[int]):
- return ExcCodes.ILLEGAL_FUNCTION
|