Datenlogger

bBrice.Youemto

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

ich bin Anfänger in der SPS-Programmierung und beantrage ich Ihre Unterstützung.

Ich lese 200 SPS-Werte ein und speichere diese in eine Array (stSPSDaten : ARRAY [0..200] OF ST_SPSDaten)
Dann schreibe die 200 Werte in meine Datenbank.

Das Problem ist folgendes: Das Schreibprozess in der Datenbank ist langsamer als das Zwischenspeichern meiner SPS-werte im Array.
Also verliere ich Daten. Denn während das Schreibprozess in die Datenbank noch ausgeführt wird, ist schon das Array schon 2 mal ausgefüllt.

Wie kann ich bitte das lösen?

Vielen Dank im Voraus
Brice
 
Ketzerisch gesprochen: Mit schnellerer HW.

Ansonsten: Mehr Infos.
Deine Beschreibung liest sich nämlich wie folgt: Hilfe: mein Auto fährt zu langsam.
Und die somit mögliche Antworten: Schalte in den höheren Gang, kauf dir ein schnelleres Auto, tritt aufs Gas...

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Guga,

ich programmiere mit TwinCAT ein Datenlogger. Mein SPS Programmcode läuft auf eine CX9020-Steuerung. Mein Programmcode holt Messwerte der SPS ab. Diese Messwerte werden in Gruppe von 200 Datensätze gesammelt und mit Hilfe von TwinCAT Database Server in MySQL geschrieben. Die ersten 200 Messwerte werden in einem Array gesammelt und in die MySQL-Datenbank ordnungsgemäß geschrieben. Inzwischen generiert die SPS immer Messwerte, die weiterhin im Array gespeichert sind. Das Array wird von 0 bis 199 ausgefüllt und ein neues Füllprozess beginnt (So verliere ich Daten). Gleichzeitig ist das Schreiben der Messwerte in die Datenbank noch nicht fertig. Wenn ich die zweite Gruppe von 200 Messwerte holen möchte, das fängt bei 234 . Das heißt ich habe 34 Daten Verloren. Ich habe gelesen, dass ich das Problem mit FIFO lösen kann. Aber wie? Könnt Ihr mir bitte helfen
Vielen dAnk
 
Wie kommen die 200 Messwerte zusammen? Ist das EIN Sensor/Sensorgruppe, wo du erst 200 Datensätze sammelst und dann wegschreiben willst, oder sind das 200 Datensätze, die in jedem Zyklus anfallen?
Im ersten Fall lohnt es sich, hier mal nachzulesen.
Im zweiten Fall sollte man sich über potentere Hardware Gedanken machen und mit der AutoLog-Funktion des TC DatabaseServers arbeiten.

Gruß, Jens
 
Ich denke mal das der Zeitbedarf für das Schreiben nicht proportional zur Datenmenge steigt. Hast Du schon mal versucht Dein Array auf 400 oder 600 Werte zu erhöhen?

Von irgendwas mit Internetzugang gesendet
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einfach das array vergrößern kann im ersten Moment helfen. Wenn aber im Laufe der Zeit der Datenbankserver langsamer wird oder das Netzwerk mal etwas hakt, hat man das gleiche Problem wieder.
Ein ausreichend großer FIFO-Buffer ist da die bessere Lösung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

komisch, was ist denn hier im SPS Forum los? Nur noch SQL DB Einträge?

Zu deinem Thema:

Wenn du sehr viel Datensätze bzw. Messwerte hast würde ich dir (wie ich eben in einem anderen Thread angemerkt habe) einen Bulkinsert empfehlen und nicht die Autolog Fkt von TC.
Das Problem liegt hier weniger an der Datenmenge, sondern an der Zeit der Insert benötigt. TC schickt Daten an den DB Server, der vermittelt diese per ODBC (oder was auch immer) an den SQL der insert dann wieder Rückmeldung alles OK usw... da geht Zeit ins Land. Das wirst du auch nicht so einfach ändern können. Was aber geht ist auf einen Rutsch x Datensätze zu übertragen bzw. ein Insert auszuführen.


Du kannst dann im Prinzip so viele Datensätze auf einfach in die DB übertragen wie du möchtest. Nur die Grenze von 10000 Zeichen ist limitierend. Wenn es sich aber nur um einen Messwert und evtl. noch einen Zeitstempel handelt bekommst du da locker 200 Datensätze auf einfach übertragen in wenigen ms.

Das sollte das Problem lösen.
 
Wenn deine DB json Spalten anbietet, wie Postgresql es macht, ist das kein Problem. Du setzt den Speicher von postgresql auf 1GB und machst eine Tabelle, die als Key einen Timestamp und eine UUID als key hat und machst dann eine Spalte mit dem Typ jsonb. Der UUID ist besser als ein Integer, wenn es um den Export/Import geht. Das Einfügen des Timestamps und des UUID kann die DB für dich machen.

Die json Spalte, nimmt JSON arrays und dicts ohne Probleme. Ich schrieb den Kram in Python für eine Omron SPS mit der gleichen Datenmenge, wie du sie hast. Das lief dann alles auf einem Laptop mit i5 CPU
 
Hallo,

konntest Du Dein Problem lösen?

Ich hatte vor ein paar Jahren die Aufgabe, eine Messmaschine zu programmieren (CODESYS2-Steuerung, Kuka-Roboter hat Schleifversuche durchgeführt, die Daten mussten in eine Datenbank gespeichert werden).

Die Aufgabenstellung konnte mit einem FIFO-Buffer gelöst werden. Ein schneller Task hat die Daten (zyklisch) aufgezeichnet, ein langsamerer Task hat möglichst viele der Datensätze auf einmal aus dem FIFO abgeholt und in die Datenbank gespeichert. Mit diesem Ansatz war es nur noch eine Konfigurationsfrage des FIFOs, damit dieses nicht voll läuft.
 
Zurück
Oben