Pymodbus reading from multiple energy meters

Question:

in our company we will install multiple energy meters (abb m4m ethernet 20). This energy meter works via modbus tcp/ip.

I have a working python script for reading registers from one that we already have but the problem is that when we will have multiple of them how will i be able to read data from all at once?

*This is my first time working with modbus and python and i dont know how this is done.

Current code (not all of it but main):

from pymodbus.client import ModbusTcpClient
from decimal import *

IP = '192.168.30.156'
client = ModbusTcpClient(IP)

power_register = client.read_holding_registers(23322, 2)
energy_register = client.read_holding_registers(20480, 4)

power_calculation = round(((power_register.registers[0] * pow(2, 16) + power_register.registers[1]) * 0.01 / 1000), 2)
energy_calculation = round(((energy_register.registers[2] * pow(2, 16) + energy_register.registers[3]) * 0.01), 1)

print(power_calculation, "kW")
print(energy_calculation, "kWh")

Thank you.

Asked By: faca

||

Answers:

here is my code example for it:

from pymodbus.client import ModbusTcpClient
from decimal import *

ips = ['192.168.30.156', '192.168.30.157', '192.168.30.158']

clients = []
for ip in ips:
    clients.append(ModbusTcpClient(ip))

power_registers = []
energy_registers = []
for client in clients:
    power_registers.append(client.read_holding_registers(23322, 2))
    energy_registers.append(client.read_holding_registers(20480, 4))

power_calculations = []
energy_calculations = []
for i in range(len(clients)):
    power_calculation = round(((power_registers[i].registers[0] * pow(2, 16) + power_registers[i].registers[1]) * 0.01 / 1000), 2)
    energy_calculation = round(((energy_registers[i].registers[2] * pow(2, 16) + energy_registers[i].registers[3]) * 0.01), 1)
    power_calculations.append(power_calculation)
    energy_calculations.append(energy_calculation)

for i in range(len(clients)):
    print("Meter", i+1, "power:", power_calculations[i], "kW")
    print("Meter", i+1, "energy:", energy_calculations[i], "kWh")
Answered By: Omid Goudazi