Somachine Funktion mit Input-Array und Summe als Rückgabewert

Frohnius

Level-1
Beiträge
435
Reaktionspunkte
142
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo forum,
ich versuche eine recht einfache funktion zu realisieren .. und erhalte seltsame fehlermeldungen ...

FUNCTION summe : INT
VAR_IN_OUT
A : ARRAY
[*] OF INT;
END_VAR
VAR
i, sum2: DINT;
END_VAR

sum2:= 0;
FOR i:= LOWER_BOUND(A,1) TO UPPER_BOUND(A,1) DO
sum2:= sum2 + A;
END_FOR;
summe:= sum2;

beim aufruf mit
a:= summe(b);
Funktion 'SUMME' benötigt genau '0' Eingänge
sollte aber nicht sein ... der code ist ein codesys beispiel .. und VAR_IN_OUT ist nötig wegen dem array mit variabler länge...
(Zeile 3 (Dekl)): C0006: '..' an Stelle von ']' erwartet
^^ das array ohne feste länge wird aber was ich so gelesen habe so definiert ... [..] oder [0..0] funktionieren ebenfalls nicht

(Dekl)): C0006: 'OF' an Stelle von 'i' erwartet
(Zeile 8 (Dekl)): C0031: Typdefinition an Stelle von 'END_VAR' erwartet
(Zeile 2 (Dekl)): C0006: 'END_VAR' an Stelle von '' erwartet
(Zeile 3 (Dekl)): C0006: ';, := oder (' an Stelle von '' erwartet
(Zeile 1, Spalte 1 (Impl)): C0046: Bezeichner 'sum2' nicht definiert
(Zeile 1, Spalte 1 (Impl)): C0018: 'sum2' ist kein gültiges Zuweisungsziel
(Zeile 2, Spalte 1 (Impl)): C0046: Bezeichner 'i' nicht definiert
(Zeile 2, Spalte 1 (Impl)): C0018: 'i' ist kein gültiges Zuweisungsziel
(Zeile 2, Spalte 1 (Impl)): C0046: Bezeichner 'LOWER_BOUND' nicht definiert
(Zeile 2, Spalte 1 (Impl)): C0035: Programmname oder Funktionsblockinstanz an Stelle von 'LOWER_BOUND' erwartet



ich verwende Somachine 4.1 Sp2 und die eingestellte sps ist eine m251

laut dem schneider programmierhandbuch sollte das so möglich sein.

eigentlich möchte ich messwerte in einem array "aufzeichnen" und hätte meine funktionen gerne variabler um aufzeichnungsgeschwindigkeit und dauer verändern zu können,
mit arrays mit fester länge funktioniert alles wunderbar .

der code hier ist sozusagen nur ein "fallback" bei dem ich gleichen fehlermeldungen erhalte.

ich gehe davon aus, dass ich nur eine dumme kleinigkeit übersehe und hoffe, dass mir jemand helfen kann.

vielen dank für eure mühe :D
 
Moin Frohnius,

das ist aber erst seit der 3rd Edition der IEC spezifiziert. Ist das in Deiner CoDeSys Version bereits implementiert?

Ansonsten übergibst Du einen Poinetr auf das erste Element und mußt dann allerdings einen zusätzlichen Parameter "Länge" einführen, der Dir die Array-Länge angibt.

Gruß
Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das ist aber erst seit der 3rd Edition der IEC spezifiziert. Ist das in Deiner CoDeSys Version bereits implementiert?

ahhh ok - ... guter hinweis ... codesys compiler verison 3.5.3.86 wäre der entsprechende zu somachine 4.1 sp2 ... wird das problem sein

Ansonsten übergibst Du einen Poinetr auf das erste Element und mußt dann allerdings einen zusätzlichen Parameter "Länge" einführen, der Dir die Array-Länge angibt.
geniale idee .. und die länge weiss ich ja vor dem funktionsaufruf - perfekt danke ;)
 
achja .. sollte die lösung jemanden interessieren

FUNCTION summe : INT
VAR_INPUT
ptrZahl:POINTER TO INT;
ptrCount:UINT;
END_VAR
VAR
i: UINT;
sum2: INT :=0;
ptrHilf: POINTER TO INT;
END_VAR

FOR i:=0 TO ptrCount/2 -1 DO // geteilt durch 2 da wir 2 byte bei int haben ... -1 schleife bei 0 startet
ptrHilf:= ptrZahl+i*2; // i * 2 da int 2 byte hat
sum2:=sum2+(ptrHilf^);
END_FOR
summe:= sum2;


funktionsaufruf wäre dann
b:= summe(ADR(a),SIZEOF(a));
wenn a: array [1..egalWieGroß] of int ..
 
Zuletzt bearbeitet:
Zurück
Oben