Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


L780 C++ Builder6 (windows 7)

Вы не вошли.

 Поиск | Регистрация | Вход 

Алексей
03.10.2011 16:11:19
#1

Гость

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


В чем может быть проблема?

03.10.2011 16:23:10
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 C++ Builder6 (windows 7)

create.cpp там надо подключить

Алексей
04.10.2011 13:03:26
#3

Гость

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);

--------------------------

04.10.2011 13:21:19
#4

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 C++ Builder6 (windows 7)

create.cpp и lguids.cpp включать нужно, и не инклюдами а в проект.

Алексей
05.10.2011 17:27:50
#5

Гость

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 или это как раз сигналы поданные на плату?

06.10.2011 10:36:35
#6

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 C++ Builder6 (windows 7)

сигналы с платы в кольцевом буфере data. при одиночном опросе будет выводиться один отсчет с канала что в Chn[0] задан. медленно и неравномерно по временной шкале.
ReadFlashWord используется при чтении ПЗУ с информацией в ReadPlataDescr. Пользователю нужна редко. Write лучше не пробовать без полного понятия зачем это нужно...

Алексей
10.10.2011 09:21:10
#7

Гость

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В, то какое значение или интервал значения и буду наблюдать (с учетом шумов конечно же)?

10.10.2011 10:00:22
#8

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 C++ Builder6 (windows 7)

Chn[i] побитово сформированное число - как смотрите в описании на плату про логический номер канала.
При потоковом сбое данных да IrqStep *Pages эторазмер буфера и данные лежат как по перовму варианту.
Одингочное чтение  через IoAsync это именно одиночное чтение с одного канала, никаких кадров. Задали номер канала получили отчет. Отсчеты знаковый 16 бит. те тип short. 61648 это отрицательно число.

Алексей
10.10.2011 11:11:42
#9

Гость

Re: L780 C++ Builder6 (windows 7)

Уважаемый, Poul!

Не хватает мне знаний школьной информатики! Но как получили из 61648 отрицательное число? Это шестнадцатеричная система (тогда букв что-то не хватает)?

Какой запрос в гугл вписать, что бы понять какое напряжение(ток) кроется в этом числе?!  smile)) М.б. страничку назовете из L-7xx Programmer//'s Guide DOS Plx_Api (если там есть такое)!

10.10.2011 11:39:45
#10

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: L780 C++ Builder6 (windows 7)

10.10.2011 11:46:29
#11

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 C++ Builder6 (windows 7)

на С типа приведение типа (short)data[i];

странички 8 9

Алексей
10.10.2011 11:59:48
#12

Гость

Re: L780 C++ Builder6 (windows 7)

to Poul
Если правильно понял, то значения в кольцевом буфере принимают значения от  -65 536 до  65 535.
to Александр Е
Если, верить википедии, то 61848 это 61848-65535 = 3687? Помойму, как-то не сходится smile

MICV
10.10.2011 13:02:42
#13

Гость

Re: L780 C++ Builder6 (windows 7)

Наверное, еще почитать стоит:
http://www.ozon.ru/context/detail/id/6089823/

10.10.2011 13:07:14
#14

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: L780 C++ Builder6 (windows 7)

Я бы сказал, что 61848 - 65536 = -3688.
16-битные знаковые целые принимают значения от -32768 (0x8000) до 32767 (0x7FFF).

Это значение в отсчетах АЦП. Преобразование в вольты - см. документацию устройства (там должно быть указано, сколько единиц соответствует границе диапазона измерения и как применять калибровочные коэффициенты).