[TwinCAT 3] Riesige Mengen Daten speichern/verwalten

naheliegend

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

meine SPS hat an einem Prüfstand die Aufgabe CM (Condition Monitoring) zu betreiben.

Während eines Prüfzyklus werden ungefähr 5 Mrd Daten erfasst. Diese möchte ich jetzt sinnvoll speichern.

Da dies mein erstes SPS Projekt ist, habe ich keine/kaum Erfahrung damit, wie ich das am besten umsetze.
Was würdet ihr vorschlagen?

Macht es Sinn eine Datenbank anzulegen? Funktioniert das mit SQL in TwinCat?
Oder einfach alles in ein Textdokument schreiben?

Viele Grüße und Danke :)
 
Prüfzyklus dauert wie lange?
Ich komme bei 4 Byte-Werten hier auf ~ 800 MByte an Daten. Und du schlaegst hier ernsthaft Text-Dateien vor?
Da kommt mir dann als Erstes der Gedanke das NICHT lokal wegzuspeichern.
Danach stellt sich mir die Frage was für ein Datendurchsatz du hast und was du mit den Daten hinterher anstellen willst.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
16.000 Werte / s ergibt in 90h ungefähr 5 Mrd Werte. Und zwar LREAL Werte. Das ergibt ungefähr 38 GB

Ja, natürlich extern speichern.

Kennt jemand eine Seite wo erklärt wird, wie man die Daten in einer Datenbank speichert?
 
Das macht man nicht unbedingt mit einer SPS. Nimm ein Realtime OS, Twincat IO und so etwas wie ZeroMQ um die Daten an Worker übers Netzwerk zu senden. Ein oder mehrere Worker bereitet die Daten auf und sendet dann die Daten and die Datenbank wie Postgresql, weil die auch NoSQL kann. Ich würde die Doubles komprimieren mit so etwas wie Klassifikation oder mach aus denen 32bit floats

Das ganze wird ist ein ausgewachsenes Projekt, dass mindestens braucht:

Diverse PC um die Daten einzusammeln
Server um die Worker zu fahren
2 Server um die Datenbank mit Failover zu fahren.
Die Notstromversorgung für die DB-Server sollte nicht fehlen
 
Zuletzt bearbeitet:
16.000 Inserts pro Sekunde in eine Datenbank speichern, da musst du schon ordentliche Geschütze auffahren um auf diese Werte zu kommen.

Wenn die Daten nicht auf dem System wo sie auch aufgezeichnet werden direkt ausgewertet werden sollen, ist das Speichern in einer reinen Text- bzw. Binärdatei das schnellste. Dann kannst du diese immer noch weiterverarbeiten und in eine Datenbank schieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da machst kein Condition Monitoring wenn die Daten als Textdateien gespeichert werden. Wenn die Chefetage einen zentralisierten Ansatz will, dann muss sie auch die Kosten für die Server tragen.
 
Ich habe doch geschrieben, die Datenaufzeichnung und Auswertung in dem Fall zu trennen, d.h. erst (schnell) aufzeichnen und anschließend (langsam) über ein externes Programm einlesen in die Datenbank eintragen. Dann ist das Problem schon relativ entspannt. Wenn es ausreichend ist, dass die Daten erst ein paar Minuten später zur Auswertung bereitstehen, würde ich das Problem so angehen.
 
... bei den Datenmengen fehlt mir die persönliche Erfahrung - das Projekt hört sich aber spannend an.
Prinzipiell: Datenbankserver: Je weniger Inserts du fährst desto performanter wird das Ganze. D.h. du müsstest hier alle paar 100 msec ein Insert wegschicken-> Nachteil wird dann das du dann in der Datenbank ein Binärstream hast für den Datenpunkt da dieser mehrer Messpunkte beinhaltet... Und das extrahieren somit etwas mühsamer wird.
Was mir deshalb in den Sinn käme: IoT. Über MqTT die Daten an einen Broker (z.B. Mosquitto) verschicken und dann innerhalb der IT-Welt den Rest erledigen... Die 16.000 Werte/Sekunde rauszuballern sollte nach meinem Verständnis prinzipiell möglich sein. So oder so wird dir aber kaum jemand zusagen ohne Tests das das ohne Probleme geht.

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe doch geschrieben, die Datenaufzeichnung und Auswertung in dem Fall zu trennen, d.h. erst (schnell) aufzeichnen und anschließend (langsam) über ein externes Programm einlesen in die Datenbank eintragen. Dann ist das Problem schon relativ entspannt. Wenn es ausreichend ist, dass die Daten erst ein paar Minuten später zur Auswertung bereitstehen, würde ich das Problem so angehen.

Selbst wen die Auswertung mit ein "paar" Minuten später erfolgen soll, bei den Datenmengen sind Textdateien nicht nur Platzverschwendung, sie behindern eine flexible Auswertung. Die DB-Server brauchst du dann trotzdem.

Also ich habe keine Probleme gehabt, 1000 Werte/sec in eine PostgresQL-DB mit jsonb-Tabelle zu schreiben. Die DB war auf einem normalen PC mit i7 installiert. Solange man genug Speicher für die DB konfiguriert (1Gb in meinem Fall), schreibt die das effizient weg. Das ganze lief dann mit einer Art Visualisierung auf dem selben PC. Da die jsonb-Tabelle NoSQL ist, kannst du dann auch die Datenfelder dynamisch konfigurieren und must die DB nicht statisch anlegen. Das sollte also kein Hinderniss sein.

Da das ganze bei dir etwas professioneller ausfallen muss, da die Produktion überwacht werden soll:

- Du brauchst zwei Server (z.B EPYC mit 8Cores) um Failover zu realisieren.
- Du musst dir Gedanken über eine Partitionierung der Daten machen. AKA wie lange sollen die Daten gelagert werden? Die DB kann das für dich machen. Wenn du das z.B. auf eine Woche begrenzen kannst, dann sind die Kosten für die Datenlagerung begrenzt. Entweder werden die alten Daten archiviert und aus der DB entfernt oder gleich gelöscht.
- Du kannst die Daten per ADS saugen, wenn der Zyklus nicht zu klein ist. Als Minimum würde ich 100ms annehmen, ansonsten nimmst du ein Realtime-OS. Ich habe zwar Daten im 50ms Zyklus mit Python von Omron-SPS geholt, aber der Jitter mit 2ms war schon heftig.
 
Zuletzt bearbeitet:
Bis dahin ist noch ein weiter weg. Ich werde eure Ratschläge berücksichtigen.

Mal ne andere Frage:

Wie speichere ich z.B. einen einfachen Array in einer Textdatei oder ähnliches? Gibt es da einen Befehl wie save(speicherpfad, Array) ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
bStart := TRUE;

fb_FileOpen(sNetId:='',sPathName:='C:\Users\Desktop\test.txt',nMode:=FOPEN_MODEWRITE,bExecute:=bStart);
fb_FileWrite(sNetId:='',hFile:=fb_FileOpen.hFile,pWriteBuff:=ADR(aArray),cbWriteLen:=SIZEOF(aArray),bExecute:=bStart);
fb_FileClose(sNetId:='',hFile:=fb_FileOpen.hFile,bExecute:=bStart);

Wieso schreibt der mir den Array nicht in meine txt Datei?
 
Ich sehe gerade ich bekomme eine Fehlermeldung von der FB_FileWrite:

Code:
[TABLE="width: 95%"]
[TR]
[TD="class: style2"]DeviceInvalidOffset[/TD]
[TD="class: style1"]
Invalid index offset. Error code: 1795(0x703).


[/TD]
[/TR]
[/TABLE]

Was auch immer das heißen mag?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vermutlich weil Du die Datei schon schließt bevor fb_FileWrite fertig ist.
Du brauchst eine Schrittkette und mußt die Statusmeldungen der fb_File... auswerten.

Ich ersetzte fb_FileWrite mit fb_FileOpen in der Antwort von Harald, dann stimmt die Antwort in Bezug auf Post #14

Guga
 
Die Bausteine (Alle drei!) haben ein busy-Flag. Erst wenn das wieder auf false ist, darf der nächste Baustein aufgerufen werden.
Ohne das wirds nicht recht funzen.
 
Zurück
Oben