All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.3.7 - 2023-07-19
- Add a single character wait time after flush to avoid timing issues with RTU control pin, see #68 and #72
2.3.6 - 2023-07-19
- Add contribution guideline, see #67
- Content of
package.json
is validated on each test workflow run - Precommit hooks for
package.json
and package version file validation, yaml style, flake8 and trailing whitespace checks, contributes to #67
umodbus/version.py
file is validated against the latest changelog entry before running all tests and testing the package creationulogging
placed intotests
folder instead of installing it with deprecatedupip
in all Docker containers
- Added missing empty line in several files
2.3.5 - 2023-07-01
- Time between RS485 control pin raise and UART transmission reduced by 80% from 1000us to 200us
- The RS485 control pin is lowered as fast as possible by using
time.sleep_us()
instead ofmachine.idle()
which uses an IRQ on the order of milliseconds. This kept the control pin active longer than necessary, causing the response message to be missed at higher baud rates. This applies only to MicroPython firmwares below v1.20.0 - The following fixes were provided by @wpyoga
- RS485 control pin handling fixed by using UART
flush
function, see #68 - Invalid CRC while reading multiple coils and fixed, see #50 and #52
2.3.4 - 2023-03-20
package.json
formip
installation with MicroPython v1.19.1 or newer.editorconfig
for common editor settings.yamllint
to lint all used YAML filesyamllint
package to therequirements-test.txt
file- Run YAML linter on test workflow
- Modbus version input field in issues template
- Test workflow is also running on pull requests as the workflow is not executed on branches of contributors
- YAML style violation in Docker, workflow and issue files
mip
installation commands inREADME
andINSTALLATION
2.3.3 - 2023-01-29
- Add link to RTU documentation examples from RTU examples files and root README, relates to #7
- Add missing ESP32, RP2 and pyboard pin usage for RTU in examples and documentation, relates to #7 and #17
- Add missing issue template file, see #46
2.3.2 - 2023-01-09
- Installation instructions for
mip
usage on MicroPython 1.19.1 or newer, see #44 - Manual testing Dockerfile
- INSTALLATION, TESTING and EXAMPLES files for simpler docs structure
- Split SETUP into INSTALLATION
- Split USAGE into TESTING and EXAMPLES
- Use callback to reset register data in RTU client example
- Update docs copyright year to 2023
- Use fakes machine module instead of classic Mock in docs config file
- Basic RTU host example in root README uses correct init values, optional parameters are listed after mandatory ones
- Remove outdated warning sections about #35 bug from USAGE
2.3.1 - 2023-01-06
- Unittest to read multiple coils at any location if defined as list, verifies #35
- Unittests to write a single coil or multiple coils at any location if defined as list, verifies fix #15 and #24
- All configured register of a client can be accessed and modified individually, see #35
- Resolved overlapping register positions in example JSON file
- Register length of
EXAMPLE_IREG
in TCP and RTU examples corrected to 1 instead of 2
2.3.0 - 2023-01-03
- Custom callback functions can be registered on client (ModbusRTU or ModbusTCP) side with new parameters
on_set_cb
andon_get_cb
available from modbus.py functionsadd_coil
andadd_hreg
. Functionsadd_ist
andadd_ireg
support onlyon_get_cb
, see #31 - Example callback usage shown in TCP client example
- Documentation for callback functions in USAGE
- Typing hint
Callable
is now subscriptable
2.2.0 - 2023-01-03
- Fake machine module with UART and Pin class to be used on Unix MicroPython container for RTU tests and examples, see #47
- RTU host example script
- RTU docker compose file and RTU docker compose file test based in MicroPython 1.18 image
- RTU client Dockerfile and RTU host Dockerfile based on MicroPython 1.18 image
- Initial RTU examples unittest
- RTU example section for Client and Host in USAGE
-
Outsourced the following common functions of serial.py and tcp.py into
CommonModbusFunctions
of common.py:read_coils
read_discrete_inputs
read_holding_registers
read_input_registers
write_single_coil
write_single_register
write_multiple_coils
write_multiple_registers
-
Inherit from
CommonModbusFunctions
inSerial
of serial.py and inTCP
of of tcp.py -
Extended RTU client example for Docker usage to load all registers from example JSON file
-
Update internal functions parameter name from
slave_id
toslave_addr
of TCP's_create_mbap_hdr
and_validate_resp_hdr
function to be the same as in Serial -
Update Modbus function documentation from TCP specific to common module in USAGE file
-
Renamed docker files:
Dockerfile.client
->Dockerfile.client_tcp
Dockerfile.host
->Dockerfile.host_tcp
Dockerfile.test_tcp_example
->Dockerfile.test_examples
2.1.3 - 2022-12-30
uart_id
can be specified during init ofModbusRTU
andSerial
class and is no longer hardcoded to1
, but set as1
by default to ensure backwards compability, see #7 and #43- RTU Client example and USAGE documentation updated with new
uart_id
parameter
2.1.2 - 2022-12-28
- Baudrate specific inter frame time is used at Modbus RTU internal function
_uart_read
of serial.py instead of constant value of 5ms
- ESP32 port specific
wait_tx_done
function replaced by generic wait time calculation in_send
function of serial.py, see #34 - A 1ms delay has been added between turning the RS485 control pin on and sending the Modbus PDU in
_send
function of serial.py
2.1.1 - 2022-12-27
- Removed unnecessary dependency to
micropython-urequests
from Docker files, setup guide and package setup file - Enable Modbus Client mode for RTU implementation, see #40, removed during #33
2.1.0 - 2022-12-27
- Typing hints available for all functions of umodbus, see #27
- Docstrings available for all constants, functions and classes of umodbus, see #27
- Test for reading more than 8 coils in a row to verify fix of #36
- Test for reading single negative holding register value
- Test for writing multiple coils to verify fix of #22
- Test for writing multiple registers to verify fix of #23
- Usage documentation for coil, discrete inputs, holding register and input register usage
- Modbus TCP IP and port binding can be checked with
is_bound
property in tcp.py
- Reordered modules of API documentation
data_as_registers
anddata_as_bits
of common.py removed- Send illegal function code
0x01
if a register other than coil or holding register is requested to be set - Simplified
_process_write_access
logic of tcp.py
- Typing hints of function input parameters and return values
- Response data of multiple changed registers (
write_multiple_registers
) is validated with respect to the providedsigned
flag in serial.py and tcp.py, see #23 - Enable reading more than 8 coils in a row, see #36
- Writing multiple coils in TCP, see #22
- Writing multiple registers in TCP, see #23
- Unit test
test_bytes_to_bool
uses MSB and LSB data correctly - Only requested amount of registers are returned by
_process_read_access
logic of tcp.py, see #35
2.0.0 - 2022-12-03
- Perform MicroPython based unittests on every
Test
workflow run - Add usage description of docker based MicroPython unittest framework in USAGE
- Add docker compose file based in MicroPython 1.18 image
- Add TCP client Dockerfile, TCP host Dockerfile, unittest Dockerfile and TCP unittest specific Dockerfile. All based on MicroPython 1.18 image
- Add initial test, testing the unittest itself
- Add unittest implementation based on pfalcon's micropython-unittest
- Docstrings available for all functions of functions.py, see #27
- Typing hints available for all functions of functions.py, serial.py and tcp.py, see #27
- Unittest for functions.py, see #16
- Unittest for const.py, see #16
- .readthedocs.yaml for Read The Docs, contributes to #26
- Use default values for all registers defined in the example JSON
- TCP host example and TCP client example define a static IP address and skip further WiFi setup steps in case a Docker usage is detected by a failing import of the
network
module, contributes to #16 - Define all Modbus function codes as
const()
to avoid external modifications, contributes to #18 - Remove dependency to
Serial
andrequests
fromumodbus.modbus
, see #18 ModbusRTU
class is part of serial.py, see #18ModbusTCP
class is part of tcp.py, see #18ModbusRTU
andModbusTCP
classes and related functions removed from modbus.py, see #18- Imports changed from:
from umodbus.modbus import ModbusRTU
tofrom umodbus.serial import ModbusRTU
from umodbus.modbus import ModbusTCP
tofrom umodbus.tcp import ModbusTCP
read_coils
andread_discrete_inputs
return a list with the same length as the requested quantity instead of always 8, see #12 and #25- Common functions
bytes_to_bool
andto_short
moved to functions.py - Use HTTPS URL instead of SSH for submodule
- Cleanup of root README, content moved to SETUP and USAGE, contributes to #30
- Moved SETUP and USAGE into docs folder, see #26 contributes to #30
- Use
False
or0
as default values for registers without a specific initial value in modbus.py
read_coils
returns list with amount of requested coils, see #12read_holding_registers
returns list with amount of requested registers, see #25
1.2.0 - 2022-11-13
- TCP host example script
- JSON file to set registers on TCP/RTU device
- Bash script to wrap manipulation of TCP modbus register data
- Example boot script
- TOC in README
- Use changelog-based-release action to create a draft release with every merge to develop
- Use changelog-based-release action to create a drafted prerelease release with every PR build, see #20
- USAGE and SETUP files with more details
- Add more info to TCP client example script
- Update modules submodule to
1.3.0
- Line breaks are no longer used in this changelog for enumerations
- Issues are referenced as
#123
instead of[#123][ref-issue-123]
to avoid explicit references at the bottom or some other location in the file - Scope of contents permissions in release and test release workflow is now
write
to use auto release creation
- Typo in RTU client example script
1.1.1 - 2022-11-09
- Default value of
setup_registers
function parameteruse_default_vals
changed toFalse
to avoid confusion behaviour if not explicitly defined, see issue 13 - Missing function docstring added to
setup_registers
function write_single_coil
allows0
,1
,False
,True
,0x0
or0xFF00
instead of0x0
and0xFF00
only as set value, see issue 14
1.1.0 - 2022-11-03
float_to_bin
,bin_to_float
,int_to_bin
functions added toumodbus/functions.py
- Deploy to Test Python Package Index on every PR
build with a PEP440 compliant
-rc<BUILDNUMBER>.dev<PR_NUMBER>
meta data extension - Test release workflow running only on PRs is archiving and uploading built artifacts to Test Python Package Index
- Author is explicitly mentioned in
setup.py
instead of used by__author__
variable which has been previously defined inversion.py
but no longer available with autodeploy.
- All uncovered flake8 warnings of
umodbus
1.0.0 - 2022-02-26
setup.py
andsdist_upip.py
taken from pfalcon's picoweb repo and PEP8 improvedMIT License
version.py
storing current library versiontyping.py
enabling type hints
- Moved all uModbus files from
lib/uModbus
intoumodbus
- Update import statements of all files of
umodbus
- Update
README
usage description of MicroPython lib deploy to PyPi - Usage examples in
README
updated with new import path - Update
boot
andmain
files to usebe_helpers
- Enable setting of
max_connections
to TCP socket inmodbus ModbusTCP bind function
andtcp TCPServer bind function
- MicroPython helpers module no longer used
- MicroPython ESP WiFi Manager module no longer used
- Lib folder of dependency modules no longer used
- Commented print debug messages in several files of umodbus
0.1.0 - 2022-02-20
- This changelog file
.gitignore
filerequirements.txt
file to setup tools for board interactions- Creation header to all files of
lib/uModbus
in order to provide proper credits to Pycom get_is_bound()
function added tolib/uModbus/tcp.py
to check status of socket binding for the Modbus TCP Server (host)- Example register files to show basic usage with a MyEVSE board
- Reworked
boot.py
andmain.py
for simple usage README
file with usage examples- Replaced WiPy specific calls in
lib/uModbus
files with MicroPython 1.16 or higher calls - Limit number of concurrent socket connections to the Modbus TCP Server (host) to 10
- Return on
_accept_request()
in case of anOSError
as MicroPython raises this type of error in case a socket timeout occured.TimeoutError
is not available on MicroPython compared to WiPy
- PEP8 style issues on all files of
lib/uModbus