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!
15.07.2014, 09:52 (Dieser Beitrag wurde zuletzt bearbeitet: 15.07.2014 09:53 von amadeus.)
Ich habe letzte Woche mein Praktikum bei einer Firma begonnen und komme daher, nach 4 Jähriger Pause, wieder einmal in den Genuss mit Labview zu arbeiten.
Die Erfahrung von vor 4 Jahren beschränkt sich jedoch auch auf ein Schulprojekt.
Meine Aufgabe ist es, eine Nachlaufmessgerät zu konstruieren, welches den Nachlaufweg und die Nachlaufzeit einer Anlage bestimmt. Dazu habe ich einen Inkrementalen Drehgeber mit 2000 Impulsen/Umdrehung und 10 Impulse/mm. Die aufzulösende Geschwindikeit liegt zwischen 0,1mm/s (wird als 0 gewertet) und 10m/s. Also einem Frequenzbereich von 1Hz-10kHz.
Der Ablauf sieht so aus, dass die Anlage hochgefahren wird und nach erreichen der Maximalgeschwindigkeit durch Auslösen eines Sicherheitsvorhanges (Lichtschranke) abschaltet.
Zu diesem Zeitpunkt soll auch meine Messung starten. Am Ende benötige ich die Daten: Dauer (bis die Geschwindigkeit unter 0,1mm/s abgefallen ist, Anzahl der Impulse (für die Berechnung der gefahrenen Distanz) und den Geschwindigkeitsverlauf.
Diese Messung führe ich 10 mal durch und gebe dann die damit 10 verschiedenen Werte an ein schon von mir fertiges und funktionierendes LV-Programm, welches daraus dann den Mindestabstand eines Sicherheitszaunes berechnet und in ein Excel-Dokument übergibt.
Das zu meiner Aufgabe.
Als Datenerfassungsmodul habe ich:
NI- USB 6351
Den Drehgeber bekomme ich erst in 2 Wochen, daher simuliere ich ihn derzeit mit einem Frequenzgenerator, Rechteck, TTL
Für die Erfassung der Daten hätte ich einfach die Counter- Eingänge benutzt und damit die Periode/Flanken gezählt.
Nachdem meine Karte am COunter-Eingang bis 10 MHz zulässig ist, müsste sie meiner Meinung nach locker auskommen?
Mein Großes Problem liegt darin, die Werte (vor allem für die Geschwindikeit) in einem Array abspeichern zu können, um dann einen Geschwindigkeitsverlauf aufzeichnen zu können, um den Punkt der Maximalgeschwindigkeit zu bestimmen.
Ich arbeite zum ersten mal mit einem Datenerfassungsmodul, und habe mich auch schon durch einige example-VIs gearbeitet und auch schon in diesem Forum gesucht.
Nachdem ich bisher zwar nicht für mich, aber generell, immer sehr gute Antworten gelesen habe, würde ich hier um Hilfe oder gute Anregungen bitten,
Hier einmal meine Versuche =
Nachlauf-Messgerät_Counter_Period.vi (Größe: 78,64 KB / Downloads: 283)
Im Prinzip machst du das schon richtig, aber einen kleinen Gedanken-Fehler hast du in einem Konzept:
das (schnelle) Zählen übernimmt der Counter-Chip auf der Mess-Karte. Wie oft du in der Software den Zähler-Stand abfragst ist wieder ein ganz anderes Thema. Das kann nun sehr langsam sein (z.B. mit 10 Hz) oder auch sehr schnell, aber der Zähler zählt erstmal komplett unabhängig davon wie schnell du den Zähler-Stand abfragst.
Ich würde das Thema wie folgt angehen:
einen Flanken-Zähl-Task mit DAQmx erstellen, der - wie der Name schon sagt - die Flanken zählt.
Diesen Task würde ich kontinuierlich anlegen und den Zähler-Stand mit z.B. 1 kHz auslesen. Damit hast du dann eine zeitliche Auflösung von 1 ms. Über die reinkommenden Samples würde ich eine gleitende Berechnung mit z.B. 500 ms Länge durchführen, die die Anzahl der Flanken in diesem Zeitfenster durch die Zeit dividiert. Das ganze rechnest du dann in Grad/Sekunde bzw. U/s um und schon hast du eine Umdrehungs-Geschwindigkeit. Das musst du dann noch über die Achs-Steigung in eine Achsen-Geschwindigkeit umrechnen und dann hast du schon fast das was du willst.
Ggf. ist bei dem DAQmx-Task noch ein Trigger sinnvoll, damit der Task genau dann startet wenn der Not-Aus gedrückt wurde
Verstehe ich das richtig, dass ich meinen Counterstand jedes mal abfrage, wenn ich meine while-schleife durchlaufe?
Ich habe maximal eine Geschwindigkeit von 10m/s, das macht bei 10Impulsen/mm eine Frequenz von 10 kHz.
Außerdem muss ich davon ausgehen, dass ich Anlagen teste, die <1s abbremsen.
also innerhalb 1s von 10m/s auf 0. Wenn ich dann über 500ms "Mittle", dann verliere ich doch eigentlich meine ganze Information.
oder verstehe ich das falsch?
Zum Trigger,
ich muss die Messung starten und gleichzeitig eine "Autohand" ansteuern, die den Lichtvorhang innerhalb ys auslöst.
Jetzt steuere ich den Messungsstart noch über einen START Button an, aber kann man auch auf ein externes Signal, eine Flanke eines Impulses Triggern?
Ich schick dir einmal meinen derzeitigen Stand. Hier jetzt schon die Auswahlmöglichkeit zwischen Messung/Berechnung. wobei ich folgendes Problem habe:
Wenn ich zuerst die Messung durchführe, und dann die gemessenen Werte für die Berechnung verwenden und diese starten will, dann treten Probleme auf:
1) Die Ausgabe der Messung erfolgt in einem Spalten-Array, die Eingabe der Berechnung in Zeilen, daher funktioniert das nicht. denke ich? oder hat das andere Gründe. Ich kann doch bestimmt dieses Array Transponieren?
2) Wenn ich abwarte bis die Messung vorbei ist und dann auf Berechnung umsteige, funktioniert das nicht. Ich muss noch während der Messung auf Berechnung umschalten, damit ich in meinem Programm auch in dem anderen Case lande. Woran liegt das?
freundliche Grüße,
Amadeus
17.07.2014, 08:31 (Dieser Beitrag wurde zuletzt bearbeitet: 17.07.2014 08:36 von cb.)
ich hab mir das VI nun nicht angeschaut (sorry, aber für eine genauere Analyse hab ich gerade keine Zeit ...) aber das Problem ist eigentlich schon fast gelöst, wenn du folgendes machst:
such dir in den Beispielen (Exmple-Finder) ein VI raus, mit einer getriggerten Flanken-Zählung, in dem Fall reicht auch eine finite Erfassung mit z.B. 2 oder 3 Sekunden. Über einen DIO steuerst du die Auto-Hand und das Lichtschranken Signal nutzt du als Trigger für den Flanken-Zähl-Task, ggf. brauchst du dann noch einen Spannungs-Teiler und eine Invertierung oder ähnliches.
Dein Counter-Task läuft dann in dem Moment los in dem die Lichtschranke auslöst und nimmt für (z.B.) 2 Sekunden die Counter-Stände auf mit der Sample-Rate, die du festlegst. Nehmen wir an du willst eine Auflösung von 100 µs, dann liest du den Counter mit einer SR von 10 kHz aus. Dein Ergebnis wäre dann ein Array mit 20000 oder 30000 Counter-Ständen, die du dann auswerten kannst.
Da es ja nur drum geht rauszufinden wie schnell die Maschine stoppt, braucht man da mMn gar kein großes Programm, man kann da auch einfach erst mal nur erfassen und die Daten innerhalb des Zeitraumes aufnehmen in dem die Maschine auf jeden Fall stoppen müsste und die genaue Analyse der Daten dann im Nachgang machen ...
Zur Mittelung: nein, das hast du falsch verstanden, du sollst nicht blockweise mit einer bestimmten Dauer mitteln, sondern gleitend, d.h. du fängst bei Sample 0 an und schneidest ein Array mit der Länge x aus (bei SR=1kHZ z.B. 500 Samples) und berechnest daraus eine Geschwindigkeit, dann nimmst du Sample 1 und machst das gleiche, dann Sample 2 usw. Hintergrund: wenn du nicht über eine bestimmte Dauer-Mittelst, dann ergibt die Berechnung einer Geschwindigkeit aus einem Encoder-Signal eine große Streuung weil du was kleines (ein Inkrement) durch noch was kleineres (Zeit zwischen 2 Samples) teilst und an der kleine Änderungen eine große Auswirkung haben ...
Danke dir, ich werde versuchen, das so umzusetzen.
Ich soll aber nicht einfach nur den Weg bestimmen, sondern auch den Geschwindigkeitsverlauf darstellen und andere Parameter ausgeben.
Aber das krieg ich hoffentlich schon alles irgendwie hin.
Jetzt habe ich habe ich aber immer noch ein Problem, mit dem ich mich schon den ganzen Tag rumschlage. Ich will 3 Auswahlmöglichkeiten haben
1) Aufnahme Geschwindigkeitskennlinie (soll einmal durchfahren damit ich bestimmen kann wie hoch die Maximalgeschwindigkeit ist und wo diese auftritt)
2) Messung: 10 durchläufe bei denen ich die Zeit bestimme
3) Berechnung: hier übernehme ich die 10 Zeiten und berechne meine Sicherheitsabstände.
Nachdem´s mit einer CASE- Struktur nicht funktioniert hat, habe ich jetzt alles auf eine Ereignisstruktur umgemünzt. Aber auch hier funktioniert die Umschaltung einfach nicht.
Müsste nicht eigentlich bei Drücken eines Tasters im Frontpanel die Ereignisstruktur zum jeweiligen Ereignis abgearbeitet werden und dann im Timeout-Modus auf ein neues Ereignis warten?
Vielen Dank für deine Hilfe, ich hoffe, du hast auch hier einen guten Rat. Vielleicht hast du mal kurz Zeit um ins Vi rein zu schaun um mir zu sagen, ob ich das mit den Eventstrukturen richtig aufgebaut habe.
Ich hängs nochmal an!
So, jetzt kann ich meine Probleme etwas konkreter benennen.
1) Wenn ich MESSEN will, dann möchte ich, wie gesagt, 10 Messwiederholungen machen.
Problem: Wenn ich in die Ereignisstruktur für MESSEN noch eine Ereignisstruktur einbaue für NEUE MESSUNG, dann hängt alles. Auch mit dem Highlight Execution-Feature kann ich nicht erkennen, worauf gewartet wird.
Ich möchte, dass wenn ich auf MESSEN gehe, die einzelnen Messungen starten, wenn ich den NEUE MESSUNG Button betätige. Nach meiner Denkweise müsste das so gehen, wie ich es Programmiert habe, aber leider funzt das so nicht. Ich hab das Gefühl, ich verstehe einfach noch nicht, wie Labview genau arbeitet.
2) Wenn ich im Ereignis KENNLINIE bin, möchte ich dort eben nur einmal eine Kennlinie aufnehmen und Maximalwert der Geschwindigkeit und dazugehörigen Verfahrweg bestimmen. das funktioniert auch ganz gut. Nur bringt mir der Feedback-node das Problem, dass ich, wenn ich die Kennlinie ein weiteresmal aufnehme, und eine kleiner Maximalgeschwindigkeit habe, der alte Maximalwert gespeichert bleibt.
Kann ich diesen bei erneutem Drücken des KENNLINIEN-Buttons im Frontpanel löschen?`
3) Nach einer Messfolge von 10 Messungen speichere ich diese in einem Text(LVM) ab, damit ich sie dann bei meiner Berechnung wieder auslesen kann. Hier auch wieder, wenn ich die Berechnung ein weiteres mal durchführen möchte, ein Fehler. : Error 4 occurred at Read From Measurement ( LabVIEW: End of file encountered.)
Auch hier keinen Plan woran das liegen kann, das File liegt im richtigen Ordner und hat genau 10 Einträge.
Kann es sein, dass beim ersten Durchlauf die ersten 10 Werte ausgelesen werden und beim zweiten Durchlauf versucht wird, ab dem 10 Eintrag wieder 10 Einträge auszulesen, welche jedoch nicht vorhanden sind?
Ich weiß, ich habe viele Fragen, aber Labview erscheint mir im Gegensatz zu C oder C# eine sehr komplizierte Programmiersprache zu sein
Der Ablauf, wie mein Programm bearbeitet wird, ist mir oft nicht schlüssig.
(17.07.2014 13:49 )amadeus schrieb: 1) Wenn ich MESSEN will, dann möchte ich, wie gesagt, 10 Messwiederholungen machen.
Problem: Wenn ich in die Ereignisstruktur für MESSEN noch eine Ereignisstruktur einbaue für NEUE MESSUNG, dann hängt alles. Auch mit dem Highlight Execution-Feature kann ich nicht erkennen, worauf gewartet wird.
Jau, das haut nicht hin (oder wenn, dann nur mit viel Aufwand und fast garantiert unschönen Nebeneffekten). Hängt damit zusammen, dass es nur eine Event-Queue pro VI gibt, die GUI-Ereignisse empfängt und weitergibt. Lies dir die Hinweise zur Verwendung der Event-Struktur in der LabVIEW-Hilfe durch. Da steht u.a. maximal 1 Event-Struktur pro Schleife.
Die Erfahrung in der Realität leert: Max. 1 Event-Struktur pro VI.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Danke für die Antwort, auch wenn mir das jetzt überhaupt nicht in die Karten spielt.
Hast du eine Idee, wie ich dann trotzdem mit einem Ereignis (später dann über einen Digitalen Eingang) meine einzelnen Messungen starten kann?
Problem Nr. 3 habe ich jetzt gelöst, einfach den Reset-Eingang meines Write to Measurement File auf TRUE setzen und schon funktionierts
Was hältst du von der Idee, die Messung auf den erwarteten Maximalwert der Geschwindigkeit zu Triggern? also, dass die ganze Zeit gemessen wird, aber die Aufzeichnung erst dann startet, wenn die Anlage wieder auf Nennleistung gefahren wurde?
edit: das ist eigentlich keine gute Idee, ich muss ja meine Messung exakt dann starten, wenn ich die Autohand auslöse, um die genaue Zeit ermitteln zu können
Meine Idee war es jetzt, meine Messung einfach auf einen Eingang meiner Messkarte zu Triggern, welchen ich direkt mit einem Ausgang verbinde.
Mit diesem Ausgang steuere ich dann meine "Autohand" und meinen Messstart an. Mein Problem ist jetzt, dass ich immer eine Fehlermeldung bekomme, wenn ich den Counter über einen Eingang Triggern will.
Error -200452 occurred at Property Node DAQmx Trigger (arg 1) in DAQmx Start Trigger (Digital Edge).vi:3930002->Untitled 11
Possible reason(s):
Specified property is not supported by the device or is not applicable to the task.
Property: Start.TrigType
Task Name: _unnamedTask<35>
Das gleiche Problem wurde 2009 schon einmal hier diskutiert, aber leider nicht zu Ende gebracht.