nutellahase
Level-2
- Beiträge
- 180
- Reaktionspunkte
- 28
-> Hier kostenlos registrieren
Hatte letztens eine hitzige Debatte mit einem Kollegen wegen einer Flankenauswertung in SCL. Ich versteh auch nicht ganz wieso das eigentlich funktioniert. Hier erstmal der Code:
Der Index wird jeden SPS-Zyklus um eins erhöht. Anforderung_alt ist ein Array of Bool und eine Stat-Variable. Anforderung ist ebenfalls ein Array of Bool und eine Eingangsvariable.
Das Signal Trigger setzt er mit einer pos. Flanke. Ich versteh allerdings nicht wie die Flanke überhaupt zustande kommen kann. Angenommen der Index ist jetzt 1 und das Signal Anforderung an der Indexstelle ist ebenfalls log 1. Dann wird doch am Anfang des Programms folgendes gemacht:
Anforderung_alt[1]:= True; (weil ja Anforderung[1] ebenfalls True ist)
Wie kann jetzt die Flanke erfolgen?
If Anforderung[1] = True and not Anforderung_alt[1] = False weil sie ja davor mit dem Wert True überschrieben wird!?!
Verstehen würde ich es wenn er das nur einmalig machen will! Dann würde ich es allerdings so schreiben:
So würde Trigger nur einmal an der jeweiligen Indexstelle gesetzt werden, wenn das Signal Anforderung True ist.
Wenn er es bei jeder pos. Flanke machen will würde ich es so schreiben:
Dennoch funktioniert aber seine Variante auch... Wieso?? Ich denk bei SCL nämlich immer gerne Zeile für Zeile... Sprich was ganz oben steht wird auch als erstes durchgeführt...
Vielleicht denk ich aber auch nur falsch / zu kompliziert ?!?
Code:
Trigger := False;
Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
IndexAnf := IndexAnf + 1;
IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN
Trigger := True;
Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
END_IF;
Das Signal Trigger setzt er mit einer pos. Flanke. Ich versteh allerdings nicht wie die Flanke überhaupt zustande kommen kann. Angenommen der Index ist jetzt 1 und das Signal Anforderung an der Indexstelle ist ebenfalls log 1. Dann wird doch am Anfang des Programms folgendes gemacht:
Anforderung_alt[1]:= True; (weil ja Anforderung[1] ebenfalls True ist)
Wie kann jetzt die Flanke erfolgen?
If Anforderung[1] = True and not Anforderung_alt[1] = False weil sie ja davor mit dem Wert True überschrieben wird!?!
Verstehen würde ich es wenn er das nur einmalig machen will! Dann würde ich es allerdings so schreiben:
Code:
Trigger := False;
IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
IndexAnf := IndexAnf + 1;
IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN
Trigger := True;
Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
END_IF;
Wenn er es bei jeder pos. Flanke machen will würde ich es so schreiben:
Code:
Trigger := False;
IF IndexAnf > 99 THEN IndexAnf := 0; END_IF;
IndexAnf := IndexAnf + 1;
IF Anforderung [IndexAnf] AND NOT Anforderung_alt[IndexAnf] THEN
Trigger := True;
END_IF;
Anforderung_alt[IndexAnf] := Anforderung[IndexAnf];
Vielleicht denk ich aber auch nur falsch / zu kompliziert ?!?