Timer probleme

waldi

Level-1
Beiträge
25
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle Profis.
Mal eine ganz blöde frage. Wenn ich einen Timer merhfrach beutzen will wir kann ich das denn machen? Ich habe mal dies so ausprobiert.

Code:
      U     E    101.0
      FR    T      1
      O     E    101.1
      L     S5T#5S
      SE    T      1
      U     T      1
      =     A    102.1
      L     0
      U     E    101.4
      FR    T      1
      O     E    101.5
      L     S5T#5S
      SE    T      1
      U     T      1
      =     A    102.2
also ich kann den Timer nur dann zum laufen bringen wenn beide Eingänge zum einschalten eine "1" führen. Wie kann ich das also so realisieren damit ich diesen Timer mehrfach benutzten kann. Es ist keine Frage das ich einfach einen anderen Timer hernehmen könnte, gibt ja genug davon, aber es geht ums Prinzip.
Ach ja was ich auch nicht so ganz verstehe. Was passiert wenn man einen Timer mehrfach benutzt und desen Zeit variabel machen will.

Für eure Antworten bin ich schon jetzt dankbar.
 
Hallo!

du musst sicherstellen das der Timer nicht zur selben Zeit 2 mal gestartet wird.
Du kannst das mit Sprungbefehle machen also du musst über den Zweiten Timeraufruf springen wenn beim ersten Aufruf die Zeit gestartet wird. Aber schön ist halt was anderes.
Verwende die IEC Timer in einer Multiinstanz da hast dann das Problem nicht.

godi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich jetzt den IEC Timer verwende dann brauche ich ja auch einen DB. Was ist wenn ich ein und den selben DB für jeden aufruf benutze?

Was ist das besondere beim IEC Timer?

Warum würde es mit diesem klappen und mit anderen nicht?
 
aja zur Variablen Zeit eines Timers:
Code:
U E1.0
L S5T#1S
SPB Zeit
 
U E1.1
L S5T#2S
SPB Zeit
 
U E1.2
L S5T#3S
SPB Zeit
 
U E1.3
L S5T#4S
SPB Zeit
SPA end
 
Zeit: //Anweisungen für die Startbedinungen der Zeit
SE T1
 
end: NOP 0
 
Wenn ich jetzt den IEC Timer verwende dann brauche ich ja auch einen DB. Was ist wenn ich ein und den selben DB für jeden aufruf benutze?

Was ist das besondere beim IEC Timer?

Warum würde es mit diesem klappen und mit anderen nicht?

Du brauchst im Prinzip für jeden IEC Timer einen DB aber wenn du den in einen FB aufrufst dann kannst du den Timer als Multiinstanz anlegen. Dann brauchst du nur mehr einen DB für deinen FB.

Warum willst du eigentlich unbedingt einen Timer mehrmals verwenden?
 
Also hört sich vieleicht ein bisschen blöd an.

Ich rufe mit OB1 einen FB auf. Diesen FB nutze ich zu parametrierung. In diesem FB rufe ich einen FC auf in dem eine etwas größere Funktion drin ist. In diesem FC werden nochmals zwei FC aufgerufen. Einer davon ist der FC105 und den anderen wolte ich als Zeit-Element nutzen. Sprich ich will für mehrere Aufrufe, abhängig von der Parametrierung, nur einen Timer nutzen.

Das witzige ist dass der FC105, den ich zur Analogwert anpassung hernehme überall funktioniert. Sprich wenn ich zum beispiel 10 Aufrufe mit 10 Analogwerten habe so funktioniert jede einzelne Umrechnung. Warum geht das nicht auch mit einem Timer. Es ist nur eine Verzugszeit um einen Prellfreien Kontakt zu simulieren. Sprich ich habe keine Zeitkritische Maßnahme. Aber die Reaktion sollte auch nicht zu früh erscheinen. Der Zeitwert kann eigentlich auch konstant bleiben. Ich will bloß nicht x Timer verbrauchen.
 
Zuletzt bearbeitet:
Also hört sich vieleicht ein bisschen blöd an.

