WinCC V7.2 Listenfeld dynamisch mit Werten aus Textfile befüllen

Jennsy

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

ich habe ein Textfile, in welches mir durch ein externes Programm Werte/Fehlermeldungen geschrieben werden. Ich möchte nun in WinCC gerne dieses Textfile Zeile für Zeile auslesen, und dann sollte jede Zeile ein Item in der Listbox anzeigen, nur habe ich leider keine Ahnung wie ich hier vorgehen sollte...habe mal das Textfile auszulesen versucht, und einfach alles in einer MessageBox angezeigt...aber um das Ganze in einem Listenfeld anzeigen zu können, müsste ich ja auch die Anzahl der vorhanden Einträge zuvor herausfinden, oder? Habe zwar einige Tipps aus dem Internet ausprobiert, nur hat das nicht wirklich etwas Richtiges angezeigt...:confused: Hätte hier vll. jemand eine Idee, wie ich so etwas lösen könnte?

Vielen Dank im Voraus.
 
Gibt sicherlich viele Wege. Vielleicht nimmst Du in WinCC nen Textfeld und schiebst mit nem Script einfach alle 5 Sekunden den ganzen Text aus dem Textfile in das Textfeld...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort.
Naja,nur das mit dem Textfeld ist nicht wirklich das wonach ich suche...ich hätte schon gerne jede Zeile in dem Textfile in einem separaten Listenfeld Item gehabt, um danach damit weiterarbeiten zu können. Aber irgendwie funktioniert das hier nicht so recht..(habe es auch als vb.net Anwendung, die ich aufrufen kann, nur hätte ich eben alles gerne nur in WinCC ohne Aufruf auf ein externes Programm gelöst)
 
Sollte doch eigentlich im WinCC mit Scripten auch alles machbar sein... Nur vermutlich nicht mal eben.

Was hast Du denn bis jetzt und an welcher Stelle hakt es konkret?

gruß.
 
In der Hilfe steht: Das Attribut "Zuordnungen" ist nicht dynamisierbar.
Also kannst Du die Texte der Textliste vermutlich nicht über ein Script verändern.

Aber es gibt ja noch einige andere Smart-Objekte, oder Du bastelst Dir selber was passendes zusammen...

Gruß.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der Hilfe steht: Das Attribut "Zuordnungen" ist nicht dynamisierbar.
Danke, tut mir leid, das hätte mir auch selbst auffallen können :-( hab' da gar nicht nachgeschaut, weil ich davon ausgegangen bin, dass das schon funktionieren wird.
Vielen Dank nochmals, ich hab's jetzt ziemlich einfach gelöst, aber für diesen Anwendungsfall reicht's auch so erstmal..
 
Also ein Listenfeld aus dem Ordner der Smart Objekte kann ich per Skript befüllen.
Nach dem gleichen Schema wie auch bei anderen Objekten, erst Index passend setzen, und dann kann man den Text für diesen Index setzen.
Über die Eigenschaft "NumerLines" legt man fest wie viele Einträge überhaupt vorhanden sind.

Code:
// Eigenschaft "Anzahl Zeilen" setzen
SetPropWord(lpszPictureName, "Listenfeld1", "NumberLines", 2);
// Index selektieren
SetPropWord(lpszPictureName, "Listenfeld1", "Index", 1);
// Eintrag für diesen Index setzen
SetPropChar(lpszPictureName,"Listenfeld1", "Text", "Testeintrag 1");
// Index selektieren
SetPropWord(lpszPictureName, "Listenfeld1", "Index", 2);
// Eintrag für diesen Index setzen
SetPropChar(lpszPictureName,"Listenfeld1", "Text", "Testeintrag 2");
 
Servus,

ich möchte zur Runtime ein Kombinationsfeld mit Texten befüllen - das was ausgewählt werden kann, soll bei der IBN einmal manuell eingegeben werden (ohne PG), dabei geht es um Typenbezeichnungen also STRINGs.
Gleicher Code wie oben funktioniert, aber bei Bildwechsel sind die Eintragungen wieder weg.
Wie kann ich das verhindern? Müssen die Texte noch in Variablen gespeichert werden?

Das befüllen soll wenn möglich von einem anderen Bild aus geschehen, was schon das nächste Problem aufwirft.
"WinCC Runtime: PDL Runtime : Bild nicht angewählt" erscheint als Error-Message
Hie mal mein Versuch:

Code:
SetPropWord("FP_Konfiguration_Ladestation.pdl","Kombinationsfeld1","Index",2);
SetPropChar("FP_Konfiguration_Ladestation.pdl","Kombinationsfeld1","Text","160D");

Hoffe ihr könnt mir weiterhelfen,
Danke
michstein
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde das Listenfeld im Bildaufbau-Ereignis des Bildes mit dem Listenfeld über ein Script befüllen.
In dem Script kannst du auch vorher die Texte aus internen/externen Variablen auslesen, und diese dann in der Liste eintragen.

Auf Elemente eines Bildes das nicht aktiv ist kannst du nicht zugreifen, zumindest nicht aus der Runtime.
 
Hallo Thomas_v2.1
Deine Idee finde ich ganz gut das Kombinationsfeld (ich verwende kein Listenfeld, aber das macht glaub ich keinen Unterschied in dem Zusammenhang) beim Aufbau des Bildfensters zu befüllen.

So, aber: Das Kombinationsfeld befindet sich in einem Bildfenster, welches mit verschiedenen Variablen-Präfixen aufgerufen wird.

Derzeit sieht das ganze so aus, halt nur mal für einen Index:
Code:
// Index selektieren
SetPropWord(lpszPictureName,"Kombinationsfeld1","Index",1);

// Eintrag für diesen Index setzen
SetPropChar(lpszPictureName,"Kombinationsfeld1","Text", GetTagChar("Steckertyp_1") );

"Steckertyp_1" ist eine STRING-Variable in einem S7-DB
In einem anderen Bild (Konfigurations-Ebene, nicht Bediener-Ebene) wird mittels EA Feld der Typ eingegeben.

Klar, dass hier ein Fehler auftaucht, weil es den Tag nun mal nicht gibt.
Wie kann ich also bei manchen Variablen den Präfix verwenden und bei manchen nicht? Geht das Überhaupt?

Bild.jpg

MFG &Danke
michstein
 
Ich würde die Texte für das Listenfeld in lokale Variablen einlesen, bevor du das Fenster und den Tagprefix setzt. Und wenn das Fenster konfiguriert und sichtbar geschaltet wurde, die Eigenschaften des Listen- oder Kombinationsfeldes setzen setzen.

In Anlehnung an mein obiges Beispiel sollte es folgendermaßen funktionieren, wenn du das Bildfenster z.B. über Klick auf einen Button aktivierst:
Code:
char *s1;
char *s2;
char *s3;
s1 = SysMalloc(255);
s2 = SysMalloc(255);
s3 = SysMalloc(255);
/* Texte für die Liste einlesen */
s1 = GetTagChar("Listeneintrag1");
s2 = GetTagChar("Listeneintrag2");
s3 = GetTagChar("Listeneintrag3");

/* Bildfenster konfigurieren und sichtbar schalten */
SetPropChar(lpszPictureName, "Bildfenster1", "PictureName", "pop1");
SetPropChar(lpszPictureName, "Bildfenster1", "TagPrefix", "struct1");
SetPropBOOL(lpszPictureName, "Bildfenster1", "Visible", 1);

/* Eigenschaften des Listenfeldes setzen */
SetPropWord("pop1", "Listenfeld1", "NumberLines", 3);
SetPropWord("pop1", "Listenfeld1", "Index", 1);
SetPropChar("pop1", "Listenfeld1", "Text", s1);
SetPropWord("pop1", "Listenfeld1", "Index", 2);
SetPropChar("pop1", "Listenfeld1", "Text", s2);
SetPropWord("pop1", "Listenfeld1", "Index", 3);
SetPropChar("pop1", "Listenfeld1", "Text", s3);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

danke für deinen Vorschlag. Ich werde es die Tage mal probieren.
Bleibt mir immer noch eine Frage:

Wie kann ich bei manchen Variablen (in einem Bildfenster) den Präfix verwenden und bei manchen nicht?
Geht das Überhaupt?

MFG michstein
 
Wie kann ich bei manchen Variablen (in einem Bildfenster) den Präfix verwenden und bei manchen nicht?
Geht das Überhaupt?

Meines Wissens geht das nicht, also entweder alles mit oder alles ohne.
Das lässt sich auch nicht umgehen indem man versucht über ein globales Skript Variablenwerte einzulesen. Wenn dieses Skript aus dem Bildfenster mit dem Variablenpräfix angestoßen wird, ist das auch im globalen Skript aktiv.

Wenn du in deinem Bildfenster mehr Variablen ohne als mit Präfix hast, könntest du zur Not die Variablennamen mit dem Präfix per Skript zusammenbauen. Das ist aber relativ aufwändig und womöglich auch langsamer, weil dann wirklich alles mit Skripten gemacht werden muss, zumindest für die Variablen mit dem Präfix.
 
Hallo,

Danke für die Antworten.

Das mit den Var-Präfixen hat sich erledigt.
Die Einträge werden wunderbar im Auswahlfeld angezeigt.

Doch nun eine weitere Frage:
Kann man den Text für den Listeneintrag "zusammenstöpseln"?

Ich stell mir das grob mal so vor:
Also ich möchte einen fixteil + variablen Teil zusammensetzen und als ein Text im Kombinationsfeld dann darstellen.
Code:
char *s1;
s1 = SysMalloc(255);

s1 = "1 - " & GetTagChar("Steckertyp_1") ;

SetPropWord(lpszPictureName, "Kombinationsfeld1", "Index", 1);
SetPropChar(lpszPictureName,"Kombinationsfeld1", "Text", s1);

Alternativ könnte man auch das "1 - " in die Variable für den Text eintragen, ist aber meines erachtens nicht so schön.
Gibt es dafür eine andere Lösung?

Vielen Dank,
michstein
 
Hallo,

Wie kann ich bei manchen Variablen (in einem Bildfenster) den Präfix verwenden und bei manchen nicht?
Geht das Überhaupt?

MFG michstein

Ja, das funktioniert:

"@NOTP" schaltet das Variablen-Präfix ab.
"@NOSP" schaltet das Server-Präfix ab.
"@NOP" schaltet das Variablen-Präfix und das Server-Präfix ab.

Code:
'VBS200
Dim tag
tag = HMIRuntime.Tags("@NOTP::@CurrentUser").Read
HMIRuntime.Trace "CurrentUser: " & tag & vbNewLine
 
Zuletzt bearbeitet:
Zurück
Oben