ich möchte Daten von einer Wechselrichter im Python mit Visual Studio Code lesen . Der folgende Code läuft bei mir nicht ich weiß nicht warum . ich bekomme nichts von der Wechselrichter .
import serial
import time
ser = serial.Serial(
port='COM1',
baudrate=2400,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1
)
def send_command(command):
full_command = command + '\r' # Oder '\r\n' je nach Gerät
ser.write(full_command.encode())
time.sleep(1)
response = ser.read_all().decode(errors='ignore')
return response
response = send_command("QPIGS")
print("Antwort vom Wechselrichter:")
print(response)
ser.close()
Daten einer Wechselrichter mit python auslesen
Man benutzt keine kryptischen Abkürzungen. Was ist ein `ser`? Globale Variablen darf es nicht geben, alles was eine Funktion braucht, muß sie über ihre Argumente bekommen.
Aller restliche Code steht in einer Funktion mit den Namen `main`. Das verhindert auch effektiv, dass man aus Versehen globale Variablen definiert oder dass Funktionsdefinitionen mitten im Code auftauchen. read_all liest alles, was gerade im Puffer ist, wenn es etwas länger dauert, dann reicht vielleicht eine Sekunde warten nicht, oder eine Sekunde ist viel zu lang. Deshalb benutzt man read_until. Da wir Deinen Wechselrichter nicht kennen, kann man nichts dazu sagen, ob Du das richtige Protokoll benutzt. Kannst Du prüfen, ob die Verbindung überhaupt funktioniert?
Wenn ich das richtig lese, ist die Antwort in Wirklichkeit ein Binärformat, das je nach Command eine fixe Anzahl an Bytes zurückliefert. Also auf ein QPIGS wird irgendwas mit 100+x Bytes gesendet.
Aller restliche Code steht in einer Funktion mit den Namen `main`. Das verhindert auch effektiv, dass man aus Versehen globale Variablen definiert oder dass Funktionsdefinitionen mitten im Code auftauchen. read_all liest alles, was gerade im Puffer ist, wenn es etwas länger dauert, dann reicht vielleicht eine Sekunde warten nicht, oder eine Sekunde ist viel zu lang. Deshalb benutzt man read_until. Da wir Deinen Wechselrichter nicht kennen, kann man nichts dazu sagen, ob Du das richtige Protokoll benutzt. Kannst Du prüfen, ob die Verbindung überhaupt funktioniert?
Wenn ich das richtig lese, ist die Antwort in Wirklichkeit ein Binärformat, das je nach Command eine fixe Anzahl an Bytes zurückliefert. Also auf ein QPIGS wird irgendwas mit 100+x Bytes gesendet.
Code: Alles auswählen
import serial
def send_command(connection, command, size):
full_command = command + '\r'
connection.write(full_command.encode())
result = connection.read(size)
if result[-1] != 13:
raise ValueError(f"corrupt data {data}")
# TODO check crc
return result[:-3]
def main():
with serial.Serial(
port='COM1',
baudrate=2400,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1
) as connection:
response = send_command(connection, "QPIGS", size=110) # Anzahl Bytes, die Deine Version des Wechelrichters sendet
print("Antwort vom Wechselrichter:")
print(response)
if __name__ == "__main__":
main()
Du bekommst also eine Rückmeldung, wenn auch einen Fehler. NAK bedeutet Not-Acknowledged und legt nahe, dass der Befehl QPIGS nicht richtig ist, oder bestimmte Vorraussetzungen nicht gegeben sind. Du mußt also die Dokumentation zum Protokoll lesen, um herauszufinden, welche Befehle in welcher Reihenfolge abzusetzen sind, um das gewünschte Ergebnis zu bekommen.