modbuslink


Namemodbuslink JSON
Version 1.1.1 PyPI version JSON
download
home_pageNone
Summary现代化、功能强大、开发者友好且高度可扩展的Python Modbus库 | Modern, powerful, developer-friendly and highly scalable Python Modbus library
upload_time2025-08-08 06:34:43
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords modbus industrial automation communication protocol tcp rtu ascii serial plc scada iot
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ModbusLink

English | [中文版](README-zh_CN.md)

[![PyPI Downloads](https://static.pepy.tech/badge/modbuslink)](https://pepy.tech/projects/modbuslink)
[![PyPI version](https://badge.fury.io/py/modbuslink.svg)](https://badge.fury.io/py/modbuslink)

A modern, powerful, and developer-friendly Python Modbus library with comprehensive transport layer support.

## Features

- **🏗️ Layered Architecture**: Clean separation of transport, client, server, and utility layers
- **🔌 Multiple Transports**: TCP, RTU, and ASCII with both sync and async support
- **⚡ High Performance**: Asynchronous operations with concurrent request handling
- **🛠️ Developer Friendly**: Intuitive APIs with comprehensive error handling
- **📊 Advanced Data Types**: Built-in support for float32, int32, strings, and more
- **🔍 Debugging Support**: Comprehensive logging with protocol-level debugging
- **🎯 Type Safe**: Full type hints for better IDE support
- **🖥️ Server Support**: Complete Modbus server implementation with TCP, RTU, and ASCII support

## Quick Start

### Installation

```bash
pip install modbuslink
```

### Basic Usage

#### TCP Client

```python
from modbuslink import ModbusClient, TcpTransport

# Create TCP transport
transport = TcpTransport(host='192.168.1.100', port=502)
client = ModbusClient(transport)

with client:
    # Read holding registers
    registers = client.read_holding_registers(
        slave_id=1, start_address=0, quantity=10
    )
    print(f"Registers: {registers}")
    
    # Write single register
    client.write_single_register(
        slave_id=1, address=0, value=1234
    )
```

#### RTU Client

```python
from modbuslink import ModbusClient, RtuTransport

# Create RTU transport
transport = RtuTransport(
    port='COM1',  # or '/dev/ttyUSB0' on Linux
    baudrate=9600,
    timeout=1.0
)
client = ModbusClient(transport)

with client:
    # Read coils
    coils = client.read_coils(
        slave_id=1, start_address=0, quantity=8
    )
    print(f"Coils: {coils}")
```

#### ASCII Client

```python
from modbuslink import ModbusClient, AsciiTransport

# Create ASCII transport
transport = AsciiTransport(
    port='COM1',
    baudrate=9600,
    bytesize=7,
    parity='E'
)
client = ModbusClient(transport)

with client:
    # Read input registers
    registers = client.read_input_registers(
        slave_id=1, start_address=0, quantity=5
    )
    print(f"Input registers: {registers}")
```

### Asynchronous Operations

```python
import asyncio
from modbuslink import AsyncModbusClient, AsyncTcpTransport

async def main():
    transport = AsyncTcpTransport(host='192.168.1.100', port=502)
    client = AsyncModbusClient(transport)
    
    async with client:
        # Concurrent operations
        tasks = [
            client.read_holding_registers(1, 0, 10),
            client.read_coils(1, 0, 8),
            client.write_single_register(1, 100, 9999)
        ]
        results = await asyncio.gather(*tasks)
        print(f"Results: {results}")

asyncio.run(main())
```

### Modbus Servers

#### TCP Server

```python
from modbuslink import AsyncTcpModbusServer, ModbusDataStore
import asyncio

async def main():
    # Create data store
    data_store = ModbusDataStore(
        coils_size=1000,
        discrete_inputs_size=1000,
        holding_registers_size=1000,
        input_registers_size=1000
    )
    
    # Set initial data
    data_store.write_coils(0, [True, False, True, False])
    data_store.write_holding_registers(0, [100, 200, 300, 400])
    
    # Create TCP server
    server = AsyncTcpModbusServer(
        host="localhost",
        port=5020,
        data_store=data_store,
        slave_id=1
    )
    
    try:
        await server.start()
        print("TCP server started successfully!")
        await server.serve_forever()
    except KeyboardInterrupt:
        print("Stopping server...")
    finally:
        await server.stop()

asyncio.run(main())
```

#### RTU Server

```python
from modbuslink import AsyncRtuModbusServer, ModbusDataStore
import asyncio

async def main():
    # Create data store
    data_store = ModbusDataStore(
        coils_size=1000,
        discrete_inputs_size=1000,
        holding_registers_size=1000,
        input_registers_size=1000
    )
    
    # Create RTU server
    server = AsyncRtuModbusServer(
        port="COM3",  # or '/dev/ttyUSB0' on Linux
        baudrate=9600,
        data_store=data_store,
        slave_id=1
    )
    
    try:
        await server.start()
        print("RTU server started successfully!")
        await server.serve_forever()
    except KeyboardInterrupt:
        print("Stopping server...")
    finally:
        await server.stop()

asyncio.run(main())
```

#### ASCII Server

```python
from modbuslink import AsyncAsciiModbusServer, ModbusDataStore
import asyncio

async def main():
    # Create data store
    data_store = ModbusDataStore(
        coils_size=1000,
        discrete_inputs_size=1000,
        holding_registers_size=1000,
        input_registers_size=1000
    )
    
    # Create ASCII server
    server = AsyncAsciiModbusServer(
        port="COM4",
        baudrate=9600,
        data_store=data_store,
        slave_id=2,
        parity="E",
        bytesize=7
    )
    
    try:
        await server.start()
        print("ASCII server started successfully!")
        await server.serve_forever()
    except KeyboardInterrupt:
        print("Stopping server...")
    finally:
        await server.stop()

asyncio.run(main())
```

### Advanced Data Types

```python
with client:
    # 32-bit float
    client.write_float32(slave_id=1, start_address=100, value=3.14159)
    temperature = client.read_float32(slave_id=1, start_address=100)
    
    # 32-bit integer
    client.write_int32(slave_id=1, start_address=102, value=-123456)
    counter = client.read_int32(slave_id=1, start_address=102)
    
    # String
    client.write_string(slave_id=1, start_address=110, value="Hello")
    message = client.read_string(slave_id=1, start_address=110, length=10)
```

## Supported Function Codes

| Code | Function | Description |
|------|----------|-------------|
| 0x01 | Read Coils | Read coil status |
| 0x02 | Read Discrete Inputs | Read discrete input status |
| 0x03 | Read Holding Registers | Read holding register values |
| 0x04 | Read Input Registers | Read input register values |
| 0x05 | Write Single Coil | Write single coil value |
| 0x06 | Write Single Register | Write single register value |
| 0x0F | Write Multiple Coils | Write multiple coil values |
| 0x10 | Write Multiple Registers | Write multiple register values |

## Transport Layers

### Synchronous Transports

- **TcpTransport**: Modbus TCP over Ethernet
- **RtuTransport**: Modbus RTU over serial port
- **AsciiTransport**: Modbus ASCII over serial port

### Asynchronous Transports

- **AsyncTcpTransport**: High-performance async TCP
- **AsyncRtuTransport**: High-performance async RTU
- **AsyncAsciiTransport**: High-performance async ASCII

## Error Handling

```python
from modbuslink import (
    ModbusClient, TcpTransport,
    ConnectionError, TimeoutError, ModbusException
)

transport = TcpTransport(host='192.168.1.100', port=502)
client = ModbusClient(transport)

try:
    with client:
        registers = client.read_holding_registers(1, 0, 10)
except ConnectionError as e:
    print(f"Connection failed: {e}")
except TimeoutError as e:
    print(f"Operation timed out: {e}")
except ModbusException as e:
    print(f"Modbus error: {e}")
```

## Logging and Debugging

```python
from modbuslink.utils import ModbusLogger
import logging

# Setup logging
ModbusLogger.setup_logging(
    level=logging.DEBUG,
    enable_debug=True,
    log_file='modbus.log'
)

# Enable protocol debugging
ModbusLogger.enable_protocol_debug()
```

## Project Structure

```
ModbusLink/
├── src/modbuslink/
│   ├── client/              # Client implementations
│   │   ├── sync_client.py   # Synchronous client
│   │   └── async_client.py  # Asynchronous client
│   ├── server/              # Server implementations
│   │   ├── data_store.py    # Data store
│   │   ├── async_base_server.py  # Async server base class
│   │   ├── async_tcp_server.py   # Async TCP server
│   │   ├── async_rtu_server.py   # Async RTU server
│   │   └── async_ascii_server.py # Async ASCII server
│   ├── transport/           # Transport layer implementations
│   │   ├── tcp.py          # TCP transport
│   │   ├── rtu.py          # RTU transport
│   │   ├── ascii.py        # ASCII transport
│   │   ├── async_tcp.py    # Async TCP transport
│   │   ├── async_rtu.py    # Async RTU transport
│   │   └── async_ascii.py  # Async ASCII transport
│   ├── utils/              # Utility modules
│   │   ├── crc.py         # CRC validation
│   │   ├── payload_coder.py # Data encoding/decoding
│   │   └── logger.py      # Logging system
│   └── common/             # Common modules
│       └── exceptions.py   # Exception definitions
├── examples/               # Usage examples
│   ├── sync_tcp_example.py
│   ├── async_tcp_example.py
│   ├── sync_rtu_example.py
│   ├── async_rtu_example.py
│   ├── sync_ascii_example.py
│   ├── async_ascii_example.py
│   ├── async_tcp_server_example.py    # TCP server example
│   ├── async_rtu_server_example.py    # RTU server example
│   ├── async_ascii_server_example.py  # ASCII server example
│   └── multi_server_example.py        # Multi-server example
└── docs/                   # Documentation
```

## Examples

Check out the [examples](examples/) directory for comprehensive usage examples:

- **Synchronous Examples**: Basic sync operations for TCP, RTU, and ASCII
- **Asynchronous Examples**: High-performance async operations with concurrency
- **Server Examples**: TCP, RTU, and ASCII server implementations
- **Advanced Features**: Data types, error handling, and debugging
- **Multi-Server**: Running multiple server types simultaneously

## Requirements

- Python 3.8+
- pyserial >= 3.5
- pyserial-asyncio >= 0.6
- typing_extensions >= 4.0.0

## License

MIT License - see [LICENSE.txt](LICENSE.txt) for details.

## Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "modbuslink",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "modbus, industrial, automation, communication, protocol, tcp, rtu, ascii, serial, plc, scada, iot",
    "author": null,
    "author_email": "Miraitowa <2056978412@qq.com>",
    "download_url": "https://files.pythonhosted.org/packages/e1/5c/d2c7b62c313034b47eac2a6317b478468a94c98a062031e1a84f0493b2fa/modbuslink-1.1.1.tar.gz",
    "platform": null,
    "description": "# ModbusLink\r\n\r\nEnglish | [\u4e2d\u6587\u7248](README-zh_CN.md)\r\n\r\n[![PyPI Downloads](https://static.pepy.tech/badge/modbuslink)](https://pepy.tech/projects/modbuslink)\r\n[![PyPI version](https://badge.fury.io/py/modbuslink.svg)](https://badge.fury.io/py/modbuslink)\r\n\r\nA modern, powerful, and developer-friendly Python Modbus library with comprehensive transport layer support.\r\n\r\n## Features\r\n\r\n- **\ud83c\udfd7\ufe0f Layered Architecture**: Clean separation of transport, client, server, and utility layers\r\n- **\ud83d\udd0c Multiple Transports**: TCP, RTU, and ASCII with both sync and async support\r\n- **\u26a1 High Performance**: Asynchronous operations with concurrent request handling\r\n- **\ud83d\udee0\ufe0f Developer Friendly**: Intuitive APIs with comprehensive error handling\r\n- **\ud83d\udcca Advanced Data Types**: Built-in support for float32, int32, strings, and more\r\n- **\ud83d\udd0d Debugging Support**: Comprehensive logging with protocol-level debugging\r\n- **\ud83c\udfaf Type Safe**: Full type hints for better IDE support\r\n- **\ud83d\udda5\ufe0f Server Support**: Complete Modbus server implementation with TCP, RTU, and ASCII support\r\n\r\n## Quick Start\r\n\r\n### Installation\r\n\r\n```bash\r\npip install modbuslink\r\n```\r\n\r\n### Basic Usage\r\n\r\n#### TCP Client\r\n\r\n```python\r\nfrom modbuslink import ModbusClient, TcpTransport\r\n\r\n# Create TCP transport\r\ntransport = TcpTransport(host='192.168.1.100', port=502)\r\nclient = ModbusClient(transport)\r\n\r\nwith client:\r\n    # Read holding registers\r\n    registers = client.read_holding_registers(\r\n        slave_id=1, start_address=0, quantity=10\r\n    )\r\n    print(f\"Registers: {registers}\")\r\n    \r\n    # Write single register\r\n    client.write_single_register(\r\n        slave_id=1, address=0, value=1234\r\n    )\r\n```\r\n\r\n#### RTU Client\r\n\r\n```python\r\nfrom modbuslink import ModbusClient, RtuTransport\r\n\r\n# Create RTU transport\r\ntransport = RtuTransport(\r\n    port='COM1',  # or '/dev/ttyUSB0' on Linux\r\n    baudrate=9600,\r\n    timeout=1.0\r\n)\r\nclient = ModbusClient(transport)\r\n\r\nwith client:\r\n    # Read coils\r\n    coils = client.read_coils(\r\n        slave_id=1, start_address=0, quantity=8\r\n    )\r\n    print(f\"Coils: {coils}\")\r\n```\r\n\r\n#### ASCII Client\r\n\r\n```python\r\nfrom modbuslink import ModbusClient, AsciiTransport\r\n\r\n# Create ASCII transport\r\ntransport = AsciiTransport(\r\n    port='COM1',\r\n    baudrate=9600,\r\n    bytesize=7,\r\n    parity='E'\r\n)\r\nclient = ModbusClient(transport)\r\n\r\nwith client:\r\n    # Read input registers\r\n    registers = client.read_input_registers(\r\n        slave_id=1, start_address=0, quantity=5\r\n    )\r\n    print(f\"Input registers: {registers}\")\r\n```\r\n\r\n### Asynchronous Operations\r\n\r\n```python\r\nimport asyncio\r\nfrom modbuslink import AsyncModbusClient, AsyncTcpTransport\r\n\r\nasync def main():\r\n    transport = AsyncTcpTransport(host='192.168.1.100', port=502)\r\n    client = AsyncModbusClient(transport)\r\n    \r\n    async with client:\r\n        # Concurrent operations\r\n        tasks = [\r\n            client.read_holding_registers(1, 0, 10),\r\n            client.read_coils(1, 0, 8),\r\n            client.write_single_register(1, 100, 9999)\r\n        ]\r\n        results = await asyncio.gather(*tasks)\r\n        print(f\"Results: {results}\")\r\n\r\nasyncio.run(main())\r\n```\r\n\r\n### Modbus Servers\r\n\r\n#### TCP Server\r\n\r\n```python\r\nfrom modbuslink import AsyncTcpModbusServer, ModbusDataStore\r\nimport asyncio\r\n\r\nasync def main():\r\n    # Create data store\r\n    data_store = ModbusDataStore(\r\n        coils_size=1000,\r\n        discrete_inputs_size=1000,\r\n        holding_registers_size=1000,\r\n        input_registers_size=1000\r\n    )\r\n    \r\n    # Set initial data\r\n    data_store.write_coils(0, [True, False, True, False])\r\n    data_store.write_holding_registers(0, [100, 200, 300, 400])\r\n    \r\n    # Create TCP server\r\n    server = AsyncTcpModbusServer(\r\n        host=\"localhost\",\r\n        port=5020,\r\n        data_store=data_store,\r\n        slave_id=1\r\n    )\r\n    \r\n    try:\r\n        await server.start()\r\n        print(\"TCP server started successfully!\")\r\n        await server.serve_forever()\r\n    except KeyboardInterrupt:\r\n        print(\"Stopping server...\")\r\n    finally:\r\n        await server.stop()\r\n\r\nasyncio.run(main())\r\n```\r\n\r\n#### RTU Server\r\n\r\n```python\r\nfrom modbuslink import AsyncRtuModbusServer, ModbusDataStore\r\nimport asyncio\r\n\r\nasync def main():\r\n    # Create data store\r\n    data_store = ModbusDataStore(\r\n        coils_size=1000,\r\n        discrete_inputs_size=1000,\r\n        holding_registers_size=1000,\r\n        input_registers_size=1000\r\n    )\r\n    \r\n    # Create RTU server\r\n    server = AsyncRtuModbusServer(\r\n        port=\"COM3\",  # or '/dev/ttyUSB0' on Linux\r\n        baudrate=9600,\r\n        data_store=data_store,\r\n        slave_id=1\r\n    )\r\n    \r\n    try:\r\n        await server.start()\r\n        print(\"RTU server started successfully!\")\r\n        await server.serve_forever()\r\n    except KeyboardInterrupt:\r\n        print(\"Stopping server...\")\r\n    finally:\r\n        await server.stop()\r\n\r\nasyncio.run(main())\r\n```\r\n\r\n#### ASCII Server\r\n\r\n```python\r\nfrom modbuslink import AsyncAsciiModbusServer, ModbusDataStore\r\nimport asyncio\r\n\r\nasync def main():\r\n    # Create data store\r\n    data_store = ModbusDataStore(\r\n        coils_size=1000,\r\n        discrete_inputs_size=1000,\r\n        holding_registers_size=1000,\r\n        input_registers_size=1000\r\n    )\r\n    \r\n    # Create ASCII server\r\n    server = AsyncAsciiModbusServer(\r\n        port=\"COM4\",\r\n        baudrate=9600,\r\n        data_store=data_store,\r\n        slave_id=2,\r\n        parity=\"E\",\r\n        bytesize=7\r\n    )\r\n    \r\n    try:\r\n        await server.start()\r\n        print(\"ASCII server started successfully!\")\r\n        await server.serve_forever()\r\n    except KeyboardInterrupt:\r\n        print(\"Stopping server...\")\r\n    finally:\r\n        await server.stop()\r\n\r\nasyncio.run(main())\r\n```\r\n\r\n### Advanced Data Types\r\n\r\n```python\r\nwith client:\r\n    # 32-bit float\r\n    client.write_float32(slave_id=1, start_address=100, value=3.14159)\r\n    temperature = client.read_float32(slave_id=1, start_address=100)\r\n    \r\n    # 32-bit integer\r\n    client.write_int32(slave_id=1, start_address=102, value=-123456)\r\n    counter = client.read_int32(slave_id=1, start_address=102)\r\n    \r\n    # String\r\n    client.write_string(slave_id=1, start_address=110, value=\"Hello\")\r\n    message = client.read_string(slave_id=1, start_address=110, length=10)\r\n```\r\n\r\n## Supported Function Codes\r\n\r\n| Code | Function | Description |\r\n|------|----------|-------------|\r\n| 0x01 | Read Coils | Read coil status |\r\n| 0x02 | Read Discrete Inputs | Read discrete input status |\r\n| 0x03 | Read Holding Registers | Read holding register values |\r\n| 0x04 | Read Input Registers | Read input register values |\r\n| 0x05 | Write Single Coil | Write single coil value |\r\n| 0x06 | Write Single Register | Write single register value |\r\n| 0x0F | Write Multiple Coils | Write multiple coil values |\r\n| 0x10 | Write Multiple Registers | Write multiple register values |\r\n\r\n## Transport Layers\r\n\r\n### Synchronous Transports\r\n\r\n- **TcpTransport**: Modbus TCP over Ethernet\r\n- **RtuTransport**: Modbus RTU over serial port\r\n- **AsciiTransport**: Modbus ASCII over serial port\r\n\r\n### Asynchronous Transports\r\n\r\n- **AsyncTcpTransport**: High-performance async TCP\r\n- **AsyncRtuTransport**: High-performance async RTU\r\n- **AsyncAsciiTransport**: High-performance async ASCII\r\n\r\n## Error Handling\r\n\r\n```python\r\nfrom modbuslink import (\r\n    ModbusClient, TcpTransport,\r\n    ConnectionError, TimeoutError, ModbusException\r\n)\r\n\r\ntransport = TcpTransport(host='192.168.1.100', port=502)\r\nclient = ModbusClient(transport)\r\n\r\ntry:\r\n    with client:\r\n        registers = client.read_holding_registers(1, 0, 10)\r\nexcept ConnectionError as e:\r\n    print(f\"Connection failed: {e}\")\r\nexcept TimeoutError as e:\r\n    print(f\"Operation timed out: {e}\")\r\nexcept ModbusException as e:\r\n    print(f\"Modbus error: {e}\")\r\n```\r\n\r\n## Logging and Debugging\r\n\r\n```python\r\nfrom modbuslink.utils import ModbusLogger\r\nimport logging\r\n\r\n# Setup logging\r\nModbusLogger.setup_logging(\r\n    level=logging.DEBUG,\r\n    enable_debug=True,\r\n    log_file='modbus.log'\r\n)\r\n\r\n# Enable protocol debugging\r\nModbusLogger.enable_protocol_debug()\r\n```\r\n\r\n## Project Structure\r\n\r\n```\r\nModbusLink/\r\n\u251c\u2500\u2500 src/modbuslink/\r\n\u2502   \u251c\u2500\u2500 client/              # Client implementations\r\n\u2502   \u2502   \u251c\u2500\u2500 sync_client.py   # Synchronous client\r\n\u2502   \u2502   \u2514\u2500\u2500 async_client.py  # Asynchronous client\r\n\u2502   \u251c\u2500\u2500 server/              # Server implementations\r\n\u2502   \u2502   \u251c\u2500\u2500 data_store.py    # Data store\r\n\u2502   \u2502   \u251c\u2500\u2500 async_base_server.py  # Async server base class\r\n\u2502   \u2502   \u251c\u2500\u2500 async_tcp_server.py   # Async TCP server\r\n\u2502   \u2502   \u251c\u2500\u2500 async_rtu_server.py   # Async RTU server\r\n\u2502   \u2502   \u2514\u2500\u2500 async_ascii_server.py # Async ASCII server\r\n\u2502   \u251c\u2500\u2500 transport/           # Transport layer implementations\r\n\u2502   \u2502   \u251c\u2500\u2500 tcp.py          # TCP transport\r\n\u2502   \u2502   \u251c\u2500\u2500 rtu.py          # RTU transport\r\n\u2502   \u2502   \u251c\u2500\u2500 ascii.py        # ASCII transport\r\n\u2502   \u2502   \u251c\u2500\u2500 async_tcp.py    # Async TCP transport\r\n\u2502   \u2502   \u251c\u2500\u2500 async_rtu.py    # Async RTU transport\r\n\u2502   \u2502   \u2514\u2500\u2500 async_ascii.py  # Async ASCII transport\r\n\u2502   \u251c\u2500\u2500 utils/              # Utility modules\r\n\u2502   \u2502   \u251c\u2500\u2500 crc.py         # CRC validation\r\n\u2502   \u2502   \u251c\u2500\u2500 payload_coder.py # Data encoding/decoding\r\n\u2502   \u2502   \u2514\u2500\u2500 logger.py      # Logging system\r\n\u2502   \u2514\u2500\u2500 common/             # Common modules\r\n\u2502       \u2514\u2500\u2500 exceptions.py   # Exception definitions\r\n\u251c\u2500\u2500 examples/               # Usage examples\r\n\u2502   \u251c\u2500\u2500 sync_tcp_example.py\r\n\u2502   \u251c\u2500\u2500 async_tcp_example.py\r\n\u2502   \u251c\u2500\u2500 sync_rtu_example.py\r\n\u2502   \u251c\u2500\u2500 async_rtu_example.py\r\n\u2502   \u251c\u2500\u2500 sync_ascii_example.py\r\n\u2502   \u251c\u2500\u2500 async_ascii_example.py\r\n\u2502   \u251c\u2500\u2500 async_tcp_server_example.py    # TCP server example\r\n\u2502   \u251c\u2500\u2500 async_rtu_server_example.py    # RTU server example\r\n\u2502   \u251c\u2500\u2500 async_ascii_server_example.py  # ASCII server example\r\n\u2502   \u2514\u2500\u2500 multi_server_example.py        # Multi-server example\r\n\u2514\u2500\u2500 docs/                   # Documentation\r\n```\r\n\r\n## Examples\r\n\r\nCheck out the [examples](examples/) directory for comprehensive usage examples:\r\n\r\n- **Synchronous Examples**: Basic sync operations for TCP, RTU, and ASCII\r\n- **Asynchronous Examples**: High-performance async operations with concurrency\r\n- **Server Examples**: TCP, RTU, and ASCII server implementations\r\n- **Advanced Features**: Data types, error handling, and debugging\r\n- **Multi-Server**: Running multiple server types simultaneously\r\n\r\n## Requirements\r\n\r\n- Python 3.8+\r\n- pyserial >= 3.5\r\n- pyserial-asyncio >= 0.6\r\n- typing_extensions >= 4.0.0\r\n\r\n## License\r\n\r\nMIT License - see [LICENSE.txt](LICENSE.txt) for details.\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please feel free to submit issues and pull requests.\r\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "\u73b0\u4ee3\u5316\u3001\u529f\u80fd\u5f3a\u5927\u3001\u5f00\u53d1\u8005\u53cb\u597d\u4e14\u9ad8\u5ea6\u53ef\u6269\u5c55\u7684Python Modbus\u5e93 | Modern, powerful, developer-friendly and highly scalable Python Modbus library",
    "version": "1.1.1",
    "project_urls": {
        "Homepage": "https://github.com/Miraitowa-la/ModbusLink",
        "Issues": "https://github.com/Miraitowa-la/ModbusLink/issues",
        "Repository": "https://github.com/Miraitowa-la/ModbusLink"
    },
    "split_keywords": [
        "modbus",
        " industrial",
        " automation",
        " communication",
        " protocol",
        " tcp",
        " rtu",
        " ascii",
        " serial",
        " plc",
        " scada",
        " iot"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6050cab79d9d534d1c9f97615001957dd932fb121534b195727a169f4e86b48e",
                "md5": "efe6167603cee10301bcd8d1d62f278e",
                "sha256": "704a2830f8e832d9e609d5816a085a4e8eef9cc30bd836979a439b53141a3cd7"
            },
            "downloads": -1,
            "filename": "modbuslink-1.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "efe6167603cee10301bcd8d1d62f278e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 69804,
            "upload_time": "2025-08-08T06:34:42",
            "upload_time_iso_8601": "2025-08-08T06:34:42.172350Z",
            "url": "https://files.pythonhosted.org/packages/60/50/cab79d9d534d1c9f97615001957dd932fb121534b195727a169f4e86b48e/modbuslink-1.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e15cd2c7b62c313034b47eac2a6317b478468a94c98a062031e1a84f0493b2fa",
                "md5": "6f9511796b8bd64a8eadc71ed63ef89b",
                "sha256": "c7b194078c5db929b4c10f4c90a30dbe9ac8b37368656d040a17624c3d083410"
            },
            "downloads": -1,
            "filename": "modbuslink-1.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "6f9511796b8bd64a8eadc71ed63ef89b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 48831,
            "upload_time": "2025-08-08T06:34:43",
            "upload_time_iso_8601": "2025-08-08T06:34:43.485673Z",
            "url": "https://files.pythonhosted.org/packages/e1/5c/d2c7b62c313034b47eac2a6317b478468a94c98a062031e1a84f0493b2fa/modbuslink-1.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-08 06:34:43",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Miraitowa-la",
    "github_project": "ModbusLink",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "modbuslink"
}
        
Elapsed time: 0.68957s