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

Вопрос о перезапуске слотов в крейтах

Вы не вошли.

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

12.04.2019 11:46:52
#1

Участник
Здесь с 12.12.2016
Сообщений: 73

Вопрос о перезапуске слотов в крейтах

Вопрос о перезапуске слотов в крейтах.

Речь в частности о LTR27. Есть два небольших крейта
в каждом из которых стоит по два LTR27.

Есть OPC гейт, который организует 4 нитки и опрашивает модули путем

-----Beginning of the citation-----

 CSLock wait(&CS); 
 DWORD buf[16];

 // забираем данные АЦП
 DWORD size = LTR27_Recv(&ltr27, buf, NULL, 16, 1000);

 if(size == 16)
 {
  double data[16];
  // применяем калибровку и переводим в вольты
  int res = LTR27_ProcessData(&ltr27, buf, data, &size, 1, 1);
...

----- The end of the citation -----

Через какое-то время (может длительное, возможно это связано со скачками в сети хз, словом бывает) LTR27_Recv возвращает 0. В этом случае решено сделать перезапуск модуля. Для этого сначала я закрываю модуль

-----Beginning of the citation-----

 int res = LTR27_ADCStop(&ltr27);
 // разрываем соединение
 LTR27_Close(&ltr27);

 if(res!= LTR_OK) {
  Log(__FILE__,__LINE__, LTR27_GetErrorString(res));

----- The end of the citation -----

и снова запускаю той же процедурой, что вначале.
-----Beginning of the citation-----

 // инициализируем поля структуры значениями по умолчанию
 res = LTR27_Init(&ltr27);

 crate->InitLtrChan(&ltr27.Channel);
 if(res!= LTR_OK) {
        CString mes = "crate->InitLtrChan: ERR" +  CString(LTR27_GetErrorString(res));
  Log(__FILE__,__LINE__, mes.GetString());
  return false;
 }

 res = LTR27_Open(&ltr27, SADDR_DEFAULT, SPORT_DEFAULT, (char*)(Parent()->SN), Slot);
 if(res!= LTR_OK)
 {
...

----- The end of the citation -----

Так вот, при повторном вызове LTR27_Open эта функция возвращает LTR_WARNING_MODULE_IN_USE, не смотря что я его вроде бы остановил и закрыл.
Я игнорирую этот LTR_WARNING_MODULE_IN_USE и продолжаю старт. Все вроде работает как и до перезагрузки модуля.

Вопрос - может можно как-то еще закрыть модуль, чтобы потом не получать LTR_WARNING_MODULE_IN_USE при повторном открытии? Может это сообщение связано с тем, что в этом крейте есть еще один (работающий) слот LTR27?

12.04.2019 14:15:50
#2

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

Re: Вопрос о перезапуске слотов в крейтах

Вообще LTRXX_Close, если Вызывается и вызывается успешно, то должен закрывать ранее открытое соединение. Точно он у Вас вызывается по любой ветке при перезапуске?
Количество подключений к модулю отображается в статистике в LTRManger, можете посмотреть, что после LTR27_Close это значение должно измениться с 1 до 0. Если при явно вызове Close, вернувшем LTR_OK этот счетчик не уменьшается, то это странно, не должно быть.

В принципе модуль можно гарантированно полностью сбросить, разорвав все соединения с ним через управляющее соединение со службой с помощью LTR_ResetModule(), но как правило при корректной работе это не требуется.

Модули в других слотах никак не влияют на соединение, количество соединений считается по каждому слоту и к одному модулю при повторном соединении выдается данное предупреждение

12.04.2019 16:24:56
#3

Участник
Здесь с 12.12.2016
Сообщений: 73

Re: Вопрос о перезапуске слотов в крейтах

Алексей L Card пишет:

Вообще LTRXX_Close, если Вызывается и вызывается успешно, то должен закрывать ранее открытое соединение. Точно он у Вас вызывается по любой ветке при перезапуске?

В процедуру нити передается указатель объекта слота - процедура одна для всех нитей модулей. Так что я закрываю именно тот и только тот модуль у которого была ошибка по LTR27_Recv. Правда как я увидел я не анализировал результат функции  LTR27_Close.

А в каком месте лучше вызывать LTR_Reset_Module если все таки попробовать это делать? Нужно ли в этом случае вызывать LTR27_ADCStop и LTR27_Close? События перезапуска из-за срыва данных очень редкое.  Вот например как у меня выглядит функция остановки модуля с функцией LTR_Reset_Module:

//остановка модуля
void ltr_mod27::Stop()
{
 CSLock wait(&CS);

     //сначала поглядим что за слот и что за крейт
      CString cr_name = Name;        //имя модуля
      CString cr_SN = crate->SN;     //серийный номер крейта из модуля
      char tst[300];  sprintf(tst, "Stop slot: %s SN:%s", cr_name.GetString(), cr_SN.GetString() );
      Log(__FILE__,__LINE__, tst);

 int res = LTR27_ADCStop(&ltr27);
 if(res!= LTR_OK)
  Log(__FILE__,__LINE__, LTR27_GetErrorString(res));
 // разрываем соединение
 res = LTR27_Close(&ltr27);
 if(res!= LTR_OK)
       Log(__FILE__,__LINE__, LTR27_GetErrorString(res));

 res = LTR_ResetModule(&ltr, CRATE_IFACE_UNKNOWN, (char*)(Parent()->SN), Slot, 0);
 if(res!= LTR_OK)
   Log(__FILE__,__LINE__, LTR27_GetErrorString(res));
}

Всё работает и закрывается при штатном закрытии гейта.

12.04.2019 16:43:13
#4

Участник
Здесь с 12.12.2016
Сообщений: 73

Re: Вопрос о перезапуске слотов в крейтах

Попробовал вышеописанную функцию:
при такой функции Stop LTR_ResetModule возвращает ошибку
-----Beginning of the citation-----
12.04.2019_16:45:08   LTR_ResetModule err: Канал обмена с ltrd не был создан или закрыт
----- The end of the citation -----

Однако LTR27Open срабатывает после уже без LTR_WARNING_MODULE_IN_USE. smile

12.04.2019 16:51:05
#5

Участник
Здесь с 12.12.2016
Сообщений: 73

Re: Вопрос о перезапуске слотов в крейтах

Сорри - после того как я сегодня обновил драйвер lcomp модуль стал закрываться и без LTR_ResetModule. Только что проверил это. Видимо разность версий драйвера и LTR софта как-то сказывалась. Вопрос закрылся короче. Извиняюсь за лишние сообщения.

Контакты

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

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

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

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