Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich versuche gerade es hinzukriegen mittels occurences eine Schleife der subVI von der HauptVI zu stoppen. ich habe mir entsprechende Beiträge gelesen, aber ich wollte herausfinden, was ich hier nu falsch mache.. Wenn ich den timer für "warten" auf 0 setzen geht das, die Schleife arbeitet aber nicht so wie ich es möchte...
Zum Programm selbst: Es sollen weitere subVIs entstehen, die dann mittels des stopbuttons bzw. andere mechanismen von der HauptVI gestoppt werden sollen. Jeder Tipp ist gern willkommen, auch wenn es nicht zur Frage passt... Es ist mein erstes mal, dass ich ein Programm mit labview erstelle.
(04.09.2020 23:33 )illy777 schrieb: Jeder Tipp ist gern willkommen, auch wenn es nicht zur Frage passt...
Hmm, ich habe den Verdacht, dass ich jetzt nicht mal 10% von dem schaffe, was mir so alles aufgefallen ist.
In Main unter Messeinstellungen steht die Sample Rate zur Zeit auf 50kS/s. Du nimmst im Moment drei Kanäle auf und willst noch mehr Kanäle aufnehmen? Du sammelst aber alle Daten. Das Programm würde irgendwann so viel Speicher brauchen, dass es platzt :-)
Davon abgesehen, dass deine Occurrence ins leere läuft und der Abbruch Button irgendwie sinnfrei ist, würde ich keine Occurrence nehmen, hier nicht und sogar ganz generell davon abraten (die Dinger haben ein paar Eigenschaften, die einem den Spass verderben können). Du verwendest schon Queues (wenn auch etwas seltsam). Mittels einer Queue kannst du relativ problemlos zwischen verschiedenen VIs kommunizieren.
Du splittest die Daten der drei gemessenen Kanäle auf, stopfst die gerade gemessenen Daten in jeweils eine eigene Queue, welche dann in der darunter liegenden schleife aus den drei Queues wieder ausgelesen werden. Ähm - drei Queues machen da gar keinen Sinn.
Die Messdaten hänst du dann an die bereits zuvor gemessenen Daten an (macht so keinen Sinn, siehe oben).
Ich habe so ein bisschen den Eindruck, dass du gar nicht weist, warum du das dt eigentlich so komisch umskalierst ...
DAQmx findet alleine den passenden Messbereich (sollte es zumindest tun). Wenn du also einfach bei Create Channel das gewünschten Maximum rein stopfst (bei dir 1.5 mal Spannung-Motor), dann reicht das. Wozu also die while Schleife links oben.
So - ich höre jetzt erst mal auf.
Martin Henz
06.09.2020, 00:34 (Dieser Beitrag wurde zuletzt bearbeitet: 06.09.2020 00:45 von illy777.)
(04.09.2020 23:33 )illy777 schrieb: Jeder Tipp ist gern willkommen, auch wenn es nicht zur Frage passt...
Hmm, ich habe den Verdacht, dass ich jetzt nicht mal 10% von dem schaffe, was mir so alles aufgefallen ist.
In Main unter Messeinstellungen steht die Sample Rate zur Zeit auf 50kS/s. Du nimmst im Moment drei Kanäle auf und willst noch mehr Kanäle aufnehmen? Du sammelst aber alle Daten. Das Programm würde irgendwann so viel Speicher brauchen, dass es platzt :-)
Davon abgesehen, dass deine Occurrence ins leere läuft und der Abbruch Button irgendwie sinnfrei ist, würde ich keine Occurrence nehmen, hier nicht und sogar ganz generell davon abraten (die Dinger haben ein paar Eigenschaften, die einem den Spass verderben können). Du verwendest schon Queues (wenn auch etwas seltsam). Mittels einer Queue kannst du relativ problemlos zwischen verschiedenen VIs kommunizieren.
Du splittest die Daten der drei gemessenen Kanäle auf, stopfst die gerade gemessenen Daten in jeweils eine eigene Queue, welche dann in der darunter liegenden schleife aus den drei Queues wieder ausgelesen werden. Ähm - drei Queues machen da gar keinen Sinn.
Die Messdaten hänst du dann an die bereits zuvor gemessenen Daten an (macht so keinen Sinn, siehe oben).
Ich habe so ein bisschen den Eindruck, dass du gar nicht weist, warum du das dt eigentlich so komisch umskalierst ...
DAQmx findet alleine den passenden Messbereich (sollte es zumindest tun). Wenn du also einfach bei Create Channel das gewünschten Maximum rein stopfst (bei dir 1.5 mal Spannung-Motor), dann reicht das. Wozu also die while Schleife links oben.
So - ich höre jetzt erst mal auf.
Hallo Martin,
danke für die Antwort! vllt zur Erklärung: das Programm ist für eine Leerlaufprüfung gedacht, und da sollen noch stromwerte abgenommen werden und eine Zeit dt eingestellt werden, in der die Daten gesammelt werden. (Es kommen noch drehzahlwerte und Temperatur dazu, und noch muss ich die DC-Mittelwerte und RMS bilden und tabellarisch darstellen)
Das mit den 3 queues ist ein guter Einwand den ich auch umsetzen werde, aber das mit dem dt der Diagramme, da weiß ich ehrlich gesagt wirklich nicht wie ich das umstellen soll, aber ich wollte die Zeit eben so skalieren, dass die x achse in sekunden ausgegeben werden. Ich weiß nicht wie ich das besser mache.. ich bin auch ehrlich gesagt neu zu LabView und muss das für meine Praxisarbeit im 2. Semester erstellen.. Ich bin ein wenig am verzweifeln, weil das relativ anspruchsvoll ist und ich gar keine Erfahrungen habe mit Labview..
Auch die 3 Diagramme möchte ich in der Subvi haben, da ich später die SubVI öffnen möchte um die Möglichkeit zu haben alle Spannungen einzeln zu betrachten
Der Abbruch button soll aber trotzdem funktionieren, da ich die Möglichkeit haben möchte, die Schleife im Main zu stoppen falls erforderlich. Ich habs ebenfalls mit queues probiert und habe auch das umgesetzt was in einigen Threads zu lesen ist, dennoch finde ich keine Möglichkeit, dies auf die richtige Weise umzusetzen.
nochmehr Ungereimtheiten:
Main.vi
- In der Schleife wird in jeder Iteration und in jedem Case eine neue Occurance angefordert, diese aber nie gelöscht. Sowas kann (auf Dauer) nie funktionieren! (Zumal diese Schleife im FALSE-Case auch ungebremst so schnell wie möglich läuft…)
- Du hast vollkommen an THINK DATAFLOW vorbei programmiert: die Event-Struktur kann NIE aufgerufen werden, da es eine DATAFLOW-Abhängigkeit gibt und die Schleife davor NIE beendet wird!
- Bei "Aufplottrate" gibt es einen CoercionDot: wieso?
sub.vi
- Was nützt dir eine Stopp-Bedingung (per Occurance oder sonst wie), wenn du da Schleifen verwendest, die NIE beendet werden?
- In der Schleife, die NIE beendet wird, setzt du Plot-Properties. Dummerweise verwendest du die ActivePlot-Property falsch: immer erst den ActivePlot setzen, dann dessen Properties…
- Die Schleife zum Berechnen der "Spannung Motor" ist reiner Rube-Goldberg: wenn die Spannung durch 5 teilbar sein soll, dann durch 5 teilen, aufrunden, mit 5 multiplizieren…
- Das Aufteilen des Waveform-Arrays für 3 Queues ist extrem sinnfrei…
Auch ich würde dir von Occurances abraten. Nimm eine FGV (aka AE) oder einen Notifier für eine globale Stopp-Bedingung…
ich danke für eure Tipps! Ich habe mittlerweile einiges umgesetzt und ich wüsste nicht wie ich das anders machen sollte.. das mit dem Abbruchknopf wird noch implementiert, aber mit queus hab ichs aber nicht hingekriegt...
Desweiteren habe ich jetzt noch ein Problem.. Ich habe eine Sequenz erstellt, da ich einen Grenzstrom angeben möchte, als Signal für den Messstart.. Wenn ich im Debugg-Modus bin klappt das ja ganz gut und er führt die Sequenz so wie ichs mir vorstelle aus: 1. Warten bis Grenze überschritten wird 2. Rahmen ausführen.
Allerdings ausserhalb des Debuggmodus miss er immer, auch wenn die Stromzange aus ist?!
Zitat:Ich habe eine Sequenz erstellt, da ich einen Grenzstrom angeben möchte, als Signal für den Messstart.. Wenn ich im Debugg-Modus bin klappt das ja ganz gut und er führt die Sequenz so wie ichs mir vorstelle aus: 1. Warten bis Grenze überschritten wird 2. Rahmen ausführen.
Allerdings ausserhalb des Debuggmodus miss er immer, auch wenn die Stromzange aus ist?!
Falscher Ansatz…
Wenn du eine Statemachine implementieren willst, dann solltest du eben auch eine Statemachine implementieren!
Wozu genau brauchst du eine Sequenzstruktur?
Außerdem: da dein VI überhaupt nicht weiß, ob die Strommesszange aktiv ist oder nicht, wird immer gemessen, egal ob Debug-Modus oder nicht…
Zum subVI:
Verwende keine TimedWhileLoop, die ist unter Windows (fast immer) vollkommen unnötig! Wenn das Timing durch DAQmx gegeben ist, reicht eine normale WhileLoop aus!
Anstatt den Graph per Referenz/PropertyNode zu beschreiben, solltest du viel eher die Queue im MainVI auslesen und direkt im MainVI den Graph beschreiben…
Zitat:Ich habe eine Sequenz erstellt, da ich einen Grenzstrom angeben möchte, als Signal für den Messstart.. Wenn ich im Debugg-Modus bin klappt das ja ganz gut und er führt die Sequenz so wie ichs mir vorstelle aus: 1. Warten bis Grenze überschritten wird 2. Rahmen ausführen.
Allerdings ausserhalb des Debuggmodus miss er immer, auch wenn die Stromzange aus ist?!
Falscher Ansatz…
Wenn du eine Statemachine implementieren willst, dann solltest du eben auch eine Statemachine implementieren!
Wozu genau brauchst du eine Sequenzstruktur?
Außerdem: da dein VI überhaupt nicht weiß, ob die Strommesszange aktiv ist oder nicht, wird immer gemessen, egal ob Debug-Modus oder nicht…
Zum subVI:
Verwende keine TimedWhileLoop, die ist unter Windows (fast immer) vollkommen unnötig! Wenn das Timing durch DAQmx gegeben ist, reicht eine normale WhileLoop aus!
Anstatt den Graph per Referenz/PropertyNode zu beschreiben, solltest du viel eher die Queue im MainVI auslesen und direkt im MainVI den Graph beschreiben…
Hallo GerdW,
ehrlich gesagt, habe ichs bis jetzt nicht verstanden wie das mit queus über mehrere VIs funktioniert(also wie ich queus aus der hauptvi mit der subvi verknüpf und andersherum)..
die Sequenz habe ich mir eben so vorgestellt, dass er eben die Schleife links durchlaufen lässt bis der Grenzwert überschritten wird, dann fängt er mit dem 2. rahmen an.. und ich wusste nicht mal was eine Statemachine ist
und wie kann ich mein VI wissen lassen, dass die Zange an ist? ich meine, ich dachte, das geht eben über den Grenzwert..
dankeschön für deine Mühe!
07.09.2020, 09:17 (Dieser Beitrag wurde zuletzt bearbeitet: 07.09.2020 09:26 von GerdW.)
Zitat:abe ichs bis jetzt nicht verstanden wie das mit queus über mehrere VIs funktioniert(also wie ich queus aus der hauptvi mit der subvi verknüpf und andersherum)..
Dann führe mal diese Schritte durch:
1. öffne das Blockdiagramm deines subVIs
2. markiere die Consumer-Loop
3. Edit-Menü->SubVI erstellen
Jetzt weißt du, wie man mittels Queue Daten zwischen 2 VIs austauschen kann…
Zitat:ich wusste nicht mal was eine Statemachine ist
Das hat aber nichts mit LabVIEW zu tun. Eine Statemachine ist ein Programmierschema, das man in (wahrscheinlich/nahezu) jeder Programmiersprache umsetzen kann…
Wobei du den Sequenzrahmen nicht benötigen würdest, wenn du DATAFLOW mit Error-Wire anwenden würdest!
Zitat:wie kann ich mein VI wissen lassen, dass die Zange an ist? ich meine, ich dachte, das geht eben über den Grenzwert..
Aha, nötige Zusatzinfo zum Programm!
Wenn bei aktiver Messzange ein Mindestsignalwert anliegt, dann kannst du das natürlich so feststellen.
Wobei du das auch maximal umständlich umgesetzt hast: es gibt da auch ganz normale Vergleichsfunktionen:
Der von dir gewählte Grenzwert erscheint mir sehr gering: wie groß ist das erwartete Rauschen? Wo liegt die "Einschaltschwelle" deiner Strommmesszange?
Tipp:
Als Anfänger (und auch als Fortgeschrittener) solltest du die Option aktivieren, in Strukturen immer das Kommentarfeld per default sichtbar zu machen - und dort dann auch Kommentare reinschreiben. So zwingt man sich von Anfang an zu besser dokumentiertem Code…
Zitat:Dann führe mal diese Schritte durch:
1. öffne das Blockdiagramm deines subVIs
2. markiere die Consumer-Loop
3. Edit-Menü->SubVI erstellen
Jetzt weißt du, wie man mittels Queue Daten zwischen 2 VIs austauschen kann…
Zitat:Das hat aber nichts mit LabVIEW zu tun. Eine Statemachine ist ein Programmierschema, das man in (wahrscheinlich/nahezu) jeder Programmiersprache umsetzen kann…
Wobei du den Sequenzrahmen nicht benötigen würdest, wenn du DATAFLOW mit Error-Wire anwenden würdest!
ich probiers
Zitat:[quote]wie kann ich mein VI wissen lassen, dass die Zange an ist? ich meine, ich dachte, das geht eben über den Grenzwert..
Aha, nötige Zusatzinfo zum Programm!
Wenn bei aktiver Messzange ein Mindestsignalwert anliegt, dann kannst du das natürlich so feststellen.
Wobei du das auch maximal umständlich umgesetzt hast: es gibt da auch ganz normale Vergleichsfunktionen:
Der von dir gewählte Grenzwert erscheint mir sehr gering: wie groß ist das erwartete Rauschen? Wo liegt die "Einschaltschwelle" deiner Strommmesszange?
das erwartete Rauschen liegt nicht über 5 mA, und da die Messung erst ab 220 mA(min. 100 ma) anfangen soll, ist das kein großer bedeutender Wert... die Messzange hat 2 Skalierungen einmal 100 mV/A und 10 mV/A... Und man kann das Rauschen mit Stromzange an und aus nicht vergleichen, da sie sich sehr stark ähneln...
Zitat:Tipp:
Als Anfänger (und auch als Fortgeschrittener) solltest du die Option aktivieren, in Strukturen immer das Kommentarfeld per default sichtbar zu machen - und dort dann auch Kommentare reinschreiben. So zwingt man sich von Anfang an zu besser dokumentiertem Code…
ok werd ich machen
Zitat:Wobei du den Sequenzrahmen nicht benötigen würdest, wenn du DATAFLOW mit Error-Wire anwenden würdest!
ich probiers.. also so wie es aufm Bild ist, hats bei mir nicht geklappt..
Zitat:das erwartete Rauschen liegt nicht über 5 mA, und da die Messung erst ab 220 mA(min. 100 ma) anfangen soll, ist das kein großer bedeutender Wert... die Messzange hat 2 Skalierungen einmal 100 mV/A und 10 mV/A...
Und wie kommst du auf das Limit von "0.00025"?
Zitat:also so wie es aufm Bild ist, hats bei mir nicht geklappt..
Kein VI von dir, keine Fehleranalyse…
Außerdem: Ich habe von LabVIEW noch nie die Fehlermeldung "hat nicht geklappt" erhalten - da kommt üblicherweise eine konkrete Angabe!