python 中的菜鸟试图通过 Modbus RTU RS485 从他的 EnergyMeter 获取值

Noob trying to get values from his EnergyMeter via Modbus RTU RS485 in python

拳头 Post 如果我搜索足够长的时间,我通常会找到答案。 但是今天是一天... 我从 Aliexpress 购买了一个带有 MODBUS RTU 连接的 EnergyMeter,我正在尝试读取它。我已经在互联网上尝试了很多东西。

这是 EnergyMeter 的数据表1

我尝试了 pyModbus 和 minimalmodbus。

我的两个脚本:

#!/usr/bin/env python3
from pymodbus.client.sync import ModbusSerialClient as ModbusClient

client = ModbusClient(method='rtu', port='/dev/ttyUSB0', timeout=1, stopbits = 1, bytesize = 8,  parity='N', baudrate= 9600)
client.connect()
request = client.read_holding_registers(0x00,0x01,unit=2)
print (request.registers)`

#!/usr/bin/env python3

import time
import minimalmodbus

rs485 = minimalmodbus.Instrument('/dev/ttyUSB0', 2)
rs485.serial.baudrate = 9600
rs485.serial.bytesize = 8
rs485.serial.parity = minimalmodbus.serial.PARITY_NONE
rs485.serial.stopbits = 1
rs485.serial.timeout = 1
rs485.debug = False
rs485.mode = minimalmodbus.MODE_RTU
print (rs485)
print(rs485.read_register(0, functioncode=4,))
#Volts_A = rs485.read_float(0, functioncode=4, number_of_registers=4)
#print ('Voltage: {0:.1f} Volts'.format(Volts_A))

看来我可以读取数据(第一个脚本输出 17942,第二个脚本输出 17248。 但老实说,我不知道该怎么办。 我也不明白那个代码...... 手册上说我必须发送一个 Hi 和一个 Low 地址,但我该怎么做呢? 0x00 是六进制 - 我必须转换它吗?怎么样?

我必须发送地址+函数代码+数据+crc 的手动统计信息 - 如何执行此操作,或者 pymod/minimod 是否自动执行此操作?它现在如何正确的功能代码等? 我很困惑,如果有人能帮助我,我会很高兴...

谢谢

多亏了 @Brits 我得到了它 运行。 我不得不使用 read_float(0, functioncode=4, number_of_registers=2) ,其中 0 是小数。 如果我想读取 001A,我必须将十六进制转换为十进制 = 26。 很好用

HV_A_Phase_Spannung = Hausverbrauch.read_float(0, functioncode=4, number_of_registers=2)
print(str(f'{HV_A_Phase_Spannung :.2f}')+"V -Phase A") 

我读出第一行,在第二行我打印了只有两位数的小数。