07.12.2010, 11:07
Beitrag #1
|
eug
LVF-Neueinsteiger
Beiträge: 7
Registriert seit: Oct 2010
Developer Suite 2010
-
de
Deutschland
|
C-dll einbinden: LabVIEW hängt
<blockquote>Hallo zusammen,
ich muss c-DLL (Borland) in LabVIEW 2010 einpacken und als Bibliothek (subVIs) unseren Kunden abgeben.
Meine subVI soll Daten von RS232 kontinuierlich (while-Schleife) lesen und in Puffer speichern.
DLL:
//header Datei
export.h
#ifndef _EXPORT_H
#define _EXPORT_H
.
.
.
extern "C" short __declspec(dllexport) WINAPI D_Thread_ReceiveCont(void * puf, BOOL * abbruch);
#endif
Beschreibung:
puf : Zeiger auf den Puffer für den Messdatensatz. Der Puffer (struct) muss mindestens eine Länge 2300 Bytes haben.
abbruch: wenn „TRUE“, Messung wird abgebrochen.
Probleme:
subVI „hängt“ ohne Fehlermeldung oder LabVIEW wird abgestürzt.
Kann mir jemand helfen?
Vielen Dank
Gruß
eug</blockquote>
|
|
|
07.12.2010, 21:05
Beitrag #2
|
IchSelbst
LVF-Guru
Beiträge: 3.700
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
C-dll einbinden: LabVIEW hängt
' schrieb:kontinuierlich (while-Schleife) lesen und in Puffer speichern.
Hier sehe ich Probleme.
Du hast also in einer Funktion innerhalb der DLL eine While-Schleife, die an sich kontinuierlich läuft. Während sie läuft, soll sie Daten in einen Puffer schreiben, der sich in LV befinden. Richtig so?
Und dann soll die While-Schleife auch noch abbrechbar sein?
Schreibst ihr die DLL komplett selbst? Dann könntest ihr euch doch an die Gegebenheiten von LV anpassen, oder nicht?
Zitat:subVI „hängt“ ohne Fehlermeldung oder LabVIEW wird abgestürzt.
Wo ein Pointer in Spiel ist, stürzt ein Programm gerne mal ab.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
08.12.2010, 02:28
Beitrag #3
|
|
|
08.12.2010, 11:21
Beitrag #4
|
eug
LVF-Neueinsteiger
Beiträge: 7
Registriert seit: Oct 2010
Developer Suite 2010
-
de
Deutschland
|
C-dll einbinden: LabVIEW hängt
Hallo zusammen!
Sehr geehrter Guru IchSelbst und Guru rolfk,
tatsächlich, in diese Funktion stehet "do-while(!abbruch)" - Schleife (das ist meine Fehler- ich habe es nicht bemerkt).
Diese Funktion:
extern "C" short __declspec(dllexport) WINAPI D_Thread_ReceiveCont(void * puf, BOOL * abbruch);
soll Messdatensätze von der RS232 ablesen in "struct XY" (2300 Bytes). Ich vermute, dass soll ich für "XY" durch puf Speicher allokieren.(z.B. Array U8 length 2300)
Genau diese Messdatensätze ("XY"), möchte ich für weitere Funktionen (aus DLL) übergeben und am Ende, will ich Messdaten in LabVIEW zeigen.
Leider DLL ist nicht von mir: ich habe es geerbt. Quellcode kann ich nicht ändern.
Und außerdem, ich bin Anfänger in LW, deswegen, kenne ich nicht alle Verfahrungen um DLL in LW einzupacken.
Habe Sie Ideen?
Vielen Dank
Gruß
eug
|
|
|
08.12.2010, 12:16
Beitrag #5
|
|
|
08.12.2010, 14:09
Beitrag #6
|
eug
LVF-Neueinsteiger
Beiträge: 7
Registriert seit: Oct 2010
Developer Suite 2010
-
de
Deutschland
|
C-dll einbinden: LabVIEW hängt
' schrieb:Das sieht schlecht aus! Solange die DLL Funktion nicht zurückkehrt kann LabVIEW mit den Werten im Buffer rein gar nichts tun. Das "do while" construct ist also ein ganz böser Killer hier und gelinde gesagt ist das sowieso eine Hackfunktion in dieser Weise. Das funktioniert in keiner einzigen modernen Programmierumgebung sinnvoll, ausser man macht ein dumbes 3 Zeiler Konsolenprogramm in C.
Ohne diese Funktion grundsätzlich zu modernisieren sehe ich da keine sinnvolle Möglichkeit um das auf eine gute Art in LabVIEW zu integrieren.
Da die ganze Kommunikation eh seriel ist denke ich aber das die Implementation dieser Funktion ganz in LabVIEW mittels VISA Funktionen 120% sicher die viel einfachere und bessere Lösung ist.
Hier ist Ablauflogik für diese Funktion:
test.c
struct XY //2300 Bytes
{
………
};
BOOL* D_Abbruch = false;
short D_Thread_ReceiveCont(void * puf, BOOL * abbruch)
{
.
.
XY *buffer = (XY *)puf;
bool dat_ok = false;
D_Abbruch = abbruch;
.
.
do
{
while( DatenLesen1() )
{
if(D_Abbruch == true)
{ return 6;} // Abbruchcode
.
.
dat_ok = true;
}
}
while(!dat_ok)
}
return 0;
Also, die Fuktion hat keine endloseschleife:
mit abbruch kann man zwangsweise Funktion abbrechen;
mit dat_ok das passiert automatisch wenn, DatenLesen1() ist gut gelaufen (Messwerte gelesen).
Die Funktion liest nur ein Messwert und dann return.
Frage:l
Soll ich subVI organisieren für einzige Messwert und dann "in LW" subVi in while kapseln?
Vielen Dank
eug
|
|
|
21.12.2010, 17:13
(Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2010 00:18 von jg.)
Beitrag #8
|
eug
LVF-Neueinsteiger
Beiträge: 7
Registriert seit: Oct 2010
Developer Suite 2010
-
de
Deutschland
|
C-dll einbinden: LabVIEW hängt
Hallo LVF-Gurrus,
ich habe meine DLL so in LV angepackt, wie in Tutorial " Einbinden einer DLL in LV" beschrieben.
Aber Software läuft nicht stabil:
manchmal nach 5e, manchmal nach 200e Iterationen stürzt die ab.
Hier ist ein Beispiel:
Test1.vi (Größe: 17,14 KB / Downloads: 337)
PS: ohne Gerät VIs funktioniert nicht. passwort: qwert.
Bitte, wer hat Ahnung, helfen Sie mir!
|
|
|
22.12.2010, 08:21
(Dieser Beitrag wurde zuletzt bearbeitet: 22.12.2010 08:22 von Y-P.)
|
Y-P
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
Beiträge: 12.612
Registriert seit: Feb 2006
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
|
C-dll einbinden: LabVIEW hängt
@rolfk:
Hier ist sein VI für LabVIEW 8.0, allerdings fehlen die ganzen SubVIs :
Test1.vi (Größe: 20,72 KB / Downloads: 377)
Gruß Markus
--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
|
|
|
| |