с отладкой
.docxunit 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.
