Lightweight control of cheap Modbus RTU components using Python
Project description
cheap_modbus_rtu
Lightweight control of cheap Modbus RTU components using Python
Currently supported hardware
"bestep" brand:
-
2-CH Digital IN + Relay module
-
4-CH Digital IN + Relay module
-
(untested) 8-CH Digital IN + Relay module
(no image)
"eletechsup" brand:
-
PWM8A04 3-CH PWM OUT PCB
-
R4DIF08 8-CH Digital IN module
-
N4AIA04 4-CH 0..5V / 0..10V / 0..20mA analog input module
-
N4DAC02 2-CH 0..5V / 0..10V analog output module
# This requires Python >= 3.9
# and recent version of setuptools and pip
user@linux:~/mysrc$ python -m pip install --upgrade pip
# Install from local git sources:
user@linux:~/mysrc$ git clone https://github.com/ul-gh/cheap_modbus_rtu.git
user@linux:~/mysrc$ cd cheap_modbus_rtu
user@linux:~/mysrc$ pip install .
Documentation Link:
API Documentation (Github Link)
R4DIF08, 8-Channel digital input PCB: Read all eight inputs
from cheap_modbus_rtu import R4DIF08
# Slave ID for these modules is pre-set to 1
input_module = R4DIF08(slave_id=1, serial_device_name="/dev/ttyUSB0")
inputs = input_module.get_inputs()
print(inputs)
Relay IO PCB: Toggle one relay on-off in a 1-second cycle
import time
# Also works with the other multi-channel variants
from cheap_modbus_rtu import Relay2Ch
# Slave ID for these modules is pre-set to 255
modbus_relay = Relay2Ch(slave_id=255, serial_device_name="/dev/ttyUSB0")
while True:
modbus_relay.set_output(1, True)
time.sleep(0.5)
modbus_relay.set_output(1, False)
time.sleep(0.5)
PWM8A04, 3-Channel PWM output PCB: Set output 1 to 20 kHz, 33 % duty cycle
from cheap_modbus_rtu import PWM8A04
# Slave ID for these PWM modules is pre-set to 1
pwm = PWM8A04(slave_id=1, serial_device_name="/dev/ttyUSB0")
pwm.set_output_frequency(1, 20000)
pwm.set_output_duty(1, 33)
Relay IO PCB: Read both inputs of the 2-Channel variant and write them directly to the relay outputs
while True:
input_1 = modbus_relay.get_input(1)
input_2 = modbus_relay.get_input(2)
modbus_relay.set_output(1, input_1)
modbus_relay.set_output(2, input_2)
print(f"\rInput 1: {input_1} Input 2: {input_2} ", end="")
time.sleep(0.1)
Input 1: False Input 2: False
Relay IO PCB: Set Slave ID from 255 to 1
This must only be done once, not at every device start, otherwise flash wear might be an issue. Once a different Slave ID is configured, invoke the constructor of this library with the new ID as an argument.
modbus_relay.get_broadcast_slave_id()
>>> 255
modbus_relay.set_slave_id(1)
modbus_relay.get_broadcast_slave_id()
>>> 1
Nice documentation of the Modbus-RTU protocol (English): https://ipc2u.com Modbus Protocol Description and Examples
(Same content in German) Beschreibung des Modbus-RTU Protokolls: https://ipc2u.de
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for cheap_modbus_rtu-0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3429aec434e90baf3b061d162bc3cb7c618c181828ca067ff2b6b7b9797d0503 |
|
MD5 | 5b313266bb828821de01bc094dd22a59 |
|
BLAKE2b-256 | a5ec21b28bf52472eaa233633d65a6e4a5ec1b56e0699c77690e72c6d9cab347 |