Fehlerhafte Verbindung zwichen Raspberry und Siemens Logo abfangen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Dusty
User
Beiträge: 35
Registriert: Sonntag 19. März 2023, 08:22

Hallo ich möchte gerne in meinem Programm eine fehlerhafte Verbindung abfangen ohne dass das Programm beendet.


Zur Erklärung :
Ich habe eine siemens logo zur poolsteuerung, wo ich auch 2 Temperatursensoren einlese. Jetzt steuere ich eine LED Anzeige mit Raspery pi an, wo mir im 10 Sekunden Zeitraster 3 Werte angezeigt werden
schleife 0 : endlos 1-3 wiederholen
Schleife 1: Systemzeit (Quelle raspberry)
Schleife 2: temp1 (Quelle Logo)
Schleife 3: temp 2 (Quelle Logo)


Die 3 Schleifen laufen sequentiell und endlos.
Wenn ich ein Verbindungs Abbruch (Logo zu Raspberry) zur Logo habe, wird das komplette Programm mit einer entsprechenden Fehlermeldung beendet.


Mein Wunsch wäre, das in so einen Fall, die gesamtschleife weiterläuft,
Die Uhrzeit weiterhin angezeigt wird im gesetzten Zeitraster, jedoch im Hintergrund versucht wird die Logo Verbindung wieder zu starten.
In der Zwischenzeit, wird nur die Uhrzeit und bei der Temperatur jeweils nur minus Striche angezeigt.
Ist das in mein pythonprogramm zu realisieren?,

Danke Euch für einen Rat
Gruß
Steffen

hier mal mein bisheriger Programm Aufbau dazu:



#!/usr/bin/env pythoimport osn3
import RPi.GPIO as GPIO
import time, datetime
import string
import snap7
import sys
import os
import subprocess

....


# Temp aus Logo lesen
plc = snap7.logo.Logo()
plc.connect(".....,1118,1245)
plc.get_connected()

AdrLogo_Temp_pool = "VW1118"
AdrLogo_Temp_aussen = "VW1120"

.....

Code: Alles auswählen

try:

 run = time.perf_counter()  
 while (round((time.perf_counter()-run),1) != (30.9)):
     #Uhrzeit anzeigen
     start = time.perf_counter()
     while (round((time.perf_counter()-start),1) != (10.3)):
         print_Zeit()
     #Pooltemperatur anzeigen
     werth = str(plc.read(AdrLogo_Temp_pool))
     if werth == "":
         print("Something went wrong TP")
     start = time.perf_counter()
     while (round((time.perf_counter()-start),1) != (10.3)):
         print_Temperatur(werth,"Temp. Pool")
         print("Temp.Pool",werth)
     #Außentemperatur anzeigen   
     werte = str(plc.read(AdrLogo_Temp_aussen))
     start = time.perf_counter()
     while (round((time.perf_counter()-start),1) != (10.3)):
         print_Temperatur(werte,"Temp. Außen")
         print("Temp.Außen",werte)
         if werte == "":
            print("Something went wrong TA")
     #call_python('/home/pi/Desktop/finale/masterpool.py')
     run = time.perf_counter()
#os.execl(sys.executable, sys.executable, * sys.argv) # Nothing hapens
except:
 print ("Nach der Schleife")
 digit_aus()
 plc.connect("192.168.178.6",1118,1245)
 plc.get_connected()
 print("Program terminated manually!")

#else:
 print ("Nach Error")
 digit_aus()

finally:
 print ("LED zurückgesetzt")
 digit_aus()


print("Tschau")
digit_aus()
plc.disconnect()
plc.destroy()
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird in Python immer mit 4 Leerzeichen pro Ebene, nicht mal 1, mal 3 und mal 4. Das macht den ganzen Code sehr schwer lesbar.
Die vielen unnötigen Klammern machen den Code auch schwer lesbar.
perf_counter ist wohl bei Deinen Genauigkeitsanforderungen nicht nötig, da reicht ein time.monotonic.
Statt zu runden, solltest Du einfach mit > vergleichen.
Wenn Du drei Schleifen hast, die 10.3s dauern, dann sollte das insgesamt 30.9s dauern, die äußere while Schleife wird also exakt einmal durchlaufen, kann also weg.
Der Code sieht also bisher ungefähr so aus:

Code: Alles auswählen

import time
import snap7
ADDRESS_TEMPERATURE_POOL = "VW1118"
ADDRESS_TEMPERATURE_AUSSEN = "VW1120"

try:
    plc = snap7.logo.Logo()
    plc.connect("192.168.178.6",1118,1245)

    start = time.monotonic()
    while time.monotonic() - start < 10.3:
        print_zeit()
    while time.monotonic() - start < 20.6:
        temperatur = plc.read(ADDRESS_TEMPERATURE_POOL)
        if not temperatur:
            print_temperatur("---", "Temp. Pool")
        else:
            print_temperatur(temperatur, "Temp. Pool")
    while time.monotonic() - start < 30.9:
        temperatur = plc.read(ADDRESS_TEMPERATURE_AUSSEN)
        if not temperatur:
            print_temperatur("---", "Temp. Außen")
        else:
            print_temperatur(temperatur, "Temp. Außen")
except Exception as error:
    print(error)
finally:
    digit_aus()
    plc.disconnect()
    plc.destroy()
Wenn Du nun eine Schleife um alles haben möchtest, dann schreib doch einfach eine Schleife um alles.

Code: Alles auswählen

import time
import snap7
ADDRESS_TEMPERATURE_POOL = "VW1118"
ADDRESS_TEMPERATURE_AUSSEN = "VW1120"


def do_loop():
    try:
        plc = snap7.logo.Logo()
        plc.connect("192.168.178.6",1118,1245)
        while True:
            start = time.monotonic()
            while time.monotonic() - start < 10.3:
                print_zeit()
            while time.monotonic() - start < 20.6:
                temperatur = plc.read(ADDRESS_TEMPERATURE_POOL)
                if not temperatur:
                    print_temperatur("---", "Temp. Pool")
                else:
                    print_temperatur(temperatur, "Temp. Pool")
            while time.monotonic() - start < 30.9:
                temperatur = plc.read(ADDRESS_TEMPERATURE_AUSSEN)
                if not temperatur:
                    print_temperatur("---", "Temp. Außen")
                else:
                    print_temperatur(temperatur, "Temp. Außen")
    finally:
        digit_aus()
        plc.disconnect()
        plc.destroy()

def main():
    while True:
        try:
            do_loop()
        except KeyboardInterrupt:
            break
        except Exception as error:
            print(error)

if __name__ == "__main__":
    main()
Dusty
User
Beiträge: 35
Registriert: Sonntag 19. März 2023, 08:22

Ok erstmal vielen Dank, ich probiere es aus,
Gruß
Steffen
Antworten