- Beiträge
- 24.322
- Reaktionspunkte
- 7.726
-> Hier kostenlos registrieren
Erzeugung einer vorgegebenen Pulsanzahl
Wenn ein Vorwärtszähler vorgeschrieben ist, dann würde ich das Programm so schreiben:
Vorwärtszählen hat die Besonderheit, daß sich der Vergleichswert myNumber über den ganzen Impulsausgabezyklus nicht ändern darf, es sei denn, man will absichtlich noch während laufendem Impulsausgabezyklus nachträglich die Impulszahl ändern. Wenn myNumber sich ungewünscht ändern kann, dann muß man beim Impulszyklus-Start myNumber in eine Kopie speichern und dann mit dieser Kopie arbeiten.
Dieses Problem umgeht man elegant, wenn man mit einem Rückwärtszähler arbeitet, da wird myNumber im Counter gespeichert und danach nicht mehr beachtet:
Ein weiterer Vorteil des Rückwärtszählers ist, daß man den Zählerstand direkt zur Anzeige eines Countdowns benutzen kann.
Wenn Pulszeit und Pausezeit gleich lang sind, dann braucht man nur 1 Timer. Mein Favorit ist in dem Fall ein Rückwärtszähler, der die Pulse und die Pausen zählt und die Pulsausgabe wird nur bei ungeraden Zählerständen TRUE:
Harald
Wenn ein Vorwärtszähler vorgeschrieben ist, dann würde ich das Programm so schreiben:
Code:
VAR_INPUT
Enable : BOOL;
myNumber : INT;
END_VAR
VAR
En_Trig : R_TRIG;
Timer_Puls : TON;
Timer_Pause : TON;
Counter : INT;
greenLightControl : BOOL;
END_VAR
En_Trig (CLK := Enable);
IF En_Trig.Q THEN
Counter := 0;
END_IF;
Timer_Puls (IN := Enable AND (Counter < MyNumber) AND NOT Timer_Pause.Q, PT := T#1s);
Timer_Pause (IN := Timer_Puls.Q, PT := T#1s);
IF Timer_Pause.Q THEN
Counter := Counter + 1;
END_IF;
greenLightControl := Enable AND (Counter < MyNumber) AND NOT Timer_Puls.Q;
Dieses Problem umgeht man elegant, wenn man mit einem Rückwärtszähler arbeitet, da wird myNumber im Counter gespeichert und danach nicht mehr beachtet:
Code:
VAR_INPUT
Enable : BOOL;
myNumber : INT;
END_VAR
VAR
En_Trig : R_TRIG;
Timer_Puls : TON;
Timer_Pause : TON;
Counter : INT;
greenLightControl : BOOL;
END_VAR
En_Trig (CLK := Enable);
IF En_Trig.Q THEN
Counter := myNumber;
END_IF;
IF NOT Enable THEN
Counter := 0;
END_IF;
Timer_Puls (IN := (Counter <> 0) AND NOT Timer_Pause.Q, PT := T#1s);
Timer_Pause (IN := Timer_Puls.Q, PT := T#1s);
IF Timer_Pause.Q AND (Counter <> 0) THEN
Counter := Counter - 1;
END_IF;
greenLightControl := (Counter <> 0) AND NOT Timer_Puls.Q;
Wenn Pulszeit und Pausezeit gleich lang sind, dann braucht man nur 1 Timer. Mein Favorit ist in dem Fall ein Rückwärtszähler, der die Pulse und die Pausen zählt und die Pulsausgabe wird nur bei ungeraden Zählerständen TRUE:
Code:
VAR_INPUT
Enable : BOOL;
myNumber : INT;
END_VAR
VAR
En_Trig : R_TRIG;
Timer : TON;
Counter : INT;
greenLightControl : BOOL;
END_VAR
En_Trig (CLK := Enable);
IF En_Trig.Q AND (myNumber > 0) THEN
Counter := myNumber + myNumber - 1;
END_IF;
IF NOT Enable THEN
Counter := 0;
END_IF;
Timer (IN := (Counter <> 0) AND NOT Timer.Q, PT := T#1s);
IF Timer.Q AND (Counter <> 0) THEN
Counter := Counter - 1;
END_IF;
greenLightControl := WORD_TO_BOOL(INT_TO_WORD(Counter) AND 1);
[SIZE="1"]
(* greenLightControl := Counter.0; darf man in ST wahrscheinlich nicht schreiben? *)[/SIZE]
Harald