Прием данных большой размерности

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Ответить
Meteor
user
user
Сообщения: 74
Зарегистрирован: 25 окт 2013, 17:37
Версия LabVIEW: 2012

Прием данных большой размерности

Сообщение Meteor »

Доброго времени, коллеги!
Реализую прием потока данных от периферийной платы.
В настоящее время делаю это таким способом (рисунок). На вход тактируемого цикла поступают данные о периоде, "индекс устройства", глубина буфера и пустой двумерный массив.
В самом цикле производится проверка нажатия кнопки "Receive" разрешающей выполнение операции чтения из указанного индексом устройства.
Считанный буфер, объединяется с массивом (добавляется в "хвост") и так происходит либо до нажатия кнопки "Stop", либо до превышения установленного порога "Maximum".
По окончанию всех итераций производится выход из цикла чтения, двумерный массив передается на обработку.
Внутреннее чутье подсказывает нерациональность построения цикла чтения.
Прежде всего каждый раз растет буфер и пока он "небольшой" (10..40 тыс байт) он работает достаточно шустро, но вот когда потребуется принимать данные длительное время - может просто переполниться память и все труды будут напрасны.
Как хотелось бы видеть рациональную структуру - некий "малоразмерный" буфер (допустим до 1..4кБ), в который будут читаться данные, плюс буфер "большого" размера (несколько сот кБ), в который будут переписываться данные из маленького буфера в то время, пока неактивна тактированная структура с узлом чтения.
Вот теперь собственно вопрос, в какую сторону ковырять (какие элементы задействовать) что бы можно было реализовать задуманное?
(На всякий случай, версия LV 8.5)
Вложения
Прием потока данных
Прием потока данных
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5461
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 27 раз
Поблагодарили: 86 раз

Re: Прием данных большой размерности

Сообщение IvanLis »

Если я не прав, то думаю меня поправят :crazy: ....

От переполнения памяти врят ли что-то спасет, разве что писать данные "малыми кучками" в файл, по мере приема. А по окончании, загружать их оттуда и обрабатывать, методы работы с большими файлами уже неоднократно обсасывались на форуме. Но мне кажется это не Ваш случай.

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

Что бы снизить задержки, необходимо предварительное резервирование памяти под принятые данные. Т.е. на вход регистра подавать не пустой массив, а массив заранее определенной размерности, у Вас кол-во строк будет Maximum, а столбцов - размер данных принимаемых с устройства. Его Вы должны знать.
По мере приема данные в цикл не "дописываются", а "перезаписываются", т.о. размер массива не изменяется. По окончании приема, принятые данные из него достаются, а незадействованные - отбрасываются.
Meteor
user
user
Сообщения: 74
Зарегистрирован: 25 окт 2013, 17:37
Версия LabVIEW: 2012

Re: Прием данных большой размерности

Сообщение Meteor »

Как раз на работе размышлял по поводу построения логики работы и передачи данных.
Листая Трэвиса натолкнулся на очередь и синхронизацию (в общем как Вы и говорите).
Пока надумал до того, что с одной стороны в циклах пересылать потоки (думаю будет минимум два синхронных, один приемный, а второй для объединения) и видимо придётся пойти по пути записи в файл- ибо спрогнозировать время сбора данных не могу, а их объем будет расти.
...на вход регистра подавать не пустой массив, а массив заранее определенной размерности...По мере приема данные в цикл не "дописываются", а "перезаписываются", т.о. размер массива не изменяется.
Вот за этот совет отдельное спасибо.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»