TIA WIE Aufruf organisieren?

Zuviel Werbung?
-> Hier kostenlos registrieren
So in etwa würde ich es machen. Du kannst die unterschiedlichen Bausteine an ihrem Aufruf überpringen oder ihnen eine Freigabe geben und dann innen den ganzen Code überspringen (entweder mit einem GOTO :Ende oder mit einem IF dass die komplette innere Bearbeitung ausklammert). WHILE DO verbietet sich hier doch wohl von selbst ...

Gruß
Larry

Warum verbietet sich denn WHILE DO - es ist doch eine "Durchführungsbedingung", d.h., solange die Bedingung anliegt, wird der Code innerhalb dieses Befehls bearbeitet ... oder verstehe ich das jetzt total falsch?
 
Nicht wenn dieser FB vom FC aufgerufen wird.
Wo soll denn der FC den Rückgabewert vom INOUT des FBs speichern?

Wenn Du z.B. aus dem IN des FCs auch einen INOUT machst, dann kann das Ergebnis des FBs weiter (in diesem Fall an den DB) durchgereicht werden.


Danke hucki,

den ersten Teil habe ich jetzt verstanden!


Ursprünglich habe ich ja in dem FC KEINE Variablen deklariert und rufe hier die SK-FB's auf.

Mit der Variable hapert es noch ... also müsste ich im Aufruf-FC eine INOUT-Variable (z.B. "variable") deklarieren, und an diese den DB anbinden?

Code:
#variable := "AchsDB".Velocity;

Und diese #variable dann in der Aufrufzeile an die INOUT-Variable des FB's setzen. Ist das so gemeint?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum verbietet sich denn WHILE DO - es ist doch eine "Durchführungsbedingung", d.h., solange die Bedingung anliegt, wird der Code innerhalb dieses Befehls bearbeitet ... oder verstehe ich das jetzt total falsch?
Ja, aber innerhalb eines Zyklusses!
Die Schrittketten sollen doch sicher über mehrere Zyklen laufen, oder?
 
Ursprünglich habe ich ja in dem FC KEINE Variablen deklariert und rufe hier die SK-FB's auf.

Mit der Variable hapert es noch ... also müsste ich im Aufruf-FC eine INOUT-Variable (z.B. "variable") deklarieren, und an diese den DB anbinden?
Du kannswt die DB-Variable auch direkt an die FBs übergeben, wenn der FC eh' nur zum Aufruf dieser FBs dient.
Warum wolltest Du das denn über IN(OUT)s des FCs machen?
 
Du kannswt die DB-Variable auch direkt an die FBs übergeben, wenn der FC eh' nur zum Aufruf dieser FBs dient.
Warum wolltest Du das denn über IN(OUT)s des FCs machen?

Also ich glaube, jetzt verstehe ich irgendwas komplett falsch!

An die INOUT-Var des FB's komme ich doch erst beim Aufruf desselben heran und das ist doch nur im Aufruf-FC der Fall. :confused:

An welcher Stelle sonst könnte ich denn die DB-Variable DIREKT an die FB's übergeben?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hoffe, wir reden nicht irgendwo aneinander vorbei.

1. nur einmaliger Aufruf des FC je Zyklus
2. Im FC werden die FBs mit INOUTs aufgerufen

Richtig?


Dann kannst Du doch beim Aufruf der FBs dessen INOUTs statt mit Lokalvariablen des FCs auch direkt mit den DB-Variablen füttern.
 
Zuletzt bearbeitet:
Ich hoffe, wir reden nicht irgendwo aneinander vorbei.

1. Start FC
2. Im FC werden die FBs mit INOUTs aufgerufen

Richtig?


Dann kannst Du doch beim Aufruf der FBs dessen INOUTs statt mit Lokalvariablen des FCs auch direkt mit den DB-Variablen füttern.

Glaube es ist schon zu spät für mich ... echt peinlich, sorry!

Ja, richtig - im FC sollen per IF-ELSIF-Anweisungen diese sieben Schrittketten-FB's aufgerufen werden. Siehe mein Post #14!

Wenn ich nun einen FB im FC aufrufe (bzw. dessen Instanz-DB), dann muss ich ja alle deklarierten Variablen IN, OUT, INOUT versorgen.


Am Ende des Aufrufs steht nun die besagte INOUT-Variable, an die ich die DB-Variable bringen möchte:

Position := ... ?

Wenn ich nun schreibe

Position := "AchsDB".Velocity

dann meckert TIA und wir haben ja auch schon den Grund dafür herausgefunden.

Wie sonst könnte ich nun an "Position" direkt die DB-Variable bringen? :confused:
 
Zuletzt bearbeitet:
Am Ende des Aufrufs steht nun die besagte INOUT-Variable, an die ich die DB-Variable bringen möchte:

Position := ... ?

Wenn ich nun schreibe

Position := "AchsDB".Velocity

dann meckert TIA und wir haben ja auch schon den Grund dafür herausgefunden.
Das sollte aber eigentlich gehen.

Wie sehen denn die Deklarationen von "Position" und "AchsDB".Velocity aus?
Sind die wirklich gleich?
Ist Position wirklich INOUT und nicht nur OUT (dann wäre die Übergabe nicht mit := sondern mit =>)?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das sollte aber eigentlich gehen.

Wie sehen denn die Deklarationen von "Position" und "AchsDB".Velocity aus?
Sind die wirklich gleich?
Ist Position wirklich INOUT und nicht nur OUT (dann wäre die Übergabe nicht mit := sondern mit =>)?

Schön, zumindest sprechen wir ja schon mal von dem Selben ... :p

Ja, Position ist 100%ig ein INOUT - und bei der Übergabe steht auch := und nicht =>

Beide Variablen sind als DINT deklariert. Das Seltsame ist ja auch, wenn ich den FB z.B. direkt im OB1 (FUP) aufrufe, dann ist alles ok und TIA meckert nicht!

Wenn ich den Aufruf aber, wie beschrieben, unter SCL im FC mache, dann bekomme ich einen Fehler und die entsprechende Zeile ist rot unterstrichen.


Nachtrag:

Wenn ich mich richtig erinnere, ich hatte heute den Aufruf auch mal in SCL in einem FB gemacht und da war besagte Zeile "nur" gelb unterstrichen und ohne Fehlermeldung übersetzt. Also muss das irgendwie mit dem Aufruf im FC zu tun haben ... warum auch immer ...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist ja immer wieder ein Streitpunkt, einen IDB direkt zu beschreiben.
Ich vermute mal, das TIA deswegen meckert. Aber komisch, dass das dann im OB1 geht.

Und das ist aber nicht der IDB eines der FBs, die im FC aufgerufen werden, oder doch?
 
Es ist ja immer wieder ein Streitpunkt, einen IDB direkt zu beschreiben.
Ich vermute mal, das TIA deswegen meckert. Aber komisch, dass das dann im OB1 geht.

Und das ist aber nicht der IDB eines der FBs, die im FC aufgerufen werden, oder doch?

Nein, das ist nicht der IDB eines solchen FB's! ;)

Ok, warum auch immer das so nicht klappt - bliebe also noch die Variante mit der INOUT im FC - so wie ich es in Post #22 angedeutet hatte?

Das werde ich morgen (huch, ist ja schon bald) mal versuchen ... und berichten.

Danke zunächst für deine Hilfestellung!
 
bliebe also noch die Variante mit der INOUT im FC - so wie ich es in Post #22 angedeutet hatte?
Dann kann auch Deine Variante aus Post#16 funktionieren.

Ich hatte das IN als IN vom FC verstanden und nicht mit dem direkten Beschreiben eines IDBs assoziert (kommt bisher in meiner Programmierweise so nicht vor).
Sorry, wenn ich dadurch zusätzlich verwirrt habe. :oops:


Auf jeden Fall darf dieser IN des Festo-FBs dann aber nicht beschaltet sein, sonst wird der ja beim Aufruf des Festo-FBs wieder überschrieben!
Der offizielle Weg wäre die Beschaltung des Festo-FB-INs mit einer Variablen (z.B. in einem GDB), und diese Variable dann auch für die INOUTs Deiner FBs zu verwenden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann kann auch Deine Variante aus Post#16 funktionieren.

Ich hatte das IN als IN vom FC verstanden und nicht mit dem direkten Beschreiben eines IDBs assoziert (kommt bisher in meiner Programmierweise so nicht vor).
Sorry, wenn ich dadurch zusätzlich verwirrt habe. :oops:


Auf jeden Fall darf dieser IN des Festo-FBs dann aber nicht beschaltet sein, sonst wird der ja beim Aufruf des Festo-FBs wieder überschrieben!
Der offizielle Weg wäre die Beschaltung des Festo-FB-INs mit einer Variablen (z.B. in einem GDB), und diese Variable dann auch für die INOUTs Deiner FBs zu verwenden.


Guten Morgen lieber hucki,

da bin ich (schon) wieder - zwar noch etwas müüüde aber sonst ok! ;)


Das mit der Verwirrung ist echt kein Problem; bin euch für jederlei Hilfestellung(en) sehr dankbar und oftmals stelle ich mich ja auch - naja sagen wir mal - etwas begriffsstutzig an ...

Habe jetzt mal "deinen" offiziellen Weg beschritten - sieht erst mal gut aus so. Kann es aber momentan nicht testen, weil mir noch etwas an HW fehlt ...



Vielleicht könnten wir noch folgendes Verständnisproblem (meinerseits) ausräumen?


Warum verbietet sich denn WHILE DO - es ist doch eine "Durchführungsbedingung", d.h., solange die Bedingung anliegt, wird der Code innerhalb dieses Befehls bearbeitet ... oder verstehe ich das jetzt total falsch?


Ja, aber innerhalb eines Zyklusses!
Die Schrittketten sollen doch sicher über mehrere Zyklen laufen, oder?


... aber wenn das Programm nach einem Zyklus wieder an der Zeile mit dem Befehl "WHILE DO" ankommt und die Bedingung noch immer TRUE ist, dann wird der Programmcode doch erneut für einen Zyklus bearbeitet und somit laufen die SK doch auf dies Art und Weise über mehrere Zyklen, oder nicht?
 
Vielleicht könnten wir noch folgendes Verständnisproblem (meinerseits) ausräumen?

... aber wenn das Programm nach einem Zyklus wieder an der Zeile mit dem Befehl "WHILE DO" ankommt und die Bedingung noch immer TRUE ist, dann wird der Programmcode doch erneut für einen Zyklus bearbeitet und somit laufen die SK doch auf dies Art und Weise über mehrere Zyklen, oder nicht?
Das Programm hängt solange in der Schleife fest, wie die Bedingung erfüllt ist. Und zwar innerhalb eines Zyklusses. Erst, wenn die Bedingung falsch ist, wird mit dem Programm nach der Schleife weiter gemacht. (Keine einmalige Abarbeitung und im nächsten Zyklus wieder, wenn die Bedingung noch wahr ist. Das macht schon IF THEN so.)

Wird die Bedingung nicht falsch, erzeugst Du ruckzuck eine Zykluszeitüberschreitung.

Typisches Negativ-Beispiel dafür: Mit WHILE DO auf ein Ereignis an einem DI warten. Das kann aber nicht kommen, weil während des Schleifendurchlaufs das Prozessabbild nicht aktualisiert wird. Und das wiederum kann aber nicht aktualisiert werden, da das Programm in der Schleife fest hängt und somit nicht zum Ende kommt.

Deine Schrittkette wird auch nicht in einem Zyklus abgearbeitet. Die Auswahl für diese Schrittkette würde somit nicht falsch und Dein WHILE DO nicht mehr verlassen werden.
 
Das Programm hängt solange in der Schleife fest, wie die Bedingung erfüllt ist. Und zwar innerhalb eines Zyklusses. Erst, wenn die Bedingung falsch ist, wird mit dem Programm nach der Schleife weiter gemacht. (Keine einmalige Abarbeitung und im nächsten Zyklus wieder, wenn die Bedingung noch wahr ist. Das macht schon IF THEN so.)

Wird die Bedingung nicht falsch, erzeugst Du ruckzuck eine Zykluszeitüberschreitung.

Typisches Negativ-Beispiel dafür: Mit WHILE DO auf ein Ereignis an einem DI warten. Das kann aber nicht kommen, weil während des Schleifendurchlaufs das Prozessabbild nicht aktualisiert wird. Und das wiederum kann aber nicht aktualisiert werden, da das Programm in der Schleife fest hängt und somit nicht zum Ende kommt.

Deine Schrittkette wird auch nicht in einem Zyklus abgearbeitet. Die Auswahl für diese Schrittkette würde somit nicht falsch und Dein WHILE DO nicht mehr verlassen werden.


Wow, hab's auf Anhieb verstanden! :p

Lieben Dank ...
 
Zurück
Oben