Übergabe von Array variabler Größe an FB / PRG

Benjamin
2007-08-23
2007-08-24
  • Benjamin - 2007-08-23

    Hallo,

    im Moment schaue ich mir die Sache mit den Pointern in Codesys genauer an und habe gleich eine Frage:

    Wie kann ich Arrays variabler Größe an einen Funktionsblock übergeben?

    Zum Ausprobieren möchte ich eine Neuwertmeldung erzeugen.

    VAR
      axListe : ARRAY [1..10] OF BOOL;
      pxListe : POINTER TO BOOL;
      iGroesse : INT;
      iGroesse2 : INT;
    END_VAR
    pxListe := ADR(axListe);
    iGroesse := SIZEOF(pxListe);
    iGroesse2 := SIZEOF(pxListe^);
    

    Am Ende steht dann in iGroesse = 4 und in iGroesse2 = 1. Ich erwarte aber 10, damit ich weiterarbeiten kann.

    Ist sowas überhaupt möglich?

    Zielplattform:

    Microinnovation XVS-400 / Codesys 2.3.6.4

     
  • hugo - 2007-08-23

    in der oscat.lib benutzen wir pointer auf arrays

    in allen funktionen die mit _array beginnen

    w www.oscat.de w

     
  • Benjamin - 2007-08-24

    Da steht doch Array variabler Größe. Ihr übergebt ja aber die Größe als Variable gleich mit. Das möchte ich nun mal wenn möglich vermeiden.

    BTW: Schreibst du und gravieren eigentlich noch Beiträge oder ist der Text eure Signatur?

     
  • Erik Böhm - 2007-08-24

    Moin

    Du kannst ja die Grösse des Arrays vor der Übergabe mit SIZEOF bestimmen und dann an die Funktion als Parameter übergeben.

    Gruss

    Erik

     
  • Benjamin - 2007-08-24

    Gute Vorschlag, so hab ichs dann auch gemacht.

    ```

    FUNCTION_BLOCK heNeuwertmeldung
    VAR_INPUT
      paxListe : POINTER TO ARRAY [1..INT_MAX] OF BOOL;  ( Zeiger auf Liste )
      iGroesse : INT;                                    ( Größe der Liste, am einfachsten per SIZEOF() übergeben )
    END_VAR
    VAR_OUTPUT
      Q : BOOL;
    END_VAR
    VAR
      tpImpuls  : TP;
      iWert     : INT; ( Hilfsvariable )
      iWert_Alt : INT; ( Hilfsvariable, letzter Zyklus )
      n : INT;
    END_VAR
    iWert := 0;
    FOR n := 1 TO iGroesse DO;  ( Alle Elemente des Arrays apklappern )
      IF paxListe^[n] THEN      ( Bei Ereignis Hilfsvariable erhöhen )
        iWert := iWert +1;
      END_IF;
    END_FOR;
    tpImpuls(
      IN := iWert > iWert_Alt, ( Wenn neues Ereignis einen Impuls erzeugen )
      PT := T#5s,
      Q => Q
    );
    iWert_Alt := iWert;

    ```[/code]

     
  • Erik Böhm - 2007-08-24

    Also. Geht doch.

    Ich hab aber doch noch nen Fehler gefunden.

    Abklappern wird mit 'b' geschrieben...

     
  • gravieren - 2007-08-24

    Hi

    "Apklappern wird mit 'b' geschrieben..."

    Meinst du so: Apklabbern

     
  • Benjamin - 2007-08-24

    [Schlag vor Kopf] Natürlich, das muss ich gleich noch korrigieren!

     
  • gravieren - 2007-08-24

    Hi Benjamin

    Da die CPU die Kommentare NICHT liest ist das halb so schlimm

    Wichtig sollte ein guter (fehlerfreier) Code sein

     

Log in to post a comment.