# WINCC flexible Archiv / Tabelle



## JoHo

Schönen guten Tag zusammen.

Nachdem ich jetzt einige Zeit mit der Hilfe von Siemens und mit dem lesen dieses Forums verbracht habe, habe ich das Gefühl dass entweder noch niemand auf meine Idee gekommen ist, oder dass meine Idee so doof ist, dass niemand anderes drauf kommen würde 

Also kommen wir zur Problemstellung:

In meiner S7 schreibe ich 2 hübsche Arrays in denen jeweils 31*3 Reals drinstehn (wer jetzt auf 31 Tage und 3 Schichten pro tag kommt is gar nicht so dumm). Diese hätte ich jetzt gerne in einer kleinen hübschen Tabelle auf einem Panel dargestellt. 
Das ganze dann noch archivieren, dass man schön scrollen kann und fertig is die Laube. 

Also eigentlich hört sich das ja gar nicht so schwer an. Aber bei mir scheiterts nicht nur daran eine 'Tabelle' zu finden und ins WinCC zu bringen sondern auch die Arrays sinnvoll rinzubekommen. 

Naja, wenn das alle meine Probleme mit dem Projekt wären, dann wär ich ja schon glücklich, aber den Rest versuch ich mal selbst zu lösen.


Vielen Dank im Voraus


----------



## PN/DP

*Siemens FAQ Beispielapplikation*

Hallo JoHo,

genau für Deine Idee gibt es im Siemens-Support eine FAQ mit fertigem Anwendungsbeispiel:
Wie können Daten bei Panels oder bei der WinCC flexible PC Runtime aus einem Variablenarchiv in Tabellenform angezeigt werden?

Gruß
Harald


----------



## Mondmann

Hi JoHo,
meinst du nun WCF oder WinCC ?
Bei Win flex kannst du Variablen archivieren und anschließend über ein VBS script diese in eine Tabelle schreiben, sortieren, etc.
Ich schreibe Variablen meistens in eine SQL Datenbank (über eine Runtime) und Werte die dann über Excel aus.
Bei WCF und großen Datenmengen werden die Panels verdammt langsam.


Grüße

der Mondi


----------



## JoHo

Also erstmal danke PN/DPfür die extremst schnelle antwort. Werde mich mal gleich an die Umsetzung packen.
Lieber Mondmann, ich glaube die Sache hier ist ein wenig wild geraten und vllt auch von mir bzw. dem Kunden schwieriger gedacht als wirklich nötig.

Im Endefekt haben wir 5 Anlagen, die im 3 Schichtbetrieb gefahren werden. Da wird irgendwas in Metern verarbeitet, wobei die Anlagen pro Schicht mehrfach umgerüstet werden müssen.
Plan ist, pro Schicht (z.B. mit nem Barcode leser) die Auftragsnummern zu erfassen und die Längen und Zeiten pro Auftrag. Das ganze passiert (naja, soll irgendwann passieren) über ein Panel je Anlage und einen PC im Meisterbüro, der einfach nur das selbe sehen soll wie die Panels an der jeweiligen Anlage anzeigen. 

Soweit ja noch gar nicht wild finde ich. Probleme sind halt die, dass das ganze in 'solange rückwärts wie geht' Form in ner Tabelle in den Panels und am PC dargestellt werden soll und der PC am Feierabend bzw. am WE ausgeschaltet wird. 

Messwerterfassung und Ausgabe in Arrays steht schon, Wochen- Monats-, und Jahreshoch is auch kein Ding, Barcodescanner kann auch keine Kunst sein. 
Jetzt gehts halt dran, das Ganze in Tabellenform zu bringen (so wie halt der Link oben von Siemens das sagt). Ist halt die Frage wieviel und wie lang kann ich auf der CPU zwischenspeichern wenn der Meister PC aus ist und wie ich da von den Daten her den Abgleich zaubere wenn der PC Schichtübergreifend aus war.


Aber wir machen den schönen Job ja nicht weil wir alles können, sondern um jeden Tag was dazuzulernen.


----------



## JoHo

Also auch auf die Gefahr hin ausgelacht zu werden........ich bekomms net hin. bzw. der Groschen fällt pfennigweise bei mir......wenn nicht sogar nur in zehntel Pfennigen.
Also mein Array in der SPS habe ich. Eine entsprechende Variable im WinCC flexible auch. Eine hübsche Tabelle auch, die mir eine csv datei hübsch anzeigt (also lesen kann ich sie).
Das Archiv beschreiben geht in form von Variable archivieren, wobei mir WinCC nicht das Array in die csv Datei schreibt, sondern irgendwas (wobei ich das 'WAS' noch grade am ergründen bin).
Aber eine einfache Version von 'zeige mir bitte mal eben das ganze array an scheint es nicht zu geben (ich mein z.B. in LabView, was hier warhscheinlich wieder sehr wenige kennen sind das dann ganze 3 Klicks).
Über die Hilfe der Siemens Software möcht ich mich hier lieber nicht aus lassen sonst wirds was länger hier.

Ja ich bin grad gefrustet und es tut mir auch schon fast leid, aber ist halt nicht so einfach sich ohne jegliche Ahnung hier durchzuhangeln.


----------



## Larry Laffer

Hallo JoHo,
ich denke, es lacht dich keiner aus ... 
Du darfst aber eben nicht Flex mit Excel (oder ähnlichen Konsorten verwechseln).
Die von dir gewünschte Funktion (zeige mir das ganze Array an) gibt es in Flex so nicht - nur mit entsprechend viel "Handarbeit".

Die Variante "mit einem Archiv arbeiten" habe ich in meinen Projekten für mich abgehakt. Mit einem bißchen Script-Wissen läßt sich das Ganze auch "zu Fuß" hinbekommen und dann funktioniert es auch so, wie man will (auch beim Abspeichern).

Gruß
LL


----------



## JoHo

Also entweder bin ich zu blöd zum archivieren oder es geht nicht.

In meinem DB 201 steht ab 0.0 ein Array mit 93 Reals. Im flexible hab ich dann auch mal eine Variable angelegt, die genau da hinzielt und auch 93 Arrayelemente hat und auch automatisch eine Länge von 372 (was ja korrekt ist). Diese Variable hab ich nun auf archivieren gestellt (was ja standartmäßig nur zyklisch geht und nicht per Knopfdruck wie ich es gerne hätte).
Und siehe da: Kaum hab ich die Runtime gestartet steht sage und schreibe NICHTS!!! im Archiv. Dies ändert sich auch nicht wenn ich die Runtime längere Zeit laufen lasse. 
Also ich ruf mir dann einfach mal die CSV Datei im Editor auf bzw. Schau mit Ihre Größe von 1kb an, die sich einfach nicht verändert.........

Deshalb: Mach ich da was falsch oder flexible?


----------



## Larry Laffer

... ich hatte jetzt eigentlich erwartet, dass sich einer unserer Archiv-Profis hier mal zur Sache meldet - aber OK.

Wie ich dir schon geschrieben habe sind Archive nicht mein Ding. Wenn es für dich aber auch eine Alternative sein könnte, das Ganze eigenhändig per Script zu Erledigen, dann sollte *dieser* Thread für dich interessant sein.
Hier kannst du selber in eine CSV-Datei (beliebigen Aufbaus) speichern und auch ggf. wieder zurücklesen, da du dann ja weißt, was wohin gegangen ist.
Da du außerdem mit einem Array arbeitest kannst du so die Daten dann sogar in einer Schleife (und nicht eine nach der anderen) wegschreiben.

Gruß
LL


----------



## JoHo

Also vielen Dank nochmal!

Mit viel rumprobiererei und viel, viel lesen hier im Forum habe ich jetzt zumindest nen Teilerfolg errungen und bin auf einem sehr guten Wege wie ich finde.



		Code:
	

'Variablen deklarieren
Dim fso, fs, datum, zeit, datei, textfile1, inifile, i, Zeile(100), Zeilen, ix, f, text_stream, il, temp
'Variablen deklarieren


' FileSystemObject erzeugen 
Set fso = CreateObject("Scripting.FileSystemObject")
' FileSystemObject erzeugen 


'Prüfen ob Datei existiert
If fso.FileExists( "C:\Storage_Data\Logs\Engine_01\Tag_Values\100.csv") = False Then 
    ShowSystemAlarm ("BLUBB!!! path or file not available")
End If
'Prüfen ob Datei existiert



'Daten schreiben    
Set fs = CreateObject("WScript.Shell")
 
datei="C:\Storage_Data\Logs\Engine_01\Tag_Values\100.csv"
 
If Not fso.FileExists (datei) Then 
    Set textfile1 = fso.OpenTextFile(datei, 8)
    For i=0 To 92
    
    textfile1.WriteLine ("Zeit Schicht 1=" & SmartTags("DB BONAK.Zeit")(i) & "; " & "Zeit Schicht 2=" & SmartTags("DB BONAK.Zeit")(i+1) & ";" & " Zeit Schicht 3=" & SmartTags("DB BONAK.Zeit")(i+2) & ";") 
   
   i=i+2
   
    Next
End If
'textfile1.Close
 
If fso.FileExists (datei) Then 
    Set textfile1 = fso.OpenTextFile(datei, 8)
    For i=0 To 92
    
    textfile1.WriteLine ("Zeit Schicht 1=" & SmartTags("DB BONAK.Zeit")(i) & "; " & "Zeit Schicht 2=" & SmartTags("DB BONAK.Zeit")(i+1) & ";" & " Zeit Schicht 3=" & SmartTags("DB BONAK.Zeit")(i+2) & ";") 
   
   i=i+2
   
    Next
End If
textfile1.WriteLine 
textfile1.Close    
'Daten schreiben

'Daten anzeigen


' Datei öffnen
' open the file    
Set f = fso.GetFile("C:\Storage_Data\Logs\Engine_01\Tag_Values\100.csv")
    
    Set text_stream = f.OpenAsTextStream(1, -2)
    
    ' Zur richtigen Zeile springen
    ' skip to the correct line
    For il = 1 To SmartTags("SkipIndex")
        If text_stream.AtEndOfStream = True Then Exit For
        temp = text_stream.ReadLine
    Next
    
    ' Zeilen aus Datei auslesen
    ' read lines from file
    
    For i = 1 To 10
        If text_stream.AtEndOfStream = True Then Exit For
        Zeile(i) = text_stream.ReadLine
    Next
    text_stream.Close
    For ix = 1 To (i-1)
    
    ' Zeile in Spalten zerlegen
    ' Split line In column
        Zeilen = Split(Zeile(ix),";",-1,1) 
        'Textfelder befüllen/ fill text fields
        Set fs = HmiRuntime.Screens("300_Archivspielerei").ScreenItems("VarNameTextfeld"& ix)
            fs.Text = Zeilen(0)
        Set fs = HmiRuntime.Screens("300_Archivspielerei").ScreenItems("ZeitTextfeld"& ix)
            fs.Text = Zeilen(1)
        Set fs = HmiRuntime.Screens("300_Archivspielerei").ScreenItems("VarTextfeld"& ix)
            fs.Text = Zeilen(2)
Next



Also hiermit kann ich mein Array in eine CVS schreiben in schön formatiert (wie sinnvoll oder sinnlos das ist bleibt fraglich). Das ganze gelumpse lese ich mir dann aus und Pack das in eine 'hübsche' Tabelle (der noch die scrollmöglichkeit fehlt, die ich mir aber aus nem andren Beispiel klauen kann).

Timestamps bzw. Datum und Uhrzeit mit dazupacken sollte ja keine Kunst sein und das ganze dann irgendwie vergleichen und Auswerten sollte ja jetzt, wo ich das schon hinbekommen habe kein dolles Problem mehr darstellen.

Für Anregungen und Verbesserungsvorschläge bin ich mehr als nur offen.


----------



## Larry Laffer

Hallo - hallo,
das ist schon mal nichts so schlecht.
Was mir im Vorbeigehen so auffällt ist :
- du brauchst nur ein "CreateObject"
- die Schleife solltest du mit "Step 3" weiterschalten
- da du die datei (wenn vorhanden) einfach gnadenlos überschreiben willst brauchst du nicht zwischen "Datei schon vorhanden" und "Datei nicht vorhanden" zu unterscheiden.

Der Code könnte dann so aussehen :
	
	




		Code:
	

'Variablen deklarieren
Dim fso, fs, datum, zeit, datei, textfile1, inifile, i, Zeile(100), Zeilen, ix, f, text_stream, il, temp

' FileSystemObject erzeugen 
[COLOR=red][B]Set fso = CreateObject("Scripting.FileSystemObject")[/B][/COLOR]

'Prüfen ob Datei existiert
If [B][COLOR=red]not [/COLOR][/B]fso.FileExists( "C:\Storage_Data\Logs\Engine_01\Tag_Values\100.csv") then
    ShowSystemAlarm ("BLUBB!!! path or file not available")
[COLOR=red][B]else[/B][/COLOR]
 
   datei="C:\Storage_Data\Logs\Engine_01\Tag_Values\100.csv"
 
    Set textfile1 = fso.OpenTextFile(datei, 8)

    For i=0 To 92 [B][SIZE=3][COLOR=red]step 3[/COLOR][/SIZE][/B]
    
       textfile1.WriteLine ("Zeit Schicht 1=" & SmartTags("DB BONAK.Zeit")(i) & "; " & "Zeit Schicht 2=" & SmartTags("DB BONAK.Zeit")(i+1) & ";" & " Zeit Schicht 3=" & SmartTags("DB BONAK.Zeit")(i+2) & ";") 
   
    Next
   textfile1.WriteLine 
   textfile1.Close    
End If

... ohne es weiter geprüft zu haben ...

Gruß
LL


----------



## PN/DP

*Archiv entbehrlich?*

Hallo JoHo,

Dein Skript in #9 wird auf einem Panel nicht funktionieren, weil auf dem Panel WinCE drauf ist und kein Win32.
Die Unterschiede der File-Operationen siehe in dem von LL verlinkten FAQ. (besonders: VBScript_WinCE.pdf)

Mal eine andere Idee:
Brauchst Du unbedingt das CSV-Archiv oder ist das Archiv nur eine Krücke, um die Array-Werte scrollbar in einer 
"Tabelle" anzuzeigen? Weil Du keine andere Möglichkeit kennst?

Ich habe da eine viel einfachere Möglichkeit im Kopf, die Werte direkt aus dem Array der SPS anzuzeigen.
Wenn das das ist, was Du eigentlich willst, dann kann ich heute Abend das Konzept der direkten Anzeige ohne 
Archiv-Umweg hier mal posten.

1. Welches Panel willst Du einsetzen?
2. Sollen Deine Werte nur angezeigt und gescrollt werden oder sollen die Werte auch änderbar sein?
3. Ist das richtig so: Du hast für 2 Real-Werte jeweils ein Array mit 31*3 Einträgen?
4. Willst Du in der SPS noch Zeitstempel zu den Werten speichern oder ist der Array-Index jeweils der Tag des Monats?

Gruß
Harald


----------



## JoHo

Vielen Dank für die schnelle Reaktion!!!

zu 1. ganz ehrlich? Wenn ich wüsste was dieses  "CreateObject" ist und wozu ich es brauche wäre ich glücklicher. Habs halt einfach stumpf ausm Beispiel kopiert.

zu 2. Haste recht! step 3 macht die sache hübscher. Wusste bisher nichts von dessen Existenz, aber man lernt nie aus.

zu 3. Auch richtig! Die Unterscheidung is eigentlich albern gewesen (aber halt im Beispiel vorhanden gewesen und ich bin ja schon froh wenigstens einen Teil davon verstanden zu haben). Nur ein Problem noch: gnadenlos überschreiben is so ne Sache. Würde ich im Prinzip gerne, leider hängt der Kollege, wenn ich das Script mehrfach ausführe die Daten hinten an und überschreibt sie halt eben nicht!


Alles in allem soll dieses eine Art Temporäre Variable sein. Da ja mein folgendes Problem darin besteht, dass die Produktion rund um die Uhr läuft, der Auswerte PC aber am Feierabend bzw. an den Wochenenden nicht läuft (zudem ist das hier erst ein Teil von einer von 5 Anlagen, die ja aber alle dem selben Konzept folgen. Das ganze Portabel machen und nicht auf eine feste Datei zuzugreifen is ja das kleinste Übel, denn eine Variable, die man eingeben kann in den Datei/Ordnernamen einzubinden is ja 'einfach').

Naja, sind wir mal gespannt. Nächste Woche gehts wohl weiter. UDTs kann ich wie ich hier irgendwo gelesen habe wohl nicht bzw. nur auf sehr sehr unelegante weise in meinem script verwursten. 

Dann noch mal ganz blöd. Kann ich auf meiner Runtime auf die Daten andrer Panels zugreifen? Quasi, die Panles an den Anlagen sind 24h in Betrieb und archivieren alles brav. Jetzt kommt einmal am Tag der Master PC mit der Runtime und sagt 'zeigt mal was ihr schönes habt!'. Geht das? Oder nur über dem Umweg CPU?


----------



## JoHo

Jetzt gehts aber fix hier! 

@PN/DP leider kam dein Beitrag erst als ich meinen grade am verfassen war, deshalb mein zweiter Analuf hier:

Dass es einen Unterschied zwischen den Anweisungen in den Scripts für Panels und PC Runtimes gibt habe ich begriffen und mir ist klar, dass das so nur auf nem PC in einer Runtime läuft und nicht auf einem Panel. Trotzdem vielen dank für den Hinweis.



> Mal eine andere Idee:
> Brauchst Du unbedingt das CSV-Archiv oder ist das Archiv nur eine Krücke, um die Array-Werte scrollbar in einer
> "Tabelle" anzuzeigen? Weil Du keine andere Möglichkeit kennst?



Sowohl als auch! ich kenne keine andre Möglichkeit das gane umzusetzen, aber ist das wirklich schlimm? gibt es eine bessere?
Klar, ich möchte meine Daten Sammeln bzw. Archivieren und auch gleichzeitig in der Runtime anzeigen lassen. 
Grundidee des Archivs war es ein 2D Array zu nehmen mit 31*3 Werten wobei die 31 die Tage des Monats sind und die 3 halt ganz stupide die Schichten. 
Als dies entstand war die Idee noch weder ne runtime, noch Panels an den Anlagen zu nutzen sondern den ganzen Datenwust einmal am Tag per OPC abzuholen und ins Excel zu legen.

Inzwischen hat sich die Sache aber verkomlpiziert. Die Herrschaften hätten im ersten Schritt gern nen PC mit Runtime, der das ganze Archivieren übernimmt. 
Zusätzlich zu den Laufzeiten und den gefahrenen Metern pro Schicht pro Tag soll nun auch noch im zweiten Schritt die Anzahl der verarbeiteten Aufträge mit Zeiten und verarbeiteten Metern plus Auftragsnummer gespeichert werden. (Auftragsnummerneingabe per Panel oder PC mit Runtime, was noch in den Sternen steht).

Naja, irgendwie so halt. Habe das Gefühl wo ich das grad selbst seh, dass mir das ganze vom Umfang her dezent aus den Fingern zu gleiten droht :neutral:


----------



## Larry Laffer

Hallo JoHo,
nicht verzweifeln. 1. hast du schon mal den ersten Schritt gemacht und 2. Rom wurde auch nicht an einem Tag erbaut.

Dennoch solltest du vielleicht dein Konzept überdenken.
Ich würde so vorgehen :
Jeweils am Ende einer Schicht (oder bei einem Auftrags- oder Chargen-Wechsel) speicherst du die in der Schicht angefallenen Daten mit Zeitstempel und was noch so interessant ist. Hierbei würde ich dann denn Schreibmodus "anhängen = 8" statt "überschreiben = 2" wählen. Ist die Datei nicht da, so erzeugst du sie (ggf. mit einem schicken Überschrifts-Header) - ist sie schon da, so hängst du deine Daten nur an.
Als Datei-Name bietet sich dann ggf. der Anlagen-Name und der Monats-Index an (z.B.).

Des weiteren :
"CreateObject" ist innerhalb von VB eine Art Klassifizierung damit das System weiß, womit es es zu tun hat.
Hierbei wird ein Handle auf (in dem Fall) die Datei erzeugt, die du verarbeiten willst. Bei Schreib- und Lese-Operationen arbeitest du dann mit dem Handle.

Das Anzeigen und ggf. Kummulieren der Daten würde ich erstmal "aussen vor" lassen. Das wird sonst im Moment vielleicht wirklich zu viel.

Willst du auf Dateien von anderen Rechnern (Anlagen) zugreifen, so bietet sich hier ggf. ein Netzwerk an.

