Hallo Manfred,
warum müssen alle Fenster so riesig sein?
Dein MainVI könnte auch so aussehen, wenn du etwas aufräumen würdest:
[
attachment=61475]
Warum hat die While-Loop so viele (ungenutzte) Output-Tunnel?
Zitat:Nur noch ein Problem: Ich nutze zur Übertragung der Messwerte eine globale Variable in einem Subvi. Jetzt muss ich aber das Subvi nach dem sweep gesondert starten, dann stoppen und dann wieder das Hauptvi starten, damit die Messwerte auf dem Hauptvi-Bedien-Panel erscheinen.
Wie kann ich die Messung ohne diese "Klimmzüge" direkt auf dem Hauptvi-BedienPanel darstellen?
Ganz einfach: dieses subVI in deinem MainVI einfügen. Das Array statt über eine globale Variable einfach durch einen Draht weiterleiten!
Danke für die schnelle Anwort. Die ungenutzten Anschlüsse habe ich einfach vom Hersteller aus seiner Vorlage übernommen. Jetzt wieder eine dumme Frage: Wie kann ich ein Subvi einfügen?
Hallo Manfred,
Zitat:Jetzt wieder eine dumme Frage: Wie kann ich ein Subvi einfügen?
Einfach ins MainVI-Blockdiagramm hineinziehen…
Du hast schon die ganzen Links in meiner Signatur beachtet!?
Die links sind sehr umfangreich, da hab ich noch viel vor....
Einfach hineinziehen, so einfach kann das sein. Vielen Dank für die Hilfe.
Nach einigen Versuchen und Einarbeitung funktioniert es jetzt. Ich habe aber den Ansatz verändert in Messen_Lesen_Einzelschritt. Damit kann ich Start-Stopp-Schrittweite frei wählen. Bei einem sweep ist man bei dem Gerät auf 300 Messpunkte beschränkt.
Elegant ist es nicht programmiert aber es funktioniert. Vielleicht gibt es hier noch Verbesserungsvorschläge.
Das vi Mess_Lesen_Einschritt.vi hänge ich an.
Vielen Dank für die Hilfe und die guten Tutorien.
/Messen_Lesen_Einzelschritt.vi
[
attachment=61545]
Hallo Manfred,
ich lese das jetzt wie ein: "Oh, da gibt es diese globalen Variablen, welche jetzt alle meine Probleme lösen"
Nein, das tun sie nicht - ganz sicher nicht - niemals - ganz im Gegenteil
Dein "Read Sweep Data_fuer_exe.vi" kenne ich leider nicht. Auch kenne ich das Messinstrument nicht.
Ich nehme an, dass "Read Sweep Data_fuer_exe.vi" VI nicht viel anders ist, als das "Read Sweep Data.vi" aus dem Treiber. Dieses VI ("Read Sweep Data.vi" aus dem Treiber) liefert dir doch die Daten an seinen Ausgängen. Diese Daten bastelst du mittels eines Clusters zu einem X/Y Graph zusammen.
Wozu soll denn das Express VI "XY-Graph erstellen gut sein? X-Array (Frequenzen) und Y-Array in einen Cluster stopfen und dann ab zum Graph - mehr machen die ganzen Express VIs in deinem Fall nicht, außer dass sie viel Platz auf dem Blockdiagram verbrauchen und die Daten ein paar mal hin und her kopieren.
Hallo Heinz,
vielen Dank für die schnelle Antwort. Mein Anliegen waren keine globalen Variablen. In meinem Messen_Lesen_Einzelschritt verwende ich sie nicht.
Die kleinen Module des Herstellers liefern nur Anregungen zur Programmierung. Sie liefern nur Einzelmessungen oder einen unvollständigen sweep, begrenzt auf 300 Messpunkte, ohne Grafik. Mein kleines Prog. kann Einzelmessungen vornehmen in beliebigen Start/Stoppfrequenzen und bliebiger Schrittweite. Der Generator ist notwendig, da in den Modulen des Herstellers keine Möglichkeit besteht, die Frequenz auszulesen.
Als Anfänger in Labview war mein Anliegen, hier noch Anregungen zur Verbesserung des Programms zu finden und mich für die bisherige Hilfe zu bedanken.
VG, Manfred
Hallo Manfred,
Zitat:Als Anfänger in Labview war mein Anliegen, hier noch Anregungen zur Verbesserung des Programms zu finden und mich für die bisherige Hilfe zu bedanken.
Was soll diese FOR-Loop zum Erzeugen eines Frequenz-Arrays?
Schau mal hier:
[
attachment=61546]
Warum soll ein User die "Startfrequenz abzüglich Schrittweite" angeben? Das ist unüblich/unlogisch/verwirrend/fehlerträchtig…
Der Vergleich von Float-Werten ist (fast) IMMER gefährlich!
Warum verwendest du eine FOR-Loop, wenn du aufgrund der Vergleichsfunktion in der Loop mit einer While-Loop viel besser bedient wärst?
Wozu die Wartezeit in deiner FOR-Loop? Warum muss das Erzeugen eines Arrays künstlich verlangsamt werden???
Warum gab es da so viele ungenutzte Output-Tunnels in dieser Loop???
Und zu guter letzt:
Es gibt da eine fertige Funktion zum Erzeugen einer Rampe! Man benötigt überhaupt keine Loop!
Zum Rest dieses VIs:
Wozu verwendest du eine TimedLoop zur Messwerterfassung??? Die Zeit wird doch durch dein Messgerät und die Latenzen des Kommunikationsbusses vorgegeben! TimedLoops sind unter einem normalen Windows so gut wie immer Overkill… (Und das ganze nur, um diese TimedLoop per i==0 gleich wieder abzubrechen!?)
Warum räumst du nicht gleich noch auf? Nirgends gerade Drähte! Und das Blockdiagramm ist auch viel zu groß: mehrere FullHD-Bildschirme zu scrollen…
Warum muss man die Parameter-Arrays zum Schluss künstlich auf ein 2D-Array aufblasen, wenn sie als 1D-Array berechnet werden?
Da sieht man, dass ich noch viel lernen kann.
Die Rampenfunktion kannte ich noch nicht. Das ist natürlich viel eleganter. Die Schrittweite muss bei mir abgezogen werden, weil sonst die 1. Messung am falschen Punkt liegt. Ich könnte auch den Startpunkt richtig setzen aber dann wäre der letzte Punkt falsch.
Über den Vergleich von float habe ich noch garnicht nachgedacht. Aber klar, dass kann daneben gehen. Es war eher eine Unachtsamkeit, in C++ wäre mir das nicht passiert. Ich werde mir auch die while-loop genauer ansehen und dann ändern.
Die Wartezeit in der loop war noch aus der Testphase. Ich hatte anfangs Probleme, den Generator mit der Messung zu synchronisieren.
Kann jetzt weg.
Ich werde mal probieren, ob die timed-loop weg kann. Durch Probieren kam ich dahinter, dass man das Gerät nicht überladen darf. Es benötigt bei kleinen Kapazitäten 2 Sekunden für eine präzise Messung. Ich wollte verhindern, dass eine neue Messung angefordert wird bevor das alte Ergebnis da ist.
Mit den Arrays hatte ich meine Schwierigkeiten. Es werden ja 2 Parameter angefordert. Daher kam der Gedanke an 2d. Macht natürlich keinen Sinn, da die Parameter getrennt kommen.
Und aufräumen muss ich auch dringend! Es gibt also viel zu tun für mich.
Vielen Dank für die Verbesserungen. Ich bin natürlich immer noch Anfänger und kein professioneller Entwickler.
Grüße und Dank,
Manfred
Hallo Manfred,
Zitat:Die Schrittweite muss bei mir abgezogen werden, weil sonst die 1. Messung am falschen Punkt liegt. Ich könnte auch den Startpunkt richtig setzen aber dann wäre der letzte Punkt falsch.
Das ist aber eine Aufgabe, die dein VI erledigen sollte und nicht der User!
Letztendlich geht es hier um die Definition eines "sauberen" APIs zum Aufruf deiner Funktion - "sauber" im Sinne von "mögllichst fehlerfrei"…
Zitat:Ich werde mal probieren, ob die timed-loop weg kann. Durch Probieren kam ich dahinter, dass man das Gerät nicht überladen darf. Es benötigt bei kleinen Kapazitäten 2 Sekunden für eine präzise Messung. Ich wollte verhindern, dass eine neue Messung angefordert wird bevor das alte Ergebnis da ist.
Normalerweise startet man die nächste Messung doch nur, wenn die aktuelle abgearbeitet ist, oder?
Manche Geräte lassen auch eine Status-Abfrage zu, aus der hervorgeht, ob eine Messung beendet ist.
Auf alle Fälle bewirkt ein simples Wait(1000ms) das gleiche wie die jetzige TimedLoop, die jeweils nur ein einziges mal iteriert…