TwinCat3 Messdatenwiedergabe

Snake05

Level-1
Beiträge
1
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag allerseits,
ich habe eine recht allgemeine Frage zur TwinCat3 Programmierung, mit der ich mich schon eine Zeit lang herumärgere und bei meiner Onlinerecherche schon auf einige Sackgassen gestoßen bin. Vielleicht hat hier ja noch jemand einen heißen Tipp für mich:).

Ich möchte meinen TwinCat3-Aufbau gerne nutzen, um vorher aufgezeichnete Messdaten auf den analogen Ausgängen bereitzustellen. In einem ersten einfachen Test habe ich die Daten eines Kanals in einem Array abgelegt, welches ich dann zyklisch durchlaufe und den jeweiligen Eintrag auf den analogen Ausgang schreibe. Soweit so gut.

Jetzt möchte ich das ganze aber skalieren und längere Datenreihen auf die Ausgänge bringen. Konkret geht es um etwa 5.000.000 Einträge, sodass ich bei einer Abtastrate von 1ms etwa 83 Minuten lang ein Signal auf dem Ausgang habe. Am liebsten würde ich sogar noch deutlich darüber hinaus gehen.

Ich hatte erwartet, dass es dafür eine sehr einfache Lösung gibt, da die Aufgabe aus meiner Sicht recht simpel klingt und ich wohl kaum der erste bin, der das versucht. Dennoch gestaltet es sich schwerer als gedacht.

Offensichtlich kann ich einen Array dieser länge nicht einfach erstellen, da bereits die Eingabe der Werte zum Einfrieren von Visual Studio führt.

Alternativ habe ich bereits versucht, die Daten in einer CSV-Datei abzulegen und in jedem Programmdurchlauf nur eine Zeile zu lesen. Allerdings ist das wohl so auch nicht möglich, da die Funktion zum Einlesen von CSV-Dateien normalerweise komplette Dateien einliest und ich damit wieder den Wertebereich der vorher zu initialisieren Arrays sprenge.

Ist es tatsächlich so, dass das so nicht funktioniert, oder hat hier noch jemand einen guten Tipp, oder kann mir sagen, mit welcher Funktion ich ggf. weiterkomme?

Viele Grüße und vielen Dank für jeden Ratschlag.

Snake05
 
Die max mögliche Datengröße ist in vom Betriebssystem und RAM abhängig.
x-Megabyte (ein analoger Datensatz bei dir sind ca 10 MByte) im Projekt vorab zu definieren ist aber ein seltsamer Ansatz.
Normalerweise definiert man das in der Datei und liest diese "häppchenweise" aus. Allerdings - die Happen dürfen nicht zu klein sein da ein Dateizugriff immer relativ lange dauert. Wenn du den ReadFile-Baustein aufrufst wird der Happen über die Länge des Datenpuffers definiert. Rufst du diesen Baustein (mit dem gleichen Handle natürlich) mehrfach auf dann bekommst du die Daten nacheinander geliefert.
Ich würde somit in einer nieder prioren Task die Datei happenweise einlesen und im Anschluß daran die Werte aufbereiten und sie in einen Puffer zwischenhalten von wo aus sie dann auf deine Ausgänge gehen. D.h. du brauchst einen zwischenpfuffer und irgendwann eine Memcpy.
Die Datei en block einzulesen würde einen riesigen Routerspeicher erfordern (>= der Dateilänge).

Guga
 
Zurück
Oben