|
|
L780 C++ Builder6 (windows 7)
Здравствуйте! У меня возникли проблемы с подключением к драйверам!
Пишу на C++ Builder 6 на ОС WIndows 7
Подключаемые файлы:
#include "L-780//ioctl.h"
#include "L-780//ifc_ldev.h"
#include "L-780//create.h"
#include "L-780//791cmd.h"
#include "L-780//pcicmd.h"
На форуме нашел, что помогает подключение lguids.cpp и guiddef.h
Но в моем случае это не помогло!
Код:
----------------
LUnknown* pIUnknown;
IDaqLDevice* pI;
HRESULT hr;
ULONG slot = 0;
SLOT_PAR slotParam;
PLATA_DESCR_U2 plataDesc;
ADC_PAR adcPar;
CallCreateInstance("lcomp.dll");
//pIUnknown = CreateInstance(slot);
----------------
Выдает следующие ошибки:
Build
[C++ Warning] UnitMain.cpp(34): W8004 //'slot//' is assigned a value that is never used
[Linker Error] Unresolved external //'CallCreateInstance(char *)//' referenced from C://...//UNITMAIN.OBJ
В чем может быть проблема?
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: L780 C++ Builder6 (windows 7)
create.cpp там надо подключить
|
|
|
Re: L780 C++ Builder6 (windows 7)
Да, спасибо, помогло, но когда дошел, до
HRESULT hr = pIUnknown->QueryInterface(IID_ILDEV,(void**)&pI);
Начал опять выдавать ошибки:
[Linker Error] Unresolved external //'_IID_ILDEV//' referenced from C://...//UNIT1.OBJ
Include:
#include "L-780//ioctl.h"
#include "L-780//ifc_ldev.h"
#include "L-780//create.cpp"
#include "L-780//791cmd.h"
#include "L-780//pcicmd.h"
Код:
--------------------------
ULONG slot = 0;
SLOT_PAR slotParam;
PLATA_DESCR_U2 plataDesc;
ADC_PAR adcPar;
if(CallCreateInstance("lcomp.dll"))
{
Form1->Label_LoadLib->Caption = "Óñïåøíî";
}
else
{
Form1->Label_LoadLib->Caption = "ÍÅÒ";
}
LUnknown* pIUnknown = CreateInstance(slot);
if(pIUnknown == NULL)
{
Form1->Label_Slot->Caption = "ÍÅÒ";
}
else
{
Form1->Label_Slot->Caption = "Óñïåøíî";
}
IDaqLDevice* pI;
HRESULT hr = pIUnknown->QueryInterface(IID_ILDEV,(void**)&pI);
--------------------------
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: L780 C++ Builder6 (windows 7)
create.cpp и lguids.cpp включать нужно, и не инклюдами а в проект.
|
|
|
Re: L780 C++ Builder6 (windows 7)
Спасибо, это заработало:
Включил в проект create.cpp и lguids.cpp по средствам Project->Add to Project...
Include подправил на:
#include "L-780//ioctl.h"
#include "L-780//ifc_ldev.h"
#include "L-780//create.h"
Хотел бы узнать про потоки данных с АЦП ...
Посмотрел рекомендуемый пример L7xx.tst!
-----------------
ULONG WINAPI ServiceThread(PVOID /*Context*/)
{
ULONG halfbuffer = IrqStep*pages/2; // Собираем половинками кольцевого буфера
ULONG fl2,fl1 = fl2 = (*sync<=halfbuffer)? 0:1; // Настроили флаги
USHORT *tmp, *tmp1;
for(int i=0;i<multi;i++) // Цикл по необходимомму количеству половинок
{
while(fl2==fl1) fl2=(*sync<=halfbuffer)? 0:1; // Ждем заполнения половинки буфера
tmp=fdata+(halfbuffer*i); // Настраиваем указатель в файле
tmp1=data+(halfbuffer*fl1); // Настраиваем указатель в кольцевом буфере
memcpy(tmp,tmp1,halfbuffer*sizeof(USHORT));// Записываем данные в файл
fl1=(*sync<=halfbuffer)? 0:1; // Обновляем флаг
Sleep(0); // если собираем медленно то можно и спать больше
}
complete=1; // Мы завершили сбор данных
return 0; // Вышли
}
-----------------
Вопрос! А где запись данных с АЦП здесь? Неужели tmp и tmp1 содержат сигналы с платы?
Пример чтения одного отсчета с АЦП:
-----------------
ASYNC_PAR pp;
pp.s_Type = L_ASYNC_ADC_INP;
pp.Chn[0] = 0x00; // 0 канал дифф. подключение (в общем случае лог. номер канала)
pI->IoAsync(&pp);cout << (short)pp.Data[0] << endl; // в Data[0] код АЦП
-----------------
Вопрос! Если данный код запускать через таймер каждые N мс или внести в цикл со Sleep(N), то здесь будет всегда выводится ПЕРВЫЙ отсчет из кадра или ПЕРВЫЙ отсчет из ПЕРВОГО кадра?
И совсем дурацкий вопрос: а где хранятся получаемые сигналы с платы, в кольцевом буфере так называемом?
Функция ReadFlashWord() - Чтение слова из пользовательского Flash. Что за слова читаются с flash или это как раз сигналы поданные на плату?
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: L780 C++ Builder6 (windows 7)
сигналы с платы в кольцевом буфере data. при одиночном опросе будет выводиться один отсчет с канала что в Chn[0] задан. медленно и неравномерно по временной шкале.
ReadFlashWord используется при чтении ПЗУ с информацией в ReadPlataDescr. Пользователю нужна редко. Write лучше не пробовать без полного понятия зачем это нужно...
|
|
|
Re: L780 C++ Builder6 (windows 7)
Уважаемый Poul.
Хотелось бы уточнить следующие моменты:
-------
...
adcPar.t1.NCh = 4;
adcPar.t1.Chn[0] = 0x0;
adcPar.t1.Chn[1] = 0x1;
adcPar.t1.Chn[2] = 0x2;
adcPar.t1.Chn[3] = 0x3;
...
--------
Chn[i] описывает порядок опроса каналов и усиление!
Усиление на канале задается после "х"?
Если да, то можно ли на всех канал указать значение 0 или в этом случае порядок опроса каналов "заглючит"?
Произведение IrqStep и Pages показывают размер кольцевого буфера data[i]?
После описания параметров сбора данных они записываются в кольцевой буфер data[i] в порядке:
Канал 0: data[0], data[4] ...
Канал 1: data[1], data[5] ...
Канал 2: data[2], data[6] ...
Канал 3: data[3], data[7] ...
Это при однократном типе сборе данных или в виде:
Канал 0: data[0];
Канал 1: data[1];
Канал 2: data[2];
Канал 3: data[3];
????
Если осуществлять чтение буфера через таймер
----------
pp.s_Type = L_ASYNC_ADC_INP;
pp.Chn[0] = 0x0;
pp.Chn[1] = 0x1; pp.Chn[2] = 0x2; pp.Chn[3] = 0x3;
pI->IoAsync(&pp);
----------
, то pp.Data[i] постоянно надо увеличивать на количество каналов или достаточно pp.Data[0],pp.Data[1], ... (Т.е. считывать будем один отсчет из одного кадра, который равен произведению IrqStep и Pages), после чего очищаем кольцевой буфер и заполняем еще следующими данными из которых опять один отсчет будем считывать)??
Считывание отсчетов идет в двоичной системе? Запустил сбор данных и получаю значения 61648, если подам напряжение в 1В, то какое значение или интервал значения и буду наблюдать (с учетом шумов конечно же)?
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: L780 C++ Builder6 (windows 7)
Chn[i] побитово сформированное число - как смотрите в описании на плату про логический номер канала.
При потоковом сбое данных да IrqStep *Pages эторазмер буфера и данные лежат как по перовму варианту.
Одингочное чтение через IoAsync это именно одиночное чтение с одного канала, никаких кадров. Задали номер канала получили отчет. Отсчеты знаковый 16 бит. те тип short. 61648 это отрицательно число.
|
|
|
Re: L780 C++ Builder6 (windows 7)
Уважаемый, Poul!
Не хватает мне знаний школьной информатики! Но как получили из 61648 отрицательное число? Это шестнадцатеричная система (тогда букв что-то не хватает)?
Какой запрос в гугл вписать, что бы понять какое напряжение(ток) кроется в этом числе?! )) М.б. страничку назовете из L-7xx Programmer//'s Guide DOS Plx_Api (если там есть такое)!
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: L780 C++ Builder6 (windows 7)
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: L780 C++ Builder6 (windows 7)
на С типа приведение типа (short)data[i];
странички 8 9
|
|
|
Re: L780 C++ Builder6 (windows 7)
to Poul
Если правильно понял, то значения в кольцевом буфере принимают значения от -65 536 до 65 535.
to Александр Е
Если, верить википедии, то 61848 это 61848-65535 = 3687? Помойму, как-то не сходится 
|
|
|
Re: L780 C++ Builder6 (windows 7)
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: L780 C++ Builder6 (windows 7)
Я бы сказал, что 61848 - 65536 = -3688.
16-битные знаковые целые принимают значения от -32768 (0x8000) до 32767 (0x7FFF).
Это значение в отсчетах АЦП. Преобразование в вольты - см. документацию устройства (там должно быть указано, сколько единиц соответствует границе диапазона измерения и как применять калибровочные коэффициенты).
|