Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

с отладкой

.docx
Скачиваний:
1
Добавлен:
29.03.2026
Размер:
15.93 Кб
Скачать

unit MainUnit;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Memo1: TMemo;

Button1: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormDestroy(Sender: TObject);

private

hPort: THandle;

end;

var

Form1: TForm1;

implementation

// Импорт функций из libcamac.dll

function openCOMPort(const Name: PChar; var ComPort: THandle): integer; stdcall; external 'libcamac.dll';

function closeCOMPort(ComPort: THandle): integer; stdcall; external 'libcamac.dll';

function searchCOMPorts(Numbers: pointer; const Size: integer): integer; stdcall; external 'libcamac.dll';

procedure setCamacPort(Port: THandle); stdcall; external 'libcamac.dll';

procedure clearBuffer(); stdcall; external 'libcamac.dll';

procedure ActCam(); stdcall; external 'libcamac.dll';

procedure ActNAF(N, A, F: byte); stdcall; external 'libcamac.dll';

function ActR(): longword; stdcall; external 'libcamac.dll';

procedure ActW(Word: longword); stdcall; external 'libcamac.dll';

{$R *.dfm}

const

ST_COUNTER = 14; // Счетчик ФК-5299

ST_REG = 20; // Регистр ФК449

A_CNT = 2; // Субадрес счетчика

A_REG = 0; // Субадрес регистра

procedure TForm1.FormCreate(Sender: TObject);

var

ports: array[0..9] of Integer;

i, cnt: Integer;

ErrorCode: Integer;

begin

hPort := THandle(-1);

Edit1.Text := '10';

Memo1.Clear;

Memo1.Lines.Add('Поиск COM-портов...');

cnt := searchCOMPorts(@ports, SizeOf(ports));

Memo1.Lines.Add('Найдено портов: ' + IntToStr(cnt));

if cnt = 0 then

begin

Memo1.Lines.Add('ОШИБКА: COM-порты не найдены!');

Memo1.Lines.Add('Проверьте подключение контроллера.');

Exit;

end;

for i := 0 to cnt-1 do

begin

Memo1.Lines.Add('Пробуем открыть COM' + IntToStr(ports[i]));

ErrorCode := openCOMPort(PChar('COM'+IntToStr(ports[i])), hPort);

if ErrorCode = 0 then

begin

Memo1.Lines.Add('УСПЕШНО: Открыт COM' + IntToStr(ports[i]));

setCamacPort(hPort);

Memo1.Lines.Add('Порт установлен для работы с CAMAC');

Break;

end

else

begin

Memo1.Lines.Add('ОШИБКА: Не удалось открыть COM' + IntToStr(ports[i]) + ', код: ' + IntToStr(ErrorCode));

end;

end;

if hPort = THandle(-1) then

begin

Memo1.Lines.Add('НЕ УДАЛОСЬ открыть ни один COM-порт!');

Memo1.Lines.Add('Возможные причины:');

Memo1.Lines.Add('- Контроллер не подключен');

Memo1.Lines.Add('- Драйвер не установлен');

Memo1.Lines.Add('- Файл libcamac.dll не найден');

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

n, i: Integer;

val: Longword;

begin

Memo1.Lines.Add('--- Нажата кнопка Старт ---');

if hPort = THandle(-1) then

begin

Memo1.Lines.Add('ОШИБКА: Порт не открыт! Перезапустите программу.');

Exit;

end;

n := StrToIntDef(Edit1.Text, 10);

Memo1.Lines.Add('Задано измерений: ' + IntToStr(n));

if n <= 0 then

begin

Memo1.Lines.Add('ОШИБКА: Количество измерений должно быть > 0');

Exit;

end;

Memo1.Lines.Add('Начинаем измерения...');

Memo1.Lines.Add('Частота (Гц):');

for i := 1 to n do

begin

Memo1.Lines.Add('--- Измерение ' + IntToStr(i) + ' ---');

try

clearBuffer;

ActNAF(ST_COUNTER, A_CNT, 26);

ActCam;

Memo1.Lines.Add(' Запуск счета (F26) - выполнен');

Sleep(1000);

Memo1.Lines.Add(' Задержка 1 сек - завершена');

clearBuffer;

ActNAF(ST_COUNTER, A_CNT, 24);

ActCam;

Memo1.Lines.Add(' Останов счета (F24) - выполнен');

clearBuffer;

ActNAF(ST_COUNTER, A_CNT, 2);

ActCam;

Memo1.Lines.Add(' Чтение счетчика (F2) - выполнен');

val := ActR;

Memo1.Lines.Add(' Получено значение: ' + IntToStr(val));

clearBuffer;

ActW(val);

ActNAF(ST_REG, A_REG, 16);

ActCam;

Memo1.Lines.Add(' Запись в регистр (F16) - выполнен');

Memo1.Lines.Add(' РЕЗУЛЬТАТ: ' + IntToStr(i) + ': ' + IntToStr(val) + ' Гц');

Sleep(100);

except

on E: Exception do

begin

Memo1.Lines.Add(' ОШИБКА при измерении: ' + E.Message);

end;

end;

end;

clearBuffer;

Memo1.Lines.Add('--- Измерения завершены ---');

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

if hPort <> THandle(-1) then

begin

closeCOMPort(hPort);

Memo1.Lines.Add('Порт закрыт');

end;

end;

end.