JMG Geschrieben December 8, 2021 at 08:39 Geschrieben December 8, 2021 at 08:39 Guten Tag miteinander Ich bin eher neu in C und in diesem Forum. (Bekommt man mehr Antworten wenn man auf Englisch posted?) Nun meine eigentliche Frage: Ich habe ein IMU Brick 2.0 und würde gerne aus dem C code ein dll erstellen wobei der Output der Funktion die Messdaten in Euler Winkel sein sollen. Wie stellt man das an? Momentan verwende ich das example_all_data.c file und dort werden die Messdaten über imu_v2_register_callback und darin genested cb_all_data aufgerufen. Wie bekomme ich nun die Messdaten in die main() Ebene des Programmes (example_all_data). Anders gesagt wie bekomme ich die Eulerangles in der höchsten Ebene des Programms so dass ich diese Messungen als Variable auspucken kann? Gruss Jeremy Zitieren
Stargate Geschrieben December 14, 2021 at 17:51 Geschrieben December 14, 2021 at 17:51 Moin, vielleicht wäre es leichter dir zu helfen, wenn du uns mitteilen würdest, was genau du machen möchtest. Da du Anfänger bist, würde ich dir empfehlen, erstmal dich an den gegebenen Beispielen und der Hilfe von Tinkerforge lang zu hangeln. Besonders das example_simple.c ist für den Anfang echt nicht schlecht. Du bekommst die Daten genau dann wenn du sie abrufst und landen auch an der Stelle wo du sie haben willst. Allerdings sind das nicht die Eulerwinkel, dazu musst du die Funktion imu_v2_get_orientation verwenden. Vielleicht reicht dir das dann auch schon für den Anfang. Von da aus kannst du das dann in eine DLL auslagern, wenn überhaupt nötig. Wenn du allerdings callbacks verwenden möchtest, schaue dir das Beispiel genauer an. Das ...register_callback übergibt eine Funktion die die Daten verarbeitet (cb_all_data), und da stehen die Daten auch zur Verfügung. Die Funktion wird auch ausgeführt wenn deine main() eine pause macht und z.B. auf eine Tasteneingabe wartet. Also vielleicht einfach mal in Threads und Synchronisation einlesen ;) MfG, Nils Zitieren
JMG Geschrieben December 15, 2021 at 14:28 Autor Geschrieben December 15, 2021 at 14:28 Hallo Nils Danke für den Tip. ich werde die mal genauer anschauen. Ich weiss allerdings nicht ob mir die Callback funktion einen Vorteil gibt. Vieleicht kannst Du mich da beraten. Was ich vor habe: Ich möchte das IMU über einen Realtime controller von NI auslesen. Diese kann allerdings nicht den Brick Deamon ausführen da darauf kein Windows Betriebssystem sondern PharLaps darauf läuft. Zudem kommt NI Realtime nicht mit .net aus, daher kann ich das Labview API nicht verwenden. Deswegen habe ich zu dem IMU BRick 2.0 auch einen Masterbrick und Ether extension angeschaft. Somit sollte ich die kommunikation auch ohne den Brick Deamon funktionieren. (Bezüglich DLL: Das dll würde ich dann bei Labview realtime einlesen. ) Nun was ich machen möchte ist die Orientierung des IMU bricks auszulesen und meinen Regelsystem füttern. Dort habe ich einen loop der mir ständig die Messwerte füttert und die Controlgrössen auspuckt. Daher könnte gut sein das ich die Callback gar nicht brauche. Oder ich hab die Callback Funktionalität einfach nicht verstanden. (Nun nach ausprobieren verwende ich die Qaternionwinkel und wandle sie in XYZ Cardan Winkel um. Daher brauche ich auch die RollGierNick winkel nicht mehr.) Danke für die Auskunft. Jeremy Zitieren
Stargate Geschrieben December 20, 2021 at 20:26 Geschrieben December 20, 2021 at 20:26 Moin Jeremy, ich selber benutze die callbacks ganz gerne, aber ich habe da auch etwas andere Voraussetzungen, da ich mit c++ und Qt arbeite, und der Vollständigkeit halber, mit Windows habe ich auch nix am Hut. Bin mit Linux ganz zufrieden ;) Bei dir sieht das wohl etwas anders aus. Vielleicht reicht es ja auch einfach eine DLL zu erstellen und die Header mit zur Verfügung zu stellen. Wie du eine DLL erstellst, kannst du dir vielleicht von Dmitry abschauen: https://stackoverflow.com/questions/31352215/c-makefile-building-multiple-dll-and-project-structuring In die DLL sollten wohl die Dateien brick_imu_v2.c und ip_connection.c. Dann die entsprechenden Header mit zur Verfügung stellen. Wenn das klappt, ist vermutlich die Hälfte schon geschafft. Dann musst du nur den Code nur noch aufrufen, aber wie das bei deinem System geht, kann ich dir leider nicht sagen. Ich drück dir die Daumen :) Nils Zitieren
fridolin11 Geschrieben January 5, 2023 at 07:53 Geschrieben January 5, 2023 at 07:53 Hallo Jeremy Konntest du das Problem Lösen um die Messwerte in die main() Ebene zu bekommen von den Callbacks? Ich habe momentan das Selbe Problem und kann leider nicht die Simple Lösung mit der Abfrage verwenden, da diese zu langsam ist. Die Funktion, welche Nils erwähnt hat, welche von ...register_callback übergeben wird hilft mir leider auch nicht weiter. Diese gibt ja keinen Wert zurück (return ...) und ich habe auch keinen pointer in der main() Ebene welcher mir den Messwert aufzeigt. Das einzige was die Funktion macht ist, den Messwert in Serial Monitor zu schreiben, was mir nicht viel hilft: tf_hal_printf("Voltage: %d 1/%d V\n", voltage, 1000); (Ich verwende den ESP32 Brick und möchte das Industrial dual analog in Bricklet mit mindestens 200 Hz auslesen können) Kann ich die Funktion welche von ...register_callback übergeben wird irgendwie anpassen, damit der Messwert in der Main() ebene übergeben wird? Freundliche Grüsse Fridolin Zitieren
rtrbt Geschrieben January 9, 2023 at 09:57 Geschrieben January 9, 2023 at 09:57 On 1/5/2023 at 8:53 AM, fridolin11 said: Kann ich die Funktion welche von ...register_callback übergeben wird irgendwie anpassen, damit der Messwert in der Main() ebene übergeben wird? Dafür gibt es den void *user_data Parameter der Callbacks: Was auch immer du in der ...register_callback-Funktion als user_data übergibst, bekommst du in der Callback-Funktion als user_data-Parameter. Darüber kannst du dir zum Beispiel einen Pointer ins Callback stecken, der dir sagt wo die voltage hingeschrieben werden soll. Beispielsweise (gekürzt und verändert von hier:) // last_voltage ist hier eine globale Variable, könnte aber auch z.b. ein Struktur-Member sein. static int32_t last_voltage; // Callback function for voltage callback static void voltage_handler(TF_IndustrialDualAnalogInV2 *device, uint8_t channel, int32_t voltage, void *user_data) { (void)device; // avoid unused parameter warning int32_t *write_to = (int32_t *)user_data; *write_to = voltage; } static TF_IndustrialDualAnalogInV2 idai; void example_setup(TF_HAL *hal) { //[...] // Hier den Pointer übergeben, den das Callback schreiben soll tf_industrial_dual_analog_in_v2_register_voltage_callback(&idai, voltage_handler, &last_voltage); //[...] } Zitieren
fridolin11 Geschrieben January 10, 2023 at 08:12 Geschrieben January 10, 2023 at 08:12 Vielen Dank für deine Antwort! Jetzt verstehe ich die Callback Funktionen besser! Zusammen mit der Antwort von photron von der verlinkten Seite läuft nun mein Programm wie gewünscht :) Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.