TwinCat 3 TE2000 HMI Combobox MaxArrayIndex

mapfromme

Level-2
Beiträge
9
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich möchte in meiner Combobox verschiedene Strings und verschieden Anzahlen von Strings anzeigen.
Das ganze soll von der SPS über Variablen umgeschalten werden. Funktioniert auch soweit.
Problem: Das Array of String beeinhaltet 100 Einträge. Manchmal muss ich aber nur 4 Strings in der Combobox anzeigen. Die anderen 96 sind dan leer. Das ist nicht gerade schön.
In der Info liest man von einem "MaxArrayIndex" den man angeblich bei einer Combobox definieren kann. Diesen Wert würde ich dann gerne von der SPS dynamisch anpassen.
Jedoch finde ich "MaxArrayIndex" nicht bei meiner Combobox.
Kann mir jemand helfen?
 
In der Info liest man von einem "MaxArrayIndex" den man angeblich bei einer Combobox definieren kann.
Wo siehst du das denn? Gibt es nicht im TwinCAT HMI. Höchstens im alten PLC HMI.

Du kannst per JavaScript die Daten reduzieren. Die kürzeste Variante ist diese hier:
Zieh dein Serversymbol per Drag und Drop auf dein SrcData der Combobox. Dann plazierst du den Cursor dahinter und fügst das hier dahinter.

Code:
?.filter(String)
Damit wird aus dem Serversymbol ein Funktionsausdruck.

  • ?. ist der Optional Chaining operator. Liefert das davor keinen Wert (null) so gilt undefined
  • filter ist vom Array. Dieses erstellt ein neues Array und ruft mit jedem Element eine Funktion auf. Nur wenn diese Funktion truthy zurück, so wird das Element übernommen.
  • String ist der String-Konstruktor. Der macht aus allem ein String. Der Trick hier ist, dass dein leerer String nicht truthy sondern falsy ist. (!"sps" wird true, !"" wird false).

Und damit kriegt die Combobox ein Array mit allen Werten welche Strings mit Inhalt sind.
 
Zuletzt bearbeitet:
Och Mist. Sorry.
Probiere mal

%s%tescht%/s% ? %s%tescht%/s%.filter(String):null

Dann hast du da kein ecmascript6 feature was so scheinbar nicht unterstützt wird.
 
Sehr cool. Das funktioniert! Ohne Java Kenntnisse ist man da wohl ziemlich aufgeschmissen :(
Danke dir!
Kannst du mir auch noch sagen wie ich das ganze hin bekomme mit einem Array of Type? Das kann man ja beider Combobox auch als SrcData angeben.
Type:
Code:
TYPE udtComboBoxIn :
STRUCT
    id : INT;
    text : STRING;
    value : INT;
END_STRUCT
END_TYPE

Wäre echt MEGA!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne Java Kenntnisse ist man da wohl ziemlich aufgeschmissen
JavaScript. Java kann ich auch nicht. :)

Kannst du mir auch noch sagen wie ich das ganze hin bekomme mit einem Array of Type? Das kann man ja beider Combobox auch als SrcData angeben.
Du musst dem filter ja mitteilen, ob das Element genommen (return truthly) oder verworfen (return falsy) werden soll. Du willst hier nicht auf den Arrayeintrag selbst, sondern auf eine Property testen:
In den devTools des Browsers (im Tab "Console") schnell getestet:
Code:
[{id : 1, text :"strg", value : 54},{id : 4, text :"", value : 1231},{id : 7, text :null, value : 123}].filter(function(data){return data.text})
Also im TcHmi:
Code:
[COLOR=#333333]%s%tescht%/s% ? %s%tescht%/s%[/COLOR].filter(function(data){return data.text}) : null
 
Zurück
Oben