Variablenstruktur für ActivX aufruf

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

mkersch hat geschrieben:mein letzter Artikel war keine "Drohung"
nur zur Sicherheit, das war nicht böse gemeint, sondern ein Scherz ;-)
mkersch hat geschrieben: Mein Projekt werde ich jetzt mit einer Art "Low-Level API von HBM" und ot4xb weiterverfolgen.
Erste Erfolge sind sichtbar !
das hört sich nach direkten DLL Aufrufen an. Insbesondere wenn es eine saubere Parameterbeschreibung
z.b. für C oder PowerBasic gibt.
Die waren mir schon immer lieber als ActiveX ... viel Erfolg :D
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenstruktur für ActivX aufruf

Beitrag von AUGE_OHR »

mkersch hat geschrieben:Mein Projekt werde ich jetzt mit einer Art "Low-Level API von HBM" und ot4xb weiterverfolgen.
Erste Erfolge sind sichtbar !
... und was bekommst du zurück ? ein Array oder ein Object ?
gruss by OHR
Jimmy
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Hallo Forenmitglieder,

Die Low-Level API Funktionen von HBM laufen jetzt unter Xbase++.

Den Messwert bekomme ich als 32Bit Float - Wert zurück.

Wie kann ich diesen in eine Xbase Float Wandeln ?

(Habe bereits mit CTOF bzw. BIN2F probiert)

mfg.

mkersch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

Hallo,

zeige uns bitte deinen Funktionsaufruf im Quellcode ...

wenn es der Rückgabewert von DLLCALL() ist, dann ist ein ein 32 Bit LONG Integer ;-)
Ein Parameter per Referenz übergeben sieht anders aus. Eine Umwandlung ist übrigens nur nötig,
wenn die Zahl nicht numerisch zurückgegeben wird.

Wenn du eine 32 Bit FLOAT (also mit Nachkommastellen) bekommst, wird diese
direkt in die Xbase++ Variable passen. Ansonsten kommt es drauf an wie es "verpackt" wurde.

... ich sehe gerade ActiveX ... dort sollte der Rückgabewert numerisch sein, meine Bemerkung galt dem direkten API Aufruf.
Gruß
Hubert
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Hallo,

Das nachfolgende Beispiel zeigt den c++ Code
In der Hilfe ist beschrieben, das der float Wert im Intel-Format abgelegt ist.

In meinem Puffer (cTest) sind diese 4 Bytes abgelegt.

Mit Welcher Funktion kann ich dieses Intel-Format in Xbase wandeln ?

Code: Alles auswählen

INT32 HBM_XUTIL_GetDaqData  ( const UINT8 *  pSrcBuf,  
  UINT32  DataOffset,  
  const struct stDaqHeader *  pHdr,  
  void *  pDstBuf,  
  UINT32  DstSize   
 )    

Kopiert die Messdaten an die gewuenschte Stelle im Speicher. Die Daten werden dabei im Intel-Format abgelegt (im Rohdatenblock liegen die Messdaten im Motorola-Format vor!). Das Datenformat des Signals steht im Header (analoge Signale in der Regel float). Fuer CAN-Signale kann das Ausgabeformat vom Anwender gewaehlt werden (siehe HBM_XUTIL_ComoposeCanSensor()) Der Puffer auf den pDstBuf zeigt sollte vom Datentyp der erwarteten Messdaten sein. 

Anwendung: siehe Beispiel


Parameters:
[in]  pSrcBuf,:  Zeiger auf Rohdaten-Buffer  
[in]  DataOffset,:  Offset des Signals im Rohdaten-Buffer  
[in]  pHdr,:  Zeiger auf den Header  
[out]  pDstBuf,:  Bufferadresse, an die die Messwerte kopiert werden sollen  
[in]  DstSize,:  Groesse des Zielbuffers in Byte  

Returns:
0 = ok; <0 = Fehler, siehe Liste der Fehlermeldungen 

**************************
XBASE

nStatus :=   HBM_XUTIL_GetDaqHeader(0, 1, @DataBuf,len(DataBuf), @cHeader, @Offset)
nStatus :=   HBM_XUTIL_GetDaqData(@DataBuf, Offset, @cHeader,@cMess,len(cMess))

for i:=1 to 100
    aWerte[i] := asc(substr(DataBuf,i,1))
    bWerte[i] := asc(substr(cMess,i,1))
next i

test := ?????(substr(cMess,1,4))



mfg

mkersch
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Variablenstruktur für ActivX aufruf

Beitrag von brandelh »

Hallo,

Bin2F() erwartet eine 8 Byte Zahl in einem 8 Byte String, die meisten anderen verarbeiten Integer.
Eventuell ist Var2Bin() zu gebrauchen, aber am Besten schaut man in die ot4xb ;-)

UnPackFloat32(nPackedNum) -> nNumber

Code: Alles auswählen

Return a numeric value from a 32 bit float packed as LONG value. This can be usefull to convert values retrieved from a C/C++ function that return a float 32 value.
Syntax:
UnPackFloat32(nPackedNum) -> nNumber
sollte genau das sein, was du brauchst.

PS: Infos zum "Intelformat" gibt es hier :arrow: http://de.wikipedia.org/wiki/Byte-Reihenfolge
Gruß
Hubert
mkersch
UDF-Programmierer
UDF-Programmierer
Beiträge: 89
Registriert: Fr, 12. Mai 2006 13:26
Wohnort: Wünricht

Re: Variablenstruktur für ActivX aufruf

Beitrag von mkersch »

Was lange währt, wird endlich gut

Code: Alles auswählen

test := bin2u(substr(cMess,1,4))
test1 := UnPackFloat32(test)
Es funktioniert !

Mittels der API-Low Level Funktionen kann ich nun den Meßwert (test1) aus dem HBM Messsystem auslesen.

Nochmal vielen Dank für Eure Hilfe.

mfg

mkersch
Antworten