# ModbusLink
English | [中文版](README-zh_CN.md)
[](https://pepy.tech/projects/modbuslink)
[](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[](https://pepy.tech/projects/modbuslink)\r\n[](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"
}