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.
- Support for asynchronous TCP and RTU/Serial servers and clients, through the
asynchronous
package, see #5
- flake8 errors in both synchronous and asynchronous versions (line too long, incorrect indent level, etc.)
- Multiple connections can now be handled by TCP servers through async implementation, see #11
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