TIA zügige Prozessdatenspeicherung

Holzmichl

Well-known member
Beiträge
100
Punkte Reaktionen
26
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo ZottelMD,

jetzt mal ne Idee extrem "Quick'n'dirty".
Mache deine Messung und speichere alle Messergebnisse in einen DB.
Gehe mit TIA online auf den DB und drücke "Momentaufnahme".
Dann gehe offline und markiere mit der Maus alle Zellen durch Klicken auf das Kästchen links oben.
Strg-C, dann in eine offene Excel-Tabelle und Strg-V.
==> alle Werte in Excel
 
OP
Z

ZottelMD

Well-known member
Beiträge
65
Punkte Reaktionen
1
Hallo ZottelMD,

jetzt mal ne Idee extrem "Quick'n'dirty".
Mache deine Messung und speichere alle Messergebnisse in einen DB.
Gehe mit TIA online auf den DB und drücke "Momentaufnahme".
Dann gehe offline und markiere mit der Maus alle Zellen durch Klicken auf das Kästchen links oben.
Strg-C, dann in eine offene Excel-Tabelle und Strg-V.
==> alle Werte in Excel
Huhu,

hehehe, das ist wirklich quick'n'dirty =D Ich probiere es gerade aus, nur um es mal so gemacht zu haben (mit snapshot hab ich noch nie gearbeitet). Wenn ich das richtig sehe, hab ich erfolgreich die Momentaufnahme gemacht (extra Spalte hinzugekommen), bin offline gegangen, aber kann nirgends ein Kästchen finden, dass mir mehr als eine Zeile markiert:

1622191405979.png

Aber für debugging zwekce st das gut. Habe glaube bisher immer direkt online mit copy und paste gearbeitet und dann konnte man auch immer nur die Zeilen kopieren, die im Bildschirmausschnitt gerade sichtbar waren. Nicht sichtbare aber zugehörige EInträge wurden nie mitkopiert. Falls du mit kleines Kästchen das kleine Viereck links von "mwArray" meinst, das markiert bei mir nur dieeine Zeile mwArray ^^

Abgesehen davon, die Lösung ist etwas zu dirty, weil ich, wenn ich die Arbeit abgebe sehr schlecht verkaufen kann, dass der Benutzer, um eine Leistungsmessung durchzuführen auf dem Rechner TIA starten muss, sich durchklicken muss und dann seine eigenen, noch unverarbeiteten Werte herauskopieren soll. Ich muss da schon zusehen, dass man das relativ vernünftig übergibt. Ich hoffe ja, dass ich mein UDT-Array vernünftig in WinCC RT / VBS reinbekomme und dann nach der Messsung gemütlich die Einträge aus dem UDT-Array umrechnen kann und in die SQL Datenbank einfügen kann. Krieg ich das nicht hin, werd ich wohlmöglich DataLogs auf dem PLC Flashspeicher schreiben müssen, die der Benutzer sich über den Webbrowser abholt, oder man greif die FTP-Geschichte auf, womit ich 0 Erfahrung habe. Ich denke in der Reihenfolge probier ich es.
Hat jemand von euch schon Erfahrung mit Array of UDT in VBS einlesen und auseinander zu klamüsern? Kann ich im IPC das gesamte Array als eine Variable übergeben, so dass dem IPC, dann alle Inhalte bekannt sind a la "mwArray[]" (ohne Indexangabe)?
 
OP
Z

ZottelMD

Well-known member
Beiträge
65
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
Ich finde keine Kombination, in der ich das Gesamte Array of UDT in den IPC übergeben kann:
1622193083462.png
Das ist schlecht, das würde bedeutet, ich müsste den Inhalt von mwArray nach und nach, Zeile für Zeile an den IPC schicken und dann hab ich jedesmal das Problem/die Verzögerung um den Erfassungszyklus der Variable.
Z. B. wenn die Variable auf 500 ms Erfassungszyklus steht und ich Zeile für Zeile 1000 Zeilen übergeben muss, dann muss man 500 Sekunden warten, eh das gesamte Array in die SQL Datenbank geschrieben wurde. Das ist Mist
 

JSEngineering

Well-known member
Beiträge
908
Punkte Reaktionen
198
Bin mir nicht sicher, aber ich glaube, Du mußt den UDT im HMI nochmal anlegen, weil der den Datentyp aus der SPS nicht kennt.
Danach müßtest Du den dann theoretisch auch als Array anlegen können.
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.246
Punkte Reaktionen
3.296
In TIA gibt es einen Baustein "RecipeExport" aus der Standard Library. Mit dem kann man einen ganzen DB in eine CSV exportieren, die dann auf der Memory Card der SPS liegt und dort ebenfalls per Web-Browser abgeholt werden kann.
Du könntets also also alle deine Daten in einem DB sammeln (Je Messpunkt X Daten in X Spalten in einer UDT). Am Ende exportiertst du die Messung auf die SD-Card. Das ist dann nur ein Schreib-Vorgang dorthin.
 

JSEngineering

Well-known member
Beiträge
908
Punkte Reaktionen
198
Zuviel Werbung?
->Hier kostenlos registrieren
Außerdem fragt er ja nicht die Variablen seriell ab. Sondern pro Erfassungszyklus alle.
Du müßtest im Extremfalle (was im Hintergrund eigentlich bei einem Array auch geschieht) manuell 1000 Variablen anlegen.
Hier stellt sich die Frage: Wie viele Powertags hast Du eigentlich in Deiner Lizenz?
 
OP
Z

ZottelMD

Well-known member
Beiträge
65
Punkte Reaktionen
1
Außerdem fragt er ja nicht die Variablen seriell ab. Sondern pro Erfassungszyklus alle.
Du müßtest im Extremfalle (was im Hintergrund eigentlich bei einem Array auch geschieht) manuell 1000 Variablen anlegen.
Hier stellt sich die Frage: Wie viele Powertags hast Du eigentlich in Deiner Lizenz?
nur 128 ^^
 

JSEngineering

Well-known member
Beiträge
908
Punkte Reaktionen
198
Dann könnte man es noch über Multiplexen versuchen, aber dann kannst Du tatsächlich zur Zeit nur einen Datensatz abholen.
Dann schon eher die Lösung von Ralle.
 
OP
Z

ZottelMD

Well-known member
Beiträge
65
Punkte Reaktionen
1
Zuviel Werbung?
->Hier kostenlos registrieren
In TIA gibt es einen Baustein "RecipeExport" aus der Standard Library. Mit dem kann man einen ganzen DB in eine CSV exportieren, die dann auf der Memory Card der SPS liegt und dort ebenfalls per Web-Browser abgeholt werden kann.
Du könntets also also alle deine Daten in einem DB sammeln (Je Messpunkt X Daten in X Spalten in einer UDT). Am Ende exportiertst du die Messung auf die SD-Card. Das ist dann nur ein Schreib-Vorgang dorthin.
Das klingt doch sportlich und attraktiv, ... wenn ich da richtig verstehe.

Die Frage ist nur wie Handhabe ich das mit einem Array of UDT genau?
Tendenziell will ich gern irgendwann mal entweder in SQL oder in einer CSV eine Tabelle haben vom dem Style:
1622194805946.png
Das ist ein Bildschirm ausschnitt aus meiner Test-Tabelle in MS SQL, die via VBScript erstellt und gefüllt wird. Nach den ganzen hinweisen hier und woanders, würd ich gern haben:
Zeit | M Ax1 | n Ax1 | M DMW1 | n DMW1 | M Ax2 | ... | n DMW2
-> insgesamt 9 Spalten
Darauf hin hatte ich mir ja einen UDT angelegt, der quasi, wenn er auch als Struktur nicht so aussieht, jeweils eine Zeile aus dieser Tabelle repräsentiert. Das war der Variablen Typ "measRow":
1622194993547.png
Also jeweils eine Struktur mit den meistens unverarbeiteten Rohdaten, um Datenmenge einzusparen.
Daraus habe ich jetzt ein Array mit 101 Zeilen gemacht, was ich, tendenziell aber viel größer machen müsste, wenn das debuging vorrüber ist. Also schätzungsweise ein " Array [0..999] of measRow ", mit dem ich im Grund die maximale Anzahl von Messpunkten vorgebe, nämlich 1000. Eine Messung wird mal nicht so lange dauern, dann ist eben nur das halbe Array gefüllt. Eine wird mal gut lange dauern, dann ist vielleicht das Array kurz vor voll:
1622195428167.png
Dieses Array habe ich global, aber noch nicht isoliert/alleine in einem DB, angelegt.

