WinCC flexible und Excel

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich will aus Flexible heraus auf eine Excel-Mappe zugreifen. Mit dem Button "Excel starten" wird Excel gestartet und die Tabelle1 geöffnet. Das klappt mit folgendem Code:

Code:
'Excel starten
Dim appExcel, wbExcel, wsExcel
Dim Verzeichnis, Datei
Verzeichnis = "D:\WinCC flexible Archivdateien\"
Datei = "Mappe1.xls"
Set appExcel = CreateObject("Excel.Application")
Set wbExcel = appExcel.workbooks.open(Verzeichnis + Datei)
Set wsExcel = wbExcel.worksheets("Tabelle1")
appExcel.application.visible = True

Durch Betätigung des Button "Excel beenden" kann ich mittlerweile die Excel-Mappe schließen und Excel beenden. Ich habe die Anregung aus einem Beispiel von Volker entnommen:

Code:
'Excel beenden
Dim appExcel, wbExcel, wsExcel
Dim Verzeichnis, Datei
Verzeichnis = "D:\WinCC flexible Archivdateien\"
Datei = "Mappe1.xls"
Set appExcel = GetObject(, "Excel.Application")
Set wbExcel = appExcel.ActiveWorkbook
Set wsExcel = wbExcel.worksheets("Tabelle1")
appExcel.application.visible = True
'Dialog zum Abspeichern der Excel-Mappe
appExcel.DisplayAlerts=False  'Meldungen unterdrücken
wbExcel.close
appExcel.quit
appExcel.DisplayAlerts=True   'Meldungen wieder aktivieren
'Freigeben der Excel-Mappe, Freigen des Speichers
Set wsExcel = Nothing
Set wbExcel = Nothing
Set appExcel = Nothing

Nun möchte ich den sich ständig ändernden Drehzahlwert (MW20) von Flexible aus in die geöffnete Excel-Mappe schreiben. Da fehlt mir die Idee.
Die Messwertaufzeichnung soll bei Betätigung eines weiteren Button ("Aufzeichnung starten") beginnen. Dabei sollen die Messwerte nach Möglichkeit direkt in die geöffnete Excel-Mappe geschrieben werden, und zwar untereinander fortlaufend in einer Spalte. Dazu bräuchte ich eine statische Lokalvariable oder eine globale Variable. Gibt es einen der beiden Typen in der Script-Umgebung von Flexible.
In VB.Net würde ich bei Betätigung des Buttons "Aufzeichnung starten" einen Timer einschalten und dann in der Timer-Prozedur den Schreibvorgang in die Excel-Mappe programmieren.
Hat jemand eine Idee, wie ich mein Problem lösen könnte.


Gruß
Earny
 
Zuletzt bearbeitet:
Hallo,
natürlich gibt es die Möglichkeit, die Anwendung offen zu halten. Ich muß dir allerdings gestehen, dass das nicht so ohne ist. Da du Excel als COM-Objekt benutzt dauern Zugriffe darauf u.U. ziemlich lange.

Ich hatte so etwas aber mal gemacht. Dabei ist GetObject der richtige Weg. Du musst dir in der Visu nur merkern (in einer Visu-internen Variablen), dass du Excel schon geöffnet hast. Ansonsten erzeugst du jede Menge neue Instanzen davon. Wenn du die Visu dann beendest musst du in einem Exit-Script dann dein Workbook schliessen und Excel beenden ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, das hört sich sehr interessant an. Ich würde mich gerne in dieses Thema einarbeiten. Habt Ihr ein paar Stichwörter wie ich beginnen könnte?

Stichwort getobject, Scripte usw
 
Hallo Larry,

danke für die Anregung. Ich habe das umgesetzt und es funktioniert auch.
Ich habe in Flexible 4 Button zum Steuern der Aufzeichnung in Excel:
Ich habe bisher keine Absicherung gegen Fehlbedienungen, d.h. Betätigung der Buttons in der falschen Reihenfolge.

Button "Excel starten"
Code:
'Excel starten
Dim appExcel, wbExcel, wsExcel
Dim Verzeichnis, Datei
Verzeichnis = "D:\WinCC flexible Archivdateien\"
Datei = "Mappe1.xls"
Set appExcel = CreateObject("Excel.Application")
Set wbExcel = appExcel.workbooks.open(Verzeichnis + Datei)
Set wsExcel = wbExcel.worksheets("Tabelle1")
'appExcel.application.visible = True

Button "Aufzeichnung starten"
Code:
'Aufzeichnung starten
SmartTags("AufzeichnungEin") = True
SmartTags("Zeilenindex") = 0

Button "Aufzeichnung stoppen"
Code:
'Aufzeichnung stoppen
SmartTags("AufzeichnungEin") = False

Button "Excel beenden"
Code:
'Excel beenden
Dim appExcel, wbExcel, wsExcel
Dim Verzeichnis, Datei
Verzeichnis = "D:\WinCC flexible Archivdateien\"
Datei = "Mappe1.xls"
Set appExcel = GetObject(, "Excel.Application")
Set wbExcel = appExcel.ActiveWorkbook
Set wsExcel = wbExcel.worksheets("Tabelle1")
'appExcel.application.visible = True
'Dialog zum Abspeichern der Excel-Mappe
'appExcel.DisplayAlerts = False  'Meldungen unterdrücken
wbExcel.close
appExcel.quit
'appExcel.DisplayAlerts = True   'Meldungen wieder aktivieren
'Freigeben der Excel-Mappe, Freigeben des Speichers
Set wsExcel = Nothing
Set wbExcel = Nothing
Set appExcel = Nothing

Code:
'Aufzeichnen
If SmartTags("AufzeichnungEin") = True Then
    Dim appExcel, wbExcel, wsExcel
    Dim Verzeichnis, Datei
    Zeilenindex = Zeilenindex + 1
    Verzeichnis = "D:\WinCC flexible Archivdateien\"
    Datei = "Mappe1.xls"
    Set appExcel = GetObject(, "Excel.Application")
    Set wbExcel = appExcel.ActiveWorkbook
    Set wsExcel = wbExcel.worksheets("Tabelle1")
    'appExcel.application.visible = True
    'Messwerte mit Zeitstempel in Excel-Tabelle schreiben
    wsExcel.cells(Zeilenindex,1) = SmartTags("Drehzahl")
    wsExcel.cells(Zeilenindex,2) = Now
Else
    Exit Sub
End If


Das Ganze hat aber auch strukturelle Schwächen:

1. Die Aufzeichnungsfrequenz darf nicht zu hoch gewählt werden. 100 ms geht auf meinem Rechner nicht. Selbst bei 500 ms kommt es gelegentlich zu Aussetzern. Erst ab 1 s werden dann alle Messwerte aufgezeichnet. Ich habe allerdings nicht sehr lange getestet.

2. Ich muss mit dem Erfassungszyklus der Variable "Drehzahl" aufzeichnen. Habe ich einen Erfassungszyklus von 100 ms, so versucht Flexible mit 10 Hz in die Excel-Mappe zu schreiben - was es nicht schafft.
Es scheint nicht möglich zu sein, eine zweite Variable "Drehzahl_5s" dem Speicher MW20 zuzuordnen. Das lässt wohl Flexible nicht zu. Es ist mir bisher nicht gelungen "Drehzahl_5s" aufzuzeichnen. Es gibt aber auch keine Fehlermeldung.

Möglicherweise ist das Schreiben in eine csv-Datei, die dann später mit Excel geöffnet und bearbeitet wird, doch der bessere Weg.
Der Zugriff von Flexible auf Excel über COM scheint doch recht langsam zu sein.
Bemerkung: Beim Zugriff von VB.Net auf Excel habe ich ähnliche Erfahrungen gemacht. Auch hier ist es mir bisher nicht gelungen alle 100 ms einen Messwert in eine Excel-Tabelle mit Hilfe des COM zu schreiben.


Gruß
Earny
 
Hallo Earny,
das ist das, was ich meinte.
Für eine niedrige Aufzeichnungs-Frequenz ist das direkte Schreiben nach Excel schon OK - bei einer "hohen" Frequenz kannst du das vergessen. Ich persönlich hatte Schwierigkeiten mit Allem, was schneller als "alle 2 Sekunden" war - nicht immer aber immer öfter ...
Irgendwann wird dann die Ausführung der Scripte sogar abgelehnt, weil der Aufgaben-Puffer voll ist ...

Die CSV-Datei ist da tatsächlich die bessere Lösung.
Viel Erfolg

Gruß
Larry
 
Zurück
Oben