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 

Cluster der Array enthält als Ausgabe-Parameter einer dll



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!

06.12.2012, 17:48
Beitrag #1

SchwindelInside Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 77
Registriert seit: Dec 2005

2012 pro
2005
EN


Deutschland
Cluster der Array enthält als Ausgabe-Parameter einer dll
wunderschönen Aben,

Das einbinden der PCAN-BasicAPI.dll in Labview mittel CLFN hab ich zum großen Teil ganz gut hinbekommen nur mit einem Parameter einer Funktion hab ich noch Schwierigkeiten.

Die Funktion wird in der API-Doku wie folgt inform von Quelltext definiert:
Delphi
Code:
class function Read(
    Channel: TPCANHandle;
    var MessageBuffer: TPCANMsg;
    var TimestampBuffer: TPCANTimestamp
    ): TPCANStatus; overload; static;
C#
Code:
[DllImport("PCANBasic.dll", EntryPoint = "CAN_Read")]
public static extern TPCANStatus Read(
    [MarshalAs(UnmanagedType.U1)]
    TPCANHandle Channel,
    out TPCANMsg MessageBuffer,
    ref TPCANTimestamp TimestampBuffer);
C++ / CLR
Code:
[DllImport("PCANBasic.dll", EntryPoint = "CAN_Read")]
static TPCANStatus Read(
    [MarshalAs(UnmanagedType::U1)]
    TPCANHandle Channel,
    TPCANMsg %MessageBuffer,
    TPCANTimestamp %TimestampBuffer);

Der Parameter-Typ TPCANMsg ist wie folgt definiert:
C++
Code:
typedef struct
{
    DWORD ID;
    TPCANMessageType  MSGTYPE;
    BYTE LEN;
    BYTE DATA[8];
} TPCANMsg;
Delphi
Code:
TPCANMsg = record
    ID: Longword;
    MSGTYPE: TPCANMessageType;
    LEN: Byte;
    DATA: array[0..7] of Byte;
end;
C#
Code:
public struct TPCANMsg
{
    public uint ID;
    [MarshalAs(UnmanagedType.U1)]
    public TPCANMessageType MSGTYPE;
    public byte LEN;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] DATA;
}
C++ / CLR
Code:
public value struct TPCANMsg
{
    UInt32 ID;
    [MarshalAs(UnmanagedType.U1)]
    TPCANMessageType MSGTYPE;
    Byte LEN;
    [MarshalAs(UnmanagedType::ByValArray, SizeConst = 8)]
    array<Byte>^ DATA;
}

Darum hab ich mir ein VI gebaut, wie unten zu sehen ist

Der Rückgabewert ist "PCAN_ERROR_OK". Das heißt es müsste Daten im Puffer liegen sonst wäre der Rückgabewert "PCAN_ERROR_QVRCEMPTY"
Iin meinem AugabeCluster: MessageBuffer out werden die richtige ArbitrationID, der richtige Nachrichten-Typ und die richtige Nachrichten-Länge aber der Daten-Array ist immer leer obwohl laut Status Daten-anliegen müssten. Mit anderen fertigen Programmen können diese Daten auch über die selbe Harwarre ausgelesen werden.
Kann mir jemand sagen ab ich bei der Parameter-Definition irgend etwas falsch gemacht habe? Vielen Dank.

mfG.
Stefan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
06.12.2012, 20:00
Beitrag #2

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Cluster der Array enthält als Ausgabe-Parameter einer dll
(06.12.2012 17:48 )SchwindelInside schrieb:  Darum hab ich mir ein VI gebaut, wie unten zu sehen ist
Wo? Ich seh nix. Ph34r
Gruß, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.12.2012, 11:57 (Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2012 11:57 von SchwindelInside.)
Beitrag #3

SchwindelInside Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 77
Registriert seit: Dec 2005

2012 pro
2005
EN


Deutschland
RE: Cluster der Array enthält als Ausgabe-Parameter einer dll
Asche über mein Haupt.
Das Bild hatte ich zwar hochgeladen aber vergessen in den Beitrag einzufügen. Blush
Dieses meinte ich.:
   

Dazu sei noch gesagt, dass ich im CLFN für den Parameter "MessageBuffer" die Option "Adapt to Type" und als Data format "Handles by Value" gewählt habe. Vielleicht liegt darin der Fehler? Die anderen Datenformate habe ich auch schon durchprobiert aber hat nix geholfen.

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

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Cluster der Array enthält als Ausgabe-Parameter einer dll

Akzeptierte Lösung

(07.12.2012 11:57 )SchwindelInside schrieb:  Asche über mein Haupt.
Das Bild hatte ich zwar hochgeladen aber vergessen in den Beitrag einzufügen. Blush
Dieses meinte ich.:


Dazu sei noch gesagt, dass ich im CLFN für den Parameter "MessageBuffer" die Option "Adapt to Type" und als Data format "Handles by Value" gewählt habe. Vielleicht liegt darin der Fehler? Die anderen Datenformate habe ich auch schon durchprobiert aber hat nix geholfen.

viele Grüße
Stefan

Code:
BYTE DATA[8];
Wird von einem C Compiler nicht als Array Pointer angelegt sondern ist ein fixed size Array das direkt in die Struct inlined wird. So ein Array macht man in LabVIEW am einfachsten durch einen Cluster mit der entsprechenden Anzahl Elemente (hier also 8) anzulegen. Dann in den andren Cluster an der richtigen Position einfügen en dann sollte es gehen.

PS: Selbst wenn die Deklaration
Code:
BYTE *DATA;
wäre (was schon ein Array Pointer wäre) kannst Du nicht einfach ein LabVIEW Array in den Cluster legen. Denn LabVIEW Arrays sind Array Handles, nicht C type Array Pointers.

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
07.12.2012, 12:51
Beitrag #5

SchwindelInside Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 77
Registriert seit: Dec 2005

2012 pro
2005
EN


Deutschland
RE: Cluster der Array enthält als Ausgabe-Parameter einer dll
(07.12.2012 12:12 )rolfk schrieb:  
Code:
BYTE DATA[8];
Wird von einem C Compiler nicht als Array Pointer angelegt sondern ist ein fixed size Array das direkt in die Struct inlined wird. So ein Array macht man in LabVIEW am einfachsten durch einen Cluster mit der entsprechenden Anzahl Elemente (hier also 8) anzulegen. Dann in den andren Cluster an der richtigen Position einfügen en dann sollte es gehen.
Das scheint zu funktionieren. Tausend Dank. Du hast es echt drauf. Yourock

viele Grüße
Stefan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  DLL einbinden, Parameter hinzufügen meb2323 3 5.557 07.03.2020 16:51
Letzter Beitrag: meb2323
  Parameter aus LV DLL hammerheadbene 1 4.261 18.10.2011 14:29
Letzter Beitrag: M@rRy
  array of cluster? THL 3 5.108 01.09.2011 12:11
Letzter Beitrag: BeFu
  Problem Aufruf einer C-DLL mit Array Pointer hcl86 4 6.159 01.05.2009 10:18
Letzter Beitrag: hcl86
  Cluster und 2 Dim Array in DLL pgl_bear 4 4.863 16.03.2009 10:17
Letzter Beitrag: pgl_bear
  struct mit char **Parameter in DLL t4b-1re-2 3 5.146 03.09.2007 12:35
Letzter Beitrag: t4b-1re-2

Gehe zu: