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 

Array initalisieren über DLL Funktion



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!

28.08.2012, 09:34
Beitrag #1

Forti Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Aug 2012

8.5
2012
DE



Array initalisieren über DLL Funktion
Hallo,

dies ist mein erster Post in diesem Forum, bitte weist mich auf fehlende Informationen hin, danke! Smile

Ich habe ein Problem mit der Initalisierung eines Arrays in Labview. Ich verwende eine DLL, dieser übergebe ich den Zeiger auf einen Unsigned 32bit Integer (in Form einer numerischen Konstante in Labview) und über die Parametereinstellung "Zeiger auf Wert" in der VI zum Aufruf externer Bibliotheken. Als Rückgabe erhalte ich von der DLL einen Unsigned 8bit Integer, welcher als Dimensionsgröße meines zu initialisierenden Arrays dienen soll. Leider stürzt das Programm (vermutlich an dieser Stelle) ab. Und zwar scheinbar abhängig davon, ob ich die Numerische Konstante (welche ich als Pointer an das VI übergebe) mit "0" festlege (kompletter Programmabsturz) oder einer anderen Zahl (z.B. "5"), dann gibt es eine Meldung, dass der Speicher voll sei. Wenn ich eine andere Zahl als 0 wähle, kann ich mir das initialisierte Array ausgeben, allerdings ist die Länge scheinbar nicht, oder nur teilweise, durch die DLL beeinflusst (bei 5 ist das Array auch nur 5 lang, bei größeren Werten ändert sich die Länge allerdings seltsamerweise).

Kann mir jemand sagen, wo das Problem liegen könnte?

Vielen Dank!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
28.08.2012, 19:27
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Array initalisieren über DLL Funktion
(28.08.2012 09:34 )Forti schrieb:  Hallo,

dies ist mein erster Post in diesem Forum, bitte weist mich auf fehlende Informationen hin, danke! Smile

Dann lass Deinen Code doch mal sehen! Prosa ist schön und gut aber hilft in solchen Dingen nur sehr eingeschränkt, um sich ein Bild machen zu können, was Du denn genau getan hast und wo das Problem eventuel liegen könnte.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.08.2012, 20:05
Beitrag #3

NWOmason Offline
Simultator
*****


Beiträge: 1.078
Registriert seit: Dec 2010

2012.SP1
2008
EN

93047
Deutschland
RE: Array initalisieren über DLL Funktion
(28.08.2012 09:34 )Forti schrieb:  allerdings ist die Länge scheinbar nicht, oder nur teilweise, durch die DLL beeinflusst (bei 5 ist das Array auch nur 5 lang, bei größeren Werten ändert sich die Länge allerdings seltsamerweise).

Hast du die DLL selbst geschrieben oder verwendest du sie nur?

Einfach mal den Code posten, dann kann dir der 'Lord of DLLs' (aka rolfk) weiterhelfen Big Grin

Beste Grüße,
NWO

9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris
.

NI schrieb:To use the abort button is like using a tree to stop a car!

(20.01.2012 11:02 )NWOmason schrieb:  Getting Started with NI LabVIEW Student Training
http://zone.ni.com/devzone/cda/tut/p/id/7466

Introduction to NI LabVIEW - Learn LabVIEW Basics
http://www.ni.com/gettingstarted/labviewbasics/

Top 5 der Empfehlungen für LabVIEW-Einsteiger
http://www.ni.com/newsletter/51735/de/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2012, 08:04 (Dieser Beitrag wurde zuletzt bearbeitet: 29.08.2012 08:23 von Forti.)
Beitrag #4

Forti Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Aug 2012

8.5
2012
DE



RE: Array initalisieren über DLL Funktion
Leider verwende ich sie nur. Es handelt sich um eine PVCAM software zur Kamerasteuerung. Ich kann euch da also leider keinen Code Zeigen. Oder meint ihr etwas anderes?

Ist der Wert den ich in meine numerische Konstante schreibe überhaupt relevant, oder sollte er das sein?

Ich habe mal meine VI als Attachment hinzugefügt.

Dies ist aus der Header Datei der DLL, und ich glaube an dieser Stelle in der VI tritt der Fehler auf:

rs_bool PV_DECL pl_exp_setup_seq (int16 hcam, uns16 exp_total,
uns16 rgn_total, rgn_const_ptr rgn_array,
int16 exp_mode, uns32 exposure_time,
uns32_ptr exp_bytes);


Im Handbuch der Kamerasoftware steht:

rs_bool pl_exp_setup(int16 hcam, uns16 exp_total, uns16 rgn_total, rgn_const_ptr rgn_array, int16 mode, uns32 exposure_time, uns32_ptr stream_size)


Angehängte Datei(en)
8.5 .vi  test1.vi (Größe: 27,16 KB / Downloads: 224)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2012, 09:53 (Dieser Beitrag wurde zuletzt bearbeitet: 29.08.2012 10:03 von rolfk.)
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Array initalisieren über DLL Funktion
(29.08.2012 08:04 )Forti schrieb:  Leider verwende ich sie nur. Es handelt sich um eine PVCAM software zur Kamerasteuerung. Ich kann euch da also leider keinen Code Zeigen. Oder meint ihr etwas anderes?

Ist der Wert den ich in meine numerische Konstante schreibe überhaupt relevant, oder sollte er das sein?

Ich habe mal meine VI als Attachment hinzugefügt.

Dies ist aus der Header Datei der DLL, und ich glaube an dieser Stelle in der VI tritt der Fehler auf:

rs_bool PV_DECL pl_exp_setup_seq (int16 hcam, uns16 exp_total,
uns16 rgn_total, rgn_const_ptr rgn_array,
int16 exp_mode, uns32 exposure_time,
uns32_ptr exp_bytes);


Im Handbuch der Kamerasoftware steht:

rs_bool pl_exp_setup(int16 hcam, uns16 exp_total, uns16 rgn_total, rgn_const_ptr rgn_array, int16 mode, uns32 exposure_time, uns32_ptr stream_size)

Ich dachte sowohl an die LabVIEW VIs als auch an die Header Files! Was steht dort drin als Deklaration für rgn_const_ptr? Die anderen Parameter sind auch alles custom types aber ich vermute (hoffe) mal dass die gewählten Namen sinngemäss sind, aber das ist immer so eine Sache mit Annahmen. Viele Programmierer haben da so ihre eigenen Ideen die manchmal ziemlich unlogisch erscheinen können.

Zudem muss der Fehler nicht unbedingt in der Funktion liegen wo es crasht, sondern kann auch davor irgendwo geschehen sein, nur stolpert vielleicht erst diese Funktion über allenfalls inkonsistente Daten.

Zum Beispiel ist der Aufruf von pl_cam_get_name() mit einem leeren String als zweiten Parameter ein garantierter Fall von direktem oder indirektem Crashprovozierer. Wenn Du eine C Funktion aufrufst kann die nicht nach Bedarf Speicher reallozieren so wie das in LabVIEW überall passiert, sondern Du musst ihr für alle Parameter genug Speicher verfügbar stellen, in den sie dann schrieben kann. Das kann am einfachsten in der CLN Konfiguration mit dem Minimum Size value für diesen Parameter, aber ich ziehe eine explizite Initialisierung im Diagramm vor mittels Initialize Array und Byte Array to String Funktion, da die Konfiguration dieses sehr wichtige Detail ziemlich gemein versteckt.

Wie gross dieser Buffer sein muss musst Du der Dokumentation entnehmen. Die Library wird intern irgend einen Maximum size verwenden für die Namen und das ist dort dokumentiert. Niemand anders kann Dir das sagen.

Selbiges Problem natürlich auch für pl_error_message()!

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.08.2012, 10:12 (Dieser Beitrag wurde zuletzt bearbeitet: 29.08.2012 10:14 von Forti.)
Beitrag #6

Forti Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Aug 2012

8.5
2012
DE



RE: Array initalisieren über DLL Funktion
ok, ich habe es "zum laufen" gebracht (das Problem war eine falsche Angabe des Modes in der VI), ich danke euch für eure Mühe Smile

Ich werde mir auch die von dir genannten Punkte noch einmal anschauen (da das Programm hin und wieder abstürzt und ich noch suche woran es liegen könnte)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
29.08.2012, 13:06
Beitrag #7

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Array initalisieren über DLL Funktion
(29.08.2012 10:12 )Forti schrieb:  Ich werde mir auch die von dir genannten Punkte noch einmal anschauen (da das Programm hin und wieder abstürzt und ich noch suche woran es liegen könnte)

Buffer overrun Fehler (denn das ist es eigentlich wenn Du einer Funktion zu kleine Buffer übergibst und diese Funktion dann über das Ende des allozierten Buffers schreibt) sind eine typische Ursache von sporadischen Crashes. Je nachdem was die Funktion gerade überschreibt kann es im Glücksfall gleich crashen, oder irgendwann mal später, etwa beim Abschliessen des Programmes wenn LabVIEW versucht alle Resourcen ordnungsgemäss freuizugeben und dann über die zerstörten Pointer im Speicher stolpert, oder im schlimmsten Fall crasht es gar nicht. Und ich sage hier bewusst "im schlimmsten Fall" denn das sind die Fehler die entweder Variablen überschreiben so dass Dein mehr oder weniger komplizierter Algorithmus völlig idiotische (oder auch nur ganz leicht falsche) Resultate liefert oder urplötzlich doch crasht, wenn Du scheinbar kleine Anpassungen an der Applikation gemacht hast die die Reihenfolge und Anordnung von Elementen im Speicher verändert hat, so dass nun plötzlich doch ein Fehler oder Crash auftritt. Und da dann auf die Idee zu kommen alle DLL Aufrufe nochmals gründlich zu checken, statt den Fehler in den letzten Änderungen zu suchen ist oft nicht ganz vor der Hand liegend, aber die einzige richtige Lösung.

Deshalb tendiere ich immer mehr zu der Meinung: Wer mit der Call Library Node rumspielt ohne wirklich SEHR genau zu wissen was er tut, und das Resultat dann in eine Produktionssoftware übernimmt, handelt eigentlich grobfahrlässig. Wenn die Applikation nur ein Messdatenfile produziert, kann das im schlimmsten Fall bedeuten, dass die damit erfassten Daten alle wertlos sind, also eine mehr oder weniger grosse finanzielle Katastrophe. Aber wenn dieselbe Applikation auch Motion und was noch mehr enthält und bei einer Fehlfunktion potentiel Menschenleben gefährden kann, dann ist es schlichtweg unverantwortlich.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Array Elemnte von externer Funktion verbinden Heili 3 5.362 12.11.2010 13:54
Letzter Beitrag: Lucki
  Über externen Code Interface Array zurückbekommen? dr.smirnoff 7 8.349 13.05.2005 10:32
Letzter Beitrag: didierj

Gehe zu: