# VB-Script  Kopieren und Archivieren gleichzeitig (Skripte parallel / Batch Datei)



## Robot-Sun (13 April 2015)

*Hallo *

ich habe folgende "Herausforderung" zu meistern:

*Ausführen von einem "Archivierungs-Script" welches noch lauffähig bleibt
wenn größere Datenmengen von einer SD-Karte auf einen USB-Stick kopiert werden.*


Hardware:
CPU 1214C DC/DC/DC  (6ES7 214-1AG31-0XB0) V3.0
TP900 Comfort       (6AV2 124-0JC01-0AX0) Version: 13.0.0.0

Verwendete Software:
TIA   Portal   V13
STEP7 Basic    V13
WinCC Advanced V13

Test mit realer Hardware. (Thema: Unterschied Windows/WinCE)

Beschreibung:
Ein VB-Script wird zyklisch ausgeführt. 
Der Aufruf des Scripts erfolgt durch das Ereignis "Werteänderung" einer PLC-Variablen.
In der PLC wird z.B. aller 2Sek bzw. 30Sek. diese INT-Variable um 1 erhöht.
In dem VB-Script werden diverse BOOL, DINT, REAL Variablen in eine zuvor erstellte Textdatei(CSV) gespeichert(angehängt). Täglich wird eine Datei erstellt. (Nach einem Zeitraum X werden Dateien wieder gelöscht)
Über einen Kopier-Button am Panel soll dem Bediener/Servicemitarbeiter(etc.) die Möglichkeit
gegeben werden Dateien von der SD-Karte auf einen USB-Stick zu übertragen.


Aktueller Erkenntnisstand:
*Versuch 1:*
Aktuell gibt es einen Datenverlust beim Archivieren (VB-Script)wenn das Kopier-Script arbeitet.
Laut einem Beitrag aus diesem Forum kann nur EIN VB-Script gleichzeitig ablaufen.
-> Probleme beim Kopieren größerer Dateien
-> Probleme beim Kopieren vieler Dateien in einem Schleifen-Konstrukt
-> Datenverlust von mehreren Minuten


*Versuch 2:*
Ausführen einer Batchdatei die während der HmiRTm erstellt wird.
Ausführen der Batchdatei über CMD Konsole.
Vorteil:  Kopieren mit Wildcard (z.B. *.*) sind möglich
-> Kopieren und Archivieren gleichzeitig okay (scheinbar kein Datenverlust)
-> ABER!! CMD Konsole läuft immer im Vordergrund und lässt sich auch nicht minimieren
StartProgram "CMD", "/C " & "\Temp\copy1.bat", hmiShowMinimizedAndInactive, hmiNo
hmiShowMinimizedAndInactive OHNE WIRKUNG
(Ich habe keine Möglichkeit gefunden, dass zu unterbinden.)


*Versuch 3: (noch offen)*
Schreiben einer EXE-Datei für WinCE6.0 welches ohne sichtbaren Fenster (wenn möglich)
das Kopieren durchführt. (Aufwand und Risiken noch nicht einschätzbar. Evtl. würde doch wieder
die CMD genutzt werden.)


*Versuch 4: (noch offen)*
Schreiben eines eigenen "Task-Managers" in der HmiRTm welches den Aufruf zwischen Script 1 und 2
regelt.
Nachteil: 
Das Kopieren könnte noch viel länger dauern und würde wahrscheinlich nur gut arbeiten,
wenn das Archivierungs-Script im "30Sekunden-Modus" ist.
Der Verlust von Werten könnte auch nicht komplett ausgeschlossen werden.
(Einzelne fehlende Werte wären wohl noch okay. Aber nicht z.B. 15min keine Werte.)

----------
Die Dateigröße wird voraussichtlich zwischen 0,8 bis 2MB am Tag liegen.
----------

Hat jemand für diese Thematik einen Lösungsansatz?

Hat jemand SD-Karten mit einer Kapazität von mehr als 2GB erfolgreich verwendet die nicht von Siemens waren?
Bisher habe ich bei meiner 16GB SDHC Card noch keine schlechten Erfahrungen gemacht.



Nice to Have:
- Eine Statusanzeige (Anzahl der Dateien und Fortschritt)

Bekannte SPS-Forum Links ;o)
http://www.sps-forum.de/faq/15348-protool-winccflex-daten-lesen-schreiben-mit-vb-script.html



*Danke schon mal für eure Hilfe.*


----------



## JesperMP (13 April 2015)

Geht das kopieren von SD nach USB nicht ohne VB Skript ?
Mit der Systemfunktion Startprogram COPY aufrufen. // edit: Also ohne zuerst CMD starten.
Ud du kannst "Display mode" als "minimized" spezifizieren. Dann passiert es in der Hintergrund.
In diese weise Startest du kein weitere Skript und das Archivierungs-Skript wird nicht gesperrt.
Siehe auch hier:
https://msdn.microsoft.com/en-us/library/ms908150.aspx


----------



## Larry Laffer (13 April 2015)

Hallo,

zu Versuch 2:
versuch das mal mit HMIShowMinimized an Stelle von deiner Option.

zu Versuch 1:
somit hast du ja die Defizite des Systems voll erkannt und analysiert.
Aus der Nummer kommst du so ohne Weiteres nicht heraus - die Alternative wäre wirklich sowohl die Datenspeicherung wie auch das Umkopieren der Daten komplett aus der Visu heraus zu nehmen und hier in einer EXE mit mehreren Thread's oder sogar Task's zu arbeiten.
Den Punkt, den du noch nicht genannt hast, ist die Sache mit der Daten-Konsistenz - das hast du in den Forums-Beiträgen der Vergangenheit bestimmt auch schon gefunden.

Gruß
Larry


----------



## Robot-Sun (13 April 2015)

Meiner Meinung nach kann WinCE nur Dateien ausführen, die auch direkt im System abgelegt sind.
Auf dem Panel gibt es unter „\Program Files“ eine Datei „Command Promt“(Verknüpfung)
Diese Start z.B. das Programm „Pocket CMD v 6.00“
Als Zieldatei ist „\Windows\cmd.exe“ angegeben.
Eine Datei „copy.exe“ gibt es nicht. (Es gab ja auch mal eine xcopy.exe)
TP900 sagt: „Fehler beim Starten des Programms: COPY Fehlercode 2.1“

Mit dem Befehl Copy (aus der CMD.exe) kann ich z.B. dass machen.
copy "\Storage Card SD\*.*" "\Storage Card USB\"
copy "\Storage Card SD\2012-12*.*" "\Storage Card USB\"
Mit “filecopy” nicht.



Falls das Kopieren über eine Batch-Datei nicht geht, kann man das über „filecopy“ im VB-Script realisieren. Allerdings ohne Wildcards und das Script blockiert weitere Skripte, da es lange braucht.
Im VB-Script setze ich z.B. durch ein Schleifen-Konstrukt die zu kopierenden Dateien zusammen, wenn ich mit dem Befehl „filecopy“ arbeite.
...
Dateiname = i_year & "-" & b & i_month & "-" & a & i_day & ".csv"
...
fs.filecopy ("\Storage Card SD\"& Dateiname), ("\Storage Card USB\" & Dateiname) 

-----

@Larry Laffer
VB-Script-Auszug:
StartProgram "CMD", "/C " & "\Temp\copy1.bat", hmiShowMinimized, hmiNo
> Wird trotzdem im Vordergrund ausgeführt.
> Fenster schließt wieder wenn‘s fertig mit kopieren ist

Wenn ich das nicht im Skript ausführe, sondern die Funktion unter Ereignis-Klick
StarteProgramm nutze bleibt das CMD-Fenster auch im Vordergrund.


Über Datenkonsistenz habe ich mir weniger Gedanken gemacht. In der PLC ist es ein
„optimierter Bausteinzugriff“(Also nur noch über Namen.)
Der Inhalt der CSV-Datei ist fürs kopieren nicht wichtig. Der Name der CSV-Datei schon.


----------



## Robot-Sun (13 April 2015)

Demnächst untersuche ich eine Interrupt-Variante.
Dabei wird das Kopier-Skript verlassen, wenn das Archivier-Skript sich meldet.
Zurzeit nur über einen Schalter im HMI (interne Variable).

If SmartTags ("TEST_Copy_Interrupt") = True Then Exit Sub
[True verwenden nicht 1 !]

Das Kopieren am Panel scheint zu stoppen. LED am USB-Stick hört mit Blinken auf.
Schleifenzähler bleibt stehen (Anzeige am HMI)

Kleiner Erfolg 

Werden Smartags während der Skriptlaufzeit aktualisiert bzw. handelt es sich um eine Art Zeiger?


----------



## daschris (13 April 2015)

Hi
mal eine Grundsätzliche Frage von mir: Warum musst du das Archivieren über skript fahren`? Wenn du die Archivierungsfunktion nutzt kannst du beides parallel nutzen. 
Genau so etwas habe ich hier gerade gebaut, und das funktioniert gerade sehr gut.


daschris


----------



## JesperMP (13 April 2015)

daschris schrieb:


> mal eine Grundsätzliche Frage von mir: Warum musst du das Archivieren über skript fahren`? Wenn du die Archivierungsfunktion nutzt kannst du beides parallel nutzen.
> Genau so etwas habe ich hier gerade gebaut, und das funktioniert gerade sehr gut.


Es ist ein selbsterstellte Archiv-Funktion mittels VBS. Wenn er den Systemfunktion CopyLog verwenden wurde musste er den Standardarchivierung verwenden.


----------



## PN/DP (13 April 2015)

Wofür braucht Dein Kopier-Skript "mehrere" Minuten?
Ist das TP900 so schlecht oder der USB-Stick so langsam?

Alle 2 Sekunden Variablen in eine csv-Datei speichern wollen ist schon sportlich, hast Du denn in dieser kurzen Zeit sicher aktuelle Werte der Variablen im Panel? Wie realisierst Du das?

Kannst Du nicht besser in der SPS Archiv-Datensätze zwischenpuffern und ab und zu en bloc ins Panel einlesen und abspeichern?
Vielleicht brauchst Du ein mehrstufiges puffern-und-burst-Konzept?


Das unsichtbare Ausführen von externen Programmen auf WinCE-Panels war imho auch in WinCCflex nicht möglich. Die Hilfe zu "StartProgram" formuliert etwas schwammig: "Die Runtime-Software läuft im Hintergrund weiter."
Das Ausführen externer Programme hat noch einen weiteren Haken: man bekommt keine Info, ob das Programm gestartet wurde und ob/wann es beendet ist.

Harald


----------



## faust (13 April 2015)

Hallo,

auf die Schnelle, da eigentlich keine Zeit:

1. WinCC-Archive verwenden.
2. Vor dem Kopieren per Systemfunktion eine Kopie der Archivdatei erstellen.
3. Archivdateikopie einlesen und die Daten temporär in das gewünschte Format bringen
4. Mit den temporären Daten die "Datenkopie"-Datei erstellen.

Vorteile:
+ Die Archivierung läuft unabhängig vom Kopiervorgang.
+ Der Kopiervorgang kann mit Scripten projektiert werden.
+ Keine externen Programme/Funktionen notwendig.


Gruß, Fred


----------



## daschris (14 April 2015)

faust schrieb:


> Hallo,
> 
> auf die Schnelle, da eigentlich keine Zeit:
> 
> ...



ja genau so mache ich das auch und würde ich dir auch empfehlen


----------



## Robot-Sun (14 April 2015)

*@PN/DP*
Ob das TP900 so langsam ist oder der Stick (8GB sollte USB2.0 sein) kann ich dir nicht genau sagen.
Kopiert wurden ca. 650MB (entspricht ca. 1 Jahr Archivierung).
Der 2 Sekunden Fall sollte nicht permanent auftreten. Wenn gar nicht möglich wird das Intervall verlängert.

Ein Konzept bei dem die Daten in der SPS zwischen gepuffert werden wurde wieder verworfen.
(z.B. Speicherauslastung PLC / bzw. sind die Daten eh immer im Panel, weil sie da angezeigt werden / Programmieraufwand-Komplexität)

*@faust @daschris*
Die Archivierungsfunktion von Siemens wird nicht genutzt, weil der Nutzdatenanteil zu gering ist.
Für jede Variable wird ein langer Zeitstempel angelegt. Bei ein paar Werten mag das noch gehen, aber nicht wenn man von z.B. 50 bis 100 Werten ausgeht. 
Außerdem lässt sich eine CSV-Datei die man selber erzeugt in Excel besser weiter verarbeiten.


BSP. Eigene CSV  ca. 16Bool 8 DINT
09:44:08;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;71303;35651;17826;14261;8913;4456;3565;90;


BSP. Archivfunktion 2 Variablen
"VarName";"TimeString";"VarValue";"Validity";"Time_ms"
"VAR_INT{1}";"13.04.2015 11:10:21";0;1;42048465520,2315
"VAR_INT{2}";"13.04.2015 11:10:22";0;1;42048465531,8056

Das kostet dann Speicher auf der SD-Karte ohne Ende..


----------



## Robot-Sun (14 April 2015)

Noch eine andere Frage.. Kann mir ein Array [0...1200] of DINT oder mehr im HMI auf die Füße fallen? Will dies als Zwischenpuffer nutzen. Speichertechnisch habe ich noch keinen Haken gefunden.


----------



## PN/DP (14 April 2015)

Wenn das ein Array in der SPS ist: Bei einem Lesezugriff oder Schreibzugriff auf ein einzelnes Arrayelement werden immer alle Arrayelemente der Arrayvariablen gelesen oder geschrieben! Das kann zu Kommunikationsüberlastung und Dateninkonsistenz führen.

Harald


----------



## Robot-Sun (14 April 2015)

Dieses Array wird als Interne HMI-Variable genutzt. Also nicht in der SPS. Man kommt bei solch großen Arrays auch schnell an die Speichergrenzen der 1200er.

Das Array speichert mir das Datum (als DINT z.b. 20150414) und somit den Teil des Dateinamens den ich später wieder beim Kopieren brauche. Kopieren scheint zu funktionieren. Aber die Spätfolgen kann ich noch nicht abschätzen.


----------



## PN/DP (14 April 2015)

Als interne HMI-Variable hat sie wohl kaum etwas mit Speichergrenzen der S7-1200 zu tun...
Allerdings bei jedem Beenden der HMI-Runtime auf dem TP900 sind die Inhalte des Arrays futsch.

Harald


----------



## Robot-Sun (14 April 2015)

Die HMI-Runtime wird doch im Normalfall nur bei Spannungsausfall beendet, oder? Dem Bediener will ich keinen Zugriff auf den Taskmanager von WinCE geben. Das die Daten verloren gehen wäre ja okay, weil sie nur kurzfristig während des Kopiervorgangs als Kopierliste dienen sollen. Also ich denke vielleicht einmal im Monat.(Ist noch unklar). Also wenn ein solch großes Array in der HMI okay ist, dann werd ich wohl das Programm an dieser Stelle erstmal so lassen.


----------

