PROGRAM MAIN
VAR
zaehler: TIME;
var1: UDINT;
strg: STRING;
END_VAR
var1:=1;
zaehler:=t#30000ms;
WHILE zaehler<>t#0ms DO
Var1 := Var1*2;
zaehler := zaehler-t#1000ms;
END_WHILE
strg:= UDINT_TO_STRING(var1);
var1 = 16#40000000
zaehler = T#0ms
zaehler = T#0ms
var1 = 16#40000000
zaehler = T#0ms
strg = '1073741824' var1 = 16#40000000
Ist Klar, weil die Eingangsbedingung schon nach dem ersten Zyklus nicht mehr gilt.Hallo,
habe ein kleines Problem. Ich will entweder eine RETURN-
oder eine WHILE-Schleife nutzen, die 30 Sekunden überprüft wird.
Mit einer WHILE sieht es bis jetzt wie folgt aus, jedoch funktioniert es nicht!
Deklarationen:
Die Anweisung is nur ein Bespiel:Code:PROGRAM MAIN VAR zaehler: TIME; var1: UDINT; strg: STRING; END_VAR
Das Ergebnis bekomme ich nur leider nicht nach erst 30 Sekunden, sondern sofort.Code:var1:=1; zaehler:=t#30000ms; WHILE zaehler<>t#0ms DO Var1 := Var1*2; zaehler := zaehler-t#1000ms; END_WHILE strg:= UDINT_TO_STRING(var1);
VAR
ton1: TON;
END_VAR
ton1(IN := NOT ton1.Q , PT :=t#30s);
IF ton1.Q THEN
.... (* Aktion *)
END_IF
IF ton1.IN THEN
(* Aktion *)
END_IF
ton1(IN := NOT ton1.Q [B]AND (*Bedingung*)[/B] , PT :=t#30s);
IF ton1.Q THEN
(* Aktion *)
[B] (*Bedingung := FALSE *)[/B]
END_IF
Jetzt ist nur die Frage, ob er seine Aktion dreißig Sekunden lang oder erst nach dreißig Sekunden ausführen will.
PROGRAM MAIN
VAR
var1 : UDINT;
strg : STRING;
Zeit : TON;
END_VAR
var1:=1;
Zeit(IN := NOT Zeit.Q , PT :=t#30s);
IF Zeit.Q THEN
Var1 := Var1*2;
END_IF
strg:= UDINT_TO_STRING(var1);
Probiers mal damit:
Code:IF zaehler < 30 THEN Timer(IN:= TRUE, PT:= t#1s); IF Timer.Q THEN Timer(IN:= FALSE); var1 := var1*2; zaehler := zaehler + 1; END_IF END_IF IF zaehler = 30 THEN strg := UDINT_TO_STRING(var1); END_IF
IF Zaehler = 0 (* oder anderer Beginn *) THEN
var1:=1;
END_IF
Zeit(IN := NOT Zeit.Q , PT :=t#30s);
IF Zeit.Q THEN
Var1 := Var1*2;
Zaehler := Zaehler +1;
END_IF
IF Zaehler > (*Max Wert*) THEN
strg:= UDINT_TO_STRING(var1);
(* evtl. noch *)
Zaehler := 0;
var1 := 0
END_IF
Meine Version macht 30 Sekunden lang jede Sekunde eine Var1-Berechnung.
Wenn du nun 10 Minuten lang alle 10 Sekunden eine Berechung durchführen willst, dann stellst du beim Timer PT:= t#10s ein. Zusätzlich benutzt du dann folgende Bedingungen, damit das ganze 10 Sekunden läuft:
1. zaehler < 60
2. zaehler = 60
Wenn du jede Sekunde eine Berechnung machen willst, dann kannst du den timer so lassen und nimmst stattdessen folgende Bedingungen:
1. zaehler < 600
2. zaehler = 600
Du kannst auch einfach über einen stink normalen Zähler die Anzahl der SPS-Zyklen mitzählen. Die Zykluszeit ist ja bekannt.Die Schleife soll 10min lang alle 10 Sekunden oder jede Sekunde versuchen eine Mail über AMS zu senden (SMTP-Funktionsblock).
Zahler1 := Zahler1 + 1;
IF Zahler2 < 600 THEN
IF Zahler1 > 100 THEN
(* Nachricht verschicken *)
Zahler1 := 0;
Zahler2 := Zahler2 + 1;
END_IF
END_IF
edit: mehrmals angepasst ;-)
Meinst du diese zykluszeit. hab ich eben aus dem Manual des BC9000, was ich nutze, rausgesucht.Du kannst auch einfach über einen stink normalen Zähler die Anzahl der SPS-Zyklen mitzählen. Die Zykluszeit ist ja bekannt.
Bei den PC-Steuerungen sind die Zykluszeiten fest vorgegeben.
Ja ja, meinte ich doch (ich arbeite täglich damit). Wollte nur sagen, dass sie vorgegeben wird und nicht der Grundsatz gilt "so schnell wie möglich".Bei den PC-Steuerungen kann man sie einstellen (Siehe Anhang)!!
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?