WinCC WinCC SCADA V7.4 Textliste mit VB auslesen

SKg

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

ich suche eine Möglichkeit mit einem VB Skript den Text einer Textliste auszulesen.
Ich bin nicht ganz fit in VB.

Hintergrund: Ich muss in Abhängigkeit einer Variable den Text in eine interne Variable umleiten. Also funktionstechnisch genau so wie ein Ausgabefeld auf dem die Textliste liegt aber halt im Hintergrund mit einem Skript.

MFG
 
Ich glaub das Thema hatten wir hier so in der Art schon mal, finde ich aber gerade nicht wieder.

Eine Textliste in WinCC ist etwas unkomfortabel auszulesen, weil du im Gegensatz zu den anderen Listenobjekten wie z.B. Listenfeld nicht direkt an den selektierten Text (SelText Eigenschaft bei anderen Listen) kommst. Warum das bei einer Textliste so gemacht wurde kann ich dir nicht sagen, bis nach WinCC 7.3 kommt man da leider nicht ran.

Problematisch bei der möglichen Auswertung per Skript ist, dass eine Textliste auch Wertebereiche oder auch Lücken in den Werten zulässt. Du kommst über die Assignements-Eigenschaft an alle Texte in Form einer durch Semikolon getrennte Liste, die dann nochmal durch Komma getrennt den Index und den eigentlichen Text enthält.

Solange du keine Wertebereiche in deiner Textliste verwendest, sollte es wie folgt zumindest prinzipiell funktionieren. Variablen- und Objektnamen musst du für deine Verhältnisse entsprechend anpassen.

Code:
Dim textTag
Dim Assignment
Dim pos
Dim value

Set textTag = HMIRuntime.Tags("TextlisteText")

For Each Assignment In Split(ScreenItems("Textliste1").Assignments, ";")
  If (Len(Assignment) > 0) Then
    pos = InStr(Assignment, ",")
    value = Left(Assignment, pos - 1)
    If (CInt(value) = ScreenItems("Textliste1").OutputValue) Then
      textTag.Value = Right(Assignment, Len(Assignment) - pos)
      textTag.Write
      Exit For
    End If
  End If
Next
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Thomas_v2.1

Ich verwende WinCC V7.4
Sehe ich das richtig das hier die Textliste "Textliste1" aus dem Bild ausgelesen wird.
Das ist nicht ganz das was ich möchte. Ich möchte eine Textliste aus der Sparte "Text- und Grafiklisten" von WinCC auslesen.
siehe screenshot
Unbenannt3.JPG

MFG
 
Ah ok, das ist erst mit WinCC 7.4 hinzugekommen. Die Möglichkeit habe ich auch schon mal eingesetzt, aber nur direkt im Bild darauf zugegriffen.

Möchtest du auf den Wert aus einem Skript in einem Prozessbild zugreifen in dem schon der Inhalt aus der Textliste angezeigt wird? Dann kannst du evtl. den Inhalt auch ganz ohne Skripterei an eine Variable übergeben. Das geht möglicherweise wenn du an das Ausgabefeld ein Ereignis anhängst welches bei Wertänderung des Ausgabewertes ausgeführt wird. Anstelle eines Skript fügst du eine Direktverbindung ein, und kannst dann eine Eigenschaft des Objekts direkt einer Variable zuweisen. Da musst du mal sehen welche Eigenschaften dir angeboten werden. So etwas wie "Text" oder "OutputValue" oder "SelText" würde sich dann schon mal passend anhören.

Manche Eigenschaften lassen sich aber nur über Skripte erreichen. Da kannst du am besten mal ein VBSkript einfügen und im Objekt-Explorer nachsehen welche Eigenschaften das Objekt anbietet, wobei die auch nicht vollständig sind.
Im Handbuch zu WinCC 7.4 Skriping findet man zu der Text- und Grafikliste überhaupt nichts.
 
Hi,

also Sinn und Zweck der ganzen Sache ist.
Ich möchte Störungen von Umrichtern, im Volltext, anzeigen.

Also= Umrichter schickt > Fehlernummer > an WinCC und WinCC fügt den Volltext anhand der Fehlernummer ein.
Siemens hat auf seiner Homepage etliche Beispiele für solche Meldungen aber die Setzen voraus
das es eine 1200ter oder 1500ter ist = kein Problem hab ich schon gemacht
oder es ist eine 300ter oder 400ter = dazu müssen die SPS´n aber im Projekt eingebunden sein und via Industrial Ethernet verbunden sein= kein Problem auch schon gemacht

Jetzt habe ich aber das Problem das ich noch 300ter und 400ter im System habe die ich nicht ins Projekt einbinden möchte und die auch nur über TCP/IP angebunden sind.