Ich rufe mit OB1 einen FB auf. Diesen FB nutze ich zu parametrierung. In diesem FB rufe ich einen FC auf in dem eine etwas größere Funktion drin ist. In diesem FC werden nochmals zwei FC aufgerufen. Einer davon ist der FC105 und den anderen wolte ich als Zeit-Element nutzen. Sprich ich will für mehrere Aufrufe, abhängig von der Parametrierung, nur einen Timer nutzen.


Mach aus den einem FC einen FB und nimm IEC Timer und du brauchst gar keinen S5/S7 Timer mehr ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das habe ich schon früher ausprobiert. Deshalb bin ich auch hier gelandet. Vieleicht habe ich den IEC Timer falsch genutzt aber ich müsste ja im FB den IEC Timer im STAT Bereich festlegen. Das heist zwangweise wird die DB vom erstem FB, Parametrierung, mit den Daten vom IEC Timer überladen. Also wenn ich 10 Aufrufe habe dann habe ich doch auch im DB 10 mal die Daten vom IEC Timer.
 
Das habe ich schon früher ausprobiert. Deshalb bin ich auch hier gelandet. Vieleicht habe ich den IEC Timer falsch genutzt aber ich müsste ja im FB den IEC Timer im STAT Bereich festlegen. Das heist zwangweise wird die DB vom erstem FB, Parametrierung, mit den Daten vom IEC Timer überladen. Also wenn ich 10 Aufrufe habe dann habe ich doch auch im DB 10 mal die Daten vom IEC Timer.

Jeder IEC-Timer hat dann im Stat-Bereich automatisch auch seine eigenen Daten. Die müssen sein, denn da steht ja sein Status, seine aktuelle Zeit etc.
Du kannst nicht einen DB für alle nutzen, das ist genau das Selbe, wie ein Timer mehrfach gestartet, es geht dann nicht.
 
Siehe dir den Code an da hast du mehre IEC Timer in einem FB als multiinstanz. Den FB kannst du auch beliebig oft aufrufen.
Code:
FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1

VAR
  Timer1 : SFB 4; 
  Timer2 : SFB 4; 
  Timer3 : SFB 4; 
END_VAR
BEGIN
NETWORK
TITLE =Timer1

      CALL #Timer1 ;
NETWORK
TITLE =Timer2

      CALL #Timer2 ;
NETWORK
TITLE =Timer3

      CALL #Timer3 ;
END_FUNCTION_BLOCK

ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1

VAR_TEMP
  OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ; //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ; //Reserved for system
  OB1_RESERVED_2 : BYTE ; //Reserved for system
  OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =
      CALL FB     1 , DB     1 ;
      CALL FB     1 , DB     2 ;
      CALL FB     1 , DB     3 ;
//   usw

END_ORGANIZATION_BLOCK
 
Siehe dir den Code an da hast du mehre IEC Timer in einem FB als multiinstanz. Den FB kannst du auch beliebig oft aufrufen.
Code:
      CALL FB     1 , DB     1 ;
      CALL FB     1 , DB     2 ;
      CALL FB     1 , DB     3 ;

Was währe wenn ich das so mache:
Code:
CALL Aufruf1;
CALL Aufruf2;
CALL Aufruf3;

Anstatt das alles im OB1 laufen zu lassen mache ich einen FB als Multiinstanz dazwischen. Diesen Rufe ich dann im OB1 auf. Damit müssten doch die Daten der SFB4 über den ersten Multi in den zweiten Multi-DB eingelesen werden.
Sprich wenn OB1 -> FB1 -> FB2 -> SFB4
Daten vom SFB4 sind dann im DB1, oder??????????????????????
 
Hallo,
der Timer wird in der Multi-Instanz dort einsortiert, wo du ihn deklarierst (siehe Beispiel von Godi). Wenn du ihn im FB1 im STAT-Bereich deklarierst ist auch damit auch Bestandteil des zum FB1 zugehörenden DB's.

Normalerweise müßte sich dein Problem (aus dem Thread "Multi-Instanz-Aufrufe") auf diese Weise lösen lassen, weil du doch so nur die Timer für den einen Multi-FB deklarieren mußt. Der kümmert sich dann doch um sich selbst ...

Ich würde das ganze aber erstmal versuche in der 1-dimensionalen Variante in Betrieb zu nehmen (call FB1 , DB101 ; call FB1 , DB102 ; call FB1 , DB103 ; usw.) und dann erst einen Kombi-Baustein bauen.
 
Zurück
Oben