TIA SPS FB < neuer Timer pro DB erzeugen >

Lain91

Level-1
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ahoi zusammen,

ich habe einen FB in SCL programmiert, welchen ich nun ~20x verwenden möchte.
Die erzeugten DBs funktionieren auch soweit für sich, jedoch wird für jeden erzeugten DB der im FB referenzierte Timer verwendet (Was ja auch logisch ist, da dieser mit einer konkreten Symbolischen Referenz im FB erzeugt wird).
Ich hätte es allerdings gerne so, dass jeder aus dem FB erzeugte DB automatisch auch einen neuen Timer erstellt und die 20 DBs sich nicht einen Timer teilen müssen, was am ende zu Laufzeitfehlern führt, wenn ich mehrere DB Funktionen parallel ausführe.

Ist es also möglich im FB zu definieren, dass aus dem FB erzeugte DBs automatisch auch einen neuen Timer erzeugen?
Und falls nicht, wie umgehe ich dieses Problem? Es wäre ja eine ziemlich umständliche Lösung, wenn ich 20 FBs mit 20 verschiedenen Timern erstellen muss, um dann wiederum 20 DBs aus den 20 FBs zu erzeugebn :ROFLMAO:

Besten Dank für die Hilfe!
 
Einfach die Timer innerhalb von die Variabeldeklaration von den FB definieren.
Die Timer sind dann Teil von die Instanz-DB jeden Mal man ein neuen Instanz von den FB erzeugt.
Diese Verfahren nennt man auch Multiinstanz.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber dann hätte ich doch auch jedes mal den selben Timer?

Ich habe gerade etwas von SFB gelesen, vielleicht hilft mir das weiter, allerdings weiss ich nicht, wie ich diese einstellen / auswählen kann.
 
Wenn du die Timer im FB deklarierst, hat jede Instanz des aufgerufenen DBs einen eigenen Timer. Unter der Vorraussetzung, dass du jedem FB beim Aufruf auch einen eigenen Instanz-DB spendierst, sonst teilen sich die FBs tatsächlich den Timer.
 
Aber dann hätte ich doch auch jedes mal den selben Timer?

Nein. Du nimmst einen IEC-Timer, legst den Speicherbereich dieses Timers in der Variabeldeklaration deines FBs innerhalb des Stat-Bereiches.

Wenn du jetzt deinen FB mehrmals aufrufst, legst du doch jedesmal einen eigenen Speicherbereich für diesen aufgerufenen FB an (ob nun als extra DB oder als Multiinstanz innerhalb eines anderen FBs). Und damit liegen alle Werte des Zählers in einem anderen Speicherbereich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein. Du nimmst einen IEC-Timer, legst den Speicherbereich dieses Timers in der Variabeldeklaration deines FBs innerhalb des Stat-Bereiches.

Wenn du jetzt deinen FB mehrmals aufrufst, legst du doch jedesmal einen eigenen Speicherbereich für diesen aufgerufenen FB an (ob nun als extra DB oder als Multiinstanz innerhalb eines anderen FBs). Und damit liegen alle Werte des Zählers in einem anderen Speicherbereich.

Klingt logisch ja, allerdings haben dann alle DBs die auf die Speicheradressen des Timers zugreifen noch den selben Timer im Hintergrund laufen
=> Der Trigger Eingang für meinen Timerstart wäre somit für alle DBs gleich und auch der Timer - Ausgang wäre für alle DBs gleich?

In meinem Fall verwende ich einen TON
"IEC_Timer_0_DB_18".TON(IN := #value_change,
PT := #delay_on_ms_static,
Q => #value_changed,
ET => #timer_time);

Würde ich nun in meinem FB aus value_change verweisen und diesen wiederum auf 20 Trigger Eingänge legen, würde es nur bei dem ersten Auslösen und alle 20 anderen nicht. Jedenfalls solange nicht, bis der Timer ausgelöst wurde und value_change wieder auf 0 zurück gesetzt wird?
 
Nein es ist nicht denselben Timer.

Wenn du in den FB 3 IEC Timer deklarierst.
#Timer_1, #Timer_2, #Timer_3

Und dann rufst du den FB 2-Mal auf, je mit sein eigener Instanz-DB, dann gibts es 6 Timer !
 
Kurze Frage dazu, rufst du die FBs mit eigenen Instanz-DBs auf oder hast du einen FB, einen Instanz-DB und rufst diesen immer wieder zusammen auf?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Klingt logisch ja, allerdings haben dann alle DBs die auf die Speicheradressen des Timers zugreifen noch den selben Timer im Hintergrund laufen
=> Der Trigger Eingang für meinen Timerstart wäre somit für alle DBs gleich und auch der Timer - Ausgang wäre für alle DBs gleich?

In meinem Fall verwende ich einen TON
"IEC_Timer_0_DB_18".TON(IN := #value_change,
PT := #delay_on_ms_static,
Q => #value_changed,
ET => #timer_time);

Würde ich nun in meinem FB aus value_change verweisen und diesen wiederum auf 20 Trigger Eingänge legen, würde es nur bei dem ersten Auslösen und alle 20 anderen nicht. Jedenfalls solange nicht, bis der Timer ausgelöst wurde und value_change wieder auf 0 zurück gesetzt wird?

Du greifst tatsächlich immer auf den selben timer zu, da du siesem Timer einen eigenen "externen" Db zugordnet hast.
Du mußt den Timer im Status-Bereich des DB als Variable vom Typ TON anlegen (myTimer1). Dann ersetzt du die Timerbezeichnung:

"IEC_Timer_0_DB_18".TON(IN := #value_change,
PT := #delay_on_ms_static,
Q => #value_changed,
ET => #timer_time);

durch #myTimer1
 
Okay vielen Dank für eure Hilfe!

Ich glaube ich habe es jetzt...
Wenn ich den Timer (TON) in meinen SCL Code automatisch generieren lasse, wird man gefragt, ob man eine Einzelinstanz / Multiinstanz verwenden möchte.

Damit legt er dann auch automatisch die entsprechende TON_TIME Variable an, die ich ansonsten nicht alleine hab erzeugen können für den Timer. Warum auch immer, es nicht auf den eigenen Weg möglich ist und man genötigt ist die fertigen Bausteine zu nutzen.
 
Die TON_TIME-Variable kannst Du auch selbst in den Lokaldaten anlegen. Einfach unter Static eine Variable anlegen und bei Datentyp TON_TIME eintippen. Dieser Timer ist dann eine Multiinstanz. Jede Instanz des FB bekommt so einen eigenen Timer.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die TON_TIME-Variable kannst Du auch selbst in den Lokaldaten anlegen. Einfach unter Static eine Variable anlegen und bei Datentyp TON_TIME eintippen. Dieser Timer ist dann eine Multiinstanz. Jede Instanz des FB bekommt so einen eigenen Timer.

Harald

Ah okay... ich hatte erwartet, dass mir das TIA Portal dann auch die entsprechende Variable vorschlägt.
Aber es scheint auch möglich zu sein, eigene Variablen zu erzeugen, die nicht vorgeschlagen werden. Danke dafür :)
 
Zurück
Oben