ПО под лир941

Модератор: Денис Кашин

Ответить
CiSi

ПО под лир941

Сообщение CiSi »

При написании собственного приложения работающего с платой LIR941PCI,возникри тлудности.
пробовали писать под делфи, приложение компилировалось, но при его запуске вылезало сообщение "Точка входа в процедуру Open_driver_LIR_X не найдена в библиотеке Lir941PCI.dll" . таким образом ругается на все вункции.
это значит что в библиотеке эта функция описана как то по другому? или причина в чемто другом?

так же пробовали писать и на си ,модуль подключается, а вот при ввидении в программу какой либо функции, возникает ошибка связанная с файлом расширения *obl
Михаил Поляков
СКБИС
СКБИС
Сообщения: 79
Зарегистрирован: 06 фев 2008, 16:10

Re: ПО под лир941

Сообщение Михаил Поляков »

Попробуйте изменить название функции на "_Open_Driver_LIR_X@8" и "_UpdateData_LIR@16"
CiSi

Re: ПО под лир941

Сообщение CiSi »

Компилятор ругается на "@"
Михаил Поляков
СКБИС
СКБИС
Сообщения: 79
Зарегистрирован: 06 фев 2008, 16:10

Re: ПО под лир941

Сообщение Михаил Поляков »

Код: Выделить всё

var
  Form1: TForm1;
  hFile:Cardinal;
implementation

{$R *.dfm}


function OpenDriverLirX(plata_number:Byte ; var hFile:Cardinal): Boolean;
stdcall; external 'lir940pci.dll' name '_Open_Driver_LIR_X@8';

function UpdateDataLir(hFile:Cardinal;  kanal_number:Byte; var ident:byte; var statebyte:Byte): DWORD;
stdcall; external 'lir940pci.dll' name '_UpdateData_LIR@16';

procedure TForm1.FormCreate(Sender: TObject);
begin
if (OpenDriverLirX(0, hfile)) then Caption:= 'Driver ok !';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 ident, statebyte:Byte;
begin

  label1.Caption := IntToStr(UpdateDataLir(hFile, 1, ident, statebyte));
end;
CiSi

Re: ПО под лир941

Сообщение CiSi »

плата 24 битная значит она имеет 16777216 импульсов, как организовать счет в отрицательное значение и чтобы не возникало сброса в 1 при достижении 16777216?
Михаил Поляков
СКБИС
СКБИС
Сообщения: 79
Зарегистрирован: 06 фев 2008, 16:10

Re: ПО под лир941

Сообщение Михаил Поляков »

Для того, чтобы счетчик был знаковым, нужно контролировать его изменение.
К примеру завести две переменные. Текущее показание и Прошлое показание. И каждый раз анализировать абсолютное значение их разности.

Разность показаний = Текущее показание - Прошлое показание
Если абсолютное значение Разности показаний меньше чем половина глубины счетчика ( в данном случае 2^24/2), мы считаем что переполнения счетчика не было, и Знаковый счетчик = Знаковый счетчик + Разность показаний.
В противном случае мы считаем, что переполнение счетчика произошло, тогда Знаковый Счетчик = Знаковый счетчик + Разность показаний - sign(Разность показаний) * Глубину счетчика. Следует отметить, что работоспособность данного алгоритма возможна при условии, что частота опроса данных будет вдвое выше частоты переполнения счетчика.

В итоге код в нашем случае должен получиться приблизительно такой :

Код: Выделить всё

сonst DepthCounter = 16777216; // глубина аппаратного счетчика 2 в 24 степени
const HalfCounter = DepthCounter / 2;
Delta: Integer; // Разность показаний.
CurrentCounter := UpdateData_LIR(...); // текущее показание счетчика
Delta := CurrentCounter - PreviousCounter ; // вычисляем Разность показаний 
PreviousCounter  := CurrentCounter;   // предыдущее показание
if (Abs(Delta) > HalfCounter) then  SCounter := SCounter - sign(Delta)*DepthCounter 
else SCounter := Scounter + Delta;
// В данном псевдокоде функция Abs(x) возвращает абсолютное значение x
// Фукция sign(x) возвращает -1, если значение х - отрицательное, и 1 в противном случае.
// Переменные Scounter(знаковый счетчик) и PreviousCounter(предыдущее значение счетчика) типа Integer.
tureh012
Сообщения: 2
Зарегистрирован: 21 май 2012, 09:24

Re: ПО под лир941

Сообщение tureh012 »

CiSi писал(а):Компилятор ругается на "@"
Такая же ерунда. :(
Ответить