unit DIOu; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, Registry, ExtCtrls ; type TMainFrm = class(TForm) Label5: TLabel; GroupBox1: TGroupBox; ExitButton: TBitBtn; Memo1: TMemo; AddressList: TComboBox; CardName: TLabel; Label1: TLabel; BeginSample: TButton; RunTimer: TTimer; PortAOut: TPanel; PortAIn: TPanel; PortBIn: TPanel; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure ExitButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure AddressListChange(Sender: TObject); procedure RunTimerTimer(Sender: TObject); procedure BeginSampleClick(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var MainFrm: TMainFrm; RunFlag:Boolean; Offset : WORD; NumCards, CardNum : Integer; PortOffset: array[0..4] of WORD = (0, 4, 8, 12, 16); //known offsets implementation uses AIOWDM; type TCardData = record Base: LongWord; PPIs: LongWord; IsWDG: Boolean; //IRQCount: LongWord; //LastCOSData: TCOSData; Log: String; WDGPets: LongWord; end; var CardData: array of TCardData; {$R *.DFM} procedure TMainFrm.FormCreate(Sender: TObject); var i: Integer; found: Boolean; DeviceID, Base: LongWord; NameSize: LongWord; Name: String; Success: LongWord; begin found := false; RunFlag:=True; if (InPortB($61) = $AA55) then begin Application.MessageBox(' AIOWDM.SYS not detected.\n Please copy AIOWDM.SYS into [Windows]/system32/drivers and re-run this sample.\n Ensure that a board is installed properly.', 'Warning', IDOK); end; NumCards := GetNumCards(); CardNum := 0; // one and only card Offset := 0; // One and only card offset if NumCards = 0 then begin Memo1.Text := 'No cards found. The cards may not be installed, or they may be installed using a driver other than AIOWDM.sys.'; end; NameSize := 256; SetString(Name, nil, NameSize); Success := QueryCardInfo(CardNum, @DeviceID, @Base, @NameSize, PChar(Name)); SetLength(Name, NameSize - 1); case (DeviceID) of $ECA9: begin CardName.Caption:='PCI-A12-16 Analog I/O Card with Digital'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $ECAA: begin CardName.Caption:='PCI-A12-16A Analog I/O Card with Digital'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $2C58:begin CardName.Caption:='PCI-DIO-96C3 Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); AddressList.Items.Add('Group 2 Base Offset 8'); AddressList.Items.Add('Group 3 Base Offset 12'); found := true; end; $2C50, $2C70:begin CardName.Caption:='PCI-DIO-96CT Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); AddressList.Items.Add('Group 2 Base Offset 8'); AddressList.Items.Add('Group 3 Base Offset 12'); found := true; end; $0C50:begin CardName.Caption:='PCI-DIO-24H Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0C51:begin CardName.Caption:='PCI-DIO-24D Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0E51:begin CardName.Caption:='PCI-DIO-24H(C) Parallel Digital I/O Card w/Counter'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0E52:begin CardName.Caption:='PCI-DIO-24D(C) Parallel Digital I/O Card w/Counter'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0C52:begin CardName.Caption:='PCIe-DIO-24 Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0E53:begin CardName.Caption:='PCIe-DIO-24S Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0C53:begin CardName.Caption:='PCIe-DIO-24D Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0E55:begin CardName.Caption:='PCIe-DIO-24DC Parallel Digital I/O Card w/Counter'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0E54:begin CardName.Caption:='PCIe-DIO-24DS Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0E56:begin CardName.Caption:='PCIe-DIO-24DCS Parallel Digital I/O Card w/Counter'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $0C60:begin CardName.Caption:='PCI-DIO-48 Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); found := true; end; $0E60:begin CardName.Caption:='PCI-DIO-48S Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); found := true; end; $0C61: begin CardName.Caption:='PCIe-DIO-48 Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); found := true; end; $0E61: begin CardName.Caption:='PCIe-DIO-48S Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); found := true; end; $0C68:begin CardName.Caption:='PCI-DIO-72 Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); AddressList.Items.Add('Group 2 Base Offset 8'); found := true; end; $0C70:begin CardName.Caption:='PCI-DIO-96 Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); AddressList.Items.Add('Group 2 Base Offset 8'); AddressList.Items.Add('Group 3 Base Offset 12'); found := true; end; $0C69:begin CardName.Caption:='P104-DIO-96 Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); AddressList.Items.Add('Group 2 Base Offset 8'); AddressList.Items.Add('Group 3 Base Offset 12'); found := true; end; $0C78:begin CardName.Caption:='PCI-DIO-120 Parallel Digital I/O Card'; AddressList.Items.Add('Group 0 Base Offset 0'); AddressList.Items.Add('Group 1 Base Offset 4'); AddressList.Items.Add('Group 2 Base Offset 8'); AddressList.Items.Add('Group 3 Base Offset 12'); AddressList.Items.Add('Group 4 Base Offset 16'); found := true; end; $6C90:begin CardName.Caption:='PCI-DA12-2 Digital to Analog Output Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $6C98:begin CardName.Caption:='PCI-DA12-4 Digital to Analog Output Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $6CA0:begin CardName.Caption:='PCI-DA12-6 Digital to Analog Output Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $6CA8:begin CardName.Caption:='PCI-DA12-8 Digital to Analog Output Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $6CB0:begin CardName.Caption:='PCI-DA12-16 Digital to Analog Output Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; $2EE0:begin CardName.Caption:='PCIe-DIO24-CTR12 Card'; AddressList.Items.Add('Group 0 Base Offset 0'); found := true; end; end;{case} if not found then begin CardName.Caption:='No Card Found.'; Memo1.Lines.Clear; Memo1.Lines.Append('No PCI Card Found.'); Memo1.Lines.Append('The sample program might not have been updated for your specific device ID.'); Label1.hide; Addresslist.hide; RunFlag:=False; end; AddressList.ItemIndex:=0; if RunFlag then //Placeholder end; procedure TMainFrm.ExitButtonClick(Sender: TObject); begin Close; end; procedure TMainFrm.AddressListChange(Sender: TObject); begin Memo1.Lines.Append('New Port Selected: ' + AddressList.Items[AddressList.ItemIndex]); // Just set correct offset for the port based on selection index Offset := PortOffset[AddressList.ItemIndex]; end; procedure TMainFrm.RunTimerTimer(Sender: TObject); const value: array[0..2] of Integer = (0, 0, 0); i: Integer = 0; var j: integer; msg: string; begin value[0] := 1 shl i; RelOutPortB(CardNum, Offset, value[0]); value[1] := RelInPortB(CardNum, Offset); value[2] := RelInPortB(CardNum, Offset + 1); inc(i); i := i mod 8; msg := '00000000'; for j := 0 to 7 do if (value[0] and (1 shl j)) <> 0 then msg[8-j] := '1' else msg[8-j] := '0' ; PortAOut.Caption := msg; for j := 0 to 7 do if (value[1] and (1 shl j)) <> 0 then msg[8-j] := '1' else msg[8-j] := '0' ; PortAIn.Caption := msg; for j := 0 to 7 do if (value[2] and (1 shl j)) <> 0 then msg[8-j] := '1' else msg[8-j] := '0' ; PortBIn.Caption := msg; end; procedure TMainFrm.BeginSampleClick(Sender: TObject); begin //if not RunFlag then // Placeholder if RunTimer.Enabled then Begin RunTimer.Enabled := False; BeginSample.Caption := 'Perform I/O'; end else begin RelOutPortB(CardNum,Offset + 3, $82); RunTimer.Enabled := True; BeginSample.Caption := 'Stop I/O'; end; end; procedure TMainFrm.FormActivate(Sender: TObject); begin // Placeholder end; END.