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

问题描述

如果我搜索足够长的时间,我通常会找到答案。 但今天是这一天…… 我从 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 位数长。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...