Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Funktionsblock mehrfach innerhalb einer Schleife verwendbar?

mwatermann
2007-02-01
2007-02-08
  • mwatermann - 2007-02-01

    hallo,

    kurze knackige frage:

    darf ich ein und den selben, einfach initialisierten Funktionsblock (nicht Funktion) in einer FOR Schleife mehrfach hintereinander aufrufen?

    Haben das Phänomen, dass es bei es bei R_TRIG in einer for Schleife von 0-127 funktioniert und direkt danach bei F_TRIG, ebenfalls von 0-127 nicht mehr klappt (bei die gleiche zähl variable).

     
  • Rolf-Geisler - 2007-02-01

    Auch hallo,

    man darf, aber macht das überhaupt Sinn? Bei jedem Aufruf wird (bei R_TRIG und F_TRIG) das Triggersignal mit dem internen Abbild aus dem letzten Aufruf verglichen und dementsprechend der Ausgang gesetzt oder nicht.

    Die Konstruktion macht also nur dann Sinn, wenn sich das Triggersignal innerhalb der Schleife ZWISCHEN DEN BEIDEN AUFRUFEN ändern kann. Tut es das auch?

    Besser wäre es aber aus meiner Sicht, für jeden Aufruf eine separate Instanz des FB zu verwenden. Ist leichter zu debuggen und dürfte auch später leichter zu pflegen sein ...

    Rolf

     
  • mwatermann - 2007-02-02

    guten morgen,

    danke erst mal für die antwort.

    dazu:

    einfacher wird es dadurch eigentlich nicht; man müsste jeweils 128 FB's instanzieren und auch einzeln aufrufen.

    mit der FOR schleife geht es folgendermaßen: die zählvariable der FOR schleife gibt quasi 128 verschiedene tasten vor [ucKey], die dann innerhalb der FOR schleifen durch

    1. R_TRIG auf eine steigende und

    2. mit F_TRIG auf eine fallende flanke geprüft werden.

    bei R_TRIG funktioniert alles einwandfrei! nur bei F_TRIG klappt es nicht.

    wir vermuten einen bug in der F_TRIG funktion, aber leider kann man die ja nicht einsehen. kann dies sein? oder haben wir noch etwas übersehen?

     
  • J Schohaus - 2007-02-02

    Hallo

    Dein Vorhaben kann nur scheitern da zur identifizierung der Flanke eine Variable existieren muss wo der alte zustand enthalten ist.

    Auch deine R_Trig wird nicht richtig funktionieren, er wird solange TRUE

    an deiner Variable ist auch TRUE am Ausgang haben (bei aufruf des index).

    Zur Lösung :

    Leg die Instanzen von R_Trig und F_Trig als ARRAY an.

    z.B.

    r_trig_array : ARRAY [0..128] OF R_TRIG ;

    f_trig_array : ARRAY [0..128] OF R_TRIG ;

    dann läst sich in der Schleife deine Instanz einfach durch dein index Aufrufen

    z.B.

    For schleife := 1 to 128 do

    r_trig_array[schleife] (CLK:= Taste[schleife] , Q=> qTrig[schleife] );

    end_for

    Flanken lassen sich allerdings auch einfacher auswerten

    z.B.

    Taste : Array[0..128] OF BOOL ;

    TasteTrig : Array[0..128] OF BOOL ;

    FOR schleife:= 1 to 128 do

    IF Taste[schleife] AND NOT TasteTrig[schleife] THEN

    ( Trigger auf Positive )

    END_IF

    IF NOT Taste[schleife] AND TasteTrig[schleife] THEN

    ( Trigger auf Negative )

    END_IF

    Taste[schleife] := Tastetrig[schleife] ;

    end_for

    Gruß Jochen Schohaus

     
  • Rolf-Geisler - 2007-02-02

    Hallo,

    will das Problem am Beispiel von R_TRIG noch mal in Ruhe auseinandernehmen.

    In der Ursprungskonstruktion rufst Du eine Einzelinstanz von R_TRIG oder F_TRIG 128 mal nacheinander auf. Dem Eingang CLK übergibst Du ein Bit aus einem Array.

    Mögliche Fälle:

    1. Bit[i] ist dauerhaft FALSE und Bit[i+1] dauerhaft TRUE: der Baustein gibt beim Schleifenwert i+1 TRUE aus, weil Deine R_TRIG-Einzelinstanz eine Flanke gefunden hat. Intern steht nämlich das Vergleichsflag noch auf dem Zustand von Bit[i], der beim vorigen Schleifendurchlauf übergeben wurde.

    2. Bit[i] ist dauerhaft TRUE und Bit[i+1] wird gerade TRUE: der Baustein gibt beim Schleifenwert i+1 NICHTS aus, denn das interne Vergleichsflag steht auf dem Zustand von Bit[i], und das hat den gleichen Wert wie das soeben nach TRUE gewechselte Bit[i+1].

    Beide Lösungsvorschläge von Jochen Schohaus vermeiden das Problem, weil für jedes Bit aus dem Array ein eigener Referenzwert existiert (entweder als separate Bausteininstanz in den Arrays r_trig_array und f_trig_array oder als separater Flankenmerker im Array TasteTrig.

    Rolf

     
  • mwatermann - 2007-02-05

    guten morgen und vielen dank.

    das hat die sache recht gut geklärt; es war nicht bekannt, dass man FB's auch als array instanzieren kann.

    somit lässt es sich recht einfach anlegen und dann auch in der for-schleife ausführen.

    merkwürdig war nur, dass bei den tests, die erste schleife mit dem R_TRIG block funktioniert hat und die F_TRIG danach nicht... aber das war vermutlich ein fehler beim testen...

    danke euch noch mal!

     
  • Chräshe - 2007-02-08

    Hallo mwatermann,

    hab ich das richtig verstanden, es sollen bei 128 Bit die Flanken ausgewertet werden?

    Da kann ich zur Entlastung der Steuerung und Übersicht des Programms nur eine Wortverarbeitung empfehlen!

    So wie die Flanken eines Bits ausgewertet werden, kann z.B. auch ein Doppelwort auf Änderung abgefragt werden.

    Mit 4 Doppelworten Eingansseitig kann dies gelöst werden.

    Gruß

    Chräshe

     

Log in to post a comment.