Step 7 TON in SCL

phivog

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Habe ein Problem, und zwar habe ich eine auf der Siemens SPS in FB in SCL. Am Anfang deklariere ich eine TON den ich später starte. Der Eingang (IN) wird gleich nachdem der Timer nicht mehr benötigt wird auf FALSE gesetzt, um ihn später ein zweites mal zu nutzen. Das Problem ist, dass der Ausgang (Q) trotzdem auf TRUE stehen bleibt, obwohl (Auch laut Hilfe) der Ausgang FALSE wird sobald der Eingang FALSE ist. Beim zweiten mal fängt der Timer dann auch nicht an zu laufen.

Kennt jemand das Problem oder kann mir helfen?


tonZeitFuellzeit(IN:= TRUE, PT:= t#5000ms);

IF NOT i_xAutoBA THEN
tonZeitFuellzeit.IN := FALSE;
...
iState:=10;

ELSIF tonZeitFuellzeit.Q AND iq_stHardwareIO.stI.xDrucksensor (* Druck im Eimer aufgebaut! *)
THEN
tonZeitFuellzeit(IN:=FALSE , PT:= t#5000ms);
...
iState:=340;

ELSIF tonZeitFuellzeit.Q AND NOT iq_stHardwareIO.stI.xDrucksensor
THEN
tonZeitFuellzeit.IN := FALSE;
...
iState := 10;
END_IF;


Gruß
Phivog
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dürfen wir die Variablendeklaration sehen?

Code:
ELSIF tonZeitFuellzeit.[COLOR=#ff0000]Q AND iq[/COLOR]_stHardwareIO.stI.xDrucksensor (* Druck im Eimer aufgebaut! *)
        THEN 
            tonZeitFuellzeit(IN:=[COLOR=#ff0000]FALSE[/COLOR] , PT:= t#5000ms);
            ...
            iState:=340;

        ELSIF tonZeitFuellzeit.[COLOR=#ff0000]Q AND NOT iq[/COLOR]_stHardwareIO.stI.xDrucksensor
        THEN
            tonZeitFuellzeit.IN := [COLOR=#ff0000]FALSE[/COLOR];
            ...

btw.. Mit oder ohne Druckschalter wird der timer 0
 
VAR
...
tonZeitFuellzeit : TON;
tonPlatteunten : TON;

END_VAR

Ja, als das war jetzt ein Beispiel aus dem Programm wo er nicht schaltet. In dem dazugehörigem DB sehe ich, dass der Ausgang noch auf TRUE steht
 
Seh ich das richtig....

Wenn du den Timer nochmal verwenden willst wird das hier nicht viel bringen oder?
tonZeitFuellzeit.IN := FALSE;
Das setzt den Timer nicht zurück. Da der FB ja nicht aufgerufen wird

Damit du den Timer rücksetzen kannst musst du auf jeden Fall den FB aufrufen damit er einmal abgearbeitet werden kann.
tonZeitFuellzeit(IN:=FALSE , PT:= t#xyzms);


EDIT:
Es scheitert ja auch schon in deiner Beschreibung
Hi
Am Anfang deklariere ich eine TON den ich später starte.
Der Eingang (IN) wird gleich nachdem der Timer nicht mehr benötigt wird auf FALSE gesetzt, um ihn später ein zweites mal zu nutzen.
Wie gesagt es bringt nichts den nur den Eingang IN auf FALSE zu setzen und den FB nicht durchlaufen zu lassen
Das Problem ist, dass der Ausgang (Q) trotzdem auf TRUE stehen bleibt, obwohl (Auch laut Hilfe) der Ausgang FALSE wird sobald der Eingang FALSE ist.
Jep, woher soll den der FB wissen das sein IN sich geändert hat wenn er inzwischen noch nie abgelaufen ist...?
Die Hilfe geht übrigens davon aus das der Timer aufgerufen wird, und nicht durch irgendwelche IFs übersprungen wird...
Beim zweiten mal fängt der Timer dann auch nicht an zu laufen.
Warscheinlich hast du zu dem Zeitpunkt den Eingang IN schon wieder auf TRUE, der FB wurde aber nie mit IN=FALSE durchlaufen. Das kriegt der gar nicht mit.
Timer sind keine Hellseher... :rolleyes:
 
Zuletzt bearbeitet:
Im Augenblick wird der Timer durch die erste Zeile in jeden Zyklus mit IN:= TRUE aufgerufen.
Später setzt Du zwar den IN: auf FALSE, aber das bekommt der TON nicht mit, wie RONIN bereits erklärt hat, weil er mit diesem Parameter nicht aufgerufen wird.

Der momentan einzige Aufruf des TONs:
Code:
tonZeitFuellzeit(IN:= TRUE, PT:= t#5000ms);
Auf jeden Fall gut, dass der Timer selbst nicht durch irgendwelche IFs usw. übersprungen wird. Aber IN: ist immer TRUE, egal was sonst so folgt oder vorweg geschehen ist.


In Summe aller Bedingungen, die man in obigen Code sieht, müßte der Aufruf in etwa so aussehen:
Code:
tonZeitFuellzeit(IN:= i_xAutoBA AND NOT tonZeitFuellzeit.Q, PT:= t#5000ms);
(Der Drucksensor iq_stHardwareIO.stI.xDrucksensor hat nur Auswirkungen auf den iState, wenn ich das richtig sehe?)


Das Problem wird sein, das sich der Timer durch das "NOT tonZeitFuellzeit.Q" sofort wieder selber startet (wenn nicht mit dem Aktivieren des Timers die Automatik "i_xAutoBA" abgeschaltet wird) und der Zeitablauf damit von Neuem beginnt. Sieht aber irgendwie nicht so gewollt aus, oder?




PS: Verwende bitte mal den Code-Button (#) für's Programm. Ganz rechtes Icon in der 2. Reihe. Dann ist es besser lesbar und Du kannst auch Einrückungen und andere (Leer-) zeichen posten.
 
Zurück
Oben