12.12. Программа системы управления

Разработчик: Хаустова Ирина Владимировна.

Позволяет выводить на экран компьютера в реальном масштабе времени информацию с цифровых и аналоговых датчиков двигателя (частота вращения, температуры, давления), с одновременной записью информации в электронной таблице. 

Программное обеспечение:

  1. на DELPHI c подпрограммой на ASSEMLER, 
  2. драйвер снятия защиты WINDOWS с LPT – PortTalk

В WINDOWS 7 прямое программирование порта LPT невозможно, поэтому необходимо использовать драйвер, основная функция которого – снять защиту с порта LPT. Для этого необходимо следующее:

  1. Скачиваем с любого сайта бесплатно распространяемую программу 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. Схема драйвера.