OK, ich hätte null Problem damit, dass in einen extra DB anzulegen, um die Rezeptmethode auszuprobieren. Aber das
Du könntets also also alle deine Daten in einem DB sammeln (Je Messpunkt X Daten in X Spalten in einer UDT). Am Ende exportiertst du die Messung auf die SD-Card. Das ist dann nur ein Schreib-Vorgang dorthin.
kann ich mir gerade noch nicht ausreichend vorstellen, um das jetzt auf meine vorhandenen Variablen anzuwenden.

Ich brauch das nochmal kurz an meinem Beispiel erläutert ^^

Auf jeden Fall gefällt mir der Gedanke, nachträglich, nach einer Messwertaufzeichnung, einen solchen Rezept-Befehl auszuführen und dann als CSV vorliegen zu haben. Wenn in der CSV meine gewünschte Tabellenstruktur realisierbar ist, bin ich voll dabei ^^ Dann hab ich zwar über ne Woche mit Datenbanken und VBS verplämpert, aber hätte eine gute Schnittstelle für den Benutzer. Zusammen mit einer Anweisung, die Daten müssen aus dem Webserver abgeholt werden, um den Flashspeicher nicht zu zumüllen, kann ich das akzeptieren.
 
OP
Z

ZottelMD

Well-known member
Beiträge
65
Punkte Reaktionen
1
......
OK, ich hätte null Problem damit, dass in einen extra DB anzulegen, um die Rezeptmethode auszuprobieren. Aber das

kann ich mir gerade noch nicht ausreichend vorstellen, um das jetzt auf meine vorhandenen Variablen anzuwenden.

Ich brauch das nochmal kurz an meinem Beispiel erläutert ^^

Auf jeden Fall gefällt mir der Gedanke, nachträglich, nach einer Messwertaufzeichnung, einen solchen Rezept-Befehl auszuführen und dann als CSV vorliegen zu haben. Wenn in der CSV meine gewünschte Tabellenstruktur realisierbar ist, bin ich voll dabei ^^ Dann hab ich zwar über ne Woche mit Datenbanken und VBS verplämpert, aber hätte eine gute Schnittstelle für den Benutzer. Zusammen mit einer Anweisung, die Daten müssen aus dem Webserver abgeholt werden, um den Flashspeicher nicht zu zumüllen, kann ich das akzeptieren.

Die Frage mit der zusätzlichen Erläuterung streiche ich. In der TIA Hilfe zum Recipe Export Baustein gibts nen kleinen Link zur Struktur eines solchen Rezepts. Ich denke das deckt sich mit meiner. Nur eben als wirkliche Struktur angelegt und nicht als UDT

1622196632953.png

Es bleibt afaik das Problem mit den 5 kB ^^. Irgendwelche Vorschläge ?
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.246
Punkte Reaktionen
3.296
Zuviel Werbung?
->Hier kostenlos registrieren
ok, ganz kurz:

Ein DB der so aussieht:

Bildschirmfoto 2021-05-28 um 12.08.55.jpg

wird so als csv abgespeichert:
Bildschirmfoto 2021-05-28 um 12.10.55.jpg

wenn man aufruft:

Code:
#sfbExportConfigToCSV(REQ       := #stRequest.bExportConfig,
                              RECIPE_DB := #IO_dbRecipeConfig.aProperty);

D.h. nur der Teil aProperty aus dem DB wird abgespeichert.
Wie das mit unterschiedlichen Formaten ist, aknn ich dir aber nicht auf die Schnelle sagen, probiers aus, es sind ja nur wenige Zeilen Code.
 

Holzmichl

Well-known member
Beiträge
100
Punkte Reaktionen
26
So, jetzt noch ein letzter Ansatzpunkt:

OPC UA Client Library für Microsoft Excel​


Wenn Du Erfahrung oder Kenntnisse in VBS bzw VBA hast, kannst Du dir die Werte auch über den vorhandenen OPC-Server deiner Runtime abholen.
Bei WinCC RT Advanced kannst du unter 'Runtime-Einstellungen' -> 'Dienste' -> 'Variablen lesen/schreiben' einen Haken setzen bei 'Als OPC-Server arbeiten' und den Button 'OPC UA Server' anwählen.
 
OP
Z

ZottelMD

Well-known member
Beiträge
65
Punkte Reaktionen
1
So, jetzt noch ein letzter Ansatzpunkt:

OPC UA Client Library für Microsoft Excel​


Wenn Du Erfahrung oder Kenntnisse in VBS bzw VBA hast, kannst Du dir die Werte auch über den vorhandenen OPC-Server deiner Runtime abholen.
Bei WinCC RT Advanced kannst du unter 'Runtime-Einstellungen' -> 'Dienste' -> 'Variablen lesen/schreiben' einen Haken setzen bei 'Als OPC-Server arbeiten' und den Button 'OPC UA Server' anwählen.
Auf jeden Fall guter Ansatz. Hab ich bei meinen Recherchen auch schon mehrfach gelesen.. kann nur noch nicht einordnen, ob ich das gut hinbekommen würde.
Theoretisch hab ich in VBS/VBA nahe 0 Erfahrung. Ich hab mich n bisschen belesen und hab realisiert, dass ich die Mittelwerte aus Messmodus 1 (siehe Eingangspost), die einen hohen zeitlichen Abstand haben in eine SQL Datenbank loggen.
Ich mache also bislang alles immer nur nach und erfinde nix neues (in Anbetracht der Zeit).

Also Fakt ist, dass ich nach JS erst mal alles in einem Array of UDT speichere und am Ende der jeweiligen Messung dann das mehr oder weniger gefüllte Array mit den vielen Prozessdaten irgendwie gekonnt rausschaufeln muss.
Bei der bisherigen Rausschaufelei via VBS(IPC) und SQL Datenbank stoß ich an die Grenzen, weil Arrays scheinbar nur Zeile für Zeile in den IPC übertragen kann. Es würde zu lange dauern, den Job abzuarbeiten. Jemand schrieb in einem Forum, dass man aus dem Array of UDT wieder ein UDT machen soll und es dann ins HMI als ein Tag laden könnte, aber das hab ich noch nicht gelesen/erfahren, ob das funktioniert und man dann auf alle Inhalte in den UDTs zugreifen kann.
Als heißeste Alternative klingt die Möglichkeit mit Reciepe-Export. Da muss ich nur dafür sorgen, dass mein Messwert Array of UDT in die notwendige Struktur gequetscht wird, die für den Export-Baustein notwendig ist. Ralle sagt ja, er schreibt da mehrere MB mit einmal. Insofern klingt das ultra attraktiv, für meine Aufgabe
Die Alternative mit OPC UA, sich da einzuarbeiten, mag funktionieren, aber hab ich dann nicht wieder den Flaschenhals VBScript? Jede Variable, die man im VBScript lädt muss ja entweder innerhalb des Erfassungszyklus (HMI-Variable) aktualisiert werden (== laaaaaaaangsaaaaaam) oder wenn die OPC UA Geschichte anders funktioniert, dann steigt dadurch doch die Kommunikationslast erheblich oder ?
 

JSEngineering

Well-known member
Beiträge
908
Punkte Reaktionen
198
Daaaaaas glaub ich dir. Aber mich verwirrt das, weil in der Hilfe steht, dass ein Datensatz nicht über 5000 Byte sein darf. Ich probier es mal.
Genau so, beachte bitte die Worte: Ein Datensatz darf 5kByte groß sein.
Ein Datensatz ist bei Dir eine Zeile!
Also um bei der Methode zu bleiben: Ein einzelnes Rezept darf 5kByte nicht überschreiten. Aber Du kannst beliebig viele Rezepte/Datensätze speichern.
Ebenso für den Header...
Der baut sich vermutlich eine Zeile für das Wegschreiben zusammen, und diese Zeile darf 5kByte nicht überschreiten, also 5000 Zeichen. Weggeschrieben. Fertig. Nächste Zeile. Wieder max. 5000 Byte.
 
Oben