26.03.2008, 20:59
|
IchSelbst
LVF-Guru
Beiträge: 3.692
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
CPC
' schrieb:Wenn Funktionen nicht erkannt oder falsch erkannt werden, wie kann ich die Funktionen trotzdem als VI darstellen???
Indem du mittels eines DLL-Knotens die Funktion "von Hand" aufrufst. Wie der DLL-Knoten zu konfigurieren ist, steht im Header-File.
Bei Funktionen, die den Parameter CPC_CAN_MSG_T enthalten, kannst du diesen Parameter durch ein Array of Char, Länge 13, ersetzen.
Die Fuktionen CPC_AddHandler, CPC_RemoveHandler, CPC_AddHandlerEx und CPC_RemoveHandlerEx kannst du in LV nicht verwenden, da hier ein Funktionspointer (für CallBack) übergeben werden.
typedef struct CPC_CAN_MSG {
unsigned long id;
unsigned char length;
unsigned char msg[8];
} CPC_CAN_MSG_T;
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
28.03.2008, 07:36
(Dieser Beitrag wurde zuletzt bearbeitet: 28.03.2008 07:37 von rolfk.)
|
|
|
01.04.2008, 14:02
|
joe1234
LVF-Gelegenheitsschreiber
Beiträge: 136
Registriert seit: Sep 2007
2010
2007
kA
Deutschland
|
CPC
' schrieb:Indem du mittels eines DLL-Knotens die Funktion "von Hand" aufrufst. Wie der DLL-Knoten zu konfigurieren ist, steht im Header-File.
Bei Funktionen, die den Parameter CPC_CAN_MSG_T enthalten, kannst du diesen Parameter durch ein Array of Char, Länge 13, ersetzen.
Die Fuktionen CPC_AddHandler, CPC_RemoveHandler, CPC_AddHandlerEx und CPC_RemoveHandlerEx kannst du in LV nicht verwenden, da hier ein Funktionspointer (für CallBack) übergeben werden.
typedef struct CPC_CAN_MSG {
unsigned long id;
unsigned char length;
unsigned char msg[8];
} CPC_CAN_MSG_T;
Danke erstmal. Ich habe noch eine Frage zu der Funktion CPC_Handle.
Funktion sieht so aus:
struct CPC_MSG* CPC_Handle(int handle);
Kann das mit LV realisieren?
Gruß Joe
|
|
|
01.04.2008, 14:53
|
IchSelbst
LVF-Guru
Beiträge: 3.692
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
CPC
' schrieb:struct CPC_MSG* CPC_Handle(int handle);
Kann das mit LV realisieren?
typedef struct CPC_MSG {
unsigned char type;
unsigned char length;
unsigned char msgid;
unsigned long ts_sec;
unsigned long ts_nsec;
union {
unsigned char generic[CPC_MSG_LEN];
CPC_CAN_MSG_T canmsg;
CPC_CAN_PARAMS_T canparams;
CPC_CONFIRM_T confirmation;
CPC_INFO_T info;
CPC_OVERRUN_T overrun;
unsigned char busload;
unsigned char canstate;
} msg;
} CPC_MSG_T;
Obwohl diese Struktur einen Union-Anteil hat, könnte das gehen. Bisher habe ich in dieser System (CPC_...) nichts gefunden, was nicht, wenn auch mit Umständen, gehen sollte. Du musst halt alles als U8 interpretieren und dann entsprechend konvertieren. Das geht.
Die vielen Typen, die hier im Union-Teil aufgeführt sind, hab ich jetzt nicht explizit nachgelesen. Daher kann ich hierüber nur ungefähre Ratschläge geben. Sollte es sich um expliziete Daten handelt, geht es auf jeden Fall (über Array ...). Sind es Pointer oder sind da Pointer dabei, wird es nicht funktionieren (resprektive dur wirst eine Wrapper-DLL benötigen).
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
02.04.2008, 13:44
(Dieser Beitrag wurde zuletzt bearbeitet: 02.04.2008 13:46 von joe1234.)
|
joe1234
LVF-Gelegenheitsschreiber
Beiträge: 136
Registriert seit: Sep 2007
2010
2007
kA
Deutschland
|
CPC
Hallo Leute,
ich habe nun mit dem NI-Support telefoniert und Sie haben mir gesagt, dass ich eben nicht drumherum kommen würde eine Wrapper DLL zu schreiben.
Da ich im Programmieren nicht so fit bin, kann ich das wohl vergessen.
@IchSelbst
' schrieb:typedef struct CPC_MSG {
unsigned char type;
unsigned char length;
unsigned char msgid;
unsigned long ts_sec;
unsigned long ts_nsec;
union {
unsigned char generic[CPC_MSG_LEN];
CPC_CAN_MSG_T canmsg;
CPC_CAN_PARAMS_T canparams;
CPC_CONFIRM_T confirmation;
CPC_INFO_T info;
CPC_OVERRUN_T overrun;
unsigned char busload;
unsigned char canstate;
} msg;
} CPC_MSG_T;
Obwohl diese Struktur einen Union-Anteil hat, könnte das gehen. Bisher habe ich in dieser System (CPC_...) nichts gefunden, was nicht, wenn auch mit Umständen, gehen sollte. Du musst halt alles als U8 interpretieren und dann entsprechend konvertieren. Das geht.
Die vielen Typen, die hier im Union-Teil aufgeführt sind, hab ich jetzt nicht explizit nachgelesen. Daher kann ich hierüber nur ungefähre Ratschläge geben. Sollte es sich um expliziete Daten handelt, geht es auf jeden Fall (über Array ...). Sind es Pointer oder sind da Pointer dabei, wird es nicht funktionieren (resprektive dur wirst eine Wrapper-DLL benötigen).
Mit dem Union- Anteil greifen doch alle Structuren auf denselben Speicher zu, wie soll das denn in LV gehen?
Kannst du mir eventuell ein Beispiel machen, oder vielleicht, wenn es nicht zu schwer ist, helfen genau diese Funktion ("struct CPC_MSG* CPC_Handle(int handle);") zu programmieren, damit ich sehe, wie du es eigentlich meinst. (Ich bin leider kein Guru im Programmieren!)
Gruß Joe
|
|
|
02.04.2008, 14:10
|
IchSelbst
LVF-Guru
Beiträge: 3.692
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
CPC
' schrieb:Mit dem Union- Anteil greifen doch alle Structuren auf denselben Speicher zu,
Das ist richtig.
Zitat:wie soll das denn in LV gehen?
So:
Zum Zurücklesen der Daten benutzt du zwar immer das selbe (das selbe, nicht das gleiche) Array - aber mit diesem Array arbeitest du ja eigentlich gar nicht. Du tust natürlich, damit die Arbeit einfacher wird, das Array zuerst konvertieren in einen Cluster, der genau dem Struct entspricht. Jetzt Trick: mach acht Cluster (soviele wie Zeilen im Union-Teil). Ein Cluster, der nur für CPC_CAN_MSG_T ist. Ein Cluster für CPC_CAN_PARAMS_T usw. Das ist zwar mit Arbeit verbunden, erleichtert aber im weiteren ebendiese.
Zitat:Kannst du mir eventuell ein Beispiel machen, oder vielleicht, wenn es nicht zu schwer ist, helfen genau diese Funktion ("struct CPC_MSG* CPC_Handle(int handle);") zu programmieren, damit ich sehe, wie du es eigentlich meinst.
Nein. Ich kann dir da nicht weiterhelfen. Ich habe zu wenig Zeit.
Außerdem fehlen mir da noch weitere Unterlagen. Besondern alle Typen, die in den CPC-Sources aufgeführt sind. Und dann auch noch die DLL. Die beiden Typen, die ich hier gepostet habe, habe ich über Google im Internet gefunden.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
02.04.2008, 14:35
|
joe1234
LVF-Gelegenheitsschreiber
Beiträge: 136
Registriert seit: Sep 2007
2010
2007
kA
Deutschland
|
CPC
' schrieb:Besondern alle Typen, die in den CPC-Sources aufgeführt sind. Und dann auch noch die DLL. Die beiden Typen, die ich hier gepostet habe, habe ich über Google im Internet gefunden.
Die Unterlagen sind alle vorhanden. Die sind alle in meinem ersten Thread.
Schade, dass du zu wenig Zeit hast! Trotzdem Danke für deine Hilfe.
Gruß Joe
|
|
|
03.04.2008, 08:43
(Dieser Beitrag wurde zuletzt bearbeitet: 03.04.2008 08:45 von rolfk.)
|
rolfk
LVF-Guru
Beiträge: 2.305
Registriert seit: Jun 2007
alle seit 6.0
1992
EN
2901GG
Niederlande
|
CPC
' schrieb:Die Unterlagen sind alle vorhanden. Die sind alle in meinem ersten Thread.
Schade, dass du zu wenig Zeit hast! Trotzdem Danke für deine Hilfe.
Gruß Joe
Also CPC_CAN_MSG_T ist ja recht einfach und sollte alles sein was Du benötigst um die APIs ohne Callbacks zu implementieren.
CPC_MSG_T, das die union enthält, wird nur bei den Callbacks verwendet und die kannst Du ja ohne wrapper DLL von LabVIEW aus nicht ansprechen.
Alles ausser CPC_AddHandler(Ex) und CPC_RemoveHandler(Ex) sollte in LabVIEW prinzipiel ansprechbar sein und für polling sicher ausreichen und benötigt nur einfache C Datentype und den CPC_CAN_MSG_T struct.
Beiss Dich da erst mal rein und bring das zum laufen. Dann kannst Du immer noch beschliessen ob Du Callbackunterstützung wirklich benötigst.
Rolf Kalbermatter
|
|
|
10.04.2008, 15:33
(Dieser Beitrag wurde zuletzt bearbeitet: 10.04.2008 15:35 von joe1234.)
|
joe1234
LVF-Gelegenheitsschreiber
Beiträge: 136
Registriert seit: Sep 2007
2010
2007
kA
Deutschland
|
CPC
Hallo Leute,
da bin ich wieder mit meinem alten Problem...
Ich habe nun alle Variablen in Clustern angelegt (auf dem Bild unten sind sie als Konstante zu sehen). Ist das so richtig??? Später werde ich einfach Bedienelemente erzeugen und dann mit der *.dll verbinden.
Nun habe noch 2 Fragen zu Call Library Function Note (Knoten zum Aufruf extrener Bibliotheken):
1. Wenn ich dort eine Funktion auswähle, z.B.
struct CPC_MSG * CPC_Handle(int handle);
wie kann als Rückgabeparameter meine Variable CPC_MSG anwählen?
Meine Auswahl beim Rückgabeparameter ist sehr beschränk. Ich kann nur Void, String oder numerisches Element auswählen.
2. Wenn ich dort eine Funktion auswähle, z.B.
int CPC_SendMsg (int handle, unsigned char confirm, struct CPC_CAN_MSG *msg);
wie kann ich hier die Variable CPC_CAN_MSG* msg anwählen?
Gruß Joe
|
|
|
10.04.2008, 15:54
|
IchSelbst
LVF-Guru
Beiträge: 3.692
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
CPC
' schrieb:Ist das so richtig???
Nein. Ich würde sagen, dass ist falsch. Ich bin der Meinung, du brauchst sieben Cluster, die alle so anfangen wie der eine (CPC_MSG_T) jetzt. So wie du es jetzt hast, liegen die sieben Teile CPC_CAN_MSG_T, CPS_CAN_PARAMS_T etc hintereinander! Die liegen aber tatsächlich übereinander - es ist ja ein union! (In MSGID, einem der ersten fünf Werte, ist die Kennugn hinterlegt, welcher der sieben Cluster jetzt folgt). Du musst also einen machen, der nur CPC_CAN_MSG_T enthält, einen mit nur CPS_CAN_PARAMS_T etc.
Zitat:wie kann als Rückgabeparameter meine Variable CPC_MSG anwählen?
Gute Frage. Nächste.
Zitat:wie kann ich hier die Variable CPC_CAN_MSG* msg anwählen?
Eben nur mit so einem Trick: Du sagt einfach, es ist ein Pointer auf U8 (möglicherweise U32) und der Pointer ist einer auf Daten eines Arrays. Dann musst du eben diese Array-Daten konvertieren in den einen richtigen der sieben Cluster.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
| |