modbus_context.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. """Readonly Modbus server context."""
  2. import logging
  3. from pymodbus.constants import ExcCodes
  4. from pymodbus.datastore import ModbusServerContext
  5. from register_store import RegisterStore
  6. logger = logging.getLogger(__name__)
  7. class ReadonlyHoldingRegisterContext(ModbusServerContext):
  8. def __init__(self, store: RegisterStore):
  9. self.simdevices = []
  10. self.store = store
  11. self._illegal_address_log_count = 0
  12. def device_ids(self) -> list[int]:
  13. return sorted(self.store._registers.keys())
  14. async def async_getValues(self, device_id: int, func_code: int, address: int, count: int = 1):
  15. if func_code != 3:
  16. return ExcCodes.ILLEGAL_FUNCTION
  17. result = self.store.read_holding_registers(device_id, address, count)
  18. if result == ExcCodes.ILLEGAL_ADDRESS and self._illegal_address_log_count < 20:
  19. self._illegal_address_log_count += 1
  20. logger.warning(
  21. "Modbus读取非法地址,slave_id=%s,address=%s,count=%s,寄存器概况=%s",
  22. device_id,
  23. address,
  24. count,
  25. self.store.describe(),
  26. )
  27. return result
  28. async def async_setValues(self, device_id: int, func_code: int, address: int, values: list[int]):
  29. return ExcCodes.ILLEGAL_FUNCTION