TwinCAT 3: VAR_IN_OUT CONSTANT zur ARRAY Deklaration benutzen

LeFish

Level-1
Beiträge
60
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits,

ich habe eine eigene Bibliothek, die einen FB enthält, dem ein POINTER TO ARRAY [0..i_myLength] OF ST_myType übergeben wird, wobei die array-Größe erst im Projekt bekannt ist, welches die Bibliothek nutzt.

Für CodeSys scheint folgendes möglich zu sein:

Code:
//myLib.library:

FUNCTION_BLOCK PUBLIC FB_myFB

VAR_INPUT
    p_myPointer                : POINTER TO ARRAY[0..i_myLength] OF ST_myType;
END_VAR
VAR_IN_OUT CONSTANT
    i_myLength : INT;
END_VAR

Code:
//Projektcode:

PROGRAM MAIN
VAR
    myArray    : ARRAY [0..i_myLength] OF ST_myType // war ST_Sensor - zur besseren Lesbarkeit nachträglich korrigiert. (LeFish 23.11.2022 um 23:28)
    myFB        : FB_myFB;
END_VAR

VAR CONSTANT
    i_thisLength    : INT := 3;
END_VAR

myFB(p_myPointer := ADR(myArray), i_myLength := i_thisLength);

Beim Kompilieren des Projekts unter TC3 Build 4024.10 in VS2017 bekomme ich folgenden Fehler:

Code:
Severity    Code    Description    Project    File    Line    Suppression State
Error        Array Border i_myLength does not evaluate to a valid signed integer constant [myLib]        FB_myFB


Kann mir jemand einen Tipp geben, wie ich das unter TC3 umsetzen könnte?

VAR_IN_OUT CONSTANT unter TC3
VAR_IN_OUT CONSTANT unter CodeSys
Tipp in Codesys-Forge Forum zu der Thematik

Ich befürchte __NEW fällt weg, da ST_myType eine nutzerdefinierter Typ ist...

Danke!

Beste Grüße
LeFish
 
Zuletzt bearbeitet:
Ich kann es gerade nicht selber testen, aber dafür gibt es Parameter bei Bibliotheken die Du einstellen kannst und in der Bibliothek dann zur Erstellung der Arrays nutzen kannst.
VAR_IN_OUT und CONSTANT geht nicht, da eine IN_OUT Variable beschreibbar sein muss.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann es gerade nicht selber testen, aber dafür gibt es Parameter bei Bibliotheken die Du einstellen kannst und in der Bibliothek dann zur Erstellung der Arrays nutzen kannst.
VAR_IN_OUT und CONSTANT geht nicht, da eine IN_OUT Variable beschreibbar sein muss.

Sind diese Parameter in den Project..ProjectSettings einzustellen?

Ich versuche gerade die unter Similar Threads verlinkte Lösung umzusetzen.
Die scheint zwischen CodeSys und TwinCAT portiertbar zu sein?
 
Ich schlage ein Array variabler Dimension ohne zweiter Eingang für die Dimension vor. Also myArray : ARRAY [*] OF ST_Sensor; als Eingang und im Code mit LOWER_ / UPPER_BOUND(myArray,1) die Dimension abfragen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, mit
Code:
VAR_INPUT
myarr : array[*] of st_sensor;
END_VAR
für my_fb habe ich es auch schon ohne Erfolg probiert. Der Compiler meinte da sinngemäß: array muss konstante definierte Größe haben.

st_sensor ist übrigens ein copy&paste Fehler aus dem Projekt und entspricht st_mytype =)

Kann es sein, dass TwinCAT 3 4024.10 noch nicht die IEC Norm 61113-3 implementiert hat wie etwa CodeSys 3.5 meines Wissens nach?
 
Zuletzt bearbeitet:
Da fehlt mir die Erfahrung mit Twincat, aber das kann ich mir nicht vorstellen.
Allerdings gehen Arrays variabler Länge nur als IN_OUT und nicht als INPUT, weil ja sonst der zu allokierende Speicher unbekannt ist.
 
Ich hab mich eigentlich an den Blogeintrag von Stefan Henneken gehalten, es nur nicht in einer Funktion sondern in einem FB implementiert... Ich teste nochmal mit VAR_IN_OUT. Evtl hab ich mich da vertan...

Evtl. hab ich noch einen Spezialfall wegen Umsetzung im einer Bibliothek vorliegen?

Sorry, so viele Fragen... Aber morgen versuch ichs mal mit den oben beschriebenen Library Parametern. Ich hab allerdings mit der "Pointer zum ersten Arrayelement"-Methode prinzipiell auch Erfolg gehabt und nun zumindest mal eine Basis...

Da für mich Portierbarkeit zwischen CodeSys und TC auch wichtig ist muss ich das auch noch mit ins Kalkül nehmen...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, mit
Code:
VAR_INPUT
myarr : array[*] of st_sensor;
END_VAR
für my_fb habe ich es auch schon ohne Erfolg probiert. Der Compiler meinte da sinngemäß: array muss konstante definierte Größe haben.

st_sensor ist übrigens ein copy&paste Fehler aus dem Projekt und entspricht st_mytype =)

Kann es sein, dass TwinCAT 3 4024.10 noch nicht die IEC Norm 61113-3 implementiert hat wie etwa CodeSys 3.5 meines Wissens nach?
Hier die Antwort darauf, warum das nicht gehen kann.
Array.png
Aber was spricht gegen die Lösung mit den Parametern?
 
Ich kann bestätigen, dass bei der Implementierung mit
Code:
... ARRAY [*] OF ...
ein Fehler meinerseits vorlag.
Ich habe es nun nochmals versucht und konnte es mit
Code:
VAR_IN_OUT
... ARRAY [*] OF ...
END_VAR
lösen.
Ist Geschmackssache, wie man es umsetzt. Für mich muss ich dabei erst auf einen grünen Zweig kommen, wenn ich mit der Lib arbeite.

Zu der Lösung mit einer Parameterliste: Das wäre wohl die eleganteste und transparenteste Lösung. Ich habe jedoch keine Entsprechung unter "CodeSys 3.5 SP16 Patch2" gefunden, was schade ist.

Ich möchte die Lib für CodeSys und TwinCAT möglichst einheitlich haben. Eine Einzige zu verwenden geht leider nicht wegen systemspezifischen Lib-Abhängigkeiten. Die Code-Sektionen der Libraries sollten aber gleich sein, finde ich. Und das wäre mit der Lösung mit "Pointer auf das erste Arrayelement" oder der "In_Out Array-Referenz unbestimmter Größe" der Fall.
 
Zuletzt bearbeitet:
Ich kann bestätigen, dass bei der Implementierung mit
Code:
... ARRAY [*] OF ...
ein Fehler meinerseits vorlag.
Ich habe es nun nochmals versucht und konnte es mit
Code:
VAR_IN_OUT
... ARRAY [*] OF ...
END_VAR
lösen.
Ist Geschmackssache, wie man es umsetzt. Für mich muss ich dabei erst auf einen grünen Zweig kommen, wenn ich mit der Lib arbeite.

Zu der Lösung mit einer Parameterliste: Das wäre wohl die eleganteste und transparenteste Lösung. Ich habe jedoch keine Entsprechung unter "CodeSys 3.5 SP16 Patch2" gefunden, was schade ist.

Ich möchte die Lib für CodeSys und TwinCAT möglichst einheitlich haben. Eine Einzige zu verwenden geht leider nicht wegen systemspezifischen Lib-Abhängigkeiten. Die Code-Sektionen der Libraries sollten aber gleich sein, finde ich. Und das wäre mit der Lösung mit "Pointer auf das erste Arrayelement" oder der "In_Out Array-Referenz unbestimmter Größe" der Fall.
Sollte aber gehen schau mal hier.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist Geschmackssache, wie man es umsetzt.
Die Variante mit variabler Länge hat den Vorteil, dass der Benutzer der Bibliothek nur sein Array an den FB anlegt und nicht noch zusätzlich die Größe angeben muss. D.h. weniger Eingänge, weniger Fehlerquellen und weniger erforderliches Know-how.
 
Zurück
Oben