INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Dieses Thema hat akzeptierte Lösungen:

Sinus Sweep



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.10.2020, 13:28
Beitrag #1

janso Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Oct 2020

2017
-
EN



Sinus Sweep
Hallo zusammen,

Ich bin relativ frisch bei LabView und versuche mich gerade an der Generierung eines Sinus Sweeps. Hierzu benutzte ich den HS3 von der Firma TiePie als Generator. Da dieser kein Ni Modul ist, muss ich für die Steuerung jedoch mit .dll´s arbeiten die mir die passenden vi`s ausgeben.

Der generierte Sinus Sweep wird als 1D Array von doubles ausgegeben. Um die Daten an den Generator zu übergeben nutze ich eine vi des Generators die als Eingangssignal jedoch einen pBuffer mit singles erwartet.
Leider habe ich zu pBuffern noch nichts gefunden. Kann mir hier jemand helfen und sagen, wie ich da Array per pBuffer an die vi übergebe?

Es soll hierbei ein Sinus sweep von 100 Hz bis 20 kHz erzeugt werden.

Besten Dank schon mal
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
15.10.2020, 14:20
Beitrag #2

Martin.Henz Offline
LVF-Team
LVF-Team

Beiträge: 429
Registriert seit: Jan 2005

2.5.1 bis 20
1992
kA

74363
Deutschland
RE: Sinus Sweep
Hallo janso,

hmm, einen LabVIEW Treiber gibt es anscheinend nicht und du musst über die DLL Aufrufe der LabTiePie DLL API gehen. Das ist nicht gerade eine Übung für Anfänger :-)

Wenn du C und LabVIEW einigermaßen kennst, sollte es aber gehen. Es gibt zwar einen Import Wizard, aber der liefert auch nicht unbedingt super perfekte Resultate. Du wirst also erst einmal eine Menge lesen müssen. Auf der NI Webseite gibt es dazu ein bisschen mehr Informationen.

Aber wer weis, vielleicht hat hier irgend jemand bessere Ideen oder gar Zeit und Lust sich die Doku der LabTiePie API anzusehen.

Davon abgesehen, Poste doch hier einmal das VI, das du gemacht hast, dann ist es einfacher als eine eher allgemeine Frage zu stellen zu der manch einer ein halbes Buch als Antwort schreiben könnte.

Martin Henz
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.10.2020, 14:32
Beitrag #3

janso Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Oct 2020

2017
-
EN



RE: Sinus Sweep
Hallo Martin,
Danke für deine schnelle Antwort. Leider bin ich mit C überhaupt nicht familiär, außer dass ich das vor langer Zeit mal in der Uni gehört habe.

Die vi die von mir erstellt wurde richtet sich größten Teils nach der Vorlage die LibTiePie für die Nutzung des Generators auf der Website hat.

Ist es denn möglich die VI ohne die zugehörige .dll Datei vollständig zu öffnen?

Im Grunde funktioniert von der vi alles bis auf die Datenübergabe. Der Sweep wird zumindest laut den Indikatoren erzeugt und der Generator startet, was auch am externen Oscilloscop sichtbar ist. Leider spielt dieser aber nach dem Start keine Daten ab, was wohl an der Übergabe per pointer to buffer liegen sollte.

Ich habe das Vi mal angehangen.

Alternativ kann ich den Generator auch per Python ansteuern. Gibt es denn sonst die Möglichkeit den Python Code in ein Vi zu überführen?

Besten Dank


Angehängte Datei(en)
17.0 .vi  LibTiePie V1.vi (Größe: 74,67 KB / Downloads: 247)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.10.2020, 15:45
Beitrag #4

Martin.Henz Offline
LVF-Team
LVF-Team

Beiträge: 429
Registriert seit: Jan 2005

2.5.1 bis 20
1992
kA

74363
Deutschland
RE: Sinus Sweep

Akzeptierte Lösung

Hmm, in den VIs aus <userlib>:\Lib\VIs steckt wohl der entscheidendere Teil ( - aber die habe ich nicht.
Wenn die alle (oder fast alle) funktionieren, dann bist du schon ziemlich weit gekommen. Wenn ich mich nicht irre, dann dürfte es jetzt an Gen Set Data.vi hängen.
(BTW: schöner machen kannst du alles immer noch, wenn es erst einmal funktioniert)

void GenSetData (LibTiePieHandle_t hDevice,
const float * pBuffer,
uint64_t qwSampleCount
);

also im ersten Ansatz etwa so:


17.0 .vi  GenSetData.vi (Größe: 738,2 KB / Downloads: 268)

Martin Henz
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.10.2020, 16:09
Beitrag #5

janso Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Oct 2020

2017
-
EN



RE: Sinus Sweep
Hallo Martin,

Vielen Dank dir, damit funktioniert es tatsächlich wunderbar. Ich merke aber noch, dass der Sweep momentan abhängig von der Wartezeit ist, die ich im Frame mit der vi GenStart implementiert habe. Ist es nicht eigentlich so, dass Frames die Funktionen so voneinander abgrenzen, dass diese Frame nach Frame komplett ablaufen. Ich hoffe die Frage ist verständlich. Muss ich hier sonst erneut mit einer for schleife arbeiten, sodass erst alle Daten vom Generator abgespielt werden, bevor dieser sich wieder schließt?

Besten Dank nochmal, das hat mir wirklich sehr geholfen.

Beste Grüße
Janso
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.10.2020, 18:34
Beitrag #6

Martin.Henz Offline
LVF-Team
LVF-Team

Beiträge: 429
Registriert seit: Jan 2005

2.5.1 bis 20
1992
kA

74363
Deutschland
RE: Sinus Sweep
Vielleicht funktioniert mein VI - vielleicht aber auch nicht. Dazu später mehr.

Im Prinzip hast du recht, LabVIEW wird die 800ms warten bevor der nächste Frame ausgeführt wird. So beschreibt es NI und so sollte es ja eigentlich auch sein. Ähm - ich zweifle manchmal, ob das auch wirklich ganz exakt so ist. In deinem Fall solltest du diesbezüglich jedoch keinerlei Bedenken haben. Es gibt in dem Zusammenhang einen anderen Punkt. GenStart braucht etwas Zeit (du weist nicht, was diese API Funktion wirklich macht und wann der Funktionsgenerator wirklich startet. Auch die anderen beiden VIs könnten das ein klein wenig verzögern. Du brauchst eine Funktion mit der du prüfen kannst, ob die Daten alle ausgegeben wurden bevor du GenStop ausführst. Ich habe die Doku nur kurz überflogen - eventuell bekommst du diese Information über GenIsControllable(). Diese, bzw. eine dafür geeignete Funktion der API, fragst du in einer while schleife zyklisch ab (mit kurzen delays dazwischen und mit einem Timeout versehen) bis die Ausgabe vollständig erfolgt ist (oder der Timeout abgelaufen ist). Dann erst führst du GenStop() aus.

Jetzt noch etwas allgemeines:
Mein GenSetData ist genauso hingeklatscht, wie deine VIs. Das kann/darf/sollte nicht so bleiben. Alle VIs und Funktionen die Geräte oder irgendwelche Schnittstellen ansprechen haben am Eingang eine Referenz (bei dir das hDevice) links oben und einen Error Cluster links unten. Am Ausgang genauso (siehe VISA, TCP/IP, DAQmx usw.). Liegt am Eingang bereits ein Fehler an, dann macht das VI nichts weiter außer den Error Cluster durchzureichen. Genauso sollten auch deine VIs funktionieren. Wenn du das konsequent so machst und auch so verwendest, dann brauchst du keine Sequenz mehr. Außerdem wird ein brauchbares Fehlerhandling benötigt. Das wird in die einzelnen VIs fest integriert. Ich habe mein VI (ohne hübsches Icon und noch etwas unvollständig) mal entsprechend angepasst, damit etwas klarer wird, was ich gerade beschrieben habe.


17.0 .vi  GenSetData.vi (Größe: 11,22 KB / Downloads: 269)


Zum Schluss eine Anmerkung zu meinem ersten Satz.
Ich weis nicht genau, was GenSetData tatsächlich macht und die Doku gibt dazu auch nicht viel her oder ich habe es nicht gelesen.
Wenn GenSetData() die Daten sofort zum Gerät überträgt dann ist alles i.O.
Wenn GenSetData() die Daten in seinen eigenen Zwischenspeicher kopiert, dann ist auch alles i.O.

Falls GenSetData() den Pointer pBuffer und damit auch die Daten dazu verwendet um sie später nach und nach in kleineren Blöcken zum Gerät zu übertragen, dann merkst du jetzt noch gar nicht, dass es so nicht funktioniert. Wenn die Funktion GenSetData() beendet ist, dann ist der Pointer (und damit die Daten) nicht mehr gültig. LabVIEW wird bei dem derzeit noch einfachen Programm die Daten nicht sofort löschen und auch nicht überschreiben. Du würdest derzeit gar nicht merken, dass es so nicht funktioniert. Bei einem umfangreicheren Programm würde dir das ganz heftig um die Ohren fliegen - und du weist nicht wo und warum und kannst es auch nicht debuggen. Sollte GenSetData() so funktionieren, was ich nicht hoffe, dann wird es etwas komplizierter mit der Übergabe der Daten. Da musst du dann die Funktionen des LabVIEW Speichermanagers nutzen. Dies wollte ich dir noch mit auf den Weg geben. Es könnte ja sein, dass sich LabVIEW irgendwann häufig aber unregelmäßig mit oder auch ohne vorherige Meldung immer wieder verabschiedet. Das muss dann zwar nicht zwangsweise an GenSetData() liegen, aber es wäre denkbar.

Martin Henz
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Werten einen Sinus überlagern sarah_gru 1 3.441 09.09.2019 12:34
Letzter Beitrag: HVo
  Sinus als Grundschwingung + 3. Harmonische digitus 2 5.941 18.05.2015 18:34
Letzter Beitrag: digitus
  analoger Sinus Sweep Output tg_1909 6 8.446 15.05.2015 09:54
Letzter Beitrag: tg_1909
  Sinus-Signal in Array duckVader 3 7.600 08.11.2014 19:42
Letzter Beitrag: Lucki
  Sinus/Cosinus Werte kontinuierlich in Graph darstellen TDO 19 19.147 13.12.2013 11:33
Letzter Beitrag: Lucki
  Sinus mit Rauschen überlagern Pral 2 6.880 17.11.2012 12:01
Letzter Beitrag: Pral

Gehe zu: