Das Skript macht, was es soll. Ich kann Befehle und Anfragen an den DALI-Bus senden, ich erhalte die DALI-Antworten, die Parameter werden eingelesen, die Testergebnisse gespeichert und das Relais lässt sich auch ansteuern. Ich stoße aber leider immer wieder einmal auf ein Problem. Lese ich zum Beispiel über das Skript die ersten vier Stellen der GTIN des Dimmers über DALI aus. Kann es passieren, dass ich statt (3,17,175,18) ein (4294967295,17,175,18) oder ein (4294967295, 4294967295, 42949672953,3) zurückbekomme und beim nächsten Mal (4294967295, 4294967295, 3, 42949672953) erhalte.
Ich habe also das Problem, dass statt dem empfangenen Wert ein 32-Bit-Wert mein Skript erreicht oder aber 32-Bit-Werte das Skript erreichen und der erwartete Wert verzögert das Skript erreicht. Bei konfigurierten Werten passiert das Gleiche. Lese ich die aus kann es sein, dass ein 32-Bit-Wert beim 3. Parameter erscheint und der Wert des dritten Parameters dann beim vierten erscheint und so weiter, während beim Auslesen über ein anderes Skript/Aufrufen der exe-Datei in der Kommandozeile/DALI-Tools die Korrektheit der Konfiguration bestätigt wird. Auf dem Bus-Monitor kann ich erkennen, dass die korrekten Werte vom Bus kommen. Verzichte ich darauf die Anzeige der exe-Datei auszublenden, kann ich sehen, dass auch von der exe-Datei die korrekten Werte übergeben werden. Ich nutze die exe-Datei auch in anderen Skripten, um etwa DALI-Testsequenzen nachzubauen, und bin dabei nicht auf dieses Problem gestoßen.
Das Problem tritt, sofern es auftritt, gleich beim ersten Start des Skripts auf. Ist das Problem aufgetreten, hilft nur ein Neustart des Rechners, danach tritt der Fehler nicht mehr auf. Neustarten oder Abstecken der genutzten DALI- Hardware und so weiter bringt nichts. Läuft das Skript beim ersten Starten, läuft es ohne Probleme bis in alle Ewigkeit. Von 10 Starts des Skript habe ich den Fehler vielleicht einmal. Da ein Neustart des Rechners nötig ist das Problem zu beheben und das Skript ansonsten ohne Probleme funktioniert, bin ich in Sachen Fehlerquelle identifizieren ein wenig überfragt.
Am Anfang hatte ich mir für die ersten Versuche einen älteren DALI-Schaltaktor ausgeliehen und mit dem hatte ich das Problem nicht. Den mußte ich aber aufgeben, weil ich, als ich die Konfiguration ausgebaut habe, Befehle nutzen mußte, die der Aktor als Schaltbefehle versteht, und der Dimmer keinen unandressierten Broadcast unterstützt. Der USB-RS485-Connector könnte also eine Rolle spielen. Aber wie und wieso er mein Skript beeinflussen könnte und wieso nur manchmal, weiß ich nicht. Änderungen am Zugriff auf den COM-Port haben nichts gebracht und nach jedem Schaltbefehl wird die Kommunikation gleich wieder geschlossen, um zu verhindern, daß nach Abbrechen des Skripts der COM-Port belegt bleibt.
Meine Frage wäre nun, ob jemand eine Idee hat, wie der Fehler entsteht und woher der 32-Bit-Wert kommen könnte und wie er sich lösen lassen könnte. Mit ist klar, daß das jetzt keine alltägliche Frage ist, aber vielleicht hatte ja schon jemand ein ähnliches Problem.
Ich verwende das aktuelle Anaconda und Python 3.7 auf Windows 7 32-Bit und 10 64-Bit.
Code: Alles auswählen
#Methode zum Auslesen von DALI-Werten
def Read(Verzeichnis):
time.sleep(.300)
ans=subprocess.Popen(Verzeichnis, stdout=subprocess.PIPE, shell=True)
ans.wait()
ans.communicate()[0]
Ausgabe=ans.poll()
return Ausgabe
# Methode zum Ausführen von Befehlen
def Com(Verzeichnis):
# os.system(Verzeichnis)
time.sleep(.300)
subprocess.Popen(Verzeichnis, stdout=subprocess.PIPE, shell=True)
#Auslesen der GTIN
while True:
#Spannung aus
Uof()
time.sleep(1)
#Spannung an
Uon()
#Reset
com=loc+str(adr)+"d 32d"+do
Com(com)
time.sleep(0.5)
print("Test startet ... ")
print("Gerät identifizieren...")
for i in range(3,7,1):
#DTR1 setzen
com=loc+"C3h 0h"
Com(com)
time.sleep(0.5)
#DTR0 setzen
com=loc+"A3h "+str(i)+"h"
Com(com)
time.sleep(0.5)
com=loc+str(adr)+"d C5h"
#Read Memory at DTR1 und DTR0
ans=Read(com)
print(ans)
time.sleep(0.5)
#print(ans)
GTIN += [ans]
# ...