TIA TIA VB-Skript IF-Abfrage in While-Schleife

marcowal

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Sehr geehrtes Schwarmwissen

Seit mehreren Tagen beschäftigte ich mich erstmals mit VB-Skripten und bin nun an einen Punkt an dem ich gar nicht weiter komme.
Kurz zur Aufgabenstellung: Messwerte werden an einem Prüfstand über Stunden hinweg (Solange Messung aktiv = 1) aufgezeichnet und sollen in eine Excel-Datei geschrieben werden (1 Wert pro Sekunde => 1Hz).

HardWare: 1215C, KT900 Comfort

Da ich mich noch an das endgültige Ergebnis/Programm ran taste sieht mein Code zur Zeit wie folgt aus:

Dim fs
Dim f
Dim mode
Dim pfad

' pfad festlegen
pfad = "Storage Card SD\Logs"

' Objekt fuer Filehandling erstellen
Set fs = CreateObject("filectl.filesystem")
Set f= CreateObject("filectl.file")

' Pruefen ob Verzeichnis existiert und sonst erstellen
If fs.dir(pfad) = "" Then fs.mkdir(pfad)

While "Messung aktiv" = True
If "Takt 1 Hz" = True Then
f.open pfad + "messwerte.csv", 8
f.LinePrint CStr(Now) & ";" & ";" & ";" & MWWert1 & ";" & ";" & MWWert2 & ";" & ";" & MWWert3 & ";"
f.Close
End If
Wend


PS: Werte in die Excel-Datei schreiben war kein Problem bis ich mit der While-Schleife + IF-Abfrage angefangen habe.

Ich freue mich über jeglichen Denkanreiz und verbleibe
mit besten Grüßen
Marco
 
Moin macrowal,

wenn die While-Schleife solange läuft, wir "Messung aktiv" ist, macht das Panel nichts anderes mehr, solange "Messung aktiv" ist.
Dann die Frage: woher kommt der "Takt 1 Hz"? Aus der CPU?

Werden die Messwerte jede Sekunde geschrieben und sollen auch jede Sekunde in die Datei geschrieben werden?
Das wird nicht funktionieren.

Was gehen kann ist: Messungen in einem DB aufnehmen und z.B. alle 10s als Block vom Panel in eine Datei schreiben lassen.

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn die While-Schleife solange läuft, wir "Messung aktiv" ist, macht das Panel nichts anderes mehr, solange "Messung aktiv" ist.
==> Das war der Gedanke. Zur Zeit starte ich das Skript mit einem Button - das Skript soll dann so lange in der Schleife hängen bis die Messung vorbei ist und während dessen die Messwerte direkt in die Excel-Datei schreiben.
woher kommt der "Takt 1 Hz"? Aus der CPU?
Ja, Takt 1 Hz kommt von der CPU und soll die HMI-Bool Variable immer dann 1 setzen wenn der Takt der CPU es so vorgibt.
Werden die Messwerte jede Sekunde geschrieben und sollen auch jede Sekunde in die Datei geschrieben werden?
Das war mein ursprünglicher Ablauf (gedanklich :D )
Was gehen kann ist: Messungen in einem DB aufnehmen und z.B. alle 10s als Block vom Panel in eine Datei schreiben lassen.
Mit diesem Ansatz habe ich ehrlich gesagt begonnen. In einem Messwert-DB habe ich ein Array [0...20000] begonnen, jedoch bin ich damit auch nicht weitergekommen. Nachdem ein Kollege mich darauf hingewiesen hat dass es für die endgültige Lösung nicht nötig wäre Daten in den DB zu schreiben habe ich mit dem oben genannten Ansatz weitergemacht (bei uns hat leider niemand erfahrung mit VB)

Gibt es für "Messungen in einem DB aufnehmen und z.B. alle 10s als Block vom Panel in eine Datei schreiben lassen." bereits irgendwo einen Lösungsansatz der dir hier in den Sinn bekommt?

Zu guter letzt recht herzlichen Dank für die schnelle Antwort.
 
Moin macrowal,

dass das Panel "einfriert", wenn eine Messung aktiv ist, ist doch irgendwie unschön, oder? In der Zeit kann man mit dem Panel ja nichts mehr machen und es zeigt auch nichts mehr richtig an.

Der Takt aus der CPU kann nicht aktualisiert werden, wenn das Panel "einfriert". Besser ist: in der CPU ein Bit setzen, dass das Skript anstösst und das Bit im Skript wieder zurücksetzen. So bleibt das Panel bedienbar. Beachte dabei auch, dass es bei den Panels einen Erfassungszyklus für Variablen (Standard 1s) gibt und dass, wenn Variablen nicht verwendet werden (z.B. zur Anzeige auf dem aktuellen Bild) sie auch nicht aktualisiert werden. Dazu die Erfassungsart auf "zyklisch fortlaufend" stellen.