Gruß
LL


----------



## JoHo

jahaaaaa.......Konzept überdenken.......gute Idee......

Das fing dann gestern hier beim Schreiben an und zog sich bis in die Nacht gegen 3 Uhr durch 

Ja völlig richtig! Ein Array mit 31*2 ergab Sinnn solange es nur drum ging die Gesamten Daten einmal am Tag aufzuzeichnen ohne die Auftragsnummern und die Zuordnung zu diesen. 

Jetzt wäre es in meinen Augen sinnvoll die Daten in der SPS anders zuzuordnen. Ein Array of UDTs (klar eins pro anlage und in den UDTs halt alle relavanten Daten wie Datum, Zeit, Länge, Laufzeit, Schicht, Auftragsnummer), dass so lang ist wie der PC zum Daten abholen maximal im worst case aus ist. Dieses Array dann als umlaufspeicher beschreiben und dann so wie hier schon beschrieben im ersten Schritt in eine csv Datei abspeichern wenn der PC wieder läuft.

Und siehe da, schon hab ich wieder Arbeit für heute.


----------



## JoHo

*Siemens live*

Da bin ich wieder und dachte ich wäre fast durch, dann fiel mit auf, dass die Entwickler von step 7 anscheinend so gar nichts mit denen von flexible zu tun haben und auch niemals miteinander sprechen!!!

Ich war so 'schlau' und habe mir nen neuen DB mit all meinen Daten gemacht. Dieser besteht aus 180 UDTs hintereinander. Die UDTs bestehen aus 2 ints, 2 reals und einem time and date. Dieses große Array wollte ich jetzt in flexible anlegen. Im Hinterkopf hatte ich ja, dass flexible und step 7 von der selben Firma sind und sich auch kompatibel............

Naja, ich werde dann jetzt mal aus meinem Array of UDT 5 einzelne Arrays aus je int, real bzw. time and date basteln, die kann das flexible ja...........


----------



## Larry Laffer

Hallo JoHo,
doch doch, da gibt es schon eine Schnittmenge - die ist nur nicht so groß ... 
Aber "by the way" ... bist du sicher, dass du alle deine Daten unbedingt in der SPS abbilden mußt ? Ich könnte mir auch gut vorstellen, nur den aktuellen Datensatz (oder maximal die Daten der aktuellen Schicht) in der SPS vorzuhalten und die dann beim Schichtwechsel (oder ggf. bei Unterereignissen wie Bediener-, Chargen- oder Produktwechsel) mittels der Visu abfragen und speichern ... vielleicht auch ein Ansatz ...

Gruß
LL


----------



## JoHo

Grundsätzlich haste natürlich wie immer gut mitgedacht.
ABER der PC zum Daten speichern wird abends und am Wochenende ausgeschaltet. Also sehe ich mich gezwungen die Daten irgendwo vorzuhalten. Viele andre Optionen als die CPU habe ich da wohl leider nicht.


----------



## Larry Laffer

... dann würde ich ggf. einen Puffer aufbauen mit "nicht abgeholten Daten" und den dann von der Visu her "löschen wenn gelesen".

Gruß
LL


----------



## JoHo

So, lange nichts mehr passiert hier, aber ihr kennt das ja sicher. Ich mein wäre auch langweilig, wenn man mal erst ein Projekt beenden könnte bevor man 3 andre anfängt 

Also alles neu und alles anders hier. 
Jede Anlage bekommt nen eignen PC mit Runtime, der 24/7 an ist. Die PCs und die SPS hängen im Firmennetz und damit ist alles 'gut'.
Dadurch, dass ich jetzt keine Daten mehr zwischenlagern muss geht mir ein großes Problem flöten und ich kann immer alles brav just in time lösen.
Bisher lasse ich mir alle Daten in einer CSV ausgeben wills aber in Excel haben (hab dazu hier schon mal irgendwo ein schönes HowTo gelesen mit dem ich mich ab jetzt mal auseinander setzen werde). 

Die Herrschaften haben allerdings noch eine Idee gehabt, die mir zwar keine wilden Kopfschmerzen bereitet, aber noch einiges an Nachforschung bedarf.

Wenn ich nun ein Excel dokument habe in das ich brav alle Anlagen ihre Daten Pumpen lasse und jemand will es sich ansehen, öffnet es und hat es offen wärend dann zufällig eine Anlage ihre Daten reinschreiben will.......was passiert? Gehen die Daten verschütt? wie aktualisiert der Betrachter seine Ansicht?

Meine idee, ich stick aus den csv oder auch xls daten ganz simpel ohne viel drum rum ein html wo es ja nen schönen F5 knopf gibt.
Ein IT-Mensch sagte mir, ich solle mich doch mal mit Datenbanken auseinander setzen, weil damit alles viel einfacher möglich ist (mehrere Betrachter und Bearbeiter, aktualisieren, sortieren ect.) Was ich nun hören bzw. lesen möchte ist ein 'ja datenbanken sind geiler, weil..........' oder ein 'nö Datenbanken sind doof, geht auch so einfach aus der Runtime aus auch gar nicht.'

Ich befass mich in der Zeit dann mal mit der Optik und dem Sammeln der Daten, denn wohin ich die nun ausgebe, wenn ich die einmal gesammelt habe, dürfte ja wenig Unterschied machen, wor allem wenn ich die schon in csv bzw. txt form habe. 

Vielen Dank nochmal bis hier hin. Der Rest ist in meinen AUgen Pipifax


----------



## Larry Laffer

Hallo,
wenn du die Datei von einem anderen Programm in Beschlag hast, so erhälst du normalerweise nur Lesezugriffe darauf - reinschreiben ist also nicht.

In der FAQ gibt es ein schönes Beispiel (von mir ) zu dem Thema "Daten -> Excel". Das hat allerdings einen Haken. Die Zugriffe auf Excel sind ganz schön langwierig. Willst du also öfter in schneller Folge Daten schreiben, so würde ich dir davon abraten.

Ob das beim Schreiben in eine Datenbank wesentlich besser ist will ich mal dahingestellt sein lassen. Dazu könnte aber *JesperMP* (z.B.) sicherlich mehr dazu sagen. 

Ob eine Datenbank für dich generell die bessere Lösung ist hat m.E. sehr mit der Aufgabe zu tun. Für deine Produktionsdaten-Chargen-Geschichte ist das nach meiner Meinung am Ziel vorbei. Für regelmäßig große Datenmengen ist das schon was Anderes.
Die Frage, die sich hier stellt ist allerdings :
Ist es nicht vielleicht sinniger, du schreibst deine aktuellen Daten wie gehabt in eine CSV-Datei - das belastet dann schonmal nicht die Visu über Gebühr - die CSV-Datei importierst du dann bei Bedarf in eine Datenbank (oder sonst wohin).

Die Daten würde ich generell nicht direkt auf dem Server erzeugen sondern immer lokal und dann diese lieber hin und wieder auf den Server kopieren. Dadurch lößt du dann auch das Problem mit dem "Öffnen von 2 Benutzern".

Gruß
LL


----------



## JoHo

Also zu allererst muss ich mich mal hier selber loben. Die Daten in HTML anzuzeigen und die HTML Datei auch noch hübsch aussehen zu lassen war ja mal echt kein Problem. Bei dieser Form der Darstellung entfällt ja auch das Problem des gleichzeitigen öffnens bzw. lesens und schreibens. Genial!


So zurück zu meiner Excel Sache. Von dem Gedanken der Datenbank habe ich mich jetzt erstmal gelöst, da ja meine Ideen auch in Excel gehen und ich da ja jetzt drinhäng.

Zum Thema öffnen, bearbeiten und mehrere Nutzer gleichzeitig habe ich mir was überlegt. Ich habe 5 Anlagen, die ca. 1-2 mal pro Stunde was schreiben sollen. Deshalb sollte es kein echtes Problem sein, die Daten direkt auf den Server zu schreiben. Für den Fall, dass eine Anlage schreibt und eine andre auch schreiben will setze ich mir einfach ein Bit in der SPS bevor das Dokument geöffnet wird und setze es zurück wenn ich sie schließe. Vor dem Schreiben das Bit abfragen und bei gesetztem Bit ne Sekunde warten und schon bin ich recht fein raus bild ich mir ein. 
Problem bleibt, wenn jemand die Datei von seinem Rechner aus auf dem Server direkt öffnet. Kann ich einem Excel-Dokument auch sagen, dass es von Usern bitte nur lesend geöffnet werden kann???
Und was noch wichtiger ist und echt ein Problem: Kann ich bei einigen Zellen vorher schon ein Format (z.B. Datum oder Zeit) festlegen???

Beispiel:
Bei der ersten Eingabe einer neuen Auftragsnummer in einem Monat soll das Gerät eine neue Datei mit Entsprechendem Namen anlegen. Soweit net schwer. Nur wenn es die Schon anlegt möge das Script auch direkt Überschriften reinknallen. Auch noch kein echtes Thema. Aber im selben Zug direkt einer Spalte sagen, dass da nun ein Datum reinkommt und es bitte nich versucen möge die Zahl als Zahl darzustellen?


Nächstes Problemchen:
Das ist jetzt einfach nur nice to have, aber nicht nötig. Ich schreibe mir eine HTML in der ich mit dateimodus 8 ja immer brav ne Zeile anhänge.
Diese hätte ich aber gern auf 50 Zeilen begrenzt, wobei ich die neueste Zeile immer oben anhänge und die älteste (bei voll) rauslösche. Idee: alles in nem for-loop auslesen, verschieben, einfügen, letzte löschen und gut. Aber gibts da nicht was andres? ich möchte ungern wieder alle Daten anfassen müssen dafür um sie neu zu ordnen.


----------



## Larry Laffer

JoHo schrieb:


> So zurück zu meiner Excel Sache. ... Zum Thema öffnen, bearbeiten und mehrere Nutzer gleichzeitig habe ich mir was überlegt. Ich habe 5 Anlagen, die ca. 1-2 mal pro Stunde was schreiben sollen. Deshalb sollte es kein echtes Problem sein, die Daten direkt auf den Server zu schreiben. Für den Fall, dass eine Anlage schreibt und eine andre auch schreiben will setze ich mir einfach ein Bit in der SPS bevor das Dokument geöffnet wird und setze es zurück wenn ich sie schließe. Vor dem Schreiben das Bit abfragen und bei gesetztem Bit ne Sekunde warten und schon bin ich recht fein raus bild ich mir ein.
> Problem bleibt, wenn jemand die Datei von seinem Rechner aus auf dem Server direkt öffnet. Kann ich einem Excel-Dokument auch sagen, dass es von Usern bitte nur lesend geöffnet werden kann???



Also dazu schon jetzt von mir ein ganz herzliches "Viel Spaß" ... 
Die gleiche Datei für mehrere Visu-PC's auf dem Server zu nehmen und die Zugriffe zu synchronisieren wird bestimmt ein Unterfangen mit Anforderungs-Charakter - aber bestimmt ist es machbar.
Allerdings - was machst du, wenn die Server-Verbindung mal nicht zur Verfügung steht ? Bei uns im Unternehmen kommt das aus unterschiedlichen Gründen schon mal vor ...
Des weiteren : Für die Dauer der Script-Bearbeitung ist deine Visu möglicherweise für Weiteres (auf jeden Fall aber für weitere Scripts) geblockt. Mach dir auch das bitte klar ...

Das mit dem "Read-Only-Zugriff" für andere User kann ich mir nicht vorstellen, da es von Excel kommt. Dazu habe ich aber leider keine weiteren Kenntnisse ... 



JoHo schrieb:


> Und was noch wichtiger ist und echt ein Problem: Kann ich bei einigen  Zellen vorher schon ein Format (z.B. Datum oder Zeit) festlegen???
> 
> Beispiel:
> Bei der ersten Eingabe einer neuen Auftragsnummer in einem Monat soll  das Gerät eine neue Datei mit Entsprechendem Namen anlegen. Soweit net  schwer. Nur wenn es die Schon anlegt möge das Script auch direkt  Überschriften reinknallen. Auch noch kein echtes Thema. Aber im selben  Zug direkt einer Spalte sagen, dass da nun ein Datum reinkommt und es  bitte nich versucen möge die Zahl als Zahl darzustellen?



Für ein öhnlich geartetes Unterfangen hatte ich mit einemm Vorlagen-Sheet gearbeitet. Ist die gwünschte Ziel-Datei noch nicht vorhanden, so lädt (und bearbeitet) die Visu die Vorlage und speichert diese unter einem neuen Namen ab. Vorteil hierbei : du kannst sicherlich die Formatierungen auch im Script und handisch machen - aber blickt da hinterher noch einer durch ?



JoHo schrieb:


> Nächstes Problemchen:
> Das ist jetzt einfach nur nice to have, aber nicht nötig. Ich schreibe  mir eine HTML in der ich mit dateimodus 8 ja immer brav ne Zeile  anhänge.
> Diese hätte ich aber gern auf 50 Zeilen begrenzt, wobei ich die neueste  Zeile immer oben anhänge und die älteste (bei voll) rauslösche. Idee:  alles in nem for-loop auslesen, verschieben, einfügen, letzte löschen  und gut. Aber gibts da nicht was andres? ich möchte ungern wieder alle  Daten anfassen müssen dafür um sie neu zu ordnen.



Da wirst du wohl nicht darum herum kommen, dass du erst alle Daten lädst und dann den veränderten Stand abspeicherst. Dafür gibt es keine interne Funktion (oder so). Das sehe ich aber auch nicht als problematsich an, denn das ist sehr viel einfacher zu programmieren, wie deine Synchronisierung ...

Gruß
LL


----------



## JoHo

Augenscheinlich hast du einen Punkt von mir icht zu 100% so verstanden wie ich das gemeint habe......
Also die Visu PCs sollen nicht alle wild auf meine Tabelle zugreifen. Die Tabelle ist mein "Datenendlager".
Nix lesen und nix weiteres. Einfach nur öffnen, Zeile schreiben und wieder freigeben. ENDE! ich unterstelle einfach mal, dass das nicht zu lange aufhalten sollte und auch kein echtes Problem mit der synchronisierung darstellt, oder lieg ich da ganz falsch?


----------



## Larry Laffer

... ich denke, ich habe genau verstanden was du machen willst ...


----------



## JoHo

Also Zellen vorformatieren is jetzt auch kein Ding. Man lernt ja nie aus!

Habs mir einfach gemacht und in Excel einfach mal ein Makro aufgezeichnet und von Hand die Zellen formatiert. Makro anzeigen lassen und siehe da....Die Befehle gehen auch in meinem Script


		Code:
	

Set wsExcel = wbExcel.Worksheets("Tabelle1")
  
 'Zellen formatieren
 wsExcel.Columns("G:G").NumberFormat = "d/m/yyyy;@"


Nur mal um die stumpfheit dieses Beispiels zu dokumentieren...


----------



## Larry Laffer

Larry Laffer schrieb:


> Für ein ähnlich geartetes Unterfangen hatte ich mit einemm Vorlagen-Sheet gearbeitet. Ist die gewünschte Ziel-Datei noch nicht vorhanden, so lädt (und bearbeitet) die Visu die Vorlage und speichert diese unter einem neuen Namen ab. Vorteil hierbei : du kannst sicherlich die Formatierungen auch im Script und handisch machen - aber blickt da hinterher noch einer durch ?


 
Hatte ich etwas davon gesagt, dass es nicht geht ?
Ich denke, dass du alle Excel-Eigenschaften im Script umsetzen kannst.
Heute muss eine Spalte im Date-Format sein. Morgen soll sie eine Spaltenbreite von 15 haben und der ganze Block einen Fett umrahmten Header, der hellblau ist mit anderer Schriftgröße und und und ...
Es sollte nur ein Vorschlag sein und jeder soll und darf natürlich auch seine eigenen Erfahrungen machen. Also los ...

Gruß
LL


----------



## Hausen

Mondmann schrieb:


> Bei Win flex kannst du Variablen archivieren und anschließend über ein VBS script diese in eine Tabelle schreiben, sortieren, etc.
> Ich schreibe Variablen meistens in eine SQL Datenbank (über eine Runtime) und Werte die dann über Excel aus.


 
Hallo Mondi,

könntest Du vielleicht mal posten wie Du das machst? Möchte soetwas auch gerne umsetzen, da man mit dem originalen Archiv am PC ja gar nichts anfangen kann.

Würde mich freuen 

Gruss Hausen


----------



## Mondmann

Hi Hausen,

wo müssen wir denn anfangen ? Was möchtest du gerne realisiert haben (Konzept?).

Mfg

Der Mondmann


----------



## Hausen

Hallo Mondmann,

also ich nutze zur Zeit die normale Archivierung von WinCC Flexible um Historische Trends auf einem MP377 anzuzeigen. Da man diese erzeugten Dateien jedoch außerhalb vom MP nur sehr schlecht auswerten bzw. benutzen kann, suche ich eine andere Lösung.

Ich habe bereits schon einen Script hier im Forum gefunden der die zur archivierenden Werte in eine "normale" gut lesbare csv-Datei schreibt.

1.) Was ich jedoch etwas negativ daran finde ist die doppelte Datenarchivierung. Einmal die normale interne WinCC Flexible um die Historischen Trends anzuzeigen und die zweite gut lesbare Form. 

2.) Ich denke das die performance da doch bestimmt gut leidet wenn ich zusätzlich noch ca. 20-30 Werte je sekunde in eine zweite Datei schreibe.

Was ich mir vorstellen würde ist, das ich z.B. ein oder zweimal am Tag die vorhandenen Archivdateien auslese und die Werte in eine csv-Datei schreibe die dann besser auswertbar ist.

Geht das überhaupt? Und wie müsste ich da ansetzten.

Herzlichen Dank schon mal für Deine/Euere Mühe.

Gruss Hausen


----------



## Benjamin

Hallo Mondmann,

egal wie es du drehst oder wendest, die Archivierung von Variablen in WinCC ist eine Krücke. Egal ob du die integrierte Funktion verwendest, oder es über ein Skript lösen willst. Wobei du mit dem Skript wahrscheinlich noch am weitesten kommst.
Ich weiss aber nicht, wie es bei einem Skript aussieht, wenn aktionen wie defekte oder gezogene Speicherkarte oder auch solche Sachen wie eine zu große Datei auftreten. Wenn du es schaffst die Daten jeden Tag auszulesen, dann kannst du es ja einmal ausprobieren.
Eine Sichere und gute Archivierung muss man leider extern vornehmen. 

Hier noch eine Link zur Siemens FAQ http://support.automation.siemens.com/WW/view/de/26190515
Beachte vor allem Abschnitt 2 zu den Systemgrenzen.

Gruß


----------



## JoHo

Mahlzeit zusammen,

da ich in der Suche nichts dazu gefunden habe erweitere ich meinen guten alten Thread einfach mal wieder ein bisschen....

Also ich habe ein Problem!

Und zwar ein Problem mit der Synchronisierung von meinen 5 Anlagen. Alle schreiben in EINE gemeinsame Excel Datei auf einem Server im Netz. Bevor eine Anlage das Dokument öffnet setzt sie ein Bit in der SPS und setzt dieses nach dem Schreiben wieder zurück, damit die nächste Anlage schreiben darf. Wenn Bit gesetzt warten alle, die schreiben wollen brav ab, bis das Bit weg ist. So weit ganz einfach.......eigentlich.

Jetzt das Problem:
zwischendurch scheint Ecxel zu sterben und in einer Instanz im Hintergrund offen zu bleiben und das Dokument in Beschlag zu nehmen. Das Bit wird dank "on error resume next" brav zurückgesetzt, aber Excel nicht geschlossen. Was zur Folge hat, dass der Benutzer der nächsen Anlage, die schreiben will, das schöne Fenster eingeblendet bekommt, welches ihn fragt wo er denn gerne speicher möchte.
Da es mehrere Dokumente gibt (eins zur Schichterfassung und eins zur Störerfassung) klickt der gute Anlagenführer (in dem Fall der gute alte Schlosser) einfach mal auf irgendwas. Damit wird dann z.B. die Störtabelle mit einem Einzeiler der Schichterfassung überschrieben.

Also was tun? Ich will das Fenster nicht eingeblendet bekommen, welches einen Fragt wo man hinspeichern kann. Ich will dass Excel immer und definitiv zu 100% geschlossen wird und ich will einen Button, der noch bestehende Instanzen von Excel killt.

Versteht mich jemand? Bzw. kann jemand helfen?


----------



## apachler

ist zwar schon ein alter thread aber der vollständigkeit halber hier die lösung:
http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW


----------

