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 

Dieses Thema hat akzeptierte Lösungen:

PeakCAN-BasicAPI.dll in LV einbinden



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!

14.11.2012, 17:50
Beitrag #1

SchwindelInside Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 77
Registriert seit: Dec 2005

2012 pro
2005
EN


Deutschland
PeakCAN-BasicAPI.dll in LV einbinden
wunderschönen Abend,

einen PeakCAN-USB-Dongle möchte ich über die PCAN-BasicAPI.dll aus LabView ansprechen. Zum Initializieren eines USB-Kanals rufe die Funktion CAN-Initialize der dll auf und stelle die Parameter entsprechend der API-Doku ein.:

C++:
Code:
TPCANStatus __stdcall CAN_Initialize(
        TPCANHandle Channel,
        TPCANBaudrate Btr0Btr1,
        TPCANType HwType = 0,
        DWORD IOPort = 0,
        WORD Interrupt = 0
);
Wobei die letzten drei Parameter optional sind und bei USB nicht verwendet werden.

Delphi:
Code:
class function Initialize(
    Channel: TPCANHandle;
    Btr0Btr1: TPCANBaudrate
    ): TPCANStatus; overload; static;

Dabei erscheint am Ausgangs-Fehler-Cluster immer der Fehelercode x5ED bzw. d1517. Ich verwende die Standart WinAPi-Aufrufkonvention. Wenn ich die Fehlerprüfung der dll ausschalte stürtzt mir LabView ab. Prof. Google konnte mir zu diesem Fehlercode auch nicht viel sagen, außer dass es möglicherweise irgendwie mit der WinAPI zusammen hängt

   

Kann mir bitte jemand sagen wie dieser Fehler zu stande kommt und wie ich ihn vermeiden kann? Vielen Dank.

schöne Grüße
Stefan


Angehängte Datei(en)
12.0 .vi  Initialize_PCAN.vi (Größe: 10,79 KB / Downloads: 333)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.11.2012, 22:36 (Dieser Beitrag wurde zuletzt bearbeitet: 14.11.2012 22:39 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: PeakCAN-BasicAPI.dll in LV einbinden

Akzeptierte Lösung

(14.11.2012 17:50 )SchwindelInside schrieb:  wunderschönen Abend,

einen PeakCAN-USB-Dongle möchte ich über die PCAN-BasicAPI.dll aus LabView ansprechen. Zum Initializieren eines USB-Kanals rufe die Funktion CAN-Initialize der dll auf und stelle die Parameter entsprechend der API-Doku ein.:

C++:
Code:
TPCANStatus __stdcall CAN_Initialize(
        TPCANHandle Channel,
        TPCANBaudrate Btr0Btr1,
        TPCANType HwType = 0,
        DWORD IOPort = 0,
        WORD Interrupt = 0
);
Wobei die letzten drei Parameter optional sind und bei USB nicht verwendet werden.

Delphi:
Code:
class function Initialize(
    Channel: TPCANHandle;
    Btr0Btr1: TPCANBaudrate
    ): TPCANStatus; overload; static;

Dabei erscheint am Ausgangs-Fehler-Cluster immer der Fehelercode x5ED bzw. d1517. Ich verwende die Standart WinAPi-Aufrufkonvention. Wenn ich die Fehlerprüfung der dll ausschalte stürtzt mir LabView ab. Prof. Google konnte mir zu diesem Fehlercode auch nicht viel sagen, außer dass es möglicherweise irgendwie mit der WinAPI zusammen hängt



Kann mir bitte jemand sagen wie dieser Fehler zu stande kommt und wie ich ihn vermeiden kann? Vielen Dank.

schöne Grüße
Stefan

Standard C kennt KEINE optionalen Funktionsparameter und das DLL Interface folgt Standard C Konventionen und nicht C++ oder Delphi Konventionen wo Parameter mit Defaultwerten deklariert werden können. Das bedeutet dass Du doch echt alle 5 Parameter konfigurieren musst und den "optionelen" Parametern exlplizit den Defaultwert zuweisen musst.

Der Umstand dass die Funktion stdcall ist macht eine variable Anzahl Parameter sowieso vollkommen unmöglich, da der Aufrufer die Parameter auf den Stack schiebt, aber die Funktion den Stack anschliessend korrigiert.

Inwiefern die Datentypen korrekt sind kann ich nicht sagen, da die Deklaration von TPCANStatus, TPCANHandle usw. nirgends aus Deinem Post ersichtlich ist.

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
15.11.2012, 12:31
Beitrag #3

SchwindelInside Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 77
Registriert seit: Dec 2005

2012 pro
2005
EN


Deutschland
RE: PeakCAN-BasicAPI.dll in LV einbinden
Hallo RolfK,

Vielen Dank für die Antwort. Das war wohl der Fehler. Hab die zusätzlichen eingänge alle auf 0 gesetzt und siehe da, der Fehler ist verschwunden. Und wieder was gelernt dabei. Thanx

(14.11.2012 22:36 )rolfk schrieb:  Standard C kennt KEINE optionalen Funktionsparameter und das DLL Interface folgt Standard C Konventionen und nicht C++ oder Delphi Konventionen wo Parameter mit Defaultwerten deklariert werden können. Das bedeutet dass Du doch echt alle 5 Parameter konfigurieren musst und den "optionelen" Parametern exlplizit den Defaultwert zuweisen musst.

Der Umstand dass die Funktion stdcall ist macht eine variable Anzahl Parameter sowieso vollkommen unmöglich, da der Aufrufer die Parameter auf den Stack schiebt, aber die Funktion den Stack anschliessend korrigiert.
Das wusste ich bis jetzt noch nicht. In der API-Dokumentation sind auch nur Einbindungen für objektorientierte Sprachen, wie C++, C#, Delphi, VBasic und Python aufgeführt aber keine in ANSI-C.

Zitat:Inwiefern die Datentypen korrekt sind kann ich nicht sagen, da die Deklaration von TPCANStatus, TPCANHandle usw. nirgends aus Deinem Post ersichtlich ist.
TPCANStatus ist ein BYTE-enum und und TPCANHandle ein DWORD-enum. Die Initialisierung des USB-Kanals schien aber bereits korrekt funktioniert zu haben, wie die PCANStatus-Ausgabe "PCAN_ERROR_OK" im Bild zeigt.

viele Grüße
Stefan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.11.2012, 15:14
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: PeakCAN-BasicAPI.dll in LV einbinden
(15.11.2012 12:31 )SchwindelInside schrieb:  TPCANStatus ist ein BYTE-enum und und TPCANHandle ein DWORD-enum. Die Initialisierung des USB-Kanals schien aber bereits korrekt funktioniert zu haben, wie die PCANStatus-Ausgabe "PCAN_ERROR_OK" im Bild zeigt.

Nun diese Erklärung ist aber in schrillem Gegensatz zum Diagramm in Deinem ersten Post. Dort hast Du den Rückgabewert als U32 konfiguriert und das Handle als U8. Ein Byte-Enum ist aber ein U8 und ein DWORD ein U32. Also doch noch mal schauen?

Auch noch schauen ob TPCANBaudrate echt ein 16 Bit Integer ist!

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
15.11.2012, 15:18
Beitrag #5

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
RE: PeakCAN-BasicAPI.dll in LV einbinden
Ich hab von denen VIs bekommen, die besagte dll aufrufen ... da war alles schon fertig - mit Beispielen (die waren sogar fast OK).
Vielleicht einfach mal nachfragen.

Beste Grüße

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.11.2012, 14:55
Beitrag #6

SchwindelInside Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 77
Registriert seit: Dec 2005

2012 pro
2005
EN


Deutschland
RE: PeakCAN-BasicAPI.dll in LV einbinden
Hallöle,

Hab da nur beim Tippen was durcheinander verwechselt. Wink-2

(15.11.2012 15:14 )rolfk schrieb:  
(15.11.2012 12:31 )SchwindelInside schrieb:  TPCANStatus ist ein BYTE-enum und und TPCANHandle ein DWORD-enum. Die Initialisierung des USB-Kanals schien aber bereits korrekt funktioniert zu haben, wie die PCANStatus-Ausgabe "PCAN_ERROR_OK" im Bild zeigt.

Nun diese Erklärung ist aber in schrillem Gegensatz zum Diagramm in Deinem ersten Post. Dort hast Du den Rückgabewert als U32 konfiguriert und das Handle als U8. Ein Byte-Enum ist aber ein U8 und ein DWORD ein U32. Also doch noch mal schauen?

Auch noch schauen ob TPCANBaudrate echt ein 16 Bit Integer ist!

TPCANStatus ist ein DWORD-Ring, TPCANHandle ein BYTE-Ring und TPCANBaudrate tatsächlich ein WORD-Ring. In der API-Doku werden sie als enums bezeichnet, da es unter anderm in den .Net-Sprachen die Unterscheidung zwischen Enum und Ring wie in Labview anscheinend nicht gibt. Die DLL-Einbindung war aber wohl korrekt.
Ein 16-Bit-Int finde ich eigentlich zeimlich angemessen um Baudraten in kBit/s bis max 1MBit/s anzugeben. Was würdes Du denn dafür nehmen?

Grüße
SI
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.11.2012, 21:15
Beitrag #7

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: PeakCAN-BasicAPI.dll in LV einbinden
(16.11.2012 14:55 )SchwindelInside schrieb:  Hallöle,

Hab da nur beim Tippen was durcheinander verwechselt. Wink-2

(15.11.2012 15:14 )rolfk schrieb:  
(15.11.2012 12:31 )SchwindelInside schrieb:  TPCANStatus ist ein BYTE-enum und und TPCANHandle ein DWORD-enum. Die Initialisierung des USB-Kanals schien aber bereits korrekt funktioniert zu haben, wie die PCANStatus-Ausgabe "PCAN_ERROR_OK" im Bild zeigt.

Nun diese Erklärung ist aber in schrillem Gegensatz zum Diagramm in Deinem ersten Post. Dort hast Du den Rückgabewert als U32 konfiguriert und das Handle als U8. Ein Byte-Enum ist aber ein U8 und ein DWORD ein U32. Also doch noch mal schauen?

Auch noch schauen ob TPCANBaudrate echt ein 16 Bit Integer ist!

TPCANStatus ist ein DWORD-Ring, TPCANHandle ein BYTE-Ring und TPCANBaudrate tatsächlich ein WORD-Ring. In der API-Doku werden sie als enums bezeichnet, da es unter anderm in den .Net-Sprachen die Unterscheidung zwischen Enum und Ring wie in Labview anscheinend nicht gibt. Die DLL-Einbindung war aber wohl korrekt.
Ein 16-Bit-Int finde ich eigentlich zeimlich angemessen um Baudraten in kBit/s bis max 1MBit/s anzugeben. Was würdes Du denn dafür nehmen?

Grüße
SI

Also einmal is TPCANStatus ein Byte-enum und dann ist's ein DWORD-Ring. Irgendwie musst Du Dich entscheiden! :-)
16 Bit is zwar genügend für Baudrate aber es spart überhaupt nichts ob man jetzt ein 16 bit oder ein 32 bit Integer nimmt. Zudem ersceint mir die Verwendung eines Enums hier eher unsinnig es sei den man definiert ihn so dass er nur die diskret möglichen Werte enumeriert aber dann würde ein 8bit Wert auch noch lange genügen.
Persönlich tendiere ich dazu um bei eigenen APIs meist 32 bit Integerparameter zu vewenden, da alle Parameter eh immer als 32 Bit Werte über den Stack übergeben werden.

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
Antwort schreiben 


Gehe zu: