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]
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
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
in der oscat.lib benutzen wir pointer auf arrays
in allen funktionen die mit _array beginnen
w www.oscat.de w
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?
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
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]
Also. Geht doch.
Ich hab aber doch noch nen Fehler gefunden.
Abklappern wird mit 'b' geschrieben...
Hi
"Apklappern wird mit 'b' geschrieben..."
Meinst du so: Apklabbern
[Schlag vor Kopf] Natürlich, das muss ich gleich noch korrigieren!
Hi Benjamin
Da die CPU die Kommentare NICHT liest ist das halb so schlimm
Wichtig sollte ein guter (fehlerfreier) Code sein