Also muss ich mir was basteln entweder in C oder mit VB.

In C hab ich mir überlegt ich könnte über EXCEL eine Header Datei generieren dann die Fehlernummer umwandeln in einen String und dann durch die Header Datei eine Textvariable zuweisen und diese Variable dann in der Störmeldung einzubinden um dann die Meldung auszulösen.

In VB hab ich mir überlegt, wenn es möglich ist den Text anhand der Fehlernummer aus der Textliste zu lesen, direkt die Benutzerdefinierten Meldungen mit dem Text aufzurufen.

Demnach sollte alles ohne Bildzwang funktionieren.
Ich hatte zwar einen C Kurs von Siemens aber da bin ich arg eingerostet.
In C fehlt mir im moment noch der Code damit ich eine Zahl zb. 45876 in Text umzuwandeln ("45876").

MFG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst einer Meldung auch ein oder mehrere Prozesswerte anhängen, und dann als Prozesswert die Variable mit deiner ID eintragen.
Der Prozesswert kann auch ein String sein, d.h. du könntest den Text auch in der SPS bilden. Das wäre vermutlich die einfachste Variante, benötigt aber etwas Speicher in der SPS.

Problematisch dabei kann sein, dass die Triggervariable vor dem Prozesswert gelesen wird. Um sicher zu gehen dass beides konsistent ist, müsstest du dann die Alarmmeldung um ein paar Sekunden verzögern. Wenn du den Text aus der ID erst im WinCC bildest kommt diese Verzögerungszeit noch hinzu.

Ein Text zu einer ID in C auszugeben ist prinzipiell so in der Art möglich:
Code:
struct meldung {
    int id;
    char text[100];
};

struct meldung meldungen[] = {
    {	1,	"Meldung 1" },
    {	5,	"Meldung 5" },
    {	6,	"Meldung 6" },
    {	10,	"Meldung 10" },
    {	0,	NULL}
};

int print_meldetext(int id)
{
    struct meldung *pMeldung;
    pMeldung = meldungen;
    while (*(pMeldung->text) != NULL) {
        if (pMeldung->id == id) {
            printf("Meldetext zu ID %d ist %s\n", id, pMeldung->text);
            return 0;
        }
        pMeldung++;
    }
    return -1;
}

Wenn deine Nummern alle fortlaufend sind, dann kannst du auch ein String Array erstellen und direkt auf das entsprechende Element zugreifen.
Wenn deine Liste sehr lang ist und Lücken aufweist, dann wäre zu überlegen das Element zur ID per binärer Suche im Array zu finden. Dazu muss die Liste nach IDs sortiert sein. Dann braucht es bei 1000 Elementen in der Liste nicht mehr maximal 1000 Durchläufe im schlechtesten Fall, sondern nur 10.
 
Oha,

ich hab wohl so ziemlich die schlechteste Konstellation die es gibt, die Liste hat ca 1436 Einträge beginnend mit der Nummer 1000 und ist nicht Lückenlos.
Ich merke schon diese Nuss ist nicht so einfach zu knacken.

Die Formatierungsanweisung in den Meldungen kenne ich, das wird wohl die einfachste Art sein.
@1%s@ interpretiert den ersten Prozesswert als Text.
Wenn die Liste Lückenlos wäre könnte ich mit einem Offset auf direkt aus der Library lesen.
@1%l#@ liest den Text aus der "Text Library" Prozesswert 1 bestimmt in diesem fall die TextID

Ich danke für die Bemühungen und werde jetzt noch mal etwas rumprobieren.

MFG
 
Die Formatierungsanweisung in den Meldungen kenne ich, das wird wohl die einfachste Art sein.
@1%s@ interpretiert den ersten Prozesswert als Text.
Bei WinCC Scada gibt es für die Prozesswerte ein extra vorgesehenes Feld (bzw. sogar mehrere Felder) im Alarmlogging. Da brauchst du auch keine benutzerdefinierte Meldung selber generieren. In deiner Alarmliste musst du dann noch die Spalte für Prozesswert einblenden, und dort siehst du dann den Wert. Ursprünglich ist der Prozesswert vermutlich für Grenzwertverletzungen vorgesehen, aber kann man auch für diverse andere Erweiterungen verwenden.

Wenn du selber Zugriff auf die Programme hast und in den SPS noch entsprechend viel Speicher für die Alarmtexte frei ist, dann würde ich glaube ich die Texte in der SPS erzeugen und über eine Variable an WinCC übergeben. Dann kannst du den Text auch noch an entsprechender Stelle am Antrieb anzeigen.
 
Zurück
Oben