Skip to main content

Implementation of the Modbus protocol in pure Python.

Project description


uModbus or (μModbus) is a pure Python implementation of the Modbus protocol as described in the MODBUS Application Protocol Specification V1.1b3. uModbus implements both a Modbus client (or master in Modbus language) and a Modbus server (or slave). The “u” or “μ” in the name comes from the the SI prefix “micro-”. uModbus is very small and lightweight. The source can be found on GitHub. Documentation is available at Read the Docs.


Creating a Modbus server is easy:

#!/usr/bin/env python
# scripts/examples/
import logging
from socketserver import TCPServer
from collections import defaultdict

from umodbus import get_server, RequestHandler, conf
from umodbus.utils import log_to_stream

# Add stream handler to logger 'uModbus'.

# A very simple data store which maps addresss against their values.
data_store = defaultdict(int)

# Enable values to be signed (default is False).

TCPServer.allow_reuse_address = True
app = get_server(TCPServer, ('localhost', 502), RequestHandler)

@app.route(slave_ids=[1], function_codes=[3, 4], addresses=list(range(0, 10)))
def read_data_store(slave_id, function_code, address):
    """" Return value of address. """
    return data_store[address]

@app.route(slave_ids=[1], function_codes=[6, 16], addresses=list(range(0, 10)))
def write_data_store(slave_id, function_code, address, value):
    """" Set value for address. """
    data_store[address] = value

if __name__ == '__main__':

Doing a Modbus request requires even less code:

#!/usr/bin/env python
# scripts/examples/
import socket

from umodbus import conf
from umodbus.client import tcp

# Enable values to be signed (default is False).

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 502))

# Returns a message or Application Data Unit (ADU) specific for doing
# Modbus TCP/IP.
message = tcp.write_multiple_coils(slave_id=1, starting_address=1, values=[1, 0, 1, 1])

# Response depends on Modbus function code. This particular returns the
# amount of coils written, in this case it is.
response = tcp.send_message(message, sock)



The following Modbus functions have been implemented:

  • 01: Read Coils

  • 02: Read Discrete Inputs

  • 03: Read Holding Registers

  • 04: Read Input Registers

  • 05: Write Single Coil

  • 06: Write Single Register

  • 15: Write Multiple Coils

  • 16: Write Multiple Registers

Other featues:

  • Support for signed and unsigned register values.


uModbus is far from complete. The next, unordered list shows what is going to be implemented in the future:

  • Support for all Modbus functions

  • Modbus RTU

  • Use asyncio for handling of requests

  • Other Modbus ‘flavours’, so uModbus is able to handle 32 bit values.


uModbus software is licensed under Mozilla Public License. © 2015 Advanced Climate Systems.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uModbus-0.5.0.tar.gz (20.6 kB view hashes)

Uploaded source

Built Distribution

uModbus-0.5.0-py2.py3-none-any.whl (24.6 kB view hashes)

Uploaded 2 7

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page