Variabel einen Wert für bestimmte Zeit zuweisen

joern_85

Level-1
Beiträge
38
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich würde gerne einer Variablen einen Wert für eine bestimmt Zeit zuweisen.

So das diese Variable immer zwichen TRUE und FALSE hin und her schlatet.

Damit möchte ich in meiner Visualisierung ein blinken erzeugen.

Ist dieses möglich? Gibt es vielleicht noch einfachere Wege dieses umzusetzten?

Ich arbeite mit TwinCat3.1 und benutzte die ST-Sprache.

Meine bisherigen verusche sind immer in einer Endlosschleife gescheitert.

Über Vorschläge freue ich mich sehr.

Danke.
 
Lampe:= not Lampe ;
oder verzögert
timer:ton;
timer(in:= not timer.q,pt:=t#250ms);
If timer.q then
lampe:=not Lampe;
End_if
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder einen Zähler in Abhängigkeit inkrementieren und die Variable am Ende negieren. Je nach Zykluszeit ergibt sich die Blinkzeit.

Beispiel für 1 Sekunde On/Off bei 10ms Zykluszeit:
Code:
counter := counter+1;
IF counter >= 100 THEN
  counter := 0;
  Lampe := NOT Lampe;
END_IF
 
Ich habe mir einen FB gebastelt der auch asynchrones Blinken (Ein und Aus-Zeit sind unterschiedl) kann.

Code:
FUNCTION_BLOCK FB_Blinker
VAR_INPUT
	tTein	:TIME := t#500ms;
	tTaus	:TIME := t#500ms;
	bStart	:BOOL;
END_VAR
VAR_OUTPUT
	bSignal	:BOOL;
END_VAR
VAR
	nSchritt	:INT;
	WarteTimer	:TON;
END_VAR


IF NOT bStart THEN nSchritt := 0; END_IF

CASE nSchritt OF

	0:	(*Blinker Aus*)
		bSignal := FALSE;
		WarteTimer.IN := FALSE;
		IF bStart THEN nSchritt := 1; END_IF

	1:	(*Blinksignal ein*)
		WarteTimer.PT := tTein;
		WarteTimer.IN := TRUE;
		bSignal := TRUE;
		IF WarteTimer.Q THEN
			WarteTimer.IN := FALSE;
			nSchritt := 2;
		END_IF

	2:	(*Blinksignal aus*)
		WarteTimer.PT := tTaus;
		WarteTimer.IN := TRUE;
		bSignal := FALSE;
		IF WarteTimer.Q THEN
			WarteTimer.IN := FALSE;
			nSchritt := 1;
		END_IF
END_CASE

WarteTimer();

Normales Blinken finde ich langweilig. Ich mags lieber Blitzlampenstyle :ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann stelle ich meinen Universalblinker auch noch zur Disposition:

Code:
FUNCTION_BLOCK FB_Blinker
VAR_INPUT
	IN: BOOL;
	PT_ON: TIME := t#500ms;
	PT_OFF: TIME := t#500ms;
END_VAR
VAR_OUTPUT
	Q : BOOL;	(* Pulse Output *)
END_VAR
VAR
	ton1: TON;
	ton2: TON;
END_VAR
-----------------------------------------

ton1(IN := IN AND NOT ton2.Q, PT := PT_OFF);
ton2(IN := ton1.Q, PT :=PT_ON);

Q := ton1.Q;
 
Na, wenn heute alle die Code-Spendierhosen anhaben, beteilige ich mich auch noch.
Code:
FUNCTION_BLOCK fblBlink;
VAR_INPUT
   inpTHig:TIME;
   inpTLow:TIME;
   inpSet:BOOL;
   inpReset:BOOL;
END_VAR
VAR_OUTPUT
   outBlink:BOOL;
END_VAR
VAR
   varTimer:TON;
END_VAR

IF outBlink
THEN
   varTimer.PT:=inpTHig;
ELSE
   varTimer.PT:=inpTLow;
END_IF
varTimer(IN:=NOT (varTimer.Q OR inpSet OR inpReset));
IF varTimer.Q
THEN
   outBlink:=NOT outBlink;
ELSIF inpSet XOR inpReset
THEN
   outBlink:=inpSet;
END_IF
Allerdings unter Vorbehalt, da aus dem Gedächtnis abgeschrieben.
 
In der Bibliothek

Easy800.lib

von Moeller/Eaton gibt es ein Blink-Relais.
Mit verschiedenen Zeiten für True und False...

Nur so als Tipp, für die, die nicht selber basteln wollen oder können...
 
Zurück
Oben