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


Переход с L780 на Е440

Вы не вошли.

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

Denis
05.10.2006 10:53:35
#1

Гость

Переход с L780 на Е440

Здравствуйте.
У меня было написано по для С шарпа сбора данных с помощью L780 использовалась библиотека wlcomp.dll и соответственно биос L780.bio вопрос в следующем можно ли использовать эту же библиотеку для Е440... т.е. только поменять биос... И если в компьютере установлена плата L780 и Е440 как с ними правильно работать?

05.10.2006 11:00:26
#2

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

Re: Переход с L780 на Е440

скоро будет можно. только с ЦАП пока ограниченно.

Denis
05.10.2006 14:45:04
#3

Гость

Re: Переход с L780 на Е440

тогда вопрс два (скоро это хорошо... но надо было еще вчера..) под L780 вы мне давали обертку для библиотеке lcomp.dll которая называлась wlcomp.dll .. может такое же счастье есть и для библиотеки используемой для e440 Lusbapi.dll я б тогда по образу и подобию L780 попробовал бы переделать...

Заранее спсибо...

05.10.2006 15:58:50
#4

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

Re: Переход с L780 на Е440

у меня e440 уже готова в lcomp и соответственно оберта таже будет... просто я тут еще 140 и 20-10 хочу засунуть, но попробую промежуточно выложить что  есть с 440...

Denis
06.10.2006 16:53:49
#5

Гость

Re: Переход с L780 на Е440

А куда она будет выкладыватся? где это надо смотреть... Я так понимаю это будет библеотека wlcomp.dll - модифицированная... или это будет что то типа wLusbapi.dll т.е. обертка для Lusbapi.dll ???

09.10.2006 09:20:04
#6

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

Re: Переход с L780 на Е440

lcomp просто новый...

09.10.2006 11:49:58
#7

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

Re: Переход с L780 на Е440

положил уже

Denis
09.10.2006 18:30:08
#8

Гость

Re: Переход с L780 на Е440

Поправте меня если я не прав. Суть в следующем, wlcomp - остается старый... подставляю новую библиотеку. Внутри программы меняю биос на другой... Что еще нужно поменять... Где определяется какая из двух плат устанвленных в системе будет работать... в общем то непонятно в какую их них будет писатся прописанный биос. Может это где то нужно так называемые виртуальные слоты???  В общем не совсем понятно в какую сторону смотреть...

10.10.2006 09:19:26
#9

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

Re: Переход с L780 на Е440

платы определяются-выбираються исходя из SLOT_PARAM (тип платы) и серийника из флеша. А так в принципе правильно. В дистрибутиве есть пример с враппером для L7xx и E440 - сравните их...

Denis
10.10.2006 17:07:49
#10

Гость

Re: Переход с L780 на Е440

Проблема в том что usb  ни в одном из виртуальных слотов не определяются... даже ваша программа L-graph находит при инициализации псай плату в нулевом слоте а usb - слот птичкой не отмечен...

поэтому пример e440.tst тоже незапускается.. тк как там по умолчанию 0 виртуальный слот, а там стоит псай плата.. а подставляеш любой другой виртуальный слот CallCreateInstance возращает ошибку 2 (кстати почему не 3, вроде она как раз под отсутствие в слоте платы и заточена???)

исходник примерно такой:

int main(int argc, char *argv[])
{
ULONG hDll;
ULONG Err;
WDAQ_PAR ap;
PLATA_DESCR_E440 pd;
SLOT_PAR sl;
//        ULONG slot = 10;


for (ULONG slot = 0; slot < 100; slot++)
{
   hDll = LoadAPIDLL("lcomp.dll");

   hIfc = (ULONG)CallCreateInstance(&hDll, slot ,&Err); // return handle for new iface
if (Err != 0)
{

cout << "CallCreateInstance выдало ошибку номер " << Err << endl;
getch();
}
else
{
   Err = OpenLDevice(&hIfc);
   cout << "OpenLDevice Handle " << hex << Err << endl;
//  Err = LoadBios(&hIfc, argv[2]);
//  cout << "LoadBios status    " << Err << endl;
//  Err = PlataTest(&hIfc);
//  cout << "Plata test         " << Err << endl;

   cout << endl << "Read FLASH" << endl;

   ReadPlataDescr(&hIfc, &pd); // fill up properties

   cout << "SerNum       " << pd.SerNum << endl;
   cout << "BrdName      " << pd.BrdName << endl;
   cout << "Rev          " << pd.Rev << endl;
   cout << "DspType      " << pd.DspType << endl;
   cout << "IsDacPresent " << pd.IsDacPresent << endl;
   cout << "Quartz       " << dec << pd.Quartz << endl;

   cout << endl << "Slot parameters" << endl;   
   GetSlotParam(&hIfc, &sl);


   cout << "Base    " << hex << sl.Base << endl;
   cout << "BaseL   " << sl.BaseL << endl;
   cout << "Mem     " << sl.Mem << endl;
   cout << "MemL    " << sl.MemL << endl;
   cout << "Type    " << sl.BoardType << endl;
   cout << "DSPType " << sl.DSPType << endl;
   cout << "Irq     " << sl.Irq << endl;

   cout << endl << "Press any key" << dec << endl;
   getch();

}}

В общем код pci плату находит... и больше ничего....

Denis
10.10.2006 17:11:38
#11

Гость

Re: Переход с L780 на Е440

да к коду выше... в каждой итерации я там все правильно закрываю... вот так примерно

  CloseLDevice(&hIfc);

   CloseHandle(hThread);

   UnmapViewOfFile(fdata);
   CloseHandle(hMap);
   CloseHandle(hFile);
   FreeAPIDLL(&hDll);
   cout << "Exit" << endl;
     }
     }
   return 0;

Denis
10.10.2006 17:18:57
#12

Гость

Re: Переход с L780 на Е440

пробовал пример с диска DynLoad.. там используется библиотека LusbApi.dll, при вызове InitLDevice  отдается номер слота 0.. программа работает плата опредляется... Я так понимаю для Lcomp.dll должно быть где то указание какие виртуальные слоты смотреть на шине PCI или на USB???

11.10.2006 10:25:39
#13

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

Re: Переход с L780 на Е440

сегодняшний скачайте. в том что до этого был -глюк в Inf файле при установке платы....а устанавливать надо так чтобы плата определилась в системе как L-Card ADC/DAC USB boards...

Denis
11.10.2006 13:27:53
#14

Гость

Re: Переход с L780 на Е440

В общем все скачал запустил, старое устройство е440 - удалил - новое стало... ваш l-graph не опознает вторую плату.. пишет ее в поле PCI и неизвестный тип платы.. тем не менее теперь в 1-м слоте я инициализирую плату получаю ее описание (почти все нормально, только почему то, раньше было наличие цап - 0 - нет, 1-есть.. теперь в е440 выдается 28214, но это ерунда) хуже то, что теперь если даже в старую работающую программу для l780, неменяя ничего, просто подставить новую библиотеку lcomp, с новой оберткой wlcomp, то программа вылетает с ошибкой попытки чтения защищенной памяти на функции GetSyncData ... со старой библиотекой все на ура... в каком направлении ковырять???

11.10.2006 14:00:34
#15

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

Re: Переход с L780 на Е440

у GetSyncData новый параметер появился... раньше она sync[0] всегда возвращала, а теперь там есть Offset.. это для 791 платы было сделано. И еще у копировки буфера есть mask - если она не ноль то накладывается на данные, ну там в исходнике видно...
28214 это видимо потому что в программе PLATA_DESCR не заменили на PLATA_DESCR_E440...

Denis
11.10.2006 14:32:44
#16

Гость

Re: Переход с L780 на Е440

отлично ... старый пример заработал...
но на е440 в первом слоте GetSyncData в поле позийии указателя при смещении 0 возвращает все время 0.. 


csDriverLibrary.GetSyncData(ref hIfc, (uint)syncVarPointer.ToInt32(), 0, ref readingPosPointer);


Про маску я неиспользую GetDataFromBuffer а беру просто Marshal.Copy(dataStartPointer, channelDataPortion, 0, bufferSizeForAllChannels);

за PLATA_DESCR_E440 спасибо... простое его в мануале нет.. вот и необратил внимания..

11.10.2006 14:55:27
#17

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

Re: Переход с L780 на Е440

а пример wlcomp_tst1 работает ? там екзешник есть соответсвенно в start.bat свой слот прописать и посмотреть?

11.10.2006 14:58:00
#18

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

Re: Переход с L780 на Е440

А! знаю в чем дело... там синхронизацию с 3 в 0 сбросить надо....по другому она там проиндексированна...

Denis
11.10.2006 15:55:54
#19

Гость

Re: Переход с L780 на Е440

Ну вы прям ... нет  слов... просто Гуру - с большой буквы....%-)

в общем все заработало.. начинаю анализ самих сигналов... пока вроде все нормально... там кстати размер под один отсчет не изменился?
и ешшшо .. хорошо бы оформить все для остальных бредущих по этому пути...

11.10.2006 16:16:02
#20

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

Re: Переход с L780 на Е440

не не изменился... а оформлять буду скопом все когда подключу остальные USB ...

Denis
12.10.2006 18:03:44
#21

Гость

Re: Переход с L780 на Е440

что то у меня не получается непрерывного сбора...
пробовал измерять время между сбросами блока - все вроде верно... но сами данные с перепадами...
собираю следующим образом стартую задав весь блок длинной 2048 с шагом 1024 получается такая вот конструкция


                    while (readingPosPointer != bufferSizeForAllChannels) // ждем пока не считаем весь буфер
                        csDriverLibrary.GetSyncData(ref hIfc, (uint)syncVarPointer.ToInt32(), 0, ref readingPosPointer);

                    Marshal.Copy(dataStartPointer, channelDataPortion, 0, bufferSizeForAllChannels); // считываем порцию  размером 2048
                   
                    while (readingPosPointer != 1024) // ожидание пока указатель чтения не перейдет куда то еще по сути заглушка чтоб не сработала два раза подрят

и это все повторяется по циклу пока не считаю нужное количество данных (расчитывается по заданным параметрам сбора...)

параметров сбора вот такие:

  /// <summary>
        /// Устанавливка параметров работы платы
        /// </summary>
        /// <returns>Лог задания параметров</returns>
        public unsafe string SetWorkParameters()
        {           
            csDriverLibrary.WADC_PAR_0 InitParameters = new csDriverLibrary.WADC_PAR_0();
       
            InitParameters.s_Type = csDriverLibrary.L_ADC_PARAM; // тип структуры (должен быть L_ADC_PARAM);
            InitParameters.AutoInit = 1; // флаг указывающий на тип сбора данных 0 - однократный 1 - циклический;
            InitParameters.dRate = frameSamplingFrequency;     // частота опроса каналов в кадре (кГц);
            InitParameters.dKadr = 0;       // интервал между кадрами (мс);             
            InitParameters.dScale = 0;     // масштаб работы (таймера для 1250 или делителя для 1221)
            InitParameters.SynchroType = 0; // тип синхронизации;  (если больше 2 - то нет синхронизации)           
            InitParameters.SynchroSensitivity = 0; // вид синхронизации           
            InitParameters.SynchroMode = 0;         // режим синхронизации           
            InitParameters.AdChannel = 0;           // канал по которому выполняется синхронизация                       
            InitParameters.AdPorog = 0;             // уровень синхронизации
            InitParameters.NCh = numberOfChannels;         // количество опрашиваемых каналов ;
            // массив с номерами каналов и усилением на них; описывает порядок опроса каналов;
            // усиления 0x00 - нет усиления 0х40 - усиление в 4 раза 0x80 - усиление в 16 раз, 0xc0 - усиление в 64 раза
            for (int i = 0; i < 32; i++ )
                InitParameters.Chn[i] = channelsAmplifying[i];

            InitParameters.FIFO = 2048;     // размер половины аппаратного буфера FIFO на плате;
            InitParameters.IrqStep = 1024;  //  шаг генерации прерываний
            InitParameters.Pages = (ushort)(numberOfChannels*2);       // размер кольцевого буфера в шагах прерываний
            // произведение этих двух параметров IrqStep*Pages задает количество отсчетов,
            // которое соберет плата при однократном сборе, но не больше чем 128К отсчетов.
            // При циклическом сборе они игнорируются – буфер всегда 128К.
            InitParameters.IrqEna = 1;      // разрешение генерации прерывания от платы (1/0),
            // при этом mask - это младшие 16 бит в слове разрешающем прерывания от платы (блок АЦП);
            InitParameters.AdcEna = 1;      // разрешение работы АЦП (1/0);

            csDriverLibrary.FillDAQparameters(ref hIfc, ref InitParameters, (uint)2); //sp_type (t1=0, t2=1, t3 = 2, t4 =3)           
         
           // DAQparameters.t3 = InitParameters;

            string ParameterSettingLog = "";

            uint tm = (uint)(numberOfChannels * 2048); // количество отсчтов (так как мы решили считывать порциями по 2048 то столько и ставим)
            Err = csDriverLibrary.RequestBufferStream(ref hIfc, ref tm, csDriverLibrary.L_STREAM_ADC); // функция служит для выделения памяти под большой кольцевой буфер
            ParameterSettingLog += "/nCalled RequestBufferStream. Allocated memory size(word): " + tm.ToString() + ". Error result = " + Err.ToString() + '/n';
           
            // фунция настраивает плату ацп/цап под заданные параметры ввода выода
            Err = csDriverLibrary.SetParametersStream(ref hIfc, ref InitParameters, /*csDriverLibrary.L_STREAM_ADC*/ (uint)2, ref tm, ref dataStartPointer, ref syncVarPointer, csDriverLibrary.L_STREAM_ADC);
            ParameterSettingLog += "Настрайка АЦП/ЦАП заданными параметры ввода выода... /n" + ErrorMessenger(Err) + "/n";
            ParameterSettingLog += "Установленные параметры  : " + "/n";
            ParameterSettingLog += "Размер буфера (word) : " + tm.ToString() + "/n";
            ParameterSettingLog += "Страницы отсчетов : " + InitParameters.Pages.ToString() + "/n";
            ParameterSettingLog += "Шаг генерации прерываний : " + InitParameters.IrqStep.ToString() + "/n";
            ParameterSettingLog += "Размер половины аппаратного буфера FIFO на плате : " + InitParameters.FIFO.ToString() + "/n";
            ParameterSettingLog += "частота опроса каналов : " + InitParameters.dRate.ToString() + "/n";

            DAQparameters.t3 = InitParameters; // записываем параметры инициализации в поле структуры необходимой непонятно кому???

            Err = csDriverLibrary.EnableCorrection(ref hIfc,1); // Функция включает/выключает режим коррекции. Сама загружает коэффициенты в плату
            ParameterSettingLog += "Вклучение режима коррекции...  /n" + ErrorMessenger(Err) + "/n";
            Err = csDriverLibrary.InitStartLDevice(ref hIfc); // Функция инициализирует внутренние переменные драйвера перед началом сбора
            ParameterSettingLog += "Инициализация внутренних переменных драйвера... /n" + ErrorMessenger(Err) + "/n";

            return ParameterSettingLog;
        }

не пойму где грабли ...
бывает иногда нормально соберется - иногда.. нет ... думал проблема в том, что не хватает ресурсов компьютера и просто пропускаю некоторые блоки... но пробовал проверять по времени - запоминая время между сборами блоков - оно соответствет расчетным .. а данне получаются прерывистые...

                        csDriverLibrary.GetSyncData(ref hIfc, (uint)syncVarPointer.ToInt32(), 0, ref readingPosPointer);

24.10.2006 09:33:42
#22

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

Re: Переход с L780 на Е440

шаг генерации побольше. пробуйте 4096 и 4096...а вообще там еще глюкаво все...работаю и исправляю...

Denis
24.10.2006 12:31:08
#23

Гость

Re: Переход с L780 на Е440

пробовал размер порции 8192 и шаг 4096 не помогает... сделать размер буфера и шаг прерываний равный нельзя так как в вайле может два раза подряд опросится. В общем пробую всякое но пока результат тот же... Какую роль при колцево сборе вносит размер буфера фифо на плате??? он при колцевом сборе вообще на что нить влияет?

25.10.2006 09:19:47
#24

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

Re: Переход с L780 на Е440

как пример то работает? а вообще я говорю что там глюкаво еще....

Denis
26.10.2006 17:06:14
#25

Гость

Re: Переход с L780 на Е440

Похоже нашел я в чем проблема...
нужно параметр pages обязательно задавать так что б он был равен размер буфера деленное на IrqStep. А так же нужно ожидать прохождения указателя записи данных через граничные значения с запасом.. а то как то получается - указатель вроде дошел а данные еще не все...

в общем сочетание этих двух факторов вроде как позволяет непрерывно принимать данные... Причем нормально принимает с шагом IrqStep = 1024 и 2048 с размером буфера от 4096 до 65536...