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

Ситуация при которой крейт не видит слот с АЦП

Вы не вошли.

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

Алексей Синюков
24.02.2022 12:13:24
#1

Гость

Ситуация при которой крейт не видит слот с АЦП

День добрый. Подскажите пожалуйста. Наша организация приобрела крейт LTR-EU-8(16) и 8 плат АЦП LTR25. Во время отладки нашего ПО обнаружил следующую ситуацию. Отключилось питание крейтов во время работы (отключили свет). Последующее подключение нашего ПО показало наличие всех АЦП в крейте, но применение параметров настройки к платам АЦП вызвало ошибку, и повторное подключение нашего ПО через 10 секунд. При повторном подключении, АЦП во 4 слоте не оказалось. Помогло только выключение / включения питания крейта, после этого все АЦП вновь появились. Дальнейшее моделирование ошибки показало, что исчезать могут АЦП в слотах от 2 до 5 из восьми и никогда первый слот.
В нашем ПО каждое АЦП запускается в отдельном потоке. Потоком управляет менеджер потоков и в случае возникновения ошибка хотя бы на одном АЦП, все потоки менеджером уничтожаются. Возможна ли ситуация:
1.    Вызывается команда LTR25_SetADC к первому слоту с АЦП.
2.    Применение параметров настройки к первому АЦП вызывает ошибку, которая передается менеджеру потоков.
3.    Менеджер потоков, получив ошибку, дает команду уничтожить все потоки.
4.    За время реакции команда LTR25_SetADC успела примениться ко 2 и 3 слоту и перешла на 4. Возникновение ошибки применения параметров настройки на 2 и 3 слотах уже не важны и игнорируются.
5.    Вызывается команда LTR25_SetADC к 4 слоту с АЦП, она останавливает поток и ожидает результата.
6.    В этот момент поток убивается менеджером.
7.    Потребитель ответа уничтожен, на АЦП в 4 слоту возникает блокирующая ошибка (примерно, как сервер отправил запрос клиенту и отключился, клиент попытался ответить, но сервера нет, возникла ошибка).
8.    Повторный опрос крейтом слотов приводит к исключению слота 4, поскольку либо соединение занято, либо возникшая ошибка блокирует работу АЦП.

Прошу учесть, это всего лишь мои предположения, верны ли они? Если нет, то подскажите, что может вызывать потерю крейтом АЦП в описанной ситуации?

24.02.2022 12:52:23
#2

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

Re: Ситуация при которой крейт не видит слот с АЦП

Здравствуйте.

Во первых нужно проверить, пропадают ли модули из списка в программе штатной LTR Manager (сама программа выполняет просто мониторинг и не мешает работе других программ)? Продолжают ли они там видится корректно как LTR25, или он показывает, что слот пустой, или слот остаются в состоянии "Инициализация"?
Если слот не пустой (отображается что-то отличное от "---"), помогает ли нажатие правой кнопкой мыши на модуле в менеджере и выбор "Сброс модуля"?

Во вторых хотелось бы больше знать о том, что происходит в Вашей программе. Какой критерий "модуль не виден", что может к нему приводить - не получен в списке модулей от крейта? Ошибка Open(), ошибка настройки? (или в последних случаях он все же виден?). Какая функция возвращает какой код ошибки при возникновении проблемной ситуации?
Правильно ли я понимаю, что перезапуск вашей программы не исправляет ситуацию? Список "обнаруженных" модулей в вашей программе меняется от включения/выключения крейта и не меняется от перезапуска Вашей программы? Если модули обнаружились/не обнаружились, то все так и остается до снятия питания с крейта?

Open()/Close() для модулей выполняются в тех же отдельных потоках каждый раз или один раз в основном потоке?

Как именно уничтожаются потоки? Если прям моментально принудительно (типа TerminateThread()), то это конечно не очень хорошо, и как минимум может привести к тому, что соединение не будет корректно закрыто из-за отсутствия Close и тогда последующий Open вернет соответствующую ошибку, что соединение IN_USE до завершения всей программы (если open-close делается каждый раз)  или оставит соединение в непонятном состоянии где часть ответов может быть не принято, если open-close делается один раз в общем потоке. По хорошему завершать конечно лучше потоки корректно, просто подавая потокам признак (через общую переменную или другим образом), что потоку нужно завершиться, по проверке которой поток сразу переходит к вызову Close и выходу из своей функции, а менеджер потоков уже дожидается после передачи сигнала корректного завершения всех потоков, после чего запускает заново.

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

И по какому интерфейсу работаете - USB или Ethernet?

Алексей Синюков
24.02.2022 13:37:20
#3

Гость

Re: Ситуация при которой крейт не видит слот с АЦП

В штатной программе LTR Manager не проверял, поскольку в своем ПО полностью продублировали функционал сбора статистических данных. Попробую собрать (мы под Astra Linux).

