TIA Im HMI in VB-Skript auf ID und Meldetext einer Bitmeldung zugreifen

PN/DP

User des Jahres 2011-2013;2015-2017;2020-2022;2024
Beiträge
24.858
Reaktionspunkte
7.967
Zuviel Werbung?
-> Hier kostenlos registrieren
TIA V16, TP1200 Comfort oder WinCC RT Advanced

Bei Bitmeldungen soll zur Laufzeit beim Ereignis "Gekommen" die Melde-ID und der Meldetext der Meldung an ein VB-Skript übergeben werden. Müssen die ID und der Meldetext ein zweites mal beim Ereignis als Übergabeparameter an das Skript projektiert werden oder kann das Skript irgendwie selbst die Werte auslesen (zumindest den Meldetext)?

Muss man bei jeder Meldung die ID und den Meldetext zweimal projektieren oder kann man das Ereignis einmal projektieren und dann in einem Rutsch auf alle Bitmeldungen kopieren? Bei zur Zeit 1400 Meldungen könnte ich notfalls danach noch die ID in den Ereignissen 1399 mal händisch editieren, doch die projektierten Meldetexte 1400 mal einzeln ins jeweilige Ereignis kopieren würde in Arbeit ausarten ... geht das einfacher?
 
Zu Deiner VB-Frage kann ich nichts beitragen, aber falls es doch auf das Kopieren von 1400 Meldetexten hinaus läuft:
Für solche Aktionen benutze ich AUTOHOTKEY. Das ist eine einfache aber sehr mächtige Macrosprache, mit der man komplizierte Editier- oder Kopieraktionen - auch zwischen verschiedenen Fenstern oder Programmen gut automatisieren kann. Bei 1400 Meldetexten könnte sich das Einarbeiten in AUTOHOTKEY schon lohnen.
Es gibt dazu passend einen Macro-Recorder der das Schreiben des nötigen Macros nochmal deutlich erleichtert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, das kopieren irgendwie zu automatisieren ist eine Idee.
Bisher hat bei meinen Kopier- und Anpass-Aktionen der Weg über Excel gereicht, in TIA kann man aber nicht in einem Rutsch in alle Ereignisse einfügen, sondern muss das für jede Meldung einzeln machen.
Außerdem wird durch das zweimal Projektieren jedes Textes die Runtime-Datei dann bei ca. 1500 Meldungen je ca. 100 Zeichen Meldetext ca. 150 kByte größer als eigentlich nötig (oder gar 300 kByte wegen Ablage als WString?)

Zur Zeit habe ich die Idee, alle Meldetexte en bloc in eine Textdatei zu kopieren und zur Laufzeit (z.B. bei Runtime-Start) aus der Textdatei in ein globales Array einzulesen. Doch da lauert die nächste Spaßbremse: TIA kann als HMI-Variable kein Array of WString 😢 Alternativ 1400 einzelne Array-ähnliche HMI-Variablen anlegen ist keine schöne Lösung und benötigt auch 1400 Powertags mehr für die Runtime-Lizenz (in meinem Fall ca 2000 EUR mehr). Mal sehen, wie lange das Einlesen der kompletten Textdatei im Skript (bei jedem Aufruf!) dauert.
 
Zuletzt bearbeitet:
Vielleicht über Openness und XML export und import ?
Damit habe ich aber kein Erfahrung.

Das mit die Macros hatte ich auch für viele Jahren her gemacht. Allerdings mit Allen Bradley PLC5 welche keine Konzept für 'wiederverwendbare' Bausteine hat. Die wiederverwendbare Bausteine habe ich dann mittels Copy-Paste und Macro Bearbeitung geschafft.

Alternativ 1400 einzelne Array-ähnliche HMI-Variablen anlegen ist keine schöne Lösung und benötigt auch 1400 Powertags mehr für die Runtime-Lizenz (in meinem Fall ca 2000 EUR mehr).
Wenn die HMI Variabeln nur interne sind, dann zählen sie nicht für die Powertags.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zur Zeit habe ich die Idee, alle Meldetexte en bloc in eine Textdatei zu kopieren und zur Laufzeit (z.B. bei Runtime-Start) aus der Textdatei in ein globales Array einzulesen. Doch da lauert die nächste Spaßbremse: TIA kann als HMI-Variable kein Array of WString 😢 Alternativ 1400 einzelne Array-ähnliche HMI-Variablen anlegen
So habe ich das nun auch gemacht.
In TIA in Bitmeldungen die Spalten ID bis Meldetext "In Excel-Format kopieren" + in Excel einfügen + in Excel die überflüssige Spalte(n) zwischen ID und Meldetext löschen (*) + die Spalten A und B markieren und kopieren + in Texteditor (Notepad) einfügen + im Editor Speichern unter "Msgtexte.ini" mit Codierung ANSI
Die Spaltentrennzeichen von Excel sind Tabulatoren (<HT>, 0x09).

(*) zumindest Excel 365 hat da eine Macke und kopiert auch nicht markierte Spalten zwischen der ersten und der letzten markierten Spalte, deshalb die ungewünschten Spalten vorher löschen

Hier die VB-Skripte zum Einlesen der Meldetexte aus "Msgtexte.ini" in die WinCC Runtime (Comfort Panel oder PC Runtime Advanced):
Code:
' Sub MsgtexteLaden()
' Meldetexte aus Ini-Datei lesen
' weil auf die Texte der Bitmeldungen in Runtime nicht zugegriffen werden kann,
' wurden die Bitmeldungs-Meldetexte in eine Textdatei kopiert (Codierung ANSI und Windows (CRLF))
' und werden bei Runtime-Start in interne HMI-Variablen eingelesen
' Array of WString ist nicht möglich, deshalb viele einzelne WString-HMI-Variablen "BM_00000" .. "BM_32767"
' interne HMI-Variablen zählen nicht als PowerTags
Const ForReading = 1
Dim fso, f, inifile

inifile = SmartTags("_System\path_FLASH") & "\Msgtexte.ini"
If Not FileExist(inifile) Then
    ShowSystemAlarm "Datei '" & inifile & "' nicht gefunden."
    Exit Sub
Else 'Msgtexte.ini ist vorhanden
    If SmartTags("_System\!_OS_is_PC_!") Then 'PC-Windows
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set f = fso.OpenTextFile(inifile, ForReading, False)
        Do While f.AtEndOfStream = False
            SetMsgtextVar f.ReadLine 'Meldetext in HMI-Variablen "BM_00000" .. "BM_32767" einlesen
        Loop
        f.Close
    Else 'WinCE
        Set f = CreateObject("FileCtl.File")
        f.Open inifile, ForReading
        Do While f.EOF = False
            SetMsgtextVar f.LineInputString
        Loop
        f.Close
    End If
End If
Code:
' Sub SetMsgtextVar(ByRef sline)
' zerlegt einen String der Art "ID"<HT>"stringvalue" und weist dann der HMI-Variable "BM_nnnnn" den stringvalue zu
Dim field, id, svalue, varname

If sline = "" Then Exit Sub ' wg. Split()
field = Split(sline, vbTab) ' bei <HT> teilen, vbTab = Chr(9)
If UBound(field) <> 0 Then  ' <HT> war enthalten, field(0): "id", field(1): " string"
    id = field(0) : svalue = Trim(field(1))
Else
    id = 0 : svalue = sline ' Formatfehler! in "BM_00000" entsorgen
End If
varname = "BM_" & Right("00000" & CStr(id), 5) ' "BM_00000" .. "BM_32767"
SmartTags(varname) = svalue

zum VBS siehe die FAQ: Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script

Die Function FileExist siehe die FAQ #3

SmartTags("_System\!_OS_is_PC_!") und Initialisierung bei Start der WinCC Runtime siehe die FAQ #12

SmartTags("_System\path_FLASH")
Code:
If SmartTags("_System\!_OS_is_PC_!") Then 'PC-Windows
    SmartTags("_System\path_FLASH") = "C:\FLASH\Msgtexte" ' Pfad der ini-Dateien
Else 'WinCE
    SmartTags("_System\path_FLASH") = "\FLASH"
End If

verwendete HMI-Variablen (<Interne Variable>):
Code:
_System\!_OS_is_PC_!  : USInt 'Startwert: 0 | Kommentar: 0=RT auf WinCE-Panel / 1=RT auf PC (Simulation/Test)
_System\path_FLASH  : WString Länge 30
BM_00000 : WString Länge 100 'für Datei-Infozeile, Debug und Mülleimer bei Formatfehlern
BM_00001 : WString Länge 100 'Meldetext der Bitmeldung ID=1
BM_00002 : WString Länge 100 'Meldetext der Bitmeldung ID=2
...
BM_32767 : WString Länge 100 'Meldetext der Bitmeldung ID=32767

Beispiel der Datei Msgtexte.ini mit den Meldetexten
Code:
0       ANSI CRLF äöüßÄÖÜ : ! Texte Bitmeldungen - Datei ist automatisch generiert - nicht bearbeiten !
1       Anlage 1: Meldetext 1
234     Anlage 2: Meldetext x
12      Anlage 1: Meldetext 12
32767   xyz: höchstmögliche Bitmeldung
Zwischen den ID-Nummern und dem Meldetext ist als Trennzeichen ein Tabulator <HT> (0x09). Zeilenschaltung ist <CRLF> (0x0D 0x0A). Die Reihenfolge der Zeilen ist egal. ID-Nummern dürfen mehrmals vorkommen (auch die 0), bei gleichen ID-Nummern "gewinnt" die letzte Zeile mit dieser Nummer. Es dürfen auch leere Zeilen vorkommen. Für jede vorkommende ID nnnnn muss eine HMI-Variable "BM_nnnnn" projektiert sein.
 

Anhänge

Zuletzt bearbeitet:
Guten Morgen.

Frage MultiLanguage zur Laufzeit? Dafür müsstest du ja mehrere Arrays füllen und bei der Auswertung ebenfalls "umschalten".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wer das braucht, kann mehrere Meldetext-Dateien erzeugen und bei jeder Sprachumschaltung erneut in dieselben HMI-Variablen einlesen.
Stelle ich mir sehr performant vor, wenn der Bediener umschaltet.

Darf man fragen, wie du die Infos (Meldungs-ID und -Text) weiterverarbeitest?
 
Stelle ich mir sehr performant vor, wenn der Bediener umschaltet.
Zumindest in der PC Runtime geht das Einlesen ohne merkliche Verzögerung in Nullkommanix.
Auf Comfort Panel habe ich noch nicht getestet, erwarte aber auch keine Performance-Probleme.

Darf man fragen, wie du die Infos (Meldungs-ID und -Text) weiterverarbeitest?
die Meldungen per eMail verschicken
 
Zurück
Oben