(06.09.2013 13:19 )th89 schrieb: Hallo zusammen,
im Folgenden habe ich ein LabVIEW 2012 Projekt angehängt, auf die sich meine
Problemschilderung bezieht.
Um eine Schnittstelle zwischen LabVIEW und einer anderen Programmiersprache
(z.B. C#) zu schaffen, möchte ich beliebige Funktionsabläufe in eine
dynamische Bibliothek exportieren. Im konkreten Fall möchte ich mit LabVIEW
permanent erzeugte Werte zu einem beliebigen Zeitpunkt durch einen
C#-Funktionsaufruf abfragen.
Mein bisheriger Ansatz:
• RT-FIFO Puffer mit gewünschten Werten befüllen (Pufferbefuellen.vi)
z.B. innerhalb einer Dauerschleife (while-Schleife)
• beispielhaft wird das für zyklisch erzeugte Zufalls-Werte (Schleife.vi) durchgespielt
• Funktionsaufruf der Dauerschleifen mittels „exportiertem“ C#-Funktionsaufruf (Steuerung.vi), um die Werte in den Puffer zu schreiben
• RT-FIFO mittels C#- Funktionsaufruf (readpuffer.vi) kann nun durch C# zu beliebigen Zeitpunkten abgefragt werden
Für die folgenden Punkte benötige ich Ihre Unterstützung:
• Gibt es effizientere Lösungen für derartige Abfragen von Werten in Schleifen außer dem RT-FIFO?
• Kann man den Funktionsaufruf von „Dauerschleifen“ einfacher gestalten?
• Existieren noch weitere mögliche Schnittstellen zwischen LabVIEW und anderen Programmiersprachen, außer einer aus LabVIEW erzeugten DLL?
LG
Die beschriebene Architektur scheint mir ziemlich komplex und eher unsinnig. Wenn du schon einen eigene Schleife machen willst die irgendwo selbständig läuft, ist es meist sinnvoller um das in einem eigen Programm zu machen und die Daten mittels Interprozessdatenaustausch zu übertragen. Dann brauchst Du nicht so komische Klimmzüge zu machen.
Ansonsten sollten Libraries soviel möglich ein synchrones Interface haben, d.h. keine Deamons die im Hintergrund gestartet werden und unkontrolliert Daten in eine Form von Globalen schreiben die dann asynchron wieder irgendwie, manchmal, vielleicht und ab und zu aus dem Programm abgerufen werden. Ich weiss dass es für viele verlockend ist um solche asynchronen Interfaces zu entwickeln aber in den meisten Fällen ist das unnötig und verkompliziert nur die Programmierung, das Testen und Debuggen und nicht zuletzt den Unterhalt einer solchen Lösung auf längere Frist.
Schon alleine das Managen dieses FIFOs (ob das jetzt ein RT-FIFO, eine Global oder was auch ist) im Falle einer Blockierung Deines Hauptthreads der die Daten abfragt ist ein Alptraum. Wann und bei wieviel willst Du das FIFO beschränken wenn keine Daten mehr gelesen werden? Unendliches erweitern ist sicher keine Option. Und strikte Werte könnten in bestimmten Situation (etwa wenn Windows beschliesst um Deinen Hauptthread mal für eine Weile aufs Eis zu legen) zu Datenverlust führen.
Zudem lässt Deine Bemerkung:
• Gibt es effizientere Lösungen für derartige Abfragen von Werten in Schleifen außer dem RT-FIFO?
vermuten dass Du den Braten auch schon gerochen hast und nun nach einer Lösung suchst um das Ganze (un)elegant zu verschönbessern. Des weitern ist eine solche Frage ziemlich unsinnig, denn Du spezifizierst nicht warum Du denkst dass dies nicht effizient ist und was Du als effizient betrachtest. Kurze Latenz, hohe FIFO Tiefe, oder etwas anderes? Hast Du irgendwelche Benchmarks gemacht die entsprechende Daten liefern aufgrund derer man nach besseren Alternativen suchen kann?