# Modbus integration-test fixture — pymodbus simulator (Docker) The Modbus driver's integration tests talk to a [`pymodbus`](https://pymodbus.readthedocs.io/) simulator. Docker is the primary launcher — one pinned image, per-profile service in compose, same port binding (`5020`) regardless of which profile is live. A native-Python fallback lives under [`../Pymodbus/`](../Pymodbus/) for contributors who don't want to run Docker locally. | File | Purpose | |---|---| | [`Dockerfile`](Dockerfile) | `python:3.12-slim-bookworm` + `pymodbus[simulator]==3.13.0` + the four profile JSONs | | [`docker-compose.yml`](docker-compose.yml) | One service per profile (`standard` / `dl205` / `mitsubishi` / `s7_1500`); all bind `:5020` so only one runs at a time | | [`profiles/*.json`](profiles/) | Same seed-register definitions the native launcher uses — canonical source | ## Run From the repo root: ```powershell # Build + start the standard profile docker compose -f tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests\Docker\docker-compose.yml --profile standard up # DL205 quirks docker compose -f tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests\Docker\docker-compose.yml --profile dl205 up # Mitsubishi MELSEC quirks docker compose -f tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests\Docker\docker-compose.yml --profile mitsubishi up # Siemens S7-1500 MB_SERVER quirks docker compose -f tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests\Docker\docker-compose.yml --profile s7_1500 up ``` Detached + stop: ```powershell docker compose -f tests\...\Docker\docker-compose.yml --profile dl205 up -d docker compose -f tests\...\Docker\docker-compose.yml --profile dl205 down ``` Only one profile binds `:5020` at a time; switch by stopping the current service + starting another. The integration tests discriminate by a separate `MODBUS_SIM_PROFILE` env var so they skip correctly when the wrong profile is live. ## Endpoint - Default: `localhost:5020` - Override with `MODBUS_SIM_ENDPOINT` (e.g. a real PLC on `:502`). ## Run the integration tests In a separate shell with one profile live: ```powershell cd C:\Users\dohertj2\Desktop\lmxopcua dotnet test tests\ZB.MOM.WW.OtOpcUa.Driver.Modbus.IntegrationTests ``` `ModbusSimulatorFixture` probes `localhost:5020` at collection init + records a `SkipReason` when unreachable, so tests stay green on a fresh clone without Docker running. ## Native-Python fallback See [`../Pymodbus/README.md`](../Pymodbus/README.md) + `serve.ps1` — the same profiles, launched via local Python install. Kept for contributors who prefer it. Docker is the reproducible path; if CI results disagree with a local native run, Docker is the source of truth. ## References - [`../Pymodbus/README.md`](../Pymodbus/README.md) — same fixture, native launcher - [`docs/drivers/Modbus-Test-Fixture.md`](../../../docs/drivers/Modbus-Test-Fixture.md) — coverage map + gap inventory - [`docs/v2/dev-environment.md`](../../../docs/v2/dev-environment.md) §Docker fixtures — full fixture inventory