Is there a way where I can read a set of register on a device with the python library minimalmodbus? Or is it one by one I need to read_register like this?
instrument.read_register(0x0033,1)
Look at the minimalmodbus documentation for read_registers()
. You shouldn't need to change the functioncode argument.
Assuming you want the first one hundred and twenty-five registers, starting at register zero:
registers = instrument.read_registers(0, 125)
If you wanted to print those registers:
for idx in range(len(registers)):
print(f"Register {idx:3d} : {registers[idx]:5d} ({hex(registers[idx])})")
This will output something like:
Register 0 : 0 (0x0)
Register 1 : 1 (0x1)
Register 2 : 2 (0x2)
Register 3 : 3 (0x3)
Register 4 : 4 (0x4)
ā¦
EDIT: Looking at page 9 of the specification document, there are sixteen and thirty-two bit registers co-mingled. It will be easier to read them explicitly. Otherwise you'll need to shift and combine the two sixteen-bit registers, which is annoying and minimalmodbus has functions to make it easier and less error prone for you.
E.g.
# 0000h 2 V L1-N INT32 Value weight: Volt*10
# read_long(registeraddress: int, functioncode: int = 3, signed: bool = False, byteorder: int = 0) ā int
L1_N_voltage = instrument.read_long(0, signed=True) / 10
# 0028h 2 W sys INT32 Value weight: Watt*10
sys_wattage = instrument.read_long(0x28, signed=True) / 10
Note that read_long()
doesn't have number_of_decimals
support, so you need to manually divide the reading by ten. For the current and power factor you'll need to divide by 1,000.