BT2k
|
USB-Quelltext aus Turbo Compact 2000
TurboCompact kann mehere Interfaces ansprechen. Wie das CompuLab-USB über den USB-Treiber angesprochen wird, zeigt der Quelltextausschnitt.
Zum Betrieb mit dem CompuLab-USB muss der passende Treiber geladen sein.
|
Hier ein Ausschnitt der D4-Unit für hardwarenahe Dinge von Turbo Compact 2000.
Alle RS232-Teile wurden herausgenommen. Die USB-Routinen wurden so eingebunden, dass sie kompatibel zu den RS232-Aufrufen sind. Es handelt sich um drei Aufrufe:
- AIN Analogwerte einlesens
- DIN Digitalwert einlesen
- DOUT Digitalwert ausgeben
|
Interface
|
unit comphard;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, mmsystem;
const
USBDEVICE='\\.\CompuLABusb_0';
var
outbyte:integer=0;
function ain(eingang:integer):integer; {Analogwert einlesen}
procedure dout(wert:integer); {Digitalwert ausgeben}
function din:integer; {Digitalwert einlesen}
|
|
Implementation
|
Implementation
type _lIn = record
bFunction : Byte;
bValue1 : Byte;
bValue2 : Byte;
bValue3 : Byte;
end;
type _lOut = record
bAck : Byte;
bValue1 : Byte;
bValue2 : Byte;
bValue3 : Byte;
bValue4 : Byte;
bValue5 : Byte;
bValue6 : Byte;
bValue7 : Byte;
end;
procedure USBWrRAM(Adresse, Wert: Byte);
var lIn: _lIn; lOut: _lOut; DeviceHandle: THandle;
nBytes: DWord; bresult: Boolean;
begin
lIn.bFunction := 23;
lIn.bValue1 := Adresse;
lIn.bValue2 := Wert;
DeviceHandle := CreateFile(USBDEVICE, Generic_write,
File_Share_write, nil,open_existing, 0, 0);
bResult := DeviceIoControl(DeviceHandle,$04,
@lIn,sizeof(lIn),@lOut,
sizeof(lOut),nBytes,nil);
if not bresult then begin hard:=0; end;
CloseHandle (DeviceHandle);
end;
Procedure USBInit;
begin
USBWrRAM ($34,$80); {AD-Startkanal festlegen;}
end;
Function USBFind:Boolean;
var DeviceHandle: THandle;
nBytes: DWord; bresult: Boolean;
begin
DeviceHandle := CreateFile(USBDEVICE, Generic_write,
File_Share_write, nil, open_existing, 0, 0);
if DeviceHandle=INVALID_HANDLE_VALUE then result:=false
else
begin
result:=true; USBInit;
end;
CloseHandle (DeviceHandle);
end;
|
|
Ein- und Ausgaben
|
function ain(eingang:integer):integer;
var e1,e2:integer;
Var DeviceHandle: THandle;
nBytes: DWord;
bresult: Boolean;
lIn: _lIn;
lOut: _lOut;
begin
result:=0;
case hard of
CLABUSB:
begin
USBinit;
lIn.bFunction := 6;
lIn.bValue1 := outbyte;
DeviceHandle := CreateFile(USBDEVICE, Generic_write,
File_Share_write, nil,
open_existing, 0, 0);
bResult := DeviceIoControl(DeviceHandle, $08, @lIn,
sizeof(lIn), @lOut,
sizeof(lOut), nBytes,nil);
CloseHandle (DeviceHandle);
e1 := (4*lOut.bValue2+ (lOut.bValue4 and 15)+1)div 4;
e2 := (4*lOut.bValue3+ (lOut.bValue4 div 15)+1)div 4;
if eingang=1 then result:=e1;
if eingang=2 then result:=e2;
if lOut.bAck<>66 then result:=-1
end;
end;
end;
procedure DOUT(wert:Integer);
Var DeviceHandle: THandle;
nBytes: DWord;
bresult: Boolean;
lIn: _lIn;
lOut: _lOut;
begin
case HARD of
CLABUSB:
begin
lIn.bFunction := 6;
lIn.bValue1 := Wert;
DeviceHandle :=
CreateFile(USBDEVICE, Generic_write,
File_Share_write, nil, open_existing, 0, 0);
bResult := DeviceIoControl(DeviceHandle, $08,
@lIn, sizeof(lIn), @lOut,
sizeof(lOut), nBytes, nil);
CloseHandle (DeviceHandle);
end;
end;
outbyte:=wert;
end;
function DIN:Integer;
var DeviceHandle: THandle;
nBytes: DWord;
bresult: Boolean;
lIn: _lIn;
lOut: _lOut;
begin
result:=127;
case hard of
CLABUSB:
begin
lIn.bFunction := 6;
lIn.bValue1 := outbyte;
DeviceHandle :=
CreateFile(USBDEVICE, Generic_write,
File_Share_write, nil, open_existing, 0, 0);
bResult := DeviceIoControl(DeviceHandle, $08,
@lIn, sizeof(lIn), @lOut,
sizeof(lOut), nBytes, nil);
CloseHandle (DeviceHandle);
if lOut.bAck=66 then result:= lOut.bValue1
else Result:=-1;
end;
end;
end;
end.
|
|
|
-
Updated: Sun, 11 Mar 2007 23:00:00 GMT
|
|
Zurück
|