问题描述
如果我搜索足够长的时间,我通常会找到答案。 但今天是这一天…… 我从 Aliexpress 购买了一个带有 MODBUS RTU 连接的 EnergyMeter,我正在尝试读取它。我已经尝试了很多来自互联网的东西。
这是 EnergyMeter 的数据表1
我尝试了 pyModbus 和 minimummodbus。
我的两个脚本:
#!/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,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,number_of_registers=2)
print(str(f'{HV_A_Phase_Spannung :.2f}')+"V -Phase A")
第一行我读出,在第二行我用小数打印只有 2 位数长。