Funktion mit erweiterbarem Eingang selber schreiben

knautschkissen

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
In e!cockpit gibt es ja einige Funktionen (z.B. MUX) welche erweiterbar sind(anzahl der Eingänge) und der Typ der ein und ausgangsvariable beliebig ist (hauptsache gleich) Wie kann ich eine Funktion mit diesen Eigenschaften selber schreiben?
 
In e!cockpit gibt es ja einige Funktionen (z.B. MUX) welche
1. erweiterbar sind(anzahl der Eingänge) und der
2. Typ der ein und ausgangsvariable beliebig ist
3. (hauptsache gleich)
Wie kann ich eine Funktion mit diesen Eigenschaften selber schreiben?
Das sind ja 3 Probleme auf einmal! :confused:
1. In VBA geht das, müsste ich mal nachforschen wie, aber das würde Dir auch nicht helfen.
PrimitivLösung wäre, den Baustein für eine höhere - jedoch begrenzte - Anzahl auszulegen und darauf zu achten, dass nicht belegte Eingänge sich nicht störend auswirken.
2. Typ Variant benutzen.
3. Ich weiss nicht, ob es eine Möglichkeit gibt, abzufragen, mit welchem Typ ein Variant aktuell belegt ist.
Wenn doch, könntest Du im FB prüfen, ob alle gleich belegt sind und ggfs eine Fehlermeldung generieren.
Das war mein allgemeines BlaBla zum Thema - mangels genauer Sprachkenntnisse.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke trotzdem für den Input^^
Ich hab's inzwischen versucht mit Datentyp ANY aber das funktioniert nur mit eingangsvariablen... nicht mit ausgangsvariablen.
Schön währe allerdings wenn es möglich ist dass der Baustein nicht meckert, wenn nicht alle Eingänge beschaltet sind.
Ziel der Übung ist quasi ein BinaryMUX. e!Cockpit hat zwar einen MUX der erwartet aber als AuswahlEingang eine Zahl (0,1,2,3... usw) Anhand der er den Ausgang wählt. Anstatt der Zahl brauche ich aber genau so viele BOOL Eingänge wie Werte zur Auswahl stehen.
Meine nächste Idee währe ein Baustein der X Binäre Eingänge hat und anhand dessen welcher gesetzt ist die entsprechende Zahl (0,1,2,3...) ausgibt, was ich dann als Eingang für den MUX nutze.(Ist der 2. Einhang HIGH gibt er eine 2 aus, ist der 3. Eingang High gibt er 3 aus, sind beide High entscheidet der erste also er gibt 2 aus) Dafür brauche ich aber wieder die Variabilität der Anzahl der Eingänge. Da ich soeinen Binary MUX ziemlich oft im Projekt brauche und nicht jedes mal unnötig lange Bausteine zum Großteil mit 0 füllen will oder zig verschiedene Bausteine mit verschiedenen Anzahlen an Eingängen machen will soll er möglichst Flexibel sein.
 
Schön wäre allerdings wenn es möglich ist dass der Baustein nicht meckert, wenn nicht alle Eingänge beschaltet sind.
Um wie viele Ein- bzw. Ausgänge geht es eigentlich?
Wie äussert sich das Meckern des Bausteins, wenn ein Eingang nicht beschaltet ist?
Wäre es zu aufwändig, jeden "nicht beschalteten" Eingang mit einem konstanten FALSE zu beschalten?
Ich würde auch, so wie Du es beschrieben hast, einen Baustein dem MuxBaustein vorschalten, der die EinzelBits in entsprechende Zahlen umwandelt.
Siehst Du eine Möglichkeit, die EinzelBits z.B. in ein Byte (bei maximal 8 Bits) oder ein Wort (bei maximal 16 Bits) oder ein DoppelWort (bei maximal 32 Bits) zusammenzufassen? Damit würdest Du vermutlich Dein Problem nur an eine andere Stelle verlagern, aber bei Deinem Aus-EinzelBits-mache-eine-Zahl-Baustein hättest Du dann z.B. nur einen (DoppelWort-) Eingang und könntest damit den Bereich 1..32 EinzelBits erschlagen.

PS:
Zum Thema "BitNr des niederwertigsten 1-Bits als DezimalZahl ausgeben":
https://www.sps-forum.de/codesys-un...zimalzahl-aus-db-bitfeld-st-2.html#post716653
 
Zuletzt bearbeitet:
Hallo
Was heißt zu aufwändig, ansich nicht aber nervig. ich werde mir jedenfalls einen 8Bit und einen 16Bit Baustein machen und muss dann alle nicht verwendeten Eingänge mit False beschreiben ist dann halt so. Das Meckern äußert sich in der Compilermeldung "Dieser baustein erwartet genau 16 Eingänge" wenn ich z.B. ein WORD als Grundlage nehme.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du den Baustein nicht als FUNCTION sondern als FUNCTION_BLOCK (FB) erstellst, dann brauchst Du nicht alle Eingänge/Ausgänge beschalten. Du musst aber dafür sorgen, daß unbeschaltete Eingänge in der Instanz mit sinnvollen Werten (z.B. 0) initialisiert werden, weil den Instanzvariablen dann nichts zugewiesen wird und der FB nicht erkennen kann, ob beim Instanz-Aufruf ein Eingang oder Ausgang beschaltet ist, oder sonstwie auf den Eingang oder Ausgang zugegriffen wurde/wird.

Harald
 
Hallo,

@knautschkissen
wie wäre es denn, wenn du als Eingangsvariable ein Array mit variabler Länge verwendest?
Die Syntax dazu sieht z.B. so aus:

Code:
arData : ARRAY 
[*] of REAL;
 
Zurück
Oben