C++ DLL mit komplexer Datenstruktur inLabVIEW verwenden
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!
C++ DLL mit komplexer Datenstruktur inLabVIEW verwenden
Hallo zusammen,
ich habe eine *.dll (DSP-SW) die Radiosondensignale über die Soundkarte erfasst und die Messwerte ausgibt. Ich habe die dll vom Sondenhersteller erhalten und möchte sie verwenden, um in LabVIEW eine für unsere Bedürfnisse angepasste Datenerfassungssoftware zu schreiben. Dabei habe ich größte Schwierigkeiten, die *.dll richtig anzusprechen um an die Messwerte zu gelangen. Die DSP-SW steht als C++ Laufzeit Bibliothek(DLL) zur Verfügung.
Nun meine Fragen:
Ich habe ein vi mit einem "Library Function Node" erstellt, dem ich alle Variablen und Arrays entsprechend dem "DSPSwFrameType" (s.u.) eingebe. Dabei würde ich nun erwarten, dass dann am entsprechenden Ausgang die Messwerte ausgegeben werden. Das ist wohl aber zu einfach gedacht, denn ich bekomme lediglich Systemabstürze und im besten Falle Fehlermeldungen von LabVIEW (error 1097 oder seltener 1517), was auf einen Speicherkonflikt hinweist.
Ich habe generell 2 Versionen probiert:
1)(dspsw_get_frame_LV85_1.vi)
Eingangsparameter alle in ein Cluster gepackt, das wiederum aus Clustern, Arrays und Variablen besteht. Der Typ des Ausgangs ist dann als "An Typen
anpassen" konfiguriert. In dieser Konfiguration stürzt LabVIEW kommentarlos ab, wenn ich das VI im Gesamtprojekt laufen lasse.
2)(dspsw_get_frame_LV85_2.vi)
Eingangsparameter einzeln mit dem node verdrahtet. Die Ausgangstypen sind dann entsprechend der unten aufgeführten Anweisungen konfiguriert. In dieser
Konfiguration stürzt LabVIEW nicht ab, meldet jedoch "error 1097", wenn ich das VI im Gesamtprojekt laufen lasse.
Nach allem was ich durch stöbern auf diversen NatInst Seiten und Foren gelernt habe, ist es wohl ein Problem, die Speicherbereiche für die arrays richtig zu reservieren. Wie wird ausserdem die Anweisung "MarshalAs...." richtig in LabVIEW umgesetzt? Ich füge zur Verdeutlichung die beiden Versionen des vi bei, mit dem ich versuche, die Daten auszulesen. Ausserdem sind unten alle mir verfügbaren Informationen zu den Datentypen dieser dll-Funktion zusammengestellt.
Ich würde mich freuen wenn sich jemand finden würde, der mir bei diesem Problem helfen kann.
Vielen Dank schonmal und Grüße,
Dieter
------------------------------------------------------------------------------------------
Die DLL Einsprungfunktion in C++ zum Auslesen des Datenframes sieht fogendermassen aus:
------------------------------------------------------------------------------------------
Public Declare Function dspsw_get_frame Lib "./dspsw.dll"
(
<MarshalAs(UnmanagedType.Struct)> ByRef dt_gps_frame As DSPSwFrameType
)
As Integer
-------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
Dazu wurden mir zusätzlich noch folgende VB .NET 2005/2008 Datentypen angegeben:
-----------------------------------------------------------------------------------
Public Structure DSPSwPhysValType
Dim Value As Double
Dim Status As Short
Dim StatusArgc As Short
Dim Reserved0 As Short
Dim Reserved1 As Short
End Structure
Public DSPSwPhysVal As DSPSwPhysValType
Public Structure DSPSwFrameType
Dim IFrameCounter As Integer
Dim FrameCounter As Integer ' Laufende Nr. des TD_GPS_Frame
Dim IFrameTime As Double ' Zeit in s seit dsp_init
Dim frameTime As Double
Dim SyncQuality As Double ' Qualität des Synchronworts
Dim RecLevel As Double ' Pegel des Empfangssig. in dB
Dim BitDrift As Double ' Abweichung Sender/Empfänger in bits
Dim ClockDrift As Double ' Abweichung Signal/Empfänger in ppm
Dim t_phase As Short
Dim frame_sync_stat As Short
Dim framesync_cnt As Short
Dim frame_sync_diff As Short
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=40)> Dim RawData()As Byte ' Telemetrie - Frame, original
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=40)> Dim DeInterleaved() As Byte ' Telemetrie - Daten, deInterleaved
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=40)> Dim Correct() As Byte ' Telemetrie - Daten, korrigiert
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=40)> Dim DecodeError() As Byte ' Anzahl Fehlerbits
Dim BitError0 As Short ' Anzahl Bytes ohne Bitfehler
Dim BitError1 As Short ' Anzahl Bytes mit 1 Bitfehler
Dim BitError2 As Short ' Anzahl Bytes mit 2 Bitfehler
Dim BitError2Value As Short ' Anzahl Bytes mit 2 Bitfehler im Meßwert
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim DFMID() As Byte
Dim Reserved1 As Integer
Dim Sensor As Short
Dim Status As Short
Dim SensorId As Short
Dim SkMode As Short
Dim MeasData As Double
Dim MeasValue As DSPSwPhysValType
' Benutzte Werte für Strahlungsfehlerkorrektur
Dim Pressure As DSPSwPhysValType
Dim Altitude As DSPSwPhysValType
Dim SunElevation As DSPSwPhysValType
Dim RayCorrection As DSPSwPhysValType
Dim ReservedPv1 As DSPSwPhysValType
Dim ReservedPv2 As DSPSwPhysValType
Dim ReservedPv3 As DSPSwPhysValType
Dim ReservedPv4 As DSPSwPhysValType
Dim ReservedPv5 As DSPSwPhysValType
Dim ReservedPv6 As DSPSwPhysValType
' GPS-Daten bis Ende des Frames
Dim GPSValid As Short ' S J - 1, wenn GPS gültig (Jupiter) - 3, wenn GPS gültig (Sirf)
Dim tx_rfu1 As Short ' S - do not use.
Dim nav_type As Short ' S - bitmask
Dim tx_rfu2 As Short ' S - do not use.
Dim tx_rfu3 As Byte ' S - do not use.
Dim LLAValid As Short ' J - 1, wenn GPS-Lat/Lon/Alt gültig
Dim GPSFrameCounter As Integer ' S J - Nummer des empfangenen GPSFrame
Dim ValidItem As Integer ' S J - Bitmap 0...31
Dim SatMap As Integer ' S J - Bitmap, Bit(i) --> PRN(i+1)
Dim Latit As Double ' S J - +- 90°
Dim Longit As Double ' S J - +- 180°
Dim Altit As Double ' J - Meter, von ECEF
Dim Altit_Eli As Double ' S - Meter, über Ellipsoid
Dim Altit_MSL As Double ' S - Meter, über MSL
' ECEF: +- 0 ... 9.000.000m, resolution: e-2
Dim PosX As Integer ' J
Dim PosY As Integer ' J
Dim PosZ As Integer ' J
' ECEF: +- 0 ... 320m/s, resolution: e-2
Dim VelX As Integer ' J
Dim VelY As Integer ' J
Dim VelZ As Integer ' J
' 0 ... 1.000m, resolution: e-2
Dim EHPE As Integer ' J
Dim EVPE As Integer ' J
' 0 ... 300m, resolution: e-2
Dim EHVE As Integer ' J
Dim ErrorID As Short ' J - vom GPS-Empfänger
Dim UTCSec As Short ' J - Sekunden
Dim UTCTSec As Short ' J - 1/1000 Sekunden
Dim MaskAngle As Short ' J - +- 0 ... pi/2, Resolution: e-3
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Dim CNo() As Short ' J - 0 ... 60dBHz (MaxSatsVisible = 12)
Dim rfu As Integer ' J - do not use.
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Dim prn() As Byte ' S - PRN visible: 0 = unused, 1..32 = SV ID
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Dim cn0() As Byte ' S - C/N0: 0 ... 60dBHz
Dim sog As Double ' S - speed over ground, m/s
Dim cog As Double ' S - course over ground, deg. true north
Dim climb_rate As Double ' S - climb rate, m/s
Dim s_ehpe As Double ' S - m
Dim s_evpe As Double ' S - m
Dim rfu52 As Short ' S - do not use.
Dim rfu53 As Short ' S - do not use.
Dim utc_year As Short ' S - UTC
Dim utc_month As Short ' S - UTC
Dim utc_day As Short ' S - UTC
Dim utc_hour As Short ' S - UTC
Dim utc_minute As Short ' S - UTC
Dim utc_ms As Short ' S - UTC
Dim utc_time As Double ' S - 00:00:00.000 ... 23:59:59.999
Public Sub Initialize()
'ReDim reserved(3)
ReDim RawData(39)
ReDim DeInterleaved(39)
ReDim Correct(39)
ReDim DecodeError(39)
ReDim DFMID(3)
'ReDim ReservedPv(4)
ReDim CNo(31)
ReDim prn(31)
ReDim cn0(31)
End Sub
End Structure