Timer mehrfach aufrufen

DirkKuhn

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

Habe da ein Problem mit Timern. Ich habe eine Schrittkette programmiert un diese in einem FB drin. Der zugehörige Instanzdatenbaustein speichert die aktuellen Zustände. In der Schrittkette möchte ich nun einen Timer öfters aufrufen. D.h. Im Schritt1 lade ich den Timer und gehe in den Schritt2 erst wenn der Timer kommt. Ich verwende einen SE Timer. Nun möchte ich aber im Schritt 4 den gleichen Timer wieder verwenden. Aber immer wenn ich in der Schrittkette irgendwo den Timer ein zweites mal versuche zu laden dann funtzt der erste Timeraufruf nicht mehr???
Bin ratlos?? Hoffe mir kann jemand helfen.

MfG
Dirk
 
Den Timer rufst du besser ausserhalb deiner Schrittkette auf.
In der Schrittkette setzt du nur Variablen, die den Timer starten.

Damit ist dann gewährleistet, dass der Timer auch wirklich neu gestartet wird. In deiner bisherigen SK wird der Timer am Ende wohl immer noch auf 1 stehen, deshalb startet er nicht mehr neu.
#

Gru´ß pt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mhhh
Danke für den Tipp so funktionierts....auch wenn ich nicht verstehe warum es nicht in nem FB geht??
Naja hätte den Timeraufruf lieber in dem FB gehabt aber was solls wenns nicht geht gehts halt nicht.

Danke für deine Hilfe

Schöne Woche
Gruß Dirk
 
Hallo Dirk,

du müsstest die Timeraufrufe überspringen, so dass zum selben Zeitpunkt immer nur ein Aufruf schrittabhängig ausgeführt wird. Es muss dann aber gewährleistet sein, dass der Aufruf solange stattfindet bis der Timer abgelaufen ist.


Gruß, Onkel
 
Hallo,
du kannst den Timer im FB aufrufen, nur halt nicht mehrfach, weil sonst der letzte Aufruf der gültige ist ( es sei den du überspringst den Timer). Warum nimmst du nicht ein eigenes Netzwerk für den Timer und rufst ihn mit einer Oder-Verknüpfung auf:

un Schritt2
spb wei1
l Zeit2
T Schrittzeit
wei1: nop 0

un Schritt4
spb wei2
l Zeit4
T Schrittzeit
wei2: nop 0


O Schritt2
O Schritt4
L Schrittzeit
SE T100

Gruß

Andeas
 
DirkKuhn schrieb:
Mhhh
Danke für den Tipp so funktionierts....auch wenn ich nicht verstehe warum es nicht in nem FB geht??
Naja hätte den Timeraufruf lieber in dem FB gehabt aber was solls wenns nicht geht gehts halt nicht.

Danke für deine Hilfe

Schöne Woche
Gruß Dirk

Ich meinte auch nicht, das du den Timer ausserhalb des FB´s verwenden sollst, sondern so, wie es Znarf geschrieben hat.

Gruß pt
 
Oder einfach so.

FUNCTION_BLOCK FB 200
TITLE =Schrittkette
AUTHOR : DA
FAMILY : SCHRITT
VERSION : 0.1


VAR_INPUT
T_Sk : TIMER ; //Schrittkettentimer
END_VAR
VAR_IN_OUT
SNr : BYTE ; //Schrittnummer
END_VAR
VAR
Frg : BOOL ; //Schrittkettenfreigabe
Frg_next : BOOL ; //Weiterschaltfreigabe
Start : BOOL ; //Schrittkette starten
Laeuft : BOOL ; //Schrittkette läuft
Reset : BOOL ; //Schrittkette rücksetzen
END_VAR
BEGIN
NETWORK
TITLE =Reset Schrittkette

UN #Reset;
SPB Rese; // Sprungziel, wenn =0 ist
L 0;
T #SNr;
CLR ;
= #Reset;
Rese: NOP 0;

NETWORK
TITLE =Schrittkette läuft

L #SNr;
L 0;
<>I ;
= #Laeuft;

U #Laeuft; // Sprungziel, wenn =1 ist
SPB ein;
L 0;
T #SNr;
CLR ; // Aktionen löschen
ein: NOP 0;

NETWORK
TITLE =Sprungverteiler

L #SNr; // Lade die Nummer des Sprungziels in AKKU1
SPL end; // Sprungziel, wenn AKKU1 > 3 ist
SPA s0; // Sprungziel, wenn AKKU1 = 0 ist
SPA s1; // Sprungziel, wenn AKKU1 = 1 ist
SPA s2; // Sprungziel, wenn AKKU1 = 2 ist
SPA s3; // Sprungziel, wenn AKKU1 = 3 ist
end: L 0;
T #SNr;

NETWORK
TITLE =000: Warten auf "Start"

s0: U #Frg;
U #Start;
U #Frg_next;
SPB next;
BEA ;

NETWORK
TITLE =001: Schritt 1

s1: U #Frg;
L S5T#10S;
SE #T_Sk;

