from pymodbus.client import ModbusTcpClient import pandas as pd import struct import time import csv import os # Excel-Datei mit den Input-Registerinformationen excel_path = "data/ModBus TCPIP 1.17(1).xlsx" xls = pd.ExcelFile(excel_path) df_input_registers = xls.parse('04 Input Register') # Relevante Spalten bereinigen df_clean = df_input_registers[['MB Adresse', 'Variable', 'Beschreibung', 'Variabel Typ']].dropna() df_clean['MB Adresse'] = df_clean['MB Adresse'].astype(int) # Dictionary aus Excel erzeugen registers = { row['MB Adresse']: { 'desc': row['Beschreibung'], 'type': 'REAL' if row['Variabel Typ'] == 'REAL' else 'INT' } for _, row in df_clean.iterrows() } # CSV-Datei vorbereiten csv_filename = "modbus_log.csv" csv_exists = os.path.isfile(csv_filename) # Verbindung zur Wärmepumpe ip = '10.0.0.10' port = 502 unit_id = 1 client = ModbusTcpClient(ip, port=port) try: if not client.connect(): print("Verbindung zur Wärmepumpe fehlgeschlagen.") exit(1) print("Verbindung zur Wärmepumpe erfolgreich.") with open(csv_filename, mode='a', newline='') as file: writer = csv.writer(file) if not csv_exists: header = ['Zeit'] + [f"{address} - {info['desc']}" for address, info in registers.items()] writer.writerow(header) while True: print(f"\n--- Neue Abfrage --- {time.strftime('%Y-%m-%d %H:%M:%S')} ---") row = [time.strftime('%Y-%m-%d %H:%M:%S')] for address, info in registers.items(): reg_type = info['type'] result = client.read_input_registers(address, count=2 if reg_type == 'REAL' else 1) if result.isError(): print(f"Fehler beim Lesen von Adresse {address}: {result}") row.append('Fehler') continue if reg_type == 'REAL': value = result.registers[0] / 10.0 else: value = result.registers[0] print(f"Adresse {address} - {info['desc']}: {value}") row.append(value) writer.writerow(row) file.flush() time.sleep(10) except KeyboardInterrupt: print("Beendet durch Benutzer (Ctrl+C).") finally: client.close()