from pymodbus.client.sync import ModbusSerialClient from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadDecoder from pymodbus.payload import BinaryPayloadBuilder import time client = ModbusSerialClient( method='rtu', port='/dev/ttyUSB0', baudrate=9600, timeout=3, parity='N', stopbits=1, bytesize=8 ) s = "SN: " if client.connect(): # Trying for connect to Modbus Server/Slave # inverter serial number res = client.read_holding_registers(address=3, count=5, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) s += decoder.decode_string(10).decode('utf-8') print(s) # inverter fault codes res = client.read_holding_registers(address=103, count=4, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) first = decoder.decode_bits() sec = decoder.decode_bits() third = decoder.decode_bits() fourth = decoder.decode_bits() print ("Fault codes:") print(first) print(sec) print(third) print(fourth) while (True) : # inverter DC/DC transformer (DC) temp res = client.read_holding_registers(address=90, count=1, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) temp = (decoder.decode_16bit_uint() - 1000) / 10.0 print("DC temp: {0} dec C".format(temp)) # inverter IGBT (AC) temp res = client.read_holding_registers(address=91, count=1, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) temp = (decoder.decode_16bit_uint() - 1000) / 10.0 print("AC temp: {0} deg C".format(temp)) print("") # AC # load L1 (addr 157) and L2 (addr 158) volts res = client.read_holding_registers(address=157, count=2, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) val = decoder.decode_16bit_uint() / 10.0 print("L1: {0} V".format(val)) val = decoder.decode_16bit_uint() / 10.0 print("L2: {0} V".format(val)) # inverter frequency res = client.read_holding_registers(address=193, count=1, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) freq = decoder.decode_16bit_uint() / 100.0 print("Freq: {0} Hz".format(freq)) # grid side relay res = client.read_holding_registers(address=194, count=1, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) val = decoder.decode_16bit_uint() print("Grid relay: {0}".format(val)) # grid total power L1-L2 res = client.read_holding_registers(address=169, count=1, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) pwr = decoder.decode_16bit_uint() print("Grid total power: {0} W".format(pwr*2)) # inverter total power L1-L2 res = client.read_holding_registers(address=175, count=1, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) pwr = decoder.decode_16bit_int() print("Inv total power: {0} W".format(pwr*2)) # BATTERY print ("") # batt power (addr 190) and batt current (addr 191) res = client.read_holding_registers(address=190, count=2, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) val = decoder.decode_16bit_int() print("Batt Pwr: {0} W".format(val*2)) val = decoder.decode_16bit_int() / 100.0 print("Batt Curr: {0} A".format(val*2)) # battery voltage res = client.read_holding_registers(address=183, count=1, unit=1) if res: #print(res.registers) decoder = BinaryPayloadDecoder.fromRegisters(res.registers, endian=Endian.Big) voltage = decoder.decode_16bit_uint() / 100.0 print("Batt: {0} V".format(voltage)) print("") time.sleep(0.5) else: print('Cannot connect to the Modbus Server/Slave')