U #Frg;
U #Frg_next;
U #T_Sk;
SPB next; // Weiterschalten
BEA ; // oder Ende

NETWORK
TITLE =002: Schritt 2

s2: U #Frg; // Schritt, Aktionen
L S5T#2S;
SE #T_Sk;

U #Frg; // Schritt, Transitionen
U #Frg_next;
U #T_Sk;
SPB next; // Transition erfüllt
BEA ; // oder Ende

NETWORK
TITLE =003: Schritt 3

s3: U #Frg; // Schritt, Aktionen
L S5T#5S;
SE #T_Sk;

U #Frg; // Schritt, Transitionen
U #Frg_next;
U #T_Sk;
SPB next; // Transition erfüllt
BEA ; // oder Ende

NETWORK
TITLE =Schritt weiterschalten

next: L #SNr;
+ 1;
T #SNr;

CLR ; // Schrittkettentimer initialisieren
L S5T#10S;
SE #T_Sk;

BEA ; // Bausteinende

END_FUNCTION_BLOCK

MfG
Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein Timer kann grundsätzlich mehrfach aufgerufen werden,
es ist lediglich darauf zu achten dass bei einem erneuten Aufruf
wie bereits erwähnt eine neue 0/1 Flanke erhält.

Wenn der Timer in einer Schrittkette aufgerufen und die Schrittschaltung z.B. durch den abgelaufenen Timer ausgelöst wird und danach nicht mehr
angesprochen wird steht der Timer mit dem aktuellen Zeitwert 0
im Speicher und mit der internen Kennung dass ein 0/1 Übergang einmal stattgefunden hat.

Um den Timer ohne erneute 0/1 Flanke mit der gleichen oder einer anderen Zeit neu zu starten muss der Timer mit dem Befehl R Txxx
zurückgesetzt werden und anschaließend mit FR Txxx das intern gespeicheret Flankensignal gelöscht werden.
Jetzt kann der Timer ohne 0/1 Flankenübergang neu gestartet werden
Aber nicht vergessen zuvor im AKKU1_L einen gültigen Zeitsollwert reinzuschreiben.

Im Code sieht das dann in etwa so aus:

un Mxyz.1
SPB ST-2

// Hier steht irgendeine schrittabhängige Verküpfung
L S5T#10s
SE Txxx // Timer mit der Verknüpfung starten
U Txxx // Abfarage Timer im aktuellen Schritt abgelaufen

R Txxx // Timer zurücksetzen
FR Txxx // Timer wieder freigeben
R Mxyz.1 // aktiven Schritt zurücksetzen
S Mxyz.2 // nächsten Schritt aktivieren


ST-2: UN Mxyz.2
SPB ST-3

// Hier wird nur eine Wartezeit gestartet
L S5T#5s
SE Txxx // Timer wird neu gestartet
U Txxx // Abfraage Timer im aktuellen Schritt abgelaufen

R Txxx // Timer zurücksetzen
FR Txxx // Timer wieder freigeben
R Mxyz.2 // aktiven Schritt zurücksetzen
S Mxyz.3 // nächsten Schritt aktivieren
 
Es ist aureichend den Timer mit dem VKE 0 zu Initialisieren,
dies jedoch nach jedem abgeschlossenen Schritt (Siehe Sprung NEXT).

CLR ; // Schrittkettentimer initialisieren
L S5T#10S;
SE #T_Sk;

Danach kann er im nächsten Schritt neu gestartet werden.

MfG
Daniel
 
Hallo

Danke für eure große Hilfe und Unterstützung!!!
Es ist wie der vorige Beitrag beschrieben ohne Probleme möglich den Timer mehrfach aufzurufen. Ich hatte in meinem Programm leider ein kleiner Fehler sodass es nicht funktionieren konnte :-( Habe den Fehler entdeckt und jetzt funtzt es wie ich es mir vorgestellt habe!

War ein typischer Anfängerfehler den ich gemacht habe und zwar habe ich an dem Punkt an dem Die Ausgänge den Schritten zugeordnet werrden nicht geschrieben:

U #Schritt1
O #Schritt3
O #Schritt4
O #Schritt11
L S5T#1s
SE Timer_Nr

sondern hatte den Schritt11 später im Programm nochmals extra zugeordnet also so:

U #Schritt1
O #Schritt3
O #Schritt4
L S5T#1s
SE Timer_Nr

......
.....
.....

U #Schritt11
L S5T#1s
SE Timer_Nr


Somit wurde der Timer wohl nicht mehr gestartet weil die zuweisung Schritt11 zum Schluss stand und dies ja nicht erfüllt war....

Naja habs letztendlich selbst gefunden nach 4 Stunden Kopf zerbrechen
Der Fehler passiert mir kein 2.Mal..... obwohl ich mich zu Erinnern glaube das ich von meinem Prof in der Vorlesung dadrauf hingewiesen wurde :-/

Naja OK vielen Dank für euren Support!

Grüsse
Dirk
 
Zurück
Oben