The M410 Modbus to Serial adapter is based on the uModbus python implementation of the Modbus protocol as described in the MODBUS Application Protocol Specification V1.1b3 along with the MAX485 processor and IC as described in the RS-485/RS-422 Circuit Implementation guide at Analog Devices.
uModbus and the M410 Modbus to Serial adapter implement a Modbus client (RTU) and a Modbus server (RTU). The same firmware can be used to implement TCP variations of both client and server.
The following functions have been implemented for Modbus RTU
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
Includes support for signed and unsigned register values.
A full working copy of channel firmware and libraries for use in all AlphaX devices can be found at M innovations GitHub.
A copy of original libraries and examples are available from AdvancedClimateSystems GitHub. Full documentation provided here.
Doing a Simple Modbus request (For reading Seametrics LevelSCOUT):
from uModBus.serial import Serial
# from uModBus.tcp import TCP ## Not required
import machine, utime, ustruct
def getData(P1,P2):
uart_id = 0x01
modbus_obj = Serial(uart_id, pins=(P1,P2))
slave_addr=2
starting_address=62594
register_quantity=1
signed=True
result=''
for y in range(0,2): ## Repeat Read, first read wakes up Levelscout, seconds reads register
try:
register_value = modbus_obj.read_holding_registers(slave_addr, starting_address, register_quantity, signed)
#print(register_value)
#print(bytes(register_value[1]))
result = ustruct.unpack('>f', register_value)
#print(result[0])
#print(result[1]-14.7)
except Exception as e:
print('Waking up Slave')
utime.sleep_ms(1000)
try:
return(result[0])
except:
return 0
print(getData('P10','P9'))
uModbus software is licensed under Mozilla Public License.