При написании собственного приложения работающего с платой LIR941PCI,возникри тлудности.
пробовали писать под делфи, приложение компилировалось, но при его запуске вылезало сообщение "Точка входа в процедуру Open_driver_LIR_X не найдена в библиотеке Lir941PCI.dll" . таким образом ругается на все вункции.
это значит что в библиотеке эта функция описана как то по другому? или причина в чемто другом?
так же пробовали писать и на си ,модуль подключается, а вот при ввидении в программу какой либо функции, возникает ошибка связанная с файлом расширения *obl
ПО под лир941
Модератор: Денис Кашин
-
- СКБИС
- Сообщения: 79
- Зарегистрирован: 06 фев 2008, 16:10
Re: ПО под лир941
Попробуйте изменить название функции на "_Open_Driver_LIR_X@8" и "_UpdateData_LIR@16"
-
- СКБИС
- Сообщения: 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;
Re: ПО под лир941
плата 24 битная значит она имеет 16777216 импульсов, как организовать счет в отрицательное значение и чтобы не возникало сброса в 1 при достижении 16777216?
-
- СКБИС
- Сообщения: 79
- Зарегистрирован: 06 фев 2008, 16:10
Re: ПО под лир941
Для того, чтобы счетчик был знаковым, нужно контролировать его изменение.
К примеру завести две переменные. Текущее показание и Прошлое показание. И каждый раз анализировать абсолютное значение их разности.
Разность показаний = Текущее показание - Прошлое показание
Если абсолютное значение Разности показаний меньше чем половина глубины счетчика ( в данном случае 2^24/2), мы считаем что переполнения счетчика не было, и Знаковый счетчик = Знаковый счетчик + Разность показаний.
В противном случае мы считаем, что переполнение счетчика произошло, тогда Знаковый Счетчик = Знаковый счетчик + Разность показаний - sign(Разность показаний) * Глубину счетчика. Следует отметить, что работоспособность данного алгоритма возможна при условии, что частота опроса данных будет вдвое выше частоты переполнения счетчика.
В итоге код в нашем случае должен получиться приблизительно такой :
// В данном псевдокоде функция Abs(x) возвращает абсолютное значение x
// Фукция sign(x) возвращает -1, если значение х - отрицательное, и 1 в противном случае.
// Переменные Scounter(знаковый счетчик) и PreviousCounter(предыдущее значение счетчика) типа Integer.
К примеру завести две переменные. Текущее показание и Прошлое показание. И каждый раз анализировать абсолютное значение их разности.
Разность показаний = Текущее показание - Прошлое показание
Если абсолютное значение Разности показаний меньше чем половина глубины счетчика ( в данном случае 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;
// Фукция sign(x) возвращает -1, если значение х - отрицательное, и 1 в противном случае.
// Переменные Scounter(знаковый счетчик) и PreviousCounter(предыдущее значение счетчика) типа Integer.
Re: ПО под лир941
Такая же ерунда.CiSi писал(а):Компилятор ругается на "@"
![Sad :(](./images/smilies/icon_sad.gif)