Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
Hallo, ich häng seit 1,5 Tagen und weiß nicht wie ich eine Wartefunktion in einer Schleife implementieren soll, die bei jedem Schleifendurchlauf aber benutzt wird.
Hintergrund ist: Ich will einen Wert hochzaehlen, wenn eine Taste gedrückt ist. Dies soll aber nicht schnellstmöglich gehen, sondern dass sich der Wert (für eine Widerstandsdekade) alle 500ms um 1 erhöht. Das hochzaehlen funktioniert und einen Timer hätt ich mit einem TP Glied realisiert. Nur die Wartefunktion wird nur einmal ausgeführt, da ja im nächsten Ablauf ET= PT ist und somit die Wartefunktion einfach durchgeschleift wird. Den Wert ET kann ich aber nicht zurücksetzen.
Gibts einen fertigen Baustein Timer oder wo hab ich grad das Brett vor dem Kopf?
Vielen Dank schonmal!
PS: hier noch mein Code
//
IF Ergebnis_PP <255 AND PP_Plus_kurz = TRUE THEN
warte:=TRUE;
Warten(IN:= warte, PT:= T#200ms);
setzen_moeglich:= NOT Warten.Q;
( schleife wird bisher nur einmal abgearbeitet)
IF setzen_moeglich = TRUE THEN
Ergebnis_PP:= Ergebnis_PP +1;
in_bits_wandeln(In:=Ergebnis_PP);
OUT_Pp_Bit0 := in_bits_wandeln.B0;
OUT_Pp_Bit1 := in_bits_wandeln.B1;
OUT_Pp_Bit2 := in_bits_wandeln.B2;
OUT_Pp_Bit3 := in_bits_wandeln.B3;
OUT_Pp_Bit4 := in_bits_wandeln.B4;
OUT_Pp_Bit5 := in_bits_wandeln.B5;
OUT_Pp_Bit6 := in_bits_wandeln.B6;
OUT_Pp_Bit7 := in_bits_wandeln.B7;
setzen_moeglich := FALSE;
warte:= False;
END_IF
END_IF
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
Du brauchst zwei Timer, die sich gegenseitig anstossen. Die Flanke eines Timersignals verwendest Du zum Hochzählen.
Hier ein Beispiel, was ich in allen Projekten als 1s-Taktgenerator benutze :
FUNCTION_BLOCK FB_Blinker(*Blinker, 1-s-Takt*)VAR_INPUT Enable : BOOL;END_VARVAR_OUTPUT Q    : BOOL;END_VARVAR Puls  : BOOL; tPuls  : TON; TPause : TON;END_VARIF EnableTHEN tPuls (IN := NOT Puls, PT := TIME#500ms);   tPause (IN :=   Puls, PT := TIME#500ms);   IF tPuls.Q   THEN Puls := TRUE;   END_IF;   IF tPause.Q   THEN Puls := FALSE;   END_IF;   Q := Puls;ELSE Q := FALSE;END_IF;
Q ist das besagte Signal, dessen Flanke zum Zählen verwendet werden kann.
Gruss
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
ja da war das Brett vorm Kopf. Blinker macht ja genau ein zyklisches Ein/Aus mit einstellbarer Zeitgrenze. Hab den Blinker zur Zeit diverese Male verwendet, aber eben nur für ein zyklisches Einschalten einer LED, da hätt mir das auch auffallen können
aber mit der Wartefunktion mit 2 Signalen hats auch ganz gut funktioniert und lass es jetzt so drin
Vg
Hubert
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo, ich häng seit 1,5 Tagen und weiß nicht wie ich eine Wartefunktion in einer Schleife implementieren soll, die bei jedem Schleifendurchlauf aber benutzt wird.
Hintergrund ist: Ich will einen Wert hochzaehlen, wenn eine Taste gedrückt ist. Dies soll aber nicht schnellstmöglich gehen, sondern dass sich der Wert (für eine Widerstandsdekade) alle 500ms um 1 erhöht. Das hochzaehlen funktioniert und einen Timer hätt ich mit einem TP Glied realisiert. Nur die Wartefunktion wird nur einmal ausgeführt, da ja im nächsten Ablauf ET= PT ist und somit die Wartefunktion einfach durchgeschleift wird. Den Wert ET kann ich aber nicht zurücksetzen.
Gibts einen fertigen Baustein Timer oder wo hab ich grad das Brett vor dem Kopf?
Vielen Dank schonmal!
PS: hier noch mein Code
//
IF Ergebnis_PP <255 AND PP_Plus_kurz = TRUE THEN
warte:=TRUE;
Warten(IN:= warte, PT:= T#200ms);
setzen_moeglich:= NOT Warten.Q;
( schleife wird bisher nur einmal abgearbeitet)
IF setzen_moeglich = TRUE THEN
Ergebnis_PP:= Ergebnis_PP +1;
in_bits_wandeln(In:=Ergebnis_PP);
OUT_Pp_Bit0 := in_bits_wandeln.B0;
OUT_Pp_Bit1 := in_bits_wandeln.B1;
OUT_Pp_Bit2 := in_bits_wandeln.B2;
OUT_Pp_Bit3 := in_bits_wandeln.B3;
OUT_Pp_Bit4 := in_bits_wandeln.B4;
OUT_Pp_Bit5 := in_bits_wandeln.B5;
OUT_Pp_Bit6 := in_bits_wandeln.B6;
OUT_Pp_Bit7 := in_bits_wandeln.B7;
setzen_moeglich := FALSE;
warte:= False;
END_IF
END_IF
Hallo,
Du brauchst zwei Timer, die sich gegenseitig anstossen. Die Flanke eines Timersignals verwendest Du zum Hochzählen.
Hier ein Beispiel, was ich in allen Projekten als 1s-Taktgenerator benutze :
Q ist das besagte Signal, dessen Flanke zum Zählen verwendet werden kann.
Gruss
Vielen Dank für die ausführliche Antwort.
Werds morgen gleich mal implementieren, sollte dann ohne Probleme laufen.
VG
Hubert
Moin
Ich denke es geht auch einfacher:
FUNCTION_BLOCK OSZILLATOR_FB
VAR_INPUT
T1 : TIME := t#500ms; ( Pausendauer )
T2 : TIME := t#500ms; ( Pulsdauer )
END_VAR
VAR_OUTPUT
Q : BOOL;
END_VAR
VAR
blinker:BLINK;
END_VAR
blinker(enable:=TRUE,TIMELOW:=T1,TIMEHIGH:=T2);
Q := blinker.out;
Jedesmal wenn von Q eine steigende Flanke kommt hochzählen.
Gruß Erik
Hallo,
ja da war das Brett vorm Kopf. Blinker macht ja genau ein zyklisches Ein/Aus mit einstellbarer Zeitgrenze. Hab den Blinker zur Zeit diverese Male verwendet, aber eben nur für ein zyklisches Einschalten einer LED, da hätt mir das auch auffallen können
aber mit der Wartefunktion mit 2 Signalen hats auch ganz gut funktioniert und lass es jetzt so drin
Vg
Hubert