Измерительный комплекс.
Выводит на экран компьютера в реальном масштабе времени информацию с цифровых и аналоговых датчиков двигателя (частота вращения, температуры, давления), с одновременной записью информации в электронной таблице.
Программное обеспечение:
1. на DELPHI c подпрограммой на ASSEMLER,
2. драйвер снятия защиты WINDOWS с LPT – PortTalk
В WINDOWS XP прямое программирование порта LPT невозможно, поэтому необходимо использовать драйвер, основная функция которого – снять защиту с порта LPT. Для этого необходимо следующее:
1. Скачиваем с любого сайта бесплатно распространяемую программу PortTalk
2. Копируем в каталог программы измерительного комплекса файлы драйвера – porttalk.sys и allowio.exe
3. Создаём новый текстовый файл - *.txt и записываем в него следующие команды:
@echo off
Allowio 0x378 0x379 Project1.exe
4. Сохраняем файл в каталоге программы измерительного комплекса под именем start.bat . Это будет запускающая программа измерительного комплекса. Project1.exe в запускающем файле start.bat - имя запускающего файла на DELPHI.
При компиляции программы на DELPHI не запускайте программу непосредственно через *.exe файл (например Project1.exe). DELPHI выдаст ошибку и это правильно, т.к защита с порта LPT не снята, поэтому измерительный комплекс нужно запускать только через START.BAT
5. Текст программы: (кидаем на форму 2-е кнопки, 2 окна ввода информации, таймер и метки)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, comobj;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Timer1: TTimer;
Button2: TButton;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TThread1 = class(TThread)
public
procedure Execute; override;
end;
var
Form1: TForm1;
binResult: Word;
total: Real;
Thread1: TThread1;
Done: Byte;
cnt: Integer;
freq: Real;
Stop: Word;
XLApp: OleVariant;
i1:Integer;
implementation
{$R *.dfm}
procedure TThread1.Execute;
begin
sleep(1000);
Done:=1;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
const
DATA = #$378;
STATUS = #$379;
begin
cnt:=0;
Done:=0;
asm
push EBX
mov DX, DATA
xor AX, AX
btr AX, 6
out DX, AL
mov BX, 8
@next:
xor AX, AX
mov DX, DATA
btr AX, 5
out DX, AL
bts AX, 5
out DX, AL
mov DX, STATUS
in AL, DX
bt AX, 6
rcl CX, 1
dec BX
jnz @next
mov DX, DATA
bts AX, 6
out DX, AL
pop EBX
and CX, 00FFh
mov word ptr binResult, CX
end;
total:=binResult*5/256;
Edit1.Text:= FloatToStr(total);
XLApp.ActiveSheet.cells.item[i1,1].value:=total;
Inc(i1);
Thread1:= TThread1.Create(False);
asm
clc
mov DX, 379h
@wait_1:
in AL, DX
bt AX, 7
jnc @wait_1
//
@wait_0:
in AL, DX
bt AX, 7
jc @wait_0
inc dword ptr cnt
cmp byte ptr Done, 1
jne @wait_1
end;
Thread1.Terminate();
freq:= cnt / 1000;
Edit2.Text:= FloatToStr(freq);
XLApp.ActiveSheet.cells.item[i1,2].value:=freq;
Inc(i1);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled:= false;
Button2.Enabled:= true;
timer1.Enabled:= true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.Enabled:= true;
Button2.Enabled:= false;
timer1.Enabled:= false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=false;
Button1.Enabled:= true;
Button2.Enabled:= false;
XLApp:= CreateOleObject('Excel.Application');
XLApp.Workbooks.Add;
XLApp.Visible:= True;
i1:=1;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts:= False; // Discard unsaved files...
XLApp.Quit;
end;
end;
end.