MinimalModbus

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Mstyle
User
Beiträge: 3
Registriert: Montag 1. März 2021, 22:07

Hallo Zusammen

Ich versuche einen Zähler über eine Serielle Schnittstelle und Modbus auszulesen. Ich erhalte aber werte die ich so nicht verstehe. Ich möchte diese umwandeln oder anders auslesen.
Der Zähler sollte auf dem Register 3028 einen Float32 Wert zurückliefen. Also ca. 230V ich erhalte jedoch komplett andere Werte.

Code: Alles auswählen

#!/usr/bin/env python3
# modbusminirtu.py
import minimalmodbus
import serial


#Adapter für Modbus Anlegen
smartmeter = minimalmodbus.Instrument('/dev/ttyUSB0', 1) # port name, slave address (in decimal)
smartmeter.serial.baudrate = 9600 # Baud
smartmeter.serial.bytesize = 8
smartmeter.serial.parity   = serial.PARITY_EVEN # vendor default is EVEN
smartmeter.serial.stopbits = 1
smartmeter.serial.timeout  = 1  # seconds
smartmeter.mode = minimalmodbus.MODE_RTU   # rtu or ascii mode
smartmeter.clear_buffers_before_each_transaction = False
smartmeter.debug = False # set to "True" for debug mode



L1Spannung= smartmeter.read_long(3028, 3, False, 0)  #registeraddress, functioncode=3, signed=False, byteorder=0)
L2Spannung= smartmeter.read_float(3028, 3, 2, 0)

print(L1Spannung)
print(L2Spannung)


Ich erhalte folgende Werte zurück

Code: Alles auswählen

1852785511
1.8512100445240847e+28
Ich stehe irgendwo auf dem Schlauch.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe mal damit gespielt. Und das kommt mir spanisch vor:

Code: Alles auswählen

>>> import struct
>>> b = struct.pack('I', 1852785511)
>>> b
b'gCon'
>>> struct.unpack('f', b)
(1.8512100445240847e+28,)
Das da ausgerechnet “gCon” steht, kann ich mir als Zufall schwer denken. Kann es sein, dass deine Dokumentation der Schnittstelle falsch ist?
Mstyle
User
Beiträge: 3
Registriert: Montag 1. März 2021, 22:07

Ich habe den Zähler mal über die gleiche Schnittstelle mit dem QModMaster die Register 3028 auslese erhalte ich 230 zurück deshalb denke ich dass ich etwas beim Auslesen falsch mache.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

So viele Möglichkeiten scheint es ja nicht zu geben. Ein anderer Funktionscode (4), und andere Byte Order. Wobei ich das nicht glaube. Denn laut

Code: Alles auswählen

>>> import struct
>>> struct.pack('f', 230)
b'\x00\x00fC'


ist das immer noch nicht gCon.

Kannst du den Verkehr von dem anderen Tool und deinem Skript mal sniffen? Zb mit wireshark sollte man das können. https://wiki.wireshark.org/CaptureSetup/USB
Mstyle
User
Beiträge: 3
Registriert: Montag 1. März 2021, 22:07

Hallo ich habe das Problem gefunden. MinimalModbus beginnt mit 0 und die beschreibung mit beginnt mit 1. So muss ich also das Register 3027 auslesen.
Antworten