如何根据功率计上的原始数据计算能量读数

时间:2018-11-13 06:56:44

标签: python modbus pymodbus

我是IoT的新手,我有一个与Schneider Power Meter有关的项目。 我使用pymodbus从寄存器读取了电压原始数据,但是我不知道如何将其转换为正确的值。

原始数据来自寄存器地址[24206, 17242]的{​​{1}}。

这是我的代码:

3927-3928

出局:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient

def main():
    try:
        register = int(input("Registers: "))
        modbus = ModbusClient(method='rtu', port='COM4', baudrate=9600, timeout=1, 
            parity='E', bytesize=8
        )
        modbus.connect()
        r = modbus.read_holding_registers(register, 2, unit=1)
        print(r.registers)
        modbus.close()
        return r.registers
    except AttributeError as e:
        print(e)
        return None

if __name__ == "__main__":
    main()

Registers

Voltage

Raw

每个人都可以告诉我该怎么做吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

仍然,我正在等待您的代码,但根据我的猜测,您将需要以下内容:

读取和解码:

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.client.sync import ModbusTcpClient

def validator(instance):
    if not instance.isError():
        '''.isError() implemented in pymodbus 1.4.0 and above.'''
        decoder = BinaryPayloadDecoder.fromRegisters(
            instance.registers,
            byteorder=Endian.Big, wordorder=Endian.Little
        )   
        return float(decoder.decode_32bit_float())

    else:
        # Error handling.
        print("There aren't the registers, Try again.")
        return None


client = ModbusTcpClient('X.X.X.X', port=502)
connection = client.connect()

if connection:
    request = client.read_holding_registers(3927, count=2, unit=1)
    data = validator(request)
    print(data)

    client.close()

else:
    print('Connection lost, Try again')

[注意]:

您的数据是 float32 float32_inverse

  • 因此,有了 float32 ,您将拥有:

    wordorder=Endian.Big
    
  • 使用 float32_inverse ,您将拥有:

    wordorder=Endian.Little