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!
09.08.2016, 15:19 (Dieser Beitrag wurde zuletzt bearbeitet: 09.08.2016 15:21 von Hasenfuss.)
ich habe ein Problem beim Zusammensetzen eines Arrays. Ich erzeuge einen Sinus in einem Array und schreibe ihn in einen selbstgebastelten Fifo rein, der als Anzeige für einen Graphen dient. Der Sinus wird nicht richtig zusammengesetzt (siehe Schaubild).
Das Programm besteht aus einer FGV, die als Anzeige-FIFO (variant_data_container_4FGV.vi) dient und einem Testprogramm (test.vi) sowie noch einigen CTL-Dateien für das Fifo-VI. Die Anzeige-FIFO-FGV hat zwei Befehle, um Daten anzuhängen - "write forward" und "write backward". Die Funktion "write backward" funktioniert, aber nicht die Funktion "write forward". Leider weis ich überhaupt nicht, was ich beim Programmieren der Funktion falsch gemacht habe.
Falls ihr Euch meine VIs einmal anschauen würdet und mir Hinweise auf eine Fehlerursache geben könntet, würde ich mich sehr darüber freuen.
Hier der letzte Anhang bzw. die 5 Einzelprogramme nochmal gezippt in einem Ordner.
09.08.2016, 22:04 (Dieser Beitrag wurde zuletzt bearbeitet: 09.08.2016 22:13 von GerdW.)
das mit dem Umdrehen hab ich schon probiert. Leider führt es zu keinem brauchbaren Resultat. Der Sinus wird zwar richtig dargestellt, aber nicht die steigende Rampe. Im Bild 1 wird gezeigt, dass parallel zum Sinus auch die Rampe erzeugt wird. Die Rampe wird richtig dargestellt, aber nicht der Sinus. Mache ich wie von Dir vorgeschlagen die Daten umdrehen, dann bekomme ich keine steigende Rampe angezeigt, sondern eine fallende Rampe.
10.08.2016, 22:28 (Dieser Beitrag wurde zuletzt bearbeitet: 10.08.2016 22:28 von IchSelbst.)
die Programmierung ist vollkommen ok. Was du aber nicht bedacht hast ist, dass wenn du eine gleitkomma Frequenz verwendest, ist deine Periodendauer ungleich 2 PI. Wenn du jetzt mit deiner Rampe von 1000 Samples arbeitest schneidest du die Welle einfach irgendwo ab und setzt dieses Signalfragment an den Anfang (FiFo) und ein neues sinus Signal wird erstellt und fängt, wenn du es nicht mit "signal zurücksetzten" kennzeichnest, an der letzten bekannte Phase wieder an und setzt dann dieses wieder an die erste Stelle. Dadurch kommt es zu diesen Sprüngen und man kann sogar die Phasenverschiebung als weitere Frequnz beobachten.
Mein Ansatz ist:
1. Wenn du deine Rampe in Abhängigkeit deiner Frequenz skalierst endet dein Signal bei Periodendauer von 2PI und du kannst es in dein FiFo packen. (siehe Abb.1)
2. Du solltest bei deinem "Teil Array setzen" sagen an welcher Stelle etwas ersetzt werden sollte, also den index 0 angeben. (siehe Abb.2)
Ich hab es bei mir ausprobiert und es funktionierte. Ich bin nicht sicher ob deine Rampe immer 1000 sein muss und ich ich dein Programm jetzt verpfuscht habe, aber vlt. ist es ein Ansatz für dich
11.08.2016, 12:56 (Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2016 13:03 von Hasenfuss.)
(10.08.2016 22:28 )IchSelbst schrieb: Wenn Ja:
Warum denn mit dem Element "Teilarray ersetzen" Daten anhängen? Warum nicht mit "Array erstellen"?
Hi,
ein neues Array erstellen würde bedeuten, dass neue Operationen im Speicher stattfinden, also neue Speicherbereiche allokieren, die alten freigeben. Aus früheren Beiträgen von vielen Usern hier drinnen habe ich gelernt, dass man ein Array am besten mit fester Länge definiert und dann Arrayrotationen oder Ersetzungen vornimmt, jedoch neue Arrays erstellen vermeiden soll.
@ Maddin Maddsen
Zitat:2. Du solltest bei deinem "Teil Array setzen" sagen an welcher Stelle etwas ersetzt werden sollte, also den index 0 angeben. (siehe Abb.2)
Wenn ich nichts dranschreibe, dann ist standardmässig der Index 0 gemeint, ich hatte auch schon eine definierte Null angehängt, es hatte aber keinen Unterschied gemacht.
Dass der Sinus nicht definiert endet und startet - da hast du recht. Ich bekomme aber von einer Messerfassungskarte einen konstanten Sinus, den ich aus einem Fifo auslese. Der Fifo ist ausreichend groß dimensioniert, so dass ein Überlauf ausgeschlossen werden kann. Dennoch werden die Daten bei der Fkt. write forward falsch eingefügt, bei write backward jedoch richtig, es sieht so aus, als ob die Funktion an irgendwelchen Stellen etwas abschneidet.
In den angehängten Bildern sind nochmal beide Funktionen zu sehen - jetzt nicht über den erzeugten Sinustest, sondern richtig über die Messerfassungshardware und bei der Funktion "write forward" kommt nicht sinvolles bei heraus. Nicht mal die Rampe wird richtig dargestellt.
Jetzt hab ich bei der Funktion "write forward" nochmal eine Arraydrehung vorgenommen mit der Funktion 1D-Array umkehren (siehe angehängtes Bild linke Seite mit Kringel). Der Sinus sieht so nun sehenswert aus, nicht mehr zerhackt. Aber die Rampe ist falsch. Es ist nun eine fallende Rampe und keine steigende Rampe, obwohl die Werte von 0-4000 hochgezählt werden und nicht von 4000-0 herabgezählt werden sollen, wie in der rechten Seite zu sehen ist.
Aus irgendeinem Grund wird das Array in der Funktion "write forward" nicht richtig in den Fifo hineingesetzt. Woran könnte das liegen?
du drehst durch die Indizierung an der for-Schleife beide Spalten deines 2D Arrays um. Dadurch dreht sich dein Sinus als auch deine Rampe. Wenn du wie in Abb.1 die Rampe aus der Drehung entfernst, sieht beides schön aus.
du drehst durch die Indizierung an der for-Schleife beide Spalten deines 2D Arrays um. Dadurch dreht sich dein Sinus als auch deine Rampe. Wenn du wie in Abb.1 die Rampe aus der Drehung entfernst, sieht beides schön aus.
Hmm, ok, was soll ich dazu sagen. Sicherlich sieht der Sinus dann "schön" aus, aber von einem schönen Aussehen habe ich nicht so viel. Der Sinus ist bei der Drehung dann um 90 Grad phasenverschoben. Natürlich könnte ich jetzt eine Korrekturfunktion einbauen, die den Sinus dann wieder richtig schiebt...
Und was ist, wenn sich die Signalreihenfolge mal ändert und ich anders herum die Signale in meine Anzeige einpräge? Dann müsste ich auch die Drehung umkehren. Das kann aber nicht sein. Es muss beim Einfügen des Arrays ein genereller Fehler in dem von mir entworfenen Programm vorliegen, den ich bis dato noch nicht gefunden habe.
11.08.2016, 16:50 (Dieser Beitrag wurde zuletzt bearbeitet: 11.08.2016 16:52 von IchSelbst.)
(11.08.2016 12:56 )Hasenfuss schrieb: ein neues Array erstellen würde bedeuten, dass neue Operationen im Speicher stattfinden, also neue Speicherbereiche allokieren, die alten freigeben. Aus früheren Beiträgen von vielen Usern hier drinnen habe ich gelernt, dass man ein Array am besten mit fester Länge definiert und dann Arrayrotationen oder Ersetzungen vornimmt, jedoch neue Arrays erstellen vermeiden soll.
Du hast zwar Recht, aber das hindert dich nicht daran es trotzdem auszuprobieren. Das Ergebnis der Probe lässt ggf. Rückschlüsse zu, warum es mit "Teilarray ersetzen" nicht geht.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).