19.07.2010, 09:36
Moin moin,
derzeit bin ich damit beschäftigt, unseren Temperaturlogger neu zu programmieren. Dazu habe ich eine Server-Anwendung erstellt, die von der Hardware einmal pro Minute die 16 Kanäle abfragt und in einer CSV-Datei abspeichert. Die Clients melden sich beim Start beim Server an und erhalten dann ebenfalls einmal pro Minute die Messwerte (vom Server, nicht von der Hardware). Allerdings sollen die letzten 5 Tage vom Server (1440 Minuten pro Tag * 5 Tage * 16 Kanäle = 115200 Messwerte) beim Client direkt angezeigt werden. Das heißt ich muss bei der Initialisierung des Clients recht viele Daten übertragen. Es werden vermutlich 3-5 Clients gleichzeitig aktiv sein.
Meine Frage ist nun: Wie mache ich das am besten? Das An- und Abmelden der Clients sowie das minütliche Verteilen der aktuellen Messwerte geschieht über UDP. Der Server speichert dann den Client samt IP und Port in einer FGV zur Weiterverarbeitung in den Daten-VIs. Wenn ich nun die besagten 115200 Messwerte in 8kb-große Pakete zerteile und per UDP rüberschicke, dann müllt mir der Client beim Empfang den Arbeitsspeicher mit 200-300 MB zu. Mitunter geht das soweit, dass ich eine Meldung bekomme, dass der Speicher voll ist. Das kanns ja irgendwie nicht sein. Leider habe ich nur das Base-Paket von Labview und mir stehen dementsprechend auch nur begrenze Mittel zur Verfügung (z.B. keine Event-Struktur).
Die Datenpakete, die ich vom Server zu den Clients schicke, sehen ungefähr so aus:
INIT_[KanalNr]_[PaketNr]_Wert1_Wert2_Wert3_....
Das ganze dann soweit bis die maximale Paketlänge von 8192 Bytes voll ist (genau genommen mache ich bei 8000 zu). Am anderen Ende werden diese Strings dann in ein Schieberegister gesteckt und "wenn alles da ist" wird es wieder auseinandergedröselt und in Signalverläufe gepackt (t0 und dt kommen in einem separaten Startpaket). Prinzipiell funktioniert die Datenkommunikation, die Pakete kommen an, werden zusammengesetzt und angezeigt.. Insgesamt werden das um die 100 UDP-Pakete. Das macht knapp 800 kb und dürfte für den Arbeitsspeicher "eigentlich" kein Problem sein.
Ich würd hier zwar gern meine VIs hochladen, aber das Projekt ist ziemlich groß und mit etlichen SubVIs. Ganz abgesehen davon dass ich das Firmenrechtlich gar nicht dürfte
Daher versuche ich einfach ein bischen Inspiration, ein paar Tips abzugreifen. Eine Idee war ursprünglich, die CSV-Dateien zu übertragen, aber da ich die Daten wirklich nur auf dem Server und keine x Kopien der CSV-Dateien auf den Clients haben will, hatte ich diesen Weg vorerst ausgeschlossen. Aber ich lasse mich gerne überzeugen.
Ist die Kommunikation über TCP evtl. besser? UDP verwende ich eigentlich nur, weil die ersten Beispiele, die ich fand, über UDP liefen.
derzeit bin ich damit beschäftigt, unseren Temperaturlogger neu zu programmieren. Dazu habe ich eine Server-Anwendung erstellt, die von der Hardware einmal pro Minute die 16 Kanäle abfragt und in einer CSV-Datei abspeichert. Die Clients melden sich beim Start beim Server an und erhalten dann ebenfalls einmal pro Minute die Messwerte (vom Server, nicht von der Hardware). Allerdings sollen die letzten 5 Tage vom Server (1440 Minuten pro Tag * 5 Tage * 16 Kanäle = 115200 Messwerte) beim Client direkt angezeigt werden. Das heißt ich muss bei der Initialisierung des Clients recht viele Daten übertragen. Es werden vermutlich 3-5 Clients gleichzeitig aktiv sein.
Meine Frage ist nun: Wie mache ich das am besten? Das An- und Abmelden der Clients sowie das minütliche Verteilen der aktuellen Messwerte geschieht über UDP. Der Server speichert dann den Client samt IP und Port in einer FGV zur Weiterverarbeitung in den Daten-VIs. Wenn ich nun die besagten 115200 Messwerte in 8kb-große Pakete zerteile und per UDP rüberschicke, dann müllt mir der Client beim Empfang den Arbeitsspeicher mit 200-300 MB zu. Mitunter geht das soweit, dass ich eine Meldung bekomme, dass der Speicher voll ist. Das kanns ja irgendwie nicht sein. Leider habe ich nur das Base-Paket von Labview und mir stehen dementsprechend auch nur begrenze Mittel zur Verfügung (z.B. keine Event-Struktur).
Die Datenpakete, die ich vom Server zu den Clients schicke, sehen ungefähr so aus:
INIT_[KanalNr]_[PaketNr]_Wert1_Wert2_Wert3_....
Das ganze dann soweit bis die maximale Paketlänge von 8192 Bytes voll ist (genau genommen mache ich bei 8000 zu). Am anderen Ende werden diese Strings dann in ein Schieberegister gesteckt und "wenn alles da ist" wird es wieder auseinandergedröselt und in Signalverläufe gepackt (t0 und dt kommen in einem separaten Startpaket). Prinzipiell funktioniert die Datenkommunikation, die Pakete kommen an, werden zusammengesetzt und angezeigt.. Insgesamt werden das um die 100 UDP-Pakete. Das macht knapp 800 kb und dürfte für den Arbeitsspeicher "eigentlich" kein Problem sein.
Ich würd hier zwar gern meine VIs hochladen, aber das Projekt ist ziemlich groß und mit etlichen SubVIs. Ganz abgesehen davon dass ich das Firmenrechtlich gar nicht dürfte
Daher versuche ich einfach ein bischen Inspiration, ein paar Tips abzugreifen. Eine Idee war ursprünglich, die CSV-Dateien zu übertragen, aber da ich die Daten wirklich nur auf dem Server und keine x Kopien der CSV-Dateien auf den Clients haben will, hatte ich diesen Weg vorerst ausgeschlossen. Aber ich lasse mich gerne überzeugen.
Ist die Kommunikation über TCP evtl. besser? UDP verwende ich eigentlich nur, weil die ersten Beispiele, die ich fand, über UDP liefen.