Меню

+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
|
||||
|
E14-140 - Проблема. Вопрос к производителям!Здравствуйте, L-CARD!
Чтобы была понятна проблема, я достаточно подробно опишу задачу.
В общем программа написана давно и работает, и все вроде бы устаривает, но есть одна очень неприятная проблема.
Это само по себе уже плохо. По идее, каналы всегда должны идти в том порядке, в каком я их задал в управляющей таблице. Ну, ладно. Я написал функцию которая постоянно отслеживает номер канала и решает этй проблему (работает с переменной FIrstInBufer, в которую помещает номер того канала, с которого начнется буфер после следующегго запроса - такой геморой)
Ну с этим как-то мирились - такие сбои происходили но не очень чвасто. тем не менее последнее время встал вопрос чтот надо что-то делать с этим.
В реководстве программиста LUSBAPI ясно сказано:
Почему такое поведение никак не обозначено в руководстве? Подскажите пожалуйста пути решения данной неприятной проблемы. Может быть я что-то не так делаю. Ваши демо программы работают нормально с любым числом каналов. Хотя я не пробовал их в режиме дни-недели-месяцы... Но очевидно что вы как-то решаете эту проблему. С уважением
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Ну мы всегда выбираем либо буфер кратный числу каналов, либо сшиваем эти буфера без потерь в сплошной поток... |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!"Но иногда по какой-либо причине винда задумывается, например, при каком-то событии в сети - а компьютер подключен в сеть - это необходимо) и ВСЕ! все каналы перепутываются, файл с данными, который записывался может час или два ИСПОРЧЕН..."
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!К сожалению, обеспечить расположение первого канала всегда в начале массива при непрерывном сборе при произвольном значении числа каналов невозможно теоретически.
Самое простое решение - выбирать число каналов кратное размеру буфера и не использовать ненужные каналы. Тогда один и тот же канал всегда будет на одном месте. |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Олег, спасибо за описание, но я немного не понял, что же Вы такое делаете...
Вы хотели сделать так, чтобы кадр /'синхронизировался/' с размером ReadData()? Это едва ли возможно, но это, с позволения сказать, неправильная логика. Куда девать не считанный программой хвост последнего кадра?
Касаемо /'винда задумывается/' и очереди асинхронных запросов Сергей Вам ответил. Популярно смысл этого подхода в том, чтобы хотя бы одна незавершенная ReadData висела постоянно, т.е. не было дыр во времени, когда АЦП запущен, а к драйверу нет запросов на чтение.
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!>Чтобы этого не было запросы RedData(..) >необходимо ставить в очередь, как это описано в >руководстве пользователя http://www.lcard.ru/>download/e14_140_programmers_guide.pdf. Смотри >про асинхронный режим работы в п.4.5 Да, все правильно. Я так и делаю. Я уже почти наизусть выучил это руководство Сделал сбор данных как в консольном примере с диска к АЦП. Я уже говорил, что вызов справки однозначно приводит к потере данных. Поэтому использую для тестирования - разблокировал кнопку ХЭЛП. размер буфера пока не трогаю - как есть. В данном случае 32*768 слов. Выбрано просто из удобства развертки сигнала на экране программы. Частота 50 кГц.
По поводу очереди. Может быть имеет смысл предварительно выставить не один запрос, а больше - 10, 20? Поможет ди это? |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Спасибо за ответ! Вы писали: >Олег, спасибо за описание, но я немного не >понял, что же Вы такое делаете...
Попрбую объяснить что я делаю. В кратце - есть некий буфер в памяти куда поступает очередная порция информации "из" функции ReadData. Как только порция поступила, поток сбора данных отправляет эту порцию - буфер в основное приложение, которое производит обработку данных, а см (поток) выставляет следующий запрос. Пока выполняется следующий запрос приложение успевает поработать с предыдущей порцией - выводит один экран осциллограммы (он всегда равен одному буферу ниформации), производит коррекцию данных, и в итоге записыват эту порцию-буфер в файл данных. Это все происходит во время обработки следующего запроса. Потом все повторяется до тех пор пока оператор не остановит процесс вручную либо он не закончится автоматически после записи требуемого количества файлов.
Нужно либо отследить каким-то образом факт такого сбоя чтобы автоматически перезапустить процесс, либо уменьшить вероятность сбоя. Вот... |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Сейчас вот думаю корректировать размер буфера при включении-отключении каналов модуля, с тем чтобы поставить размер буфера в зависимость от количества каналов. Может поможет |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Навскидку, очередь из двух запросов помогает если компьютер притормозил на время порядка 300 мс. Если больше - следует попробовать очередь из большего кол-во запросов. |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Отследить нарушение потока не очень легко (хотя это мысль, можно в будущем сделать в E14-140-M специальные сбрасываемые счетчики). Можно вставить фиктивный маркерный канал с нулевым или высоким напряжением, но это шаманизм... По идее более правильно все-таки побороть провалы.
10, 20 запросов выставить можно. С другой стороны, можно просто увеличить размер буфера. Пример readdata.cpp слегка упрощен: в нем после Wait следующая ReadData идет не сразу, а после записи на диск. Предполагается, что это время прикрывает оставшийся один запрос на чтение, но если и он завершится, то плохо.
С вызовом help не очень понимаю. Чтение - это отдельный thread? Можно приоритет ему поставить high, кстати.
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Буфер USB 64 байта, так что при потере данных теряется кратно 32 отсчетам. Если число каналов в кадре - делитель 32, то потеряете целое число кадров...
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!>Может быть, надежнее сделать кольцевой буфер с >массивом указателей (элемент кольца = 1 блок >чтения) и переключать их (WaitFor, пометить блок Вот сейчас как раз сделал массив из 100 элементов, В начале отправляю 10 запросов на чтение. Потом в процессе сбора идет по кольцу по всем 100 элементам. В общем все работает. У меня тут 4 разных компьютера - от пентиума 3 1200 мгц с 512 памяти (на нем сейчас пишу программу)до 4-ядерного с 4 гигабайтами. Еще 2 ноутбука. Везде стоит одна и та же XP SP3. Во время сбора данных с записью в файл загрузка процессора - от 8 до 13 процентов - это на старом PIII-1120. при этом программа еще рисует осциллограммы сигнала по двум любым каналам и вычисляет БПФ с выводом на экран. Да, чтение - отдельный thread. Приоритет выставлен высокий. Буфер - ссылка на первый элемент глобальной переменной-массива. В общем сейчас сбор данных надежнее чем раньше. Пробовал запускать разные программы, вставлять флэшки, отключать - подключать сетевой кабель. Даже подключил сейчас еще USB осциллографф к этому же компу - там есть встроенный генератор, беру с него тестовый сигнал для АЦП. Вce работает. Но нужны длительные тесты. На старой версии в общем тоже сбои происходили не часто. (редко но метко Что-то с вызовом справки (она в общем не очень нужна, но надо разобраться). Не пойму. В моент вызова справки загрузка процессора почти 100 процентов на время около пол-секунды. В этот момент и происходит сбой. Ывзов справки обычный стандартный средствами Делфы.
Дело в том, что эта программа работать должна не на каком-то одном компьютере на на многих, невозможно сейчас заранее сказать куда это все включат. У нас в институте несколько систем регистрации, некоторые вообще стоят на ученой базе вдали от города. Человек может включить на запись а вернуться через 3 дня. Хотелось бы найти некие общие принципы стабильности... |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Вот подумал сейчас - там же функция после чтения возвращает количество реально прочитанных байтов. А если сравнить с запрашиваемыми и в случае если пришло меньше сделать вывод что произошел сбой? сработает это? |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Сейчас посмотрел - при вызове справки программ "замирает" на целую секунду... Странно |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Функция ReadData() при работе в асинхронный режиме выставляет запрос системе и тут же возвращает управление приложению. При этом собственно сама передача данных может ещё и не начаться. |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!>Функция ReadData() при работе в асинхронный >режиме выставляет запрос системе и тут же >возвращает управление приложению. При этом >собственно сама передача данных может ещё и не >начаться. Да это так. Я думал про функцию
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!WinAPI функция GetOverlappedResult() возвращает именно кол-во переданных байтов, но не возвращает какой-нибудь признак сбоя в этих данных. Она про это просто ничего не знает. А кол-во переданных байтов будет правильным. |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Но ведь я же знаю сколько отсчетов я хочу передать - я заполняю поле NumberOfWordsToPass в структуре IO_REQUEST_LUSBAPI Предположим, что по окончании ввода порции данных GetOverlappedResult() вернула количество переданных байтов меньше чем NumberOfWordsToPass в байтовом выражении. Значит произошел сбой.
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!GetOverlappedResult() в любом случае вернет "правильное" количество байтов даже если реально придет меньше информации из-за сбоя? Получается замкнутый круг. Тогда отследить такой сбой можно только аппаратным способом... |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Ну да, ведь потерянные данные НЕ ПРИШЛИ в драйвер, ReadData() попросту дождется следующих. Оборванная передача (размером меньше, чем запрошено) могла бы быть, если бы устройство специально оборвало передачу. Или по таймауту. Разбирайтесь со справкой, почему на секунду система встает. Что-то не так.
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Нормальная винда имеет право задумываться миллисекунд на 10-20, ну на 30, но никак ни на секунду. Может вирусы живут? |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Секундные замирания ОС разве что E20-10 или
|
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Я тут почитал все...есть несколько советов. Возможно приоритет потоку сбора нужно оставить нормальный. Ну или +1 к нормальному. Иногда черезмерный подъем приоритетов приводит к блокировке фоновых процессов которые потом лавинно в систему вваливаются вместо равномерного воздействия. И потом логику программы надо посмотреть на предмет межпроцессного взаимодействия с помощью сообщений. Запуск хелпа может сообщения подзадержать прилично и если это в логике критично то будут сбои. Взаимодействие все должно быть на настоящих евентах мутексах и прочем..... Буфер 32*768 не сказать чтобы большой... |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!>Попробуйте для теста сделать размер одного >реквеста ReadData() на много секунд (скажем, >мегабайт). В этом случае тоже оторвется? да, попробую сегодня. Со справкой непонятно, но я этим пользуюсь чтобы вызвать гарантированный сбой в передаче данных. Пробовол вот добиться такого эффекта запуском посоронних программ. Тока одна программа - старая карта владивостока - она грузится секнд 5 при этом тормозит операционку - вызвала потерю данных. Похоже в голове прояснилось... Если ОС тормознет а уровне ЯДРА и несколько 64 байтных блоков потеряются на шине USB то сколько бы я не выставлял предварительных запросов с ReadData, хоть 1000, - ничего не поможет. В случае если число каналов таково, что в 32 слова не помещается целый кадр то:
В случае если в блок из 32 слов помещается целое количество кадров (если число каналов 1,2,4,8 или 16) то после любой потери данных переброса каналов не происходит, так как теряется всегда целое количество кадров. Я несколько лет назад писал программу для модуля E24 на COM порт. Там все было очень удобно. Вместе с отсчетом канала передавался и его номер. Это позволяло при любых потерях данных всегда знать какому каналу пренадлежат данные. |
|||
|
||||
|
Re: E14-140 - Проблема. Вопрос к производителям!Сейчас установил такие параметры: Число каналов в кадре - 3
Размер буфера 32*2043=65376 слов (кратно числу каналов -трем) Зпрос длтся больше 2 секунд. Вызов справки БОЛЬШЕ НЕ ВЫЗЫВАЕТ ПОТЕРЮ ДПННЫХ!!
Вызвать потерю данных удалось запуском все той же программы "Карта владивостока". Она тормозит систему при загрузке секнд на 8 на данном компьютере. |