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 

CPC



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!

26.03.2008, 20:59
Beitrag #11

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
28.03.2008, 07:36 (Dieser Beitrag wurde zuletzt bearbeitet: 28.03.2008 07:37 von rolfk.)
Beitrag #12

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
CPC
' schrieb:Wenn Funktionen nicht erkannt oder falsch erkannt werden, wie kann ich die Funktionen trotzdem als VI darstellen???

Das was IchSelbst geschrieben hat ist im Prinzip komplett korrekt. Die von ihm genannten Funktionen die man nicht von LabVIEW aufrufen kann sind aber nicht unmöglich. Sie erfordern aber die Erstellung einer Wrapper DLL in C die die Callback Funktionen in LabVIEW User Events übersetzt. Aber das ist fortgeschrittene C Programmierung und angesichts Deiner bisherigen Fragen doch etwas über Deinem Kenntnisstand. Das ist auch für jemanden der weiss wie man ein "Hello World" Programm in C schreibt und kompiliert noch etwas hoch gegriffen.

Andererseits ist das nicht etwas das man eben schnell mal so nebenbei macht sondern ziemlich seriöse Programmierarbeit. Wenn Du diese Funktionen wirklich benötigst (was nicht unbedingt gesagt ist da man auch mit Polling durchaus CAN Kommunikation machen kann) dann wird Dir wohl nichts anderes übrig bleiben als jemand in den Arm zu nehmen der davon Verstand hat und Dir dies gegen Bezahlung tun will (und auch noch Zeit dafür hat). Letzteres wäre momentan mein Problem. Cool

Rolf Kalbermatter

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
01.04.2008, 14:02
Beitrag #13

joe1234 Offline
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.04.2008, 14:53
Beitrag #14

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
02.04.2008, 13:44 (Dieser Beitrag wurde zuletzt bearbeitet: 02.04.2008 13:46 von joe1234.)
Beitrag #15

joe1234 Offline
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
02.04.2008, 14:10
Beitrag #16

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
02.04.2008, 14:35
Beitrag #17

joe1234 Offline
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.04.2008, 08:43 (Dieser Beitrag wurde zuletzt bearbeitet: 03.04.2008 08:45 von rolfk.)
Beitrag #18

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
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

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
10.04.2008, 15:33 (Dieser Beitrag wurde zuletzt bearbeitet: 10.04.2008 15:35 von joe1234.)
Beitrag #19

joe1234 Offline
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.04.2008, 15:54
Beitrag #20

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: