- Beiträge
- 25.096
- Reaktionspunkte
- 8.085
-> 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
 
	 
  
 
		 
 
		
 
		 
 
 
 
		 
 
		