Разработчик: Хаустова Ирина Владимировна.
Позволяет выводить на экран компьютера в реальном масштабе времени информацию с цифровых и аналоговых датчиков двигателя (частота вращения, температуры, давления), с одновременной записью информации в электронной таблице.
Программное обеспечение:
- на DELPHI c подпрограммой на ASSEMLER,
- драйвер снятия защиты WINDOWS с LPT – PortTalk
В WINDOWS 7 прямое программирование порта LPT невозможно, поэтому необходимо использовать драйвер, основная функция которого – снять защиту с порта LPT. Для этого необходимо следующее:
- Скачиваем с любого сайта бесплатно распространяемую программу PortTalk
- Копируем в каталог программы измерительного комплекса файлы драйвера – porttalk.sys и allowio.exe
- Создаём новый текстовый файл — *.txt и записываем в него следующие команды: @echo off
Allowio 0x378 0x379 Project1.exe
- Сохраняем файл в каталоге программы измерительного комплекса под именем start.bat . Это будет запускающая программа измерительного комплекса. Project1.exe в запускающем файле start.bat — имя запускающего файла на DELPHI.
При компиляции программы на DELPHI не запускайте программу непосредственно через *.exe файл (например Project1.exe). DELPHI выдаст ошибку и это правильно, т.к защита с порта LPT не снята,
поэтому измерительный комплекс нужно запускать только через START.BAT
- Текст программы: (кидаем на форму 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.

Рис. № 12.12.1. Схема драйвера.