From d6abf15f1b7028821ee5d1a6614f18dc1be45bc4 Mon Sep 17 00:00:00 2001 From: jan iversen Date: Sun, 5 Jan 2025 15:27:44 +0100 Subject: [PATCH] Simulator datastore. --- doc/index.rst | 5 +- doc/source/_static/examples.tgz | Bin 41100 -> 41182 bytes doc/source/_static/examples.zip | Bin 41477 -> 42706 bytes doc/source/simulator.rst | 58 +++++- doc/source/simulator3.rst | 40 ++++ examples/simulator_datamodel.py | 94 +++++++++ pymodbus/simulator/__init__.py | 10 + pymodbus/simulator/simcore.py | 2 + pymodbus/simulator/simdata.py | 248 +++++++++++++++++++++++ test/examples/__init__.py | 1 - test/framer/__init__.py | 1 - test/framer/test_framer.py | 3 +- test/pdu/__init__.py | 1 - test/pdu/test_register_write_messages.py | 3 +- test/simulator/test_simdata.py | 5 + test/transport/__init__.py | 1 - 16 files changed, 454 insertions(+), 18 deletions(-) create mode 100644 doc/source/simulator3.rst create mode 100755 examples/simulator_datamodel.py create mode 100644 pymodbus/simulator/__init__.py create mode 100644 pymodbus/simulator/simcore.py create mode 100644 pymodbus/simulator/simdata.py delete mode 100644 test/examples/__init__.py delete mode 100644 test/framer/__init__.py delete mode 100644 test/pdu/__init__.py create mode 100644 test/simulator/test_simdata.py delete mode 100644 test/transport/__init__.py diff --git a/doc/index.rst b/doc/index.rst index c2073f1f9..92678510f 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -12,11 +12,12 @@ Please select a topic in the left hand column. source/client source/server source/repl + source/simulator3 source/simulator source/examples source/authors source/changelog source/internals source/roadmap - -.. include:: ../README.rst \ No newline at end of file + +.. include:: ../README.rst diff --git a/doc/source/_static/examples.tgz b/doc/source/_static/examples.tgz index 67da30b8c95ed50591c74bb1f6185f015faeb13b..8e4ad1c21a780416489405efd9ee0711f2b0446d 100644 GIT binary patch delta 39936 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 z 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

AicNg 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 delta 39802 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 diff --git a/doc/source/simulator.rst b/doc/source/simulator.rst index 3ebe94ebd..ef8e14fdb 100644 --- a/doc/source/simulator.rst +++ b/doc/source/simulator.rst @@ -30,11 +30,53 @@ The REST API allow the test process to be automated - check the result with another simple REST API command, - test your client app in a true end-to-end fashion. -.. toctree:: - :maxdepth: 4 - :hidden: - - library/simulator/config - library/simulator/datastore - library/simulator/web - library/simulator/restapi +Data model configuration +------------------------ + +The simulator data model represent the registers and parameters of the simulated devices. +The data model is defined using :class:`SimData` and :class:`SimDevice` + +:class:`SimData` defines a group of continuous identical registers. + +:class:`SimDevice` defines device parameters and a list of :class:`SimData` defining +shared/block registers. + +A server consist of communication parameters and a list of devices. + +:class:`SimDataType` is a helper class that defines legal datatypes. + +:class:`SimActions` is a helper class that defines built in actions. + +:github:`examples/simulator_datamodel.py` contains usage examples. + +SimData +^^^^^^^ + +.. autoclass:: pymodbus.simulator.SimData + :members: + :undoc-members: + :show-inheritance: + +SimDevice +^^^^^^^^^ + +.. autoclass:: pymodbus.simulator.SimDevice + :members: + :undoc-members: + :show-inheritance: + +SimDataType +^^^^^^^^^^^ + +.. autoclass:: pymodbus.simulator.SimDataType + :members: + :undoc-members: + :show-inheritance: + +SimActions +^^^^^^^^^^ + +.. autoclass:: pymodbus.simulator.SimActions + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/simulator3.rst b/doc/source/simulator3.rst new file mode 100644 index 000000000..2efd9f515 --- /dev/null +++ b/doc/source/simulator3.rst @@ -0,0 +1,40 @@ +Simulator (3.x) +=============== + +The simulator is a full fledged modbus simulator, which is +constantly being evolved with user ideas / amendments. + +The purpose of the simulator is to provide support for client +application test harnesses with end-to-end testing simulating real life +modbus devices. + +The datastore simulator allows the user to (all automated) + +- simulate a modbus device by adding a simple configuration, +- test how a client handles modbus exceptions, +- test a client apps correct use of the simulated device. + +The web interface allows the user to (online / manual) + +- test how a client handles modbus errors, +- test how a client handles communication errors like divided messages, +- run your test server in the cloud, +- monitor requests/responses, +- inject modbus errors like malicious a response, +- see/Change values online. + +The REST API allow the test process to be automated + +- spin up a test server with unix domain sockets in your test harness, +- set expected responses with a simple REST API command, +- check the result with another simple REST API command, +- test your client app in a true end-to-end fashion. + +.. toctree:: + :maxdepth: 4 + :hidden: + + library/simulator/config + library/simulator/datastore + library/simulator/web + library/simulator/restapi diff --git a/examples/simulator_datamodel.py b/examples/simulator_datamodel.py new file mode 100755 index 000000000..4af1fb9cc --- /dev/null +++ b/examples/simulator_datamodel.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +"""Pymodbus simulator server/client Example. + +An example of how to use the simulator (server) with a client. + +for usage see documentation of simulator + +.. tip:: pymodbus.simulator starts the server directly from the commandline +""" +import asyncio +import logging + +from pymodbus import FramerType +from pymodbus.client import AsyncModbusTcpClient +from pymodbus.datastore import ModbusSimulatorContext +from pymodbus.server import ModbusSimulatorServer, get_simulator_commandline + + +_logger = logging.getLogger(__file__) + + +async def read_registers( + client, addr, count, is_int, curval=None, minval=None, maxval=None +): + """Run modbus call.""" + rr = await client.read_holding_registers(addr, count=count, slave=1) + assert not rr.isError() + if count == 1: + value = rr.registers[0] + else: + value = ModbusSimulatorContext.build_value_from_registers(rr.registers, is_int) + if not is_int: + value = round(value, 1) + if curval: + assert value == curval, f"{value} == {curval}" + else: + assert minval <= value <= maxval, f"{minval} <= {value} <= {maxval}" + + +async def run_calls(client, count): + """Run client calls.""" + _logger.info("### Read fixed/increment/random value of different types.") + _logger.info("--> UINT16") + for count in range(1, 5): + await read_registers(client, 1148, 1, True, curval=32117) + await read_registers(client, 2305, 1, True, curval=50 + count) + await read_registers(client, 2306, 1, True, minval=45, maxval=55) + + _logger.info("--> UINT32") + await read_registers(client, 3188, 2, True, curval=32514) + await read_registers(client, 3876, 2, True, curval=50000 + count) + await read_registers(client, 3878, 2, True, minval=45000, maxval=55000) + + _logger.info("--> FLOAT32") + await read_registers(client, 4188, 2, False, curval=32514.2) + await read_registers(client, 4876, 2, False, curval=50000.0 + count) + await read_registers(client, 4878, 2, False, minval=45000.0, maxval=55000.0) + + +async def run_simulator(): + """Run server.""" + _logger.info("### start server simulator") + cmdline = [ + "--modbus_device", + "device_try", + "--modbus_server", + "server", + ] + cmd_args = get_simulator_commandline(cmdline=cmdline) + task = ModbusSimulatorServer(**cmd_args) + await task.run_forever(only_start=True) + + _logger.info("### start client") + client = AsyncModbusTcpClient( + "127.0.0.1", + port=5020, + framer=FramerType.SOCKET, + ) + await client.connect() + assert client.connected + + _logger.info("### run calls") + await run_calls(client, 1) + + _logger.info("### shutdown client") + client.close() + + _logger.info("### shutdown server") + await task.stop() + _logger.info("### Thanks for now.") + + +if __name__ == "__main__": + asyncio.run(run_simulator(), debug=True) diff --git a/pymodbus/simulator/__init__.py b/pymodbus/simulator/__init__.py new file mode 100644 index 000000000..bb6ef7874 --- /dev/null +++ b/pymodbus/simulator/__init__.py @@ -0,0 +1,10 @@ +"""Simulator.""" + +__all__ = [ + "SimActions", + "SimData", + "SimDataType", + "SimDevice", +] + +from pymodbus.simulator.simdata import SimActions, SimData, SimDataType, SimDevice diff --git a/pymodbus/simulator/simcore.py b/pymodbus/simulator/simcore.py new file mode 100644 index 000000000..efd3339d1 --- /dev/null +++ b/pymodbus/simulator/simcore.py @@ -0,0 +1,2 @@ +"""Simulator data model classes.""" +from __future__ import annotations diff --git a/pymodbus/simulator/simdata.py b/pymodbus/simulator/simdata.py new file mode 100644 index 000000000..217ad054b --- /dev/null +++ b/pymodbus/simulator/simdata.py @@ -0,0 +1,248 @@ +"""Simulator data model classes.""" +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass +from enum import Enum + + +class SimDataType(Enum): + """Register types, used to define group of registers. + + more doc. + """ + + #: 1 integer == 1 register + INT16 = 1 + #: 1 positive integer == 1 register + UINT16 = 2 + #: 1 integer == 2 registers + INT32 = 3 + #: 1 positive integer == 2 register2 + UINT32 = 4 + #: 1 integer == 4 registers + INT64 = 5 + #: 1 positive integer == 4 register + UINT64 = 6 + #: 1 float == 2 registers + FLOAT32 = 7 + #: 1 float == 4 registers + FLOAT64 = 8 + #: 1 string == len(string) / 2 registers + STRING = 9 + #: (coil) + BITS = 10 + #: (coil) + REGISTERS = 11 + #: (coil) + DEFAULT = 12 + +@dataclass(frozen=True) +class SimData: + """Configure a group of continuous identical registers. + + **Example**: + + .. code-block:: python + + SimData( + start_register=100, + count=5, + value=-123456 + datatype=SimDataType.INT32 + ) + + The above code defines 5 INT32, each with the value -123456, in total 20 registers. + + .. tip:: use SimDatatype.DEFAULT to define register limits: + + .. code-block:: python + + SimData( + start_register=0, # First legal registers + count=1000, # last legal register is start_register+count-1 + value=0x1234 # Default register value + datatype=SimDataType.DEFAULT + ) + + The above code sets the range of legal registers to 0..9999 all with the value 0x1234. + Accessing non-defined registers will cause an exception response. + + .. attention:: Using SimDataType.DEFAULT is a LOT more efficient to define all registers, than \ + the other datatypes. This is because default registers are not created unless written to, whereas \ + the registers of other datatypes are each created as objects. + """ + + #: Address of first register, starting with 0. + #: + #: .. caution:: No default, must be defined. + start_register: int + + #: Value of datatype, to initialize the registers (repeated with count, apart from string). + #: + #: Depending on in which block the object is used some value types are not legal e.g. float cannot + #: be used to define coils. + value: int | float | str | bool | bytes = 0 + + #: Count of datatype e.g. count=3 datatype=SimdataType.INT32 is 6 registers. + #: + #: SimdataType.STR is special: + #: + #: - count=1, value="ABCD" is 2 registers + #: - count=3, value="ABCD" is 6 registers, with "ABCD" repeated 3 times. + count: int = 1 + + #: Datatype, used to check access and calculate register count. + #: + #: .. note:: Default is SimDataType.REGISTERS + datatype: SimDataType = SimDataType.REGISTERS + + #: Optional function to call when registers are being read/written. + #: + #: action can be a builtin from :class:`SimActions` or one defined in the app. + #: + #: .. code-block:: python + #: + #: def my_action( + #: regs: SimData, + #: addr: int, + #: value: int | float | str | bool | bytes + #: ) -> int | float | str | bool | bytes: + #: return value + 1 + #: + #: .. tip:: use functools.partial to add extra parameters if needed. + action: Callable[[SimData, int, int | float | str | bool | bytes], int | float | str | bool | bytes] | None = None + + def __post_init__(self): + """Define a group of registers.""" + if not isinstance(self.start_register, int) or not 0 <= self.start_register < 65535: + raise TypeError("0 <= start_register < 65535") + if not isinstance(self.count, int) or not 0 < self.count <= 65535: + raise TypeError("0 < count <= 65535") + if not isinstance(self.datatype, SimDataType): + raise TypeError("datatype not SimDataType") + if self.action and not callable(self.action): + raise TypeError("action not Callable") + + +@dataclass(frozen=True) +class SimDevice: + """Configure a device with parameters and registers. + + Registers can be defined as shared or as 4 separate blocks. + + shared_block means all requests access the same registers, + allowing e.g. coils to be read as a holding register (except if type_checking is True). + + .. danger:: Shared mode cannot be mixed with non-shared mode ! + + In shared mode, individual coils/direct input cannot be addressed directly ! Instead + the register address is used with count. In non-shared mode coils/direct input can be + addressed directly. + + **Device with shared registers**:: + + SimDevice( + Device_id=0, + block_shared=[SimData(...)] + ) + + **Device with non-shared registers**:: + + SimDevice( + Device_id=0, + block_coil=[SimData(...)], + block_direct=[SimData(...)], + block_holding=[SimData(...)], + block_input=[SimData(...)], + ) + + A server can contain either a single :class:`SimDevice` or list of :class:`SimDevice` to simulate a + multipoint line. + """ + + #: Address of device + #: + #: Default 0 means accept all devices, except those defined in the same server. + #: + #: .. warning:: A server with a single device device_id=0 accept all requests. + device_id: int = 0 + + #: Enforce type checking, if True access are controlled to be conform with datatypes. + #: + #: Used to control that read_coils do not access a register defined as holding and visaversa + type_check: bool = False + + #: Use this block for shared registers (Modern devices). + #: + #: Requests accesses all registers in this block. + #: + #: .. warning:: cannot be used together with other block_* parameters! + block_shared: list[SimData] | None = None + + #: Use this block for non-shared registers (very old devices). + #: + #: In this block an address is a single coil, there are no registers. + #: + #: Request of type read/write_coil accesses this block. + #: + #: .. tip:: block_coil/direct/holding/input must all be defined + block_coil: list[SimData] | None = None + + #: Use this block for non-shared registers (very old devices). + #: + #: In this block an address is a single direct relay, there are no registers. + #: + #: Request of type read/write_direct_input accesses this block. + #: + #: .. tip:: block_coil/direct/holding/input must all be defined + block_direct: list[SimData] | None = None + + #: Use this block for non-shared registers (very old devices). + #: + #: In this block an address is a register. + #: + #: Request of type read/write_holding accesses this block. + #: + #: .. tip:: block_coil/direct/holding/input must all be defined + block_holding: list[SimData] | None = None + + + #: Use this block for non-shared registers (very old devices). + #: + #: In this block an address is a register. + #: + #: Request of type read/write_input accesses this block. + #: + #: .. tip:: block_coil/direct/holding/input must all be defined + block_input: list[SimData] | None = None + + def __post_init__(self): + """Define a device.""" + if not isinstance(self.device_id, int) or not 0 <= self.device_id < 255: + raise TypeError("0 <= device_id < 255") + if not isinstance(self.type_check, bool): + raise TypeError("type_check not bool") + blocks = [(self.block_shared, "shared")] + if self.block_shared: + if self.block_coil or self.block_direct or self.block_holding or self.block_input: + raise TypeError("block_* cannot be used with block_shared") + else: + blocks = [ + (self.block_coil, "coil"), + (self.block_direct, "direct"), + (self.block_holding, "holding"), + (self.block_input, "input")] + + for block, name in blocks: + if not block: + raise TypeError(f"block_{name} not defined") + if not isinstance(block, list): + raise TypeError(f"block_{name} not a list") + for entry in block: + if not isinstance(entry, SimData): + raise TypeError(f"block_{name} contains non SimData entries") + + +class SimActions: # pylint: disable=too-few-public-methods + """Defines builtin actions.""" diff --git a/test/examples/__init__.py b/test/examples/__init__.py deleted file mode 100644 index 5f2eb76e0..000000000 --- a/test/examples/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Test of examples.""" diff --git a/test/framer/__init__.py b/test/framer/__init__.py deleted file mode 100644 index 6120f1a8f..000000000 --- a/test/framer/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Test of message layer.""" diff --git a/test/framer/test_framer.py b/test/framer/test_framer.py index a07ceed03..15ea4ce60 100644 --- a/test/framer/test_framer.py +++ b/test/framer/test_framer.py @@ -12,8 +12,7 @@ FramerType, ) from pymodbus.pdu import DecodePDU, ModbusPDU - -from .generator import set_calls +from test.framer.generator import set_calls class TestFramer: diff --git a/test/pdu/__init__.py b/test/pdu/__init__.py deleted file mode 100644 index 6120f1a8f..000000000 --- a/test/pdu/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Test of message layer.""" diff --git a/test/pdu/test_register_write_messages.py b/test/pdu/test_register_write_messages.py index 239abbfe2..1dd4cf08d 100644 --- a/test/pdu/test_register_write_messages.py +++ b/test/pdu/test_register_write_messages.py @@ -9,8 +9,7 @@ WriteSingleRegisterRequest, WriteSingleRegisterResponse, ) - -from ..conftest import MockLastValuesContext +from test.conftest import MockLastValuesContext # ---------------------------------------------------------------------------# diff --git a/test/simulator/test_simdata.py b/test/simulator/test_simdata.py new file mode 100644 index 000000000..302b23190 --- /dev/null +++ b/test/simulator/test_simdata.py @@ -0,0 +1,5 @@ +"""Test pdu.""" + + +class TestSimData: + """Test simulator data config.""" diff --git a/test/transport/__init__.py b/test/transport/__init__.py deleted file mode 100644 index 430da4624..000000000 --- a/test/transport/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Test of transport layer."""