Какой критерий "модуль не виден", что может к нему приводить - не получен в списке модулей от крейта?
Так точно, не получен в списке модулей крейта. Мы сначала получаем список модулей, затем для каждого запускаем поток, где уже происходит Open(). Соответственно и ошибок нет, крейт просто исключает из списка этот модуль, как буд-то его вообще нет в слоте.

Правильно ли я понимаю, что перезапуск вашей программы не исправляет ситуацию? Список "обнаруженных" модулей в вашей программе меняется от включения/выключения крейта и не меняется от перезапуска Вашей программы? Если модули обнаружились/не обнаружились, то все так и остается до снятия питания с крейта?

Все верно, перезапуск программы не помогает. Крейт не получает в списке видимых этот модуль. Абсолютно точно, Список "обнаруженных" модулей в вашей программе меняется от включения/выключения крейта и не меняется от перезапуска Вашей программы.
Модуль не обнаруживаются до перезагрузки крейта.

Как именно уничтожаются потоки? При уничтожении потока дается команда Close(). К сожалению мной был найден баг менеджера потоков, который одновременно с командой Close() принудительно убивал поток. Баг я исправил, но хотелось бы быть уверенным, что это решение проблемы.

...что соединение IN_USE до завершения всей программы (если open-close делается каждый раз)  или оставит соединение в непонятном состоянии где часть ответов может быть не принято... т.е. это вполне возможно из-за некорректной работы нашего потока?

И по какому интерфейсу работаете - USB или Ethernet? Ethernet.

24.02.2022 13:53:16
#4

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

Re: Ситуация при которой крейт не видит слот с АЦП

В штатной программе LTR Manager не проверял, поскольку в своем ПО полностью продублировали функционал сбора статистических данных. Попробую собрать (мы под Astra Linux).

Лучше проверить для того, чтобы подтвердить из двух разных программ одинаковое поведение и исключить возможно какую-то проблему самой в программе.  По идее с установкой проблем быть не должно, если конечно у Вас там есть графическая оболочка, а не только консоль (или также возможно запустить LTR Manager на другой машине из той же сети и получать информацию с целевой).
Также есть ли возможность посмотреть, какой ModuleID возвращает в этом случае для данного модуля LTR_GetCrateModules() (я так понимаю критерий - это что он не равен ModuleID для LTR25?).

. т.е. это вполне возможно из-за некорректной работы нашего потока?

Ну не прохождение Open возможно, но на получение списка модулей через LTR_GetCrateModules() это не должно влиять. И также по идее тогда должен помогать перезапуск программы....

Также на всякий если поставите LTR Manager посмотрите все версии прошивок крейта в его статистике.

Алексей Синюков
24.02.2022 15:05:16
#5

Гость

Re: Ситуация при которой крейт не видит слот с АЦП

Премного извиняюсь, но можно уточнить. Я поковырялся в коде. У нас сделано так:
1. После открытия управляющего соединения LTR_Open вызывается
res = LTR_GetCratesEx(&ltr, 0, 0, &LTRNom, nullptr, nullptr,nullptr);
LTRNom - число крейтов. В дальнейшем предполагается их рост в зависимости от портирования изделия.
2. Далее вызываем  res = LTR_GetCratesEx(&ltr, LTRNom, 0, nullptr, &LTRNom, serial_list, info_list);
Мы их идентифицируем по серийным номерам, поэтому все их получаем.
3. Далее получаем статистику по каждому крейту
TLTR_CRATE_STATISTIC stat;
stat=get_TLTR_CRATE_STATISTIC(ui->HeaderLTR,QString("%1").arg(serial_list[ i ]),info_list[ i ].CrateInterface);
Проверяем stat.modules_cnt, и он не равен 8
Мы что-то не так делаем?  LTR_GetCrateModules() не используется.

Алексей Синюков
24.02.2022 15:10:57
#6

Гость

Re: Ситуация при которой крейт не видит слот с АЦП

Прошу прощения, не точно написал
по stat.modules_cnt идет цикл, проверяющий статус
TLTR_MODULE_STATISTIC _mstat;
_mstat.mid = stat.mids[ j ]
И если (_mstat.mid != LTR_MID_EMPTY) && (_mstat.mid!=LTR_MID_IDENTIFYING) то считается, что слот видимый и работает , т.е. countModule=countModule+1;
Получается если условие не выполнено, то минус один слот.

24.02.2022 15:17:57
#7

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

Re: Ситуация при которой крейт не видит слот с АЦП

Да, можно использовать LTR_GetModuleStatistic вместо LTR_GetCrateModules, как раз ModuleID это поле mid. При вашем коде остается только две возможности, когда модуль не учитывается  - LTR_MID_EMPTY или LTR_MID_IDENTIFYING, хотелось бы понять, какой реально там. Ну или в LTR Manager если поставите, то по нему можно понять, он разные строки на эти два значения выводит.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск