TIA Einen FB in mehreren OBs aufrufen

Mephisto

Level-1
Beiträge
242
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich möchte in TIA V14.1 einen SCL-FB mit unterschiedlichen Geschwindigkeiten laufen lassen. Ein Teil des Codes soll schnell abgearbeitet werden, der andere langsam. Habt ihr eine gute Idee, wie ich das anstellen könnte?
Ich hätte mir zwei Weckalarm OBs gemacht. Schnell (1ms) und Langsam (500ms).
Wenn ich meinen FB nun einfach je einmal pro OB aufrufe, wird ja trotzdem jedesmal der gange OB abgearbeitet.
Somit muss ich im SCL-Code unterscheiden können, welchen Code ich in welchem OB ausführen möchte.
Hat hier jemand eine gute Idee für mich?

mfg mephisto
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Meine Idee wäre eine Kombination aus beidem:
- 2FBs draus machen
- beide FBs in einen dritten FB packen
- den dritten FB in beiden OBs aufrufen und mittels Eingang sagen, welchen der beiden FBs er aufrufen soll

Ich bin mir nur nicht sicher, ob das funktioniert und/oder ob es dafür eine bessere/einfachere/schönere Lösung gibt.

mfg mephisto
 
Ich verstehe noch nicht so ganz was du damit erreichen willst.

Bezieht sich das ganze auf die andere Frage mit dem OB der den Baustein unterbricht?
 
Hallo!

Nein, das ist davon unabhängig zu sehen. (Danke übrigens)
Ich möchte (um die Zykluszeit des Programms zu reduzieren) einige Funktionen eines Bausteins in einen langsameren OB auslagern.
Hab übrigens grad probiert.
Ich kann dengleichen FB NICHT mit dem gleiche Instanz DB in zwei unterschiedlichen OBs aufrufen. Da meckert TIA.
Oder kann man da die Überwachung dafür abschalten?
 
Kannst doch in deinem Baustein zählen wie oft er aufgerufen wird.
Den Code für die Langsamen sachen dann halt nur jenden 500. durchlauf ausführen.

Gruß

Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die bisherigen Ideen scheinen mir sinnvoller, als der Plan, den gleichen Baustein mit den gleichen Instanzdaten in zwei unterschiedlichen Weckalarm-OBs aufzurufen. So müsstest Du Dich nämlich nicht um die Problematik kümmern, was passiert, wenn der Baustein durch sich selbst unterbrochen wird.
 
Ich kann dengleichen FB NICHT mit dem gleiche Instanz DB in zwei unterschiedlichen OBs aufrufen. Da meckert TIA.
Wenn die selbe FB-Instanz in verschiedenen OB (Task) aufgerufen werden kann, dann könnte es passieren, daß sie sich auch mal selber unterbricht - und deshalb muß der Code besonders reentrant implementiert werden. Der TIA-Compiler will anscheinend den Programmierer vor seinem eigenen Machwerk schützen, kann aber (noch) nicht überprüfen, ob der Programmierer die reentrant-Fähigkeit ausreichend/korrekt beachtet hat und wertet solche Aufrufe kurzerhand als unsauber/unzulässig.

PS: zu langsam getippselt. M-Ott hat das Problem gerade erwähnt.

Harald
 
Zuletzt bearbeitet:
Also ... denselben FB mit denselben I-DB in unterschiedlich OB's aufrufen funktioniert bei mir (TIA V14).
Das Grund-Problem kenne ich aus der Vergangenheit :
Ich hatte einen FB, der eine Kurven-Aufzeichnung mit Auswertung gemacht hat. Die Kurvenwerte habe ich im OB35 mit z.B. 1ms Aufruftakt gemacht. Die Auswertung konnte aber durchaus ettliche Millisekunden dauern weshalb ich das im zyklischen Programm umgesetzt hatte. Gelöst hatte ich es einmal dadurch, dass ich dem FB per IN-Parameter mitgeteilt hatte, von wo der Aufruf kam und zum Anderen in dem ich für unterschiedliche Auswertungsmodi neue separate Steuerbits als IN-Parameter hatte.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du könntest den Code in 2 If Abfragen unterteilen. Dazu legst du zwei Eingänge an, und fragst im Code einmal ab ob Eingang "Schnell" Wahr ist und einmal ob Eingang "Langsam" Wahr ist.
So wird ein Code einmalig in jedem Zyklus abgearbeitet, und ein anderer Code nur wenn eine gewisse Anzahl an Zyklen abgelaufen ist.

Die Frage ist halt wieso du das möchtest, denn du kannst auch 2 unterschiedliche FB's benutzen.
 
Du könntest den Code in 2 If Abfragen unterteilen. Dazu legst du zwei Eingänge an, und fragst im Code einmal ab ob Eingang "Schnell" Wahr ist und einmal ob Eingang "Langsam" Wahr ist.
So wird ein Code einmalig in jedem Zyklus abgearbeitet, und ein anderer Code nur wenn eine gewisse Anzahl an Zyklen abgelaufen ist.
Habe ich jetzt falsch mitgezählt? Ich hätte mich mit 1 If-Abfrage begnügt.
Wahrscheinlich soll der ELSE-Zweig durchlaufen werden, wenn der Baustein gar nicht aufgerufen wird? ;o)
 
Mit zwei If- Abfragen kann jeder Code jederzeit abgearbeitet werden. Mit einer If- Else Abfrage wird nur ein Teil abgearbeitet wenn die Bedingung Wahr ist.
Wenn Schnell und Langsam gleichzeitig Wahr sind wird somit der gesamte Code abgearbeitet, ansonsten nur einer oder eben keiner.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Zombie:
Das stimmt, wie du es schreibst. Dann sollte man aber auch genau das berücksichtigen. Also was nun richtig ist liegt im Auge des Betrachters :
IF (1) End_if ; // nur (1) wenn Bedingung erfüllt
IF (1) ELSE (2) End_If ; // (1) wenn Bedingung erfüllt sonst (2)
IF (1) ELS_IF (2) End_If ; // (1) wenn Bedingung erfüllt sonst (2) wenn Bedingung erfüllt
IF (1) ELS_IF (2) ELSE (3) End_If ; // (1) wenn Bedingung erfüllt sonst (2) wenn Bedingung erfüllt sonst (3)

Naja ... und alle möglichen weiteren Kombinationen. Vielleicht ein schöner Fall für SELECT ...?

Gruß
Larry
 
Mit zwei If- Abfragen kann jeder Code jederzeit abgearbeitet werden.
...
Wenn Schnell und Langsam gleichzeitig Wahr sind wird somit der gesamte Code abgearbeitet, ansonsten nur einer oder eben keiner.
Selbstverständlich kann schnell und langsam gleichzeitig stattfinden. Der, der mit 40 km/h durch die Tempo30Zone rauscht, findet es langsam und der Blitzer schnell.
Aber im Sinne von ...
Ich hätte mir zwei Weckalarm OBs gemacht. Schnell (1ms) und Langsam (500ms).
...
Somit muss ich im SCL-Code unterscheiden können, welchen Code ich in welchem OB ausführen möchte.
... wäre es doch eher ein Fall von entweder oder, von schnell einerseits und nicht schnell andererseits.

Was soll denn im Fall langsam überhaupt passieren? Soll z.B. eine Programmschleife durchgenudelt werden?
Wenn ja, könnte man ersatzweise in jedem "SchnellDurchgang" 1 von n SchleifenDurchläufen abarbeiten, so dass dieser Part nach n ms erledigt wäre und nicht die ZyklusZeit alle 500 ms ein Extrem erreicht. Gleichmässigere Verteilung auf alle Zyklen ist doch auch ganz schön, zumal man auf den Aufruf alle 500 ms ganz verzichten kann und nicht mit der Reentranz zu kämpfen hat!?
In welcher GrössenOrdnng liegt die ZyklusZeit? Wäre es akzeptabel, den langsamen Part zyklisch (OB1) abzuarbeiten statt in einem WeckAlarm?
 
Zurück
Oben