From 3382b91c50cc8e03a3e4dfe9bfbf583246c07552 Mon Sep 17 00:00:00 2001 From: zihluwang Date: Wed, 10 Jun 2026 19:54:23 +0800 Subject: [PATCH] Add README and LICENCE - Document features, installation, and usage - Add MIT licence with British English spellings --- LICENCE | 21 ++++++++++++ README.md | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 LICENCE create mode 100644 README.md diff --git a/LICENCE b/LICENCE new file mode 100644 index 0000000..c9ccf3b --- /dev/null +++ b/LICENCE @@ -0,0 +1,21 @@ +MIT Licence + +Copyright (c) 2026 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicence, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6abd8bf --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# Modbus Slave Simulator + +A configurable Modbus slave simulator for testing Modbus TCP, RTU, and TLS connections. + +## Features + +- **Multiple Protocols**: TCP, RTU (serial), and TLS support +- **Configurable Data Store**: Customisable sizes for coils, discrete inputs, holding registers, and input registers +- **Initial Values**: Set default values for all data types +- **Device Identity**: Configurable vendor name, product code, model, and version +- **Docker Support**: Ready-to-use Docker image + +## Installation + +### From Source + +```bash +git clone +cd modbus-slave +pip install -r requirements.txt +``` + +### With Docker + +```bash +docker pull /modbus-slave +``` + +## Usage + +### Command Line + +```bash +# TCP server (default: 127.0.0.1:5020) +python main.py + +# Custom port +python main.py --port 5020 + +# RTU mode +python main.py --type rtu --serial-port /dev/ttyUSB0 --slave-id 2 + +# Custom data store sizes +python main.py --holding-registers-size 1000 --input-registers-size 500 + +# Set initial values +python main.py --holding-registers-default 100 --coils-default true +``` + +### Docker + +```bash +# Run with defaults +docker run -p 5020:5020 /modbus-slave + +# Run with custom arguments +docker run -p 5020:5020 /modbus-slave --holding-registers-size 1000 +``` + +## Command Line Options + +| Option | Description | Default | +|--------|-------------|---------| +| `-t, --type` | Server type (tcp, rtu, tls) | tcp | +| `-h, --host` | TCP bind host | 127.0.0.1 | +| `-p, --port` | TCP/TLS port | 5020 | +| `-s, --slave-id` | Modbus slave ID | 1 | +| `--serial-port` | Serial port (RTU) | /dev/ttyUSB0 | +| `--baudrate` | Serial baudrate | 9600 | +| `--coils-size` | Number of coils | 100 | +| `--holding-registers-size` | Number of holding registers | 100 | +| `--input-registers-size` | Number of input registers | 100 | +| `--holding-registers-default` | Default value for holding registers | 0 | +| `-v, --verbose` | Increase verbosity | - | + +## Modbus Data Model + +| Function Code | Data Type | Access | +|--------------|-----------|--------| +| 0x01/0x05/0x0F | Coil | Read/Write | +| 0x02 | Discrete Input | Read Only | +| 0x03/0x06/0x10 | Holding Register | Read/Write | +| 0x04 | Input Register | Read Only | + +## Testing + +Test with `pymodbus` client: + +```python +from pymodbus.client import ModbusTcpClient + +client = ModbusTcpClient('127.0.0.1', port=5020) +result = client.read_holding_registers(0, 10) +print(result.registers) +client.close() +``` + +## Licence + +See [LICENCE](LICENCE) file.