Das Panel wird es nicht hinbekommen das Skript sauber in 1s zu beenden. Daher sollte es auch nicht jede Sekunde aufgerufen werden. 10s sind meiner Erfahrung nach sportlich aber machbar. Besser 20s oder mehr.

Ein Array mit 20001 Elementen ist aber auch sehr groß!
Besser nur 20 Werte. Dann die Messwerte in einem DB aufnehmen, und nach 20 Einträgen in einen zweiten DB kopieren, der die Daten dann dem Panel zur Verfügung stellt.
Also alle 20 Sekunden das Skript im Panel aktivieren. Das Skript liest dann die Werte aus dem zweiten DB aus und setzt das Aktivierungsbit zurück.
In der Zeit kann der erste DB wieder mit 20 Werten befüllt werden.
20er Wert eingetragen: Werte in den zweiten DB kopieren und Triggerbit für das Panel setzen und im ersten DB wieder bei 1 anfangen.

VG

MFreiberger
 
Auch wenn unbegründet, ganz kurz zu meiner Verteidigung: Der Prüfstand ist noch nicht vollständig aufgebaut - daher war der Button für mich eine Übergangslösung. Sollte später natürlich ersetzt werden. Allerdings wird mir einiges klar wenn du sagst dass das Panel während dem Skript einfriert - das war mir so nicht bewusst. Großes Dankeschön mal für den Ansatz.
Auch das Skript via Bit zu triggern ergibt mehr Sinn - habe ich bisher nicht so gehandhabt da ich zur Zeit nur am Büro Platz sitze und entweder nur das HMI oder HMI und CPU vor mir habe (Schaltschrank wurde die letzten Tage gebaut und verdrahtet)

Array habe ich erstmal mit 20000 Elementen angelegt da die Prüfdurchgänge bis zu 4 Stunden dauern kann (pro Sekunde ein Wert => 4*3600 Werte in einer Messung)
Macht aber Sinn kleinere Arrays mit mehreren Einträgen zu verwenden.

Dann werde ich nun anfangen mich damit auseinander zu setzen wie ich die Messwerte aus einem DB dem Panel zur Verfügung stellen werde usw.

Sollte dir ein Beitrag der dies behandelt über den Weg laufen wäre ich für einen Link unheimlich dankbar.

Recht herzlichen Dank für die hilfreichen, praktischen Antworten!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Werte in die Excel-Datei schreiben war kein Problem bis ich mit der While-Schleife + IF-Abfrage angefangen habe.
"Kein Problem"? Vermutlich waren die in die Datei geschriebenen Werte nicht aktuelle und konsistente, sondern ältere Werte der Variablen. Ist Dir das aufgefallen?

Nachdem ein Kollege mich darauf hingewiesen hat dass es für die endgültige Lösung nicht nötig wäre Daten in den DB zu schreiben habe ich mit dem oben genannten Ansatz weitergemacht (bei uns hat leider niemand erfahrung mit VB)
Bei Euch hat wohl auch niemand richtig Ahnung von der HMI-Kommunikation und Variablen-Aktualisierung der TIA WinCC Advanced Runtime? ;)
Wenn man Daten aus der PLC ins HMI einlesen will um sie z.B. in eine Datei zu schreiben, dann gibt es ein großes Problem mit der Aktualisierung der Variablenwerte. Wirklich sicher aktualisiert bekommt man die Daten nur als Rezeptur ins HMI eingelesen.

Die HMI-Variablen hattest Du wohl noch nicht als Array angelegt? Achtung: Jeder Lesezugriff auf ein Array-Element löst das Lesen des ganzen Arrays aus, was bei einem Array mit 20000 Werten möglicherweise zu Kommunikationsüberlastung führt.

Übrigens werden die Skripte nicht mit VB sondern mit VBS programmiert. Zwischen VB und VBS bestehen eine Menge Unterschiede... falls Du Dich an VB-Beispielen orientieren willst...

Code:
While "Messung aktiv" = True
  If "Takt 1 Hz" = True Then
    f.open pfad + "messwerte.csv", 8
    f.LinePrint CStr(Now) & ";"  & ";"  & ";" & MWWert1  & ";" & ";" & MWWert2  & ";" & ";" & MWWert3  & ";"
    f.Close
  End If
Wend
Wenn Du solchen Code skriptest, dann mußt Du bedenken, daß "Takt 1 Hz" eine halbe Sekunde lang True ist und deshalb nicht nur 1 Zeile in die csv-Datei geschrieben wird, sondern so viele Zeilen wie das Skript in 0,5s schafft. Du müsstest da noch warten bis "Takt 1 Hz" wieder False ist oder irgendeine andere Flankenauswertung einsetzen.


Zu Deiner Lösungsidee:
Was passiert, wenn während der 4 Stunden Prüfdurchgang das HMI-Panel auch nur 10 Sekunden nicht mit der SPS kommuniziert? Soll dann die Prüfung wiederholt werden??
Besser: zunächst die Messergebnisse des Prüfdurchgangs (möglichst komplett) in der SPS zwischenspeichern und danach auslesen.
Wieviel Zeit ist zwischen den Prüfdurchgängen?

Zusammenstellung von Links zu den Problemen beim Daten lesen mit HMI aus der SPS
Hier hatte ich mal das sichere Lesen von mehreren KByte aus der SPS und Schreiben in csv-Datei beschrieben:
Prozessdaten einer CPU 317 auf Speicherkarte eines TP277 6'' speichern

Übrigens erstellst Du keine Excel-Dateien, sondern "Komma separierte" Textdateien (csv), die man mit vielen Programmen (u.a. auch mit Excel) öffnen kann.

Brauchst Du die Daten tatsächlich in Excel? Du könntest die Daten direkt mit Excel (und einer Kommunikationsbibliothek wie Libnodave oder Snap7 oder ACCON-AGLink oder ...) aus der SPS lesen, das wäre einfacher zu realisieren als die Skripterei im HMI-Panel und das Auslesen ginge auch viel schneller.

Hast Du in Deiner Anlage einen PC oder Server laufen, dem Du die Werte mit der SPS direkt senden könntest?

Bei Deiner S7-1200 könntest Du vermutlich die Werte auch direkt auf eine Speicherkarte in der SPS-CPU speichern ("DataLog") (die Werte-Aktualisierungs-Klimmzüge zum HMI-Panel würden entfallen).
Anwendungsbeispiel: Prozessdaten erfassen und überwachen mit der SIMATIC S7-1200 (Data Logging)

Harald
 
"Kein Problem"? Vermutlich waren die in die Datei geschriebenen Werte nicht aktuelle und konsistente, sondern ältere Werte der Variablen. Ist Dir das aufgefallen?
Oh, das muss ich sofort beobachten - anscheinend war ich so glücklich DASS was in der csv Datei stand dass mir das nicht aufgefallen ist.

Bei Euch hat wohl auch niemand richtig Ahnung von der HMI-Kommunikation und Variablen-Aktualisierung der TIA WinCC Advanced Runtime? ;)
gut erkannt, Columbo ;D

Wenn man Daten aus der PLC ins HMI einlesen will um sie z.B. in eine Datei zu schreiben, dann gibt es ein großes Problem mit der Aktualisierung der Variablenwerte. Wirklich sicher aktualisiert bekommt man die Daten nur als Rezeptur ins HMI eingelesen.
Danke für diesen Hinweis!

Die HMI-Variablen hattest Du wohl noch nicht als Array angelegt? Achtung: Jeder Lesezugriff auf ein Array-Element löst das Lesen des ganzen Arrays aus, was bei einem Array mit 20000 Werten möglicherweise zu Kommunikationsüberlastung führt.
Nein, dies bezog sich auf das Array in dem DB (womit ich anfangs begonnen habe)

Wenn Du solchen Code skriptest, dann mußt Du bedenken, daß "Takt 1 Hz" eine halbe Sekunde lang True ist und deshalb nicht nur 1 Zeile in die csv-Datei geschrieben wird, sondern so viele Zeilen wie das Skript in 0,5s schafft. Du müsstest da noch warten bis "Takt 1 Hz" wieder False ist oder irgendeine andere Flankenauswertung einsetzen.
Macht Sinn, danke!


Zu Deiner Lösungsidee:
Was passiert, wenn während der 4 Stunden Prüfdurchgang das HMI-Panel auch nur 10 Sekunden nicht mit der SPS kommuniziert? Soll dann die Prüfung wiederholt werden??
Besser: zunächst die Messergebnisse des Prüfdurchgangs (möglichst komplett) in der SPS zwischenspeichern und danach auslesen.
Wieviel Zeit ist zwischen den Prüfdurchgängen?
Ergibt alles Sinn. (Nochmal Danke an MFreiberger). Der neue Ansatz orientiert sich jetzt an Zwischenspeicherung in der SPS.
Zwischen den Prüfdurchgängen liegt sicher mehr als eine Stunde da eine Rüstzeit vorgesehen ist.

Brauchst Du die Daten tatsächlich in Excel? Du könntest die Daten direkt mit Excel (und einer Kommunikationsbibliothek wie Libnodave oder Snap7 oder ACCON-AGLink oder ...) aus der SPS lesen, das wäre einfacher zu realisieren als die Skripterei im HMI-Panel und das Auslesen ginge auch viel schneller.
Laut Lastenhaft ist eine .csv Datei vorgeschrieben.

Hast Du in Deiner Anlage einen PC oder Server laufen, dem Du die Werte mit der SPS direkt senden könntest?
Nein, nur HMI und CPU. Die .csv Datei soll dann via USB Stick oder eventuell HMI-Miniweb bezogen werden.

Danke für die ehrlichen Antworten :)
 
Zurück
Oben