Seite 10 von 12

Verfasst: 05.03.2006 12:17
von mk-soft
Nicht ganz richtig. Mit VarType meine ich den Type von Variant. Type 11 ist BOOL. Hurra es funktioniert.
Hiermit noch an alle User im Forum ein Dankeschön für ihre Beispiele für Variant und ActiveX, wo aus ich das hier gebastelt habe.

Ich habe mir letztens für ein Apfel und ein Ei mir VC5 gekauft und mit rumgespielt. Dabei kam beim anbinden des OCX ein Interner Wrapper raus.
Schreibe dir noch ein beispiel zum umstetzen.

Code: Alles auswählen

/////////////////////////////////////////////////////////////////////////////
// CAD_USB2XX

IMPLEMENT_DYNCREATE(CAD_USB2XX, CWnd)

/////////////////////////////////////////////////////////////////////////////
// Eigenschaften CAD_USB2XX 

/////////////////////////////////////////////////////////////////////////////
// Operationen CAD_USB2XX 

BOOL CAD_USB2XX::Scan(short DeviceNr)
{
	BOOL result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x1, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms,
		DeviceNr);
	return result;
}

double CAD_USB2XX::GetAnalogVoltage(short DeviceNr, short Channel)
{
	double result;
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_R8, (void*)&result, parms,
		DeviceNr, Channel);
	return result;
}

void CAD_USB2XX::SetAnalogVoltage(short DeviceNr, short Channel, double newValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_R8;
	InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, Channel, newValue);
}

short CAD_USB2XX::GetDigIO(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0xe, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

void CAD_USB2XX::SetDigIO(short DeviceNr, short nNewValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0xe, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, nNewValue);
}

double CAD_USB2XX::GetAnalogDiffVoltage(short DeviceNr, short Channel)
{
	double result;
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0x2, DISPATCH_METHOD, VT_R8, (void*)&result, parms,
		DeviceNr, Channel);
	return result;
}

short CAD_USB2XX::GetDeviceType(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x3, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

short CAD_USB2XX::GetError(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x4, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

short CAD_USB2XX::GetSerialNr(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x5, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

long CAD_USB2XX::GetAnalogIO(short DeviceNr, short Channel)
{
	long result;
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0xf, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, parms,
		DeviceNr, Channel);
	return result;
}

void CAD_USB2XX::SetAnalogIO(short DeviceNr, short Channel, long nNewValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_I4;
	InvokeHelper(0xf, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, Channel, nNewValue);
}

void CAD_USB2XX::EnableCalibration(LPCTSTR Password)
{
	static BYTE parms[] =
		VTS_BSTR;
	InvokeHelper(0x6, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		 Password);
}

long CAD_USB2XX::GetCalibration(short DeviceNr, short IO, short Level, short Channel)
{
	long result;
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_I2 VTS_I2;
	InvokeHelper(0x10, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, parms,
		DeviceNr, IO, Level, Channel);
	return result;
}

void CAD_USB2XX::SetCalibration(short DeviceNr, short IO, short Level, short Channel, long nNewValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_I2 VTS_I2 VTS_I4;
	InvokeHelper(0x10, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, IO, Level, Channel, nNewValue);
}

void CAD_USB2XX::SetSerialNr(short DeviceNr, short nNewValue)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0x11, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
		 DeviceNr, nNewValue);
}

double CAD_USB2XX::ReadAnalogVoltage(short DeviceNr, short Channel)
{
	double result;
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0x7, DISPATCH_METHOD, VT_R8, (void*)&result, parms,
		DeviceNr, Channel);
	return result;
}

void CAD_USB2XX::WriteAnalogVoltage(short DeviceNr, short Channel, double Voltage)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2 VTS_R8;
	InvokeHelper(0x8, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		 DeviceNr, Channel, Voltage);
}

short CAD_USB2XX::ReadDigIn(short DeviceNr)
{
	short result;
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0x9, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
		DeviceNr);
	return result;
}

void CAD_USB2XX::WriteDigOut(short DeviceNr, short Value)
{
	static BYTE parms[] =
		VTS_I2 VTS_I2;
	InvokeHelper(0xa, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		 DeviceNr, Value);
}

void CAD_USB2XX::DataIO(short DeviceNr)
{
	static BYTE parms[] =
		VTS_I2;
	InvokeHelper(0xb, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		 DeviceNr);
}

void CAD_USB2XX::Close()
{
	InvokeHelper(0xc, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
Bisschen gedult noch, bin gerade aufgestanden. :doh:

Verfasst: 05.03.2006 15:29
von mk-soft
@Falko
Ok,
habe jetzt mal was angefangen.

Hier Download:
home.arcor.de\m_kastner\MyCodes

FF :wink:

Verfasst: 05.03.2006 16:19
von Falko
@mk-soft

Habs mir gerade herunter geladen und gestartet.
Ausgabe ist:

1.#INF


Wenn ich am Pin 1 gegen Masse eine Spannung anlege, dann kommt
das Gleiche heraus.

Gruß Falko

Verfasst: 05.03.2006 16:23
von mk-soft
Sag mir mal das ergebnis von:

Code: Alles auswählen

Procedure.d GetAnalogVoltage(*obj.IDispatch, DeviceNr.w, Channel.w)

  Dim Value.Variant(2)
  
  Result.Variant\vt = #VT_EMPTY
  Value(0)\vt = #VT_I2
  Value(0)\iVal = DeviceNr
  Value(1)\vt = #VT_I2
  Value(1)\iVal = Channel
  
  parms.DISPPARAMS
  With parms
    \rgvarg = @Value(0)        
    \rgdispidNamedArgs = 0
    \cArgs = 2
    \cNamedArgs = 0
  EndWith
  
  r1 = *Obj\Invoke($0d, ?IID_NULL, 0, #DISPATCH_PROPERTYGET, @parms, @Result, 0, 0)
  If r1 <> #S_OK
    LastMessage = "Fehler GetAnalogVoltage"
    LastError = $8008010D
    ProcedureReturn 0
  Else
    Debug Result\vt
    Debug Result\dblVal
    ProcedureReturn Result\dblVal  
  EndIf

EndProcedure


Verfasst: 05.03.2006 16:27
von mk-soft
Richtigen Channel eingetragen?

Verfasst: 05.03.2006 16:34
von mk-soft
Vielleicht falsche Funktion. Zum AdWrapper hinzufügen und aufrufen.

Code: Alles auswählen

Procedure.l GetAnalogIO(*obj.IDispatch, DeviceNr.w, Channel.w)

  Dim Value.Variant(2)
  
  Result.Variant\vt = #VT_EMPTY
  Value(0)\vt = #VT_I2
  Value(0)\iVal = DeviceNr
  Value(1)\vt = #VT_I2
  Value(1)\iVal = Channel
  
  parms.DISPPARAMS
  With parms
    \rgvarg = @Value(0)        
    \rgdispidNamedArgs = 0
    \cArgs = 2
    \cNamedArgs = 0
  EndWith
  
  r1 = *Obj\Invoke($0d, ?IID_NULL, 0, #DISPATCH_PROPERTYGET, @parms, @Result, 0, 0)
  If r1 <> #S_OK
    LastMessage = "Fehler GetAnalogIO"
    LastError = $8008010D
    ProcedureReturn 0
  Else
    ProcedureReturn Result\lVal  
  EndIf

EndProcedure

Verfasst: 05.03.2006 16:36
von mk-soft
Ops, falsche ID.

Code: Alles auswählen

Procedure.l GetAnalogIO(*obj.IDispatch, DeviceNr.w, Channel.w)

  Dim Value.Variant(2)
  
  Result.Variant\vt = #VT_EMPTY
  Value(0)\vt = #VT_I2
  Value(0)\iVal = DeviceNr
  Value(1)\vt = #VT_I2
  Value(1)\iVal = Channel
  
  parms.DISPPARAMS
  With parms
    \rgvarg = @Value(0)        
    \rgdispidNamedArgs = 0
    \cArgs = 2
    \cNamedArgs = 0
  EndWith
  
  r1 = *Obj\Invoke($0f, ?IID_NULL, 0, #DISPATCH_PROPERTYGET, @parms, @Result, 0, 0)
  If r1 <> #S_OK
    LastMessage = "Fehler GetAnalogIO"
    LastError = $8008010D
    ProcedureReturn 0
  Else
    ProcedureReturn Result\lVal  
  EndIf

EndProcedure


Verfasst: 05.03.2006 16:48
von Falko
OK, das sieht schon super aus. Ich muss das mal alles ausprobieren.
habe folgendes dort im Testprogramm geändert:

Code: Alles auswählen

If i < 127
    IO=GetAnalogIO(*ADUSB, i, 1) 
    Debug GetAnalogVoltage(*ADUSB, i, IO)
    
  Else
    Debug "AD_USB2 nicht gefunden."
  EndIf
und erhalte dann folgenden Wert:

1.7077534039334341

Verfasst: 05.03.2006 16:54
von mk-soft
Das ist Super. Wenn du Hilfe brauchst um den AdWrapper zu erweitern sag bescheid. Must meinen auszug von VC5 noch umsetzen.
Bei "InvokeHelper(0x5, DISPATCH_METHOD" ist die "0x5" die Funktions ID und auf Dispatch Type achten.

Dim Value.Variant(x) anpassen und anzahl der Parameter in parms\cArgs eintragen.

FF :wink:

Gehe jetzt erstmal weg.

Verfasst: 05.03.2006 17:05
von mk-soft
Ach Ja,
Und Rückgabewert aus Result richtig auslesen

ProcedureReturn Result\iVal für Word
ProcedureReturn Result\lVal für Long
etc

Siehe Global -> Structure -> Variant.

FF
:wink: