BT2k
HOME

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

Zurück

.
Startseite Bücher Software Digital TV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt