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


Поканальное чтение данных при потоковом сборе.е140

Вы не вошли.

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

Владимир
11.03.2008 18:13:27
#1

Гость

Поканальное чтение данных при потоковом сборе.е140

Вопрос следующий - как соотносится реальный опрашиваемый дифференциальный канал с номером буфера, определенным в структуре IO_REQUEST_LUSBAPI?

Иными словами соответствуют ли записанные N значений буфера Buffer[i][N] определенном в структуре
IoReq : array[0..i] of IO_REQUEST_LUSBAPI так IoReq[i].Buffer := Pointer(Buffer[i]),i значениям  ap.ControlTable[i] структуры ADC_PARS_E140?

для примера я устанавливаю ap.ControlTable[0]=5, как я понимаю это значит, что 1-му значению таблице соотв. 5-й диф. канал (x5-y5) с коэф. усиления равным 1. Далее при чтении с каналов я получаю буфер данных, в  Buffer[0][N] я получу N отсчетов с 5-го диф. канала?

11.03.2008 18:55:15
#2

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Поканальное чтение данных при потоковом сборе.е140

Реальный опрашиваемый канал НИКАК не соотносится с номером буфера, определенным в структуре IO_REQUEST_LUSBAPI. Отсчёты с канала можно связать только с индексом i в буфере IoReq.Buffer[i].
Смотри пример 4x канального сбора данных в директории /USB/Lusbapi/E14-140/Examples/Borland Delphi 6.0/ReadData.

Владимир
11.03.2008 20:09:48
#3

Гость

Re: Поканальное чтение данных при потоковом сборе.е140

Смотрел... объясните общепопулярно smile

В примере для 4-х каналов делают по 2 структуры всего, в том числе и 2 буфера:
for i := 0 to 1 do begin SetLength(Buffer[i], DataStep); ZeroMemory(Buffer[i], DataStep*SizeOf(SHORT));
Далее связывают буферы с IO_REQUEST_LUSBAPI в строчке  IoReq[i].Buffer := Pointer(Buffer[i]);
И наконец запись в файл содержимого буферов FileWrite(FileHandle, Buffer[RequestNumber xor $1][0], DataStep*sizeof(SHORT))

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

Владимир
11.03.2008 20:11:08
#4

Гость

Re: Поканальное чтение данных при потоковом сборе.е140

свой буфер данных, почему делается всего по 2?

Oleg
11.03.2008 21:57:40
#5

Гость

Re: Поканальное чтение данных при потоковом сборе.е140

И у меня таже проблема! Владимир еси вам что-то станет известно пожалуста напишыте мне Z_Oleh@mail.ru

12.03.2008 10:18:49
#6

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

Re: Поканальное чтение данных при потоковом сборе.е140

Из модуля в компьютер поступает непрерывный поток данных. В этом потоке данные с каналов АЦП идут в той последовательности, в которой они заданы в таблице каналов (ControlTable). Т.е. если у Вас число каналов установлено равным четырем, то в массиве данных они будут расположены следующим образом: Отсчет1 с канала ControlTable[0], Отсчет1 с канала ControlTable[1], Отсчет1 с канала ControlTable[2], Отсчет1 с канала ControlTable[3], Отсчет2 с канала ControlTable[0] и т.д.
Если представить поступающий поток данных как одномерный массив, то I-ый отсчет будет располагаться по индексу I*Nch+channel_index, где Nch - число каналов. channel_index - индекс нужного канала (при nch=4 значения channel_index =0...3).

Владимир
14.03.2008 12:33:19
#7

Гость

Re: Поканальное чтение данных при потоковом сборе.е140

На сколько я понимаю, непрерывный сбор данных происходит только во внутренний буфер модуля, собранный массив данных заданного размера уже передается на компьютер ф. ReadData().
Далее выделенный в примере буфер, все-таки двумерный массив: Buffer[i][0..DataStep-1]. Тогда получается, что в примере записывается в файл только 1-го отсчет 1-го кадра для канала, определенного в ControlTable[0]:
#   
#FileWrite(FileHandle, Buffer[RequestNumber xor $1][0], DataStep*sizeof(SHORT))
#
ТАк же длина, выделямая для буфера в примере, меньше необходимой, тк на компьютер передается IoReq[i].NumberOfWordsToPass := DataStep ОТСЧЕТОВ АЦП, что равняется длине самого буфера, но канала то 4, если учесть, что в каждый отсчет входит опрос каналов, определенных в ControlTable.

Саппорт! Внесите пожалуйста некоторую ясность под данному вопросу.

зы:
1. 2 структуры сделали, как я понял, для того, чтобы работать с предварительными запросами в ОС Windows.
2. Я ссылался на пример  /E14-140/Examples/Borland Delphi 6.0/ReadData

14.03.2008 18:56:48
#8

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Поканальное чтение данных при потоковом сборе.е140

1. Весьма настоятельно рекомендую Вам почитать хотя бы соответствующий раздел руководства программиста.
2. Функция
FileWrite(FileHandle, Buffer[RequestNumber xor $1][0], DataStep*sizeof(SHORT))
записывает в файл именно массив данных. Если Вам привычнее, то всё это можно переписать следующим образом
FileWrite(FileHandle, Buffer[RequestNumber xor $1], DataStep*sizeof(SHORT)).
3. Параметр IoReq[i].NumberOfWordsToPass задаёт кол-во собранных модулем данных, которое необходимо передать в РС. И оно совершенно никоим образом не связано с кол-вом каналов в управляющей таблице ControlTable.

14.03.2008 18:58:33
#9

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,495

Re: Поканальное чтение данных при потоковом сборе.е140

А можно прокомментировать фразу "... в каждый отсчет входит опрос каналов, определенных в ControlTable"?

Владимир
14.03.2008 20:36:53
#10

Гость

Re: Поканальное чтение данных при потоковом сборе.е140

1. Читал, не для всех прочитавших сие творение, все написанное там сразу же становится прописной истиной. 
2. Да, так гораздо привычнее, зачем усложнять-то?
3. Здесь, скорее всего, слово ОТСЧЕТ трактуется нами по-разному. В уже упомянутом руководстве пользователя про NumberOfWordsToPass  написано, что  "Данный параметр задаёт
то кол-во отсчётов АЦП, которое данная функция просто обязана стребовать с модуля."  На сколько мне стало ясно, за  один отсчет Вы принимаете чтение данных с одного канала, я понял это слово в том смысле, в котором использовал его Владислав.