1

如果我搜索足够长的时间,我通常会找到答案。但是今天是这一天......我从 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 和一个低地址,但我该怎么做?0x00 是六进制 - 我必须转换这个吗?如何?

我必须发送 Adress+functioncode+data+crc 的手动统计信息 - 如何执行此操作,或者 pymod/minimod 是否自动执行此操作?现在如何正确的功能代码等?我完全糊涂了,如果有人可以帮助我,我会很高兴...

谢谢

4

1 回答 1

1

感谢@Brits ,我让它运行起来了。我不得不使用read_float(0, functioncode=4, number_of_registers=2)where 0 是十进制的。如果我想读取 001A,我必须从十六进制转换为 dec = 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") 

我读出的第一行,第二行我用小数打印,只有 2 位数长。

于 2021-05-14T13:08:57.310 回答