WinCC VB-Skript - Datenexport aus einen Archiv

wt15309

Level-1
Beiträge
55
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,leider muss ich euch um Hilfe bitten, ich hab leider sehr wenig Erfahrungen mit den VB-Skripten.
Die Aufgabe ist Folgende:
Daten sollen aus einen Umlaufarchiv auf einen USB exportiert werden per Taster.
Abfragen ob der USB vorhanden ist und ob eine Abfrage ob die Daten exportieren worden sind oder gerade exportiert werden soll es ebenfalls geben.

Ich hab nun folgendes Skript angelegt.

Sub
StopLogging hmiDataLog,"Sensor1"

CloseAllLogs

ArchiveLogFile hmiDataLog, "Sensor1", Storge Card USB" , hmiCopy

OpenallLogs

StartLogging hmiDataLog,"Sensor1"

EndSub


Das Exportieren funktioniert, leider die visuelle Abfrage ob der USB vorhanden ist nicht.
Auch ob die Abfrage ob gerade exportiert wird funktioniert auch nicht. Bei Beiden Anfragen bevorzuge ich eine visuelle Anzeige. Also leuchtender Kreis oder so ähnlich.

Könnt ihr mir bitte weiterhelfen? Leider komme ich nicht weiter.
Bin sehr dankbar für eure Hilfe.

Gruß
Manfred
 
Das Exportieren funktioniert, leider die visuelle Abfrage ob der USB vorhanden ist nicht.
Auch ob die Abfrage ob gerade exportiert wird funktioniert auch nicht. Bei Beiden Anfragen bevorzuge ich eine visuelle Anzeige. Also leuchtender Kreis oder so ähnlich.
Ich bin mir nicht ganz sicher, was Du mit "Abfrage ob der USB vorhanden ist" bzw. "Abfrage, ob gerade exportiert wird" meinst. Daher ein paar mögliche Lösungsansätze:
  • Wenn ein Export ansgestoßen wird, würde ich ein Sperrbit als HMI-Variable setzen, über das Du eine Anzeige antriggern könntest. Das Sperrbit wird beim Ende des Exports wieder zurück gesetzt.
    Das Skript selber darf nur dann ausgeführt werden, wenn das Sperrbit nicht gesetzt ist. So vermeidest Du Konflikte.
  • Eine beliebige Nutzerinteraktion kann über die Funktion MsgBox realisiert werden. Die öffnet im einfachsten Fall ein Hinweisfenster, kann aber auch ein Entscheidungsfenster mit "OK" und "Abbrechen" darstellen und die Benutzereingabe auswerten.
    Hier gibt es einen guten Einstieg in die Funktionen von MsgBox. Ich bin mir gerade allerdings nicht sicher, ob WinCC all das unterstützt. Flankierend kannst Du dieses Siemens-Kompendium (PDF-Datei) nach "MsgBox" durchsuchen und findest viele Anwendungsbeispiele.
  • Innerhalb von WinCC ist es AFAIK nicht möglich, abzufragen, ob ein USB-Stick gesteckt ist oder nicht. Dazu könntest Du Dir eine Batchdatei für das Host-System schreiben, die Du dann per VB-Skript im HMI aufrufst. Es gibt dabei begrenzte Möglichkeiten, eine Antwort des Batchskripts abzufangen und auszuwerten.
Ich nutze MsgBox gerne, um in der Entwicklungsphase Skripte zu debuggen und mir beim Testen z.B. den Zustand eines Zählers an verschiedenen Punkten des Skripts ausgeben zu lassen.

Viele Grüße
Zini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin mir gerade allerdings nicht sicher, ob WinCC all das unterstützt.
Die Siemens Comfort Panel unterstützen keine MsgBox, die Basic Panel sowieso nicht da Skripte nicht unterstützt werden. Die WinCC Runtime ( TIA wie auch WinCC flex ) unterstützen MsgBox.
 
Ich würde mal vermuten daß der Fragesteller das Skript auf einem Comfort Panel verwenden will, und da wäre die Verwendung von MsgBox geradezu tödlich (wenn man den MsgBox-Aufruf überhaupt irgendwie hinbekommt). Man muß sich auf die Möglichkeiten und Sachzwänge der WinCC Comfort Runtime beschränken. Bei so unklaren Angaben des TE wie hier gibt man wohl besser keine Tipps, die dann eh' nicht realisierbar sind.

Ob an einem Comfort Panel ein USB-Stick angesteckt ist kann man ermitteln, indem man schaut ob der Pfad zum USB-Stick existiert bzw. ob irgendeine Datei oder Ordner auf dem USB-Stick existiert. Das kann eine Weile dauern, wenn kein Stick angesteckt ist.

FAQ: Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Innerhalb von WinCC ist es AFAIK nicht möglich, abzufragen, ob ein USB-Stick gesteckt ist oder nicht.
Natürlich ist das möglich:
Im FAQ finden Sie ein Beispiel-Skript, das überprüft, ob ein Speichermedium in einem HMI-Gerät vorhanden und schreibbereit ist oder nicht. Sie können das Skript frei an Ihre Bedürfnisse anpassen.

Im laufenden Betrieb sollen Daten eines HMI-Projekts anwendergetriggert auf ein Laufwerk mit Wechselmedien (USB-Stick, SD-/MM-Card, etc.) gespeichert werden. Ein fehlendes oder aus anderen Gründen nicht schreibbereites Speichermedium kann dabei Fehler im Ablauf erzeugen. Sie vermeiden dies, indem Sie den Status des Laufwerks vor dem Schreibvorgang überprüfen.

Siemens FAQ: Wie stellen Sie mit einem Skript fest, ob ein Speicherlaufwerk mit Wechselmedien (USB-Stick, SD-/MM-Card) auf einem HMI-Gerät schreibbereit ist?
 
Zuletzt bearbeitet:
Grrrr, da sieht man mal wieder, wo die "Vorbilder" für unnötig Platz-fressenden Code herkommen:
Code:
If fso.dir(path)="" Then
    result= 1
Else
    result= 0
End If

' warum nicht einfach:
result = fso.dir(path) = "" ' bzw. result = -(fso.dir(path) = "")
' ?
Code:
If Err.Number=0 Then
    result= 0
Else
    result= Err.Number
End If

' warum nicht einfach:
result = Err.Number
' ?
Das sollte VB doch auch in den WinCC-Varianten können?

PS:
Bei VB hat allerdings TRUE den Wert -1 und nicht 1.

Das sehe ich anders. Umwege erhöhen die Ortskenntnis.
Die kürzeste Verbindung zwischen zwei Punkten ist eine Strecke.
Und die längste ist eine unbekannte Abkürzung. ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das sollte VB doch auch in den WinCC-Varianten können?
Ich habe schon so viel 🤬 mit vB-Skripten in WinCC erlebt, dass ich langsam daran zweifle, ob sich die Siemens-Programmierer überhaupt auch nur näherungsweise an die Standards von VB gehalten haben oder doch eher "Etwas, dass sich wie VB anfühlt" implementiert haben. Ich traue dem VB-Interpreter jedenfalls nicht allzu weit.

Möglicherweise schlägt hier die nicht verlässlich laufende dynamische Typisierung zu: Wenn man result in einer IF-Schleife belegt, ist es sauber vorhersehbar typisiert. Beim Gleichsetzen ist das nicht zwingend der Fall.

In Deinem ersten Beispiel müsste die Bedingungsabfrage IMO immer in Klammern gesetzt werden.

Viele Grüße
Zini
 
Ich habe schon so viel 🤬 mit vB-Skripten in WinCC erlebt, dass ich langsam daran zweifle, ob sich die Siemens-Programmierer überhaupt auch nur näherungsweise an die Standards von VB gehalten haben oder doch eher "Etwas, dass sich wie VB anfühlt" implementiert haben. Ich traue dem VB-Interpreter jedenfalls nicht allzu weit.
Da können die "Siemens-Programmierer" wohl eher wenig dafür, weil das gar nicht VB sondern VBS ist.

Harald
 
..., weil das gar nicht VB sondern VBS ist.
Danke für den Hinweis, Harald! VBS hatte ich doch gemeint. Leider kann ich das in #8 nicht mehr "reparieren".

Was sagt denn Deine Erfahrung zu den beiden folgenden Punkten?
Möglicherweise schlägt hier die nicht verlässlich laufende dynamische Typisierung zu: Wenn man result in einer IF-Schleife belegt, ist es sauber vorhersehbar typisiert. Beim Gleichsetzen ist das nicht zwingend der Fall.

In Deinem ersten Beispiel müsste die Bedingungsabfrage IMO immer in Klammern gesetzt werden.
Meine Erfahrung sagt mir, wenn die Variablen deklariert wurden, gilt die Deklaration.
Wurde der Datentyp bei der Deklaration nicht angegeben (wie in den Siemens-Beispielen), ist er vom Typ Variant ... für meinen Geschmack zu "flexibel" und schwammig.

Die Klammerung des logischen Ausdrucks in result = fso.dir(path) = "" ist m.E. nicht erforderlich.
VBS "weiss", dass es sich bei dem ersten '=' um eine WertZuweisung handelt und bei den folgenden '=' um VergleichsOperatoren.
MehrfachZuweisungen kennt VBS nicht.
Die Klammerung des logischen Ausdrucks in result = -(fso.dir(path) = "") ist erforderlich, weil sich das Vorzeichen sonst auf den Operanden fso.dir(path) beziehen würde, was ja Schwachfug ("negativer String") wäre, um es mal mit Deinem Fachbegriff zu sagen.

Gruss, Heinileini
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
In VBS kann man nicht den Datentyp einer Variable deklarieren. Man kann nur den Datentyp eines Ausdrucks beeinflussen (CInt(), CDbl()...). Beim Zuweisen eines Ausdrucks an eine Variable gibt dann VBS der Zielvariable automatisch einen Variant-Unterdatentyp, den es für gut hält. Da kann es z.B. passieren daß ein Long(Ganzzahl)-Ausdruck in einen Double(Fließkommazahl)-Datentyp gespeichert wird, nur weil das höchste Bit .31 gesetzt ist, und eine nachfolgende numerische Verknüpfung (z.B. variable AND &H1000) erzeugt dann einen Runtime-Error, weil die AND-Verknüpfung auf Double-Werte nicht zulässig ist.

Harald
 
Zurück
Oben