Nochmal ne Erklärung:
Der Timer ruft UDPClient_DataArrival auf.
Dort wird erstmal geschaut ob in temp_Zustand was ist
( If Len(temp_zustand) = 0 Then )
Also er prüft die länge von Temp_zustand.
Ist die länge 0, ist temp_zustand leer.
Temp_zustand is der Zwischenspeicher mit dem immer das darauf folgende abgeglichen wird.
Also Temp_zustand ist leer, dann wird das erste Paket in Temp_zustand gespeichert
( UDPClient.GetData temp_zustand)
Gleichzeitig wird SchalterZustand auf 0 gesetz:
SchalterZustand = ""
Weil SchalterZustand ja nur beim allerersten paket leer ist.
Da steht ja dann immer das Ergebnis dann bei jedem durchlauf mit dem du arbeiten musst.
Gut und weil jetzt SchalterZustand leer ist, geht er nicht in die Schalterverarbeitung weil ja erst das 2te da sein muss um zu entscheiden, wie der Status der Dioden denn wirklich ist.
Das wird geprüft durch:
if len(SchalterZustand) > 0 then
.
.
.
Endif
Und die Punkte ist der komplette Code der eigentlichen Schalterverarbeitung also in den Vordergrund etc..
Drum macht er jetzt auch garnix und springt aus
UDPClient_DataArrival raus.
Jetzt ruft der Timer die Funktion das 2te mal auf:
Jetzt fragt er wiederab:
If Len(temp_zustand) = 0 Then
Die Bedingung ist falsch weil in Temp_Zustand das erste datenpaket liegt, also ist
len(temp_zustand)=6
drum springt er zum Else
Dort wird das 2te datenpaket abgerufen und Zeichenweise mit dem Temp_zustand verglichen:
Beispiel:
011100 ( 1.aufrufen der Funktion IF-Zweig)
001101 ( 2. Aufruf der Funktion Else-Zweig
Also For x = 1 to Len(Zustand) bedeutet:
Wiederhole solange bis x = Länge des Strings(Zustand) also 6
Du kannst auch For x= 1 to 6 schreiben wenn sich die Länge des ZUstands nie ändert, es also immer 6 Dioden bleiben.
Gut jetzt der Vergleich:
(Z=Zeichen - nur für die Erklärung jetzt)
Temp_Zustand: 011100
Zustand: 001101
x= 1
Verglichen wird 1.Zeichen von Temp_Zustand mit 1.Zeichen von Zustand:
Code dazu:
If Mid(zustand, X, 1) = Mid(temp_zustand, X, 1)
Z1-Temp_Zustand: 0
Z1-Zustand:0
Also identisch,und wenn identisch greift der IF-Zweig:
SchalterZustand = SchalterZustand & Mid(zustand, x, 1)
SchalterZustand is erstmal leer also heisst jetzt:
"" = "" & 0
SchalterZustand="0"
If greift else wird ignoriert->Next
x wird erhöht->X=2
Jetzt kommt wieder:
If Mid(zustand, X, 1) = Mid(temp_zustand, X, 1)
Z2-Temp_Zustand: 1
Z2-Zustand:0
Jetzt isses Unterschiedlich->Else-Zweig
SchalterZustand ist immernoch "0"
Und weils jetzt unterschiedlich ist, hast du ja fesgelegt das es ein flackern ist, und flackern bedeutet: 1/AN
Also Code:
SchalterZustand = SchalterZustand & "1"
"0" = "0" & "1"
Schalterzustand ="01"
Und so gehts weiter bis die Schleife durch is.
Wenn die Schleife durch ist ist Schalterzustand 6 Zeichen lang, genauso lang wie 1 Paket das kommt.
Temp_zustand wird zurückgesetzt ( ="") damit er beim nächsten timer-aufruf von UDPClient_DataArrival erst wieder zwischenspeichert:
If Len(temp_zustand) = 0 Then
Jetzt fragt er wieder ob:
If Len(SchalterZustand) > 0 Then
Das ist jetzt wahr und jetzt kommt die Schalterverarbeitung mit dem abgeglichen Zustand von 2 paketen.
Hoffe jetzt isses verständlicher:
Die Komplette Schalterverarbeitung muss in diese IF Abfrage:
If Len(SchalterZustand) > 0 Then
Endif
Weil er nur schalten darf wenn jeweils das erste mit dem 2ten abgeglichen wurde.
Und temp_zustand muss in die Deklaration oder als static in die Sub
Und die Abfrage heisst:
If Len(SchalterZustand) > 0 Then
Gruß