TC3: Array Grenzen über FB_INIT festlegen

Beiträge
5.772
Reaktionspunkte
1.204
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe einen FB der Arrays nutzt, die zur Laufzeit konstant sind, aber beim Übersetzen soll aber zum Beispiel über FB_Init der untere und der obere Index festgelegt werden.
Hat einer eine Idee, wie ich das anstelle?
Nachtrag: Ich denke ein paar mehr Detailinfos wären nicht schlecht, tschuldigung, dass diese erst jetzt kommen.
Der FB soll als Vorlage für verschiedene Anlagenmodule dienen deren FBs sich von diesem dann ableiten und der Vorlagen FB liegt am Ende in einer Bibliothek. Dinge, die für alle Module gelten, sollen dann in der Vorlage implementiert sein. Dazu gehören auch zwei Arrays mit Instanzen von FB_TcAlarm, eins für Warnungen und eins für Fehler. Außerdem wird in einer FOR-Schleife in der Vorlage die Methode Create vom FB_TcAlarm ausgeführt. Über die Eigenschaften der abgeleiteten FBs werden Pragmas gesetzt, die festlegen, ob es überhaupt Fehler oder Warnungen gibt. Jedes Modul hat natürlich eine unterschiedliche Anzahl an Meldungen, weswegen die Arrays flexibel sein müssen, aber nur beim Übersetzen, nicht während der Laufzeit.
Ich hoffe das macht die Sache etwas klarer.
 
Zuletzt bearbeitet:
Sorry, ich weiß nicht ob ich dich richtig verstanden habe, glaube aber ich weiß was du meinst. Ich habe auch in einem Projekt ein " Grundgerüst" an Modulen. Angepasst an den Maschinentyp habe ich jeweils eine Biblitohek mit Konstanten und Parametern entsprechend der jeweiligen Ausbaustufe in dem z.B. die Arraygrenzen für Temperatursensormodule angepasst werden. Die Konstanten heißen im Projekt immer gleich, ihr Wert wird aber in der jeweiligen Bibliothek individualisiert.
Somit werden die Arrays beim kompilieren für jeden Maschinentyp individuell erstellt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du irgendwo gelesen, daß das mit der FB_Init gehen soll, oder ist das eher eine Wunschvorstellung?
Ich stehe auch öfters vor dem Problem, Bibliotheks-FBs zu entwickeln, deren anwendungsspezifische Nachkommen unterschiedliche Arraygrößen haben sollen.
Bisherige Lösung:
Eine Basisklasse ohne Datenarray, aber mit abstrakten Methoden für den Zugriff auf so ein Array. Damit kann ich in der Basisklasse die komplette Funktionalität implementieren.
Dann ein Template-FB, der ein Array hinzufügt und die abstrakten Zugriffsmethoden entsprechend überschreibt. Dieser FB ist in der Bibliothek vom Übersetzen ausgeschlosssen. Ich kann ihn in die Anwendung kopieren und brauche dort nur die Konstante für die Arraygröße anpassen.
Im Build 4026 wird es generische Konstanten geben, die man für jede FB-Instanz bei ihrer Deklaration anpassen kann. Das wird diese Dinge hoffentlich deutlich vereinfachen.
 
Sorry, ich weiß nicht ob ich dich richtig verstanden habe, glaube aber ich weiß was du meinst. Ich habe auch in einem Projekt ein " Grundgerüst" an Modulen. Angepasst an den Maschinentyp habe ich jeweils eine Biblitohek mit Konstanten und Parametern entsprechend der jeweiligen Ausbaustufe in dem z.B. die Arraygrenzen für Temperatursensormodule angepasst werden. Die Konstanten heißen im Projekt immer gleich, ihr Wert wird aber in der jeweiligen Bibliothek individualisiert.
Somit werden die Arrays beim kompilieren für jeden Maschinentyp individuell erstellt.
Das Prinzip mit den Parmatern kenne ich auch, kommt in meinem Fall aber leider, meine ich, nicht in Frage. Der FB in der Bibliothek ist nur ein Grundgerüst in dem Teile des Fehlerhandlings, z.B. die Insanziierung von FB_TcAlarm inzwei Array erfolgen soll, die Details werden dann direkt im Projekt in der Ableitung programmiert, in der sich dann auch entscheidet, wie viele es beim jeweiligen Modul geben wird, daher kann ich die Parameter wohl nicht nutzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du irgendwo gelesen, daß das mit der FB_Init gehen soll, oder ist das eher eine Wunschvorstellung?
Nein, das ist tatsächlich nur so eine Idee von mir gewesen. Ich wollte eigentlich alles über FB_Init steuern, um alles an einer Stelle zu haben, unter anderem auch zwei Flags, ob das Modul Fehler und/oder Warnungen hat, die dann Pragmas setzen. Über die Pragmas sollten dann Arrays und Code bedingt übersetzt werden oder halt nicht. Von der Idee mit den Flags bin ich aber schon abgerückt, da das nicht funktioniert, die Pragmas werden nach der Instanziierung gesetzt. Ich setze jetzt diese Pragmas im Advanced Knoten der Eigenschaften.
Im Build 4026 wird es generische Konstanten geben, die man für jede FB-Instanz bei ihrer Deklaration anpassen kann. Das wird diese Dinge hoffentlich deutlich vereinfachen.
Ich weiß nicht, ob ich den Kunden überredet bekomme ein Update zu fahren, mal schauen.
 
Die Konstanten heißen im Projekt immer gleich, ihr Wert wird aber in der jeweiligen Bibliothek individualisiert.

Ich habe so etwas im Codesys 2 auch schon gemacht, da hat das prima funktioniert.

Im TwinCAT 3 bin ich damit allerdings gescheitert.
Ich hatte damals auch Beckhoff darauf hin angesprochen und das ganze als Feature-Request eingereicht, weil die hatten damals auch keine Lösung. Der Feature-Request wurde aber abgelehnt.

Wie machst Du das im TC3.1.4024?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie machst Du das im TC3.1.4024?
Sorry, hatte deine Antwort damals nicht mehr gesehen und bin erst jetzt wieder auf den Thread gekommen.

Wenn du in der jeweiligen Bibliothek eine GVL anlegst und die Konstante definierts, kannst du sie über "GVL_Name"."NAME_DER_KONSTANTE" in der Deklaration des Arrays als Grenze einsetzen.

Die GVL wird dir in der Autovervollständigung zwar nicht angezeigt, aber wenn du den Namen von Hand einträgst geht es trotzdem.

Ich arbeite mit der 3.1 4024.55

Grüße

Markus
 
Ich habe letztens dieses Video auf Youtube gesehen. Das betrifft TC ab 4026.
Es gibt eine neue Möglichkeit, mit der man dein - und auch mein - Problem zufriedenstellend lösen kann.

So im FB das Array deklarieren, die generischen Konstanten müssen vorbelegt sein.
Code:
Var Generic Constant
    iLen_1 :Int := 10;
    iLen_2 :Int := 20;
End_Var
Var
    aTestArray1 : Array[0..iLen_1] of Byte;
    aTestArray2 : Array[0..iLen_2] of Byte;
End_Var

Dann kannst du den FB mit den Arraygrößen deiner Wahl aufrufen.
Mir fällt gerade ein, ein Link hätte es auch getan :LOL:
 
Ich habe letztens dieses Video auf Youtube gesehen. Das betrifft TC ab 4026.
Es gibt eine neue Möglichkeit, mit der man dein - und auch mein - Problem zufriedenstellend lösen kann.

So im FB das Array deklarieren, die generischen Konstanten müssen vorbelegt sein.
Code:
Var Generic Constant
    iLen_1 :Int := 10;
    iLen_2 :Int := 20;
End_Var
Var
    aTestArray1 : Array[0..iLen_1] of Byte;
    aTestArray2 : Array[0..iLen_2] of Byte;
End_Var

Dann kannst du den FB mit den Arraygrößen deiner Wahl aufrufen.
Mir fällt gerade ein, ein Link hätte es auch getan :LOL:
Das würde gehen, mal sehen, ob ich das nochmal umstelle wenn die 4026 verfügbar ist.
 
Zurück
Oben