Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Средства операторского интерфейса
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Терминал I/O данных DK-9000

 Ответить Ответить
Автор
Сообщение
archer84 Смотреть выпадающим
Новичок
Новичок


Присоединился: 16 Февраль 2007
Категория: Russian Federation
Online Status: Offline
Публикации: 25
Свойства публикации Свойства публикации   Ответить, цитируя автора - archer84 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Терминал I/O данных DK-9000
    Опубликовано: 11 Сентябрь 2009 07:27
Уважаемые специалисты, подскажите, есть ли у кого опыт программирования на С++ работы с терминалом ввода/вывода данных DK-9000? Я общаюсь с ним по Ethernet интерфейсу и через какое-то время терминал перестает отвечать. Уходит команда, а потом моя программа уходит в ожидание ответа, на чем благополучно виснет. Может есть у кого пример работы с ним, которым можно поделиться?
Наверх
archer84 Смотреть выпадающим
Новичок
Новичок


Присоединился: 16 Февраль 2007
Категория: Russian Federation
Online Status: Offline
Публикации: 25
Свойства публикации Свойства публикации   Ответить, цитируя автора - archer84 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Сентябрь 2009 10:03
Отвечаю сам себе, может кому пригодится.
Выяснить почему не приходит ответ не получилось, однако вышло заставить стабильно работать. Код участка, отвечающего за общение с терминалом выглядит так (в примере показана команда вычитывания буфера клавиатуры):

// Готовим строку запроса (для того чтобы не создавать новые переменные в качестве буферов для хранения команд запроса и ответа использую одну переменную)
memset(&m_Keyb[0], 0, sizeof(m_Keyb));
sprintf(m_Keyb, "$%02XK\r", addr );

sendto(udp_s, m_Keyb, strlen(m_Keyb), NULL, (SOCKADDR *)&udp_sin, sizeof(udp_sin));
// Небольшая задержка, чтоб успели сформироваться данные ответные (возможно ее и не надо, но так надежнее, альтернативу пока не проверял)
Sleep(10);
// Проверяем можно ли читать ответ
struct timeval tv; tv.tv_sec = 3; tv.tv_usec = 0;
fd_set read_set;
FD_ZERO(&read_set);
FD_SET(udp_s, &read_set);
if(select(udp_s+1, &read_set, NULL, NULL, &tv))
{
if(FD_ISSET(udp_s, &read_set))
{
int udp_sin_len = sizeof(udp_sin);
if ((recvfrom(udp_s, m_Keyb, sizeof(m_Keyb), NULL, (SOCKADDR *)&udp_sin, &udp_sin_len) > 0) && (m_Keyb[0]=='!'))
   return TRUE;
else
{
   memset(m_Keyb, 0, sizeof(m_Keyb));
   return FALSE;
}
}
else
return FALSE;
}
else
{
dwError = WSAGetLastError();
return FALSE;
}

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

Так как терминал всего один, то класс работы с ним красиво получилось описать при помощи шаблона Singleton.
Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz