Einmalige Ausführung pro Zyklus

Neals

Level-1
Beiträge
347
Reaktionspunkte
72
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey Leute,

ich habe einen Programmteil, welcher sehr rechenintensiv ist. Eigentlich benötige ich die Berechnung nur ein einziges mal pro Zyklus.

Wenn der Baustein aber mehrere Male aufgerufen wird, wird dieser jedes mal komplett abgearbeitet, obwohl die Ergebnisse für diesen Zyklus eventuell schon anstehen.

Habe schon überlegt, irgendwie den Zyklustick zu speichern und abzufragen. Jedoch ist das auslesen der Ticks etc. recht aufwendig für die CPU.

Hat da jemand von euch irgendwie schonmal was umgesetzt, best practice oder ne Idea?
 
Hier mal zwei Ideen:

1. Kannst du in deinem Baustein ein IN/OUT hinzufügen? Dann setze zu Beginn des Zyklus eine Var auf false und übergib diese deinem Baustein. Im Baustein führst du den Code nur aus, wenn diese Var false ist. Gleichzeitig setzt du im Baustein die Var auf true und gibst sie wieder raus. Bei jedem weiteren Aufruf dieses Bausteins ist diese Var true bis ein neuer Zyklus beginnt.

2. Das Ganze ohne IN/OUT: Du nimmst eine globale Var und setzt sie zu Beginn eines jeden Zyklus auf false. Den Baustein führst du nur aus, wenn die Var false ist. Gleichzeitig setzt du im Baustein die Var auf true. Gleiches Ergebnis wie oben.

3. Das ganze mit einer lokalen Var: Du nimmst eine lokale Var und setzt sie zu Beginn eines jeden Zyklus auf false. Den Baustein rufst du nur auf, wenn die Var false ist. Nach dem ersten Aufruf des Bausteins setzt du für den Rest des Zyklus die Var auf true.

Ich hoffe du kannst eine der Ideen umsetzen und gebrauchen.

Mfg Cerberus
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Vorschläge.

Der Baustein soll ein Bibliotheks-Baustein sein. Daher habe ich keine Kontrolle über den Zyklus und es kann passieren, dass der "Anwender" diesen Baustein 20 mal aufruft.
 
Die Berechnung ist sicher an veränderbaren Parametern geknüpft. Vielleicht kannst du nur bei Änderung der Parameter die Berechnung anstoßen.

Um Ceberus sein Vorschlag aufzugreifen (best practice):

OB1:

SET
M 10.0
CALL FC 1 //1. Berechnung
CALL FC 1 //2. Aufruf
...
CALL FC 1 //n.Aufruf

FC 1:

UN M10.0
BEB
//Berechnung
SET
R M10.0
 
Danke euch beiden!

Habe es jetzt über den CycleCount in SystemTaskInfoArr aus der TcBase-Bibliothek gelöst. Darüber kann ich leicht erkennen, ob ich noch im gleichen, oder in einem neuen Zyklus bin.
 
Zurück
Oben