Меню
![Главная](https://www.lcard.ru/sites/default/files/Logo.jpg)
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Тема закрыта
|
||||
|
Скорость Считывания данных АЦПВ общем в плате L-780 замечено такое непонятное свойство. При циклическом сборе если мы количество отсчетов для сбора ставим 65536 - то отслеживая переменной syncVarPointer положение записи текущей порции (я устанавливал по 2048 порции) и сразу же пытаясь считать якобы только что записанную порцию там получались не совсем те данные что должны быть... реальные данные можно было считать только если дождаться полного заполнения всех отсчетов т.е. 65536 конечно проблема решается достаточно несложно - я просто ставлю количество отсчетов 2048 - ожидаю пока syncVarPointer не достигнет этой отметки и таким образом получаю реальные данные.. но все таки возможно я что то недопонимаю и хотелось бы услышать комментарии специалистов... параметры задаются следующие: public unsafe string SetWorkParameters()
csDriverLibrary.FillDAQparameters(ref hIfc, ref InitParameters, (uint)2); //sp_type (t1=0, t2=1, t3 = 2, t4 =3)
string ParameterSettingLog = ""; uint tm = 2048; // количество отсчтов (так как мы решили считывать порциями по 2048 то столько и ставим)
DAQparameters.t3 = InitParameters; // записываем параметры инициализации в поле структуры необходимой непонятно кому??? Err = csDriverLibrary.EnableCorrection(ref hIfc,1); // Функция включает/выключает режим коррекции. Сама загружает коэффициенты в плату
return ParameterSettingLog;
функция сбора такая: public static Int16[] dataPortion = new Int16[2048]; // выделяем память под массив private unsafe void DataCapture(ushort SizeOfDataPortion)
Marshal.Copy(dataStartPointer, dataPortion, 0, 2048);// считываем порцию
|
|||
|
||||
|
Re: Скорость Считывания данных АЦПя бы рекомендовал вдумчиво посмотретьна сишный пример L780.TST... и повторитьего на С# через враппер... |
|||
|
||||
|
Re: Скорость Считывания данных АЦПВ общем пока несовсем получается..... смотрел пример правда для L783.TST - но думаю это непринципиально.... непонятен один момент почему мы вроде как хотим снять только сто тысяч отсчетов
но в тоже время задаем АЦП принять миллион с копейками: "
в общем случае полбуфера это ULONG halfbuffer = IrqStep*pages/2; // Собираем половинками кольцевого буфера что есть 1024*32/2= 16384 и соответственно 16384 * multi = 16384 * 64 = 1048576 что есть в 10 раз больше чем нам надо????
проблема уже как то мной поднималась правда не в этом топике --- почему если я считываю данные от 0 до 2048 сразу после достижения указателя значения 2048 реально там записаны только первые 1024 отсчета из всех 2048??? хотя делал также как у вас только все меньше по размеру (если делать так же как у вас достаточно долго ждать окончания записи всего буфера) InitParameters.FIFO = 2048; // размер половины аппаратного буфера FIFO на плате;
uint tm = 4096; // количество отсчтов (так как мы решили считывать порциями по 2048 то столько и ставим)
и непосредственно считывание public static Int16[] dataPortion = new Int16[2048]; // выделяем память под массив в котором будем сохранять данные
Int16[] channelDataPortion = new Int16[numberOfChannels * 4096]; // необходимо собрать порцию размером 4096 для каждого канала
Marshal.Copy(dataStartPointer, dataPortion, 0, 2048); // считываем порцию размером 2048
// проверка записывает ли Ацп вообще что нить в память.... т.е. перед съемом заполняем память 1
while (readingPosPointer != 4096) // ожидаем пока не достигнем окончания порции
Marshal.Copy((IntPtr)(dataStartPointer.ToInt32() + 2048), dataPortion, 0, 2048); // считываем порцию
Marshal.Copy(Initdata, 0, (IntPtr)(dataStartPointer.ToInt32() + 2048), Initdata.Length);
} |
|||
|
||||
|
Re: Скорость Считывания данных АЦПа с каким процом 780? если с 84 то там половина фифо максимум 1024... и функция его обрезала внутри. ... |
|||
|
||||
|
Re: Скорость Считывания данных АЦПв общем я вроде как понял в чем была ошибка.... в считывании второй половины буфера я ytghfdbmkyj сдвигал указатель откуда считывать
первая половина вопроса про ваш пример остаеться в силе а нужно было Marshal.Copy((IntPtr)(dataStartPointer.ToInt32() + 4096), dataPortion, 0, 2048); // считываем порцию |
|||
|
||||
|
Re: Скорость Считывания данных АЦПну буфер выделяем на 100000...используем в нем 32 тыщи и прокручиваем его несколько раз... |
Страницы 1
Тема закрыта