LabVIEWForum.de
Cluster der Array enthält als Ausgabe-Parameter einer dll - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Cluster der Array enthält als Ausgabe-Parameter einer dll (/Thread-Cluster-der-Array-enthaelt-als-Ausgabe-Parameter-einer-dll)



Cluster der Array enthält als Ausgabe-Parameter einer dll - SchwindelInside - 06.12.2012 17:48

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


RE: Cluster der Array enthält als Ausgabe-Parameter einer dll - jg - 06.12.2012 20:00

(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


RE: Cluster der Array enthält als Ausgabe-Parameter einer dll - SchwindelInside - 07.12.2012 11:57

Asche über mein Haupt.
Das Bild hatte ich zwar hochgeladen aber vergessen in den Beitrag einzufügen. Blush
Dieses meinte ich.:
[attachment=42562]

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


RE: Cluster der Array enthält als Ausgabe-Parameter einer dll - rolfk - 07.12.2012 12:12

(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.


RE: Cluster der Array enthält als Ausgabe-Parameter einer dll - SchwindelInside - 07.12.2012 12:51

(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