Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [CBuilder6,RS-232], Подскажите алгоритм. 
:(
    Опции темы
JayTi
Дата 19.6.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 22.5.2008

Репутация: нет
Всего: нет



Привет всем. Спасибо за просмотр топика.
Вот у меня вопрос к великим кодерам.
Возможно ли сделать событие которое срабатывает после прихода 8-ми байт на ком порт, или как это по другому осуществить, да есчо нужен интервал на ожидаемый ответ?
PM MAIL   Вверх
petlyura
Дата 19.6.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



 Тут что-нибудь полезное найдешь.

Здесь создаем, настраиваем, устанвливаем время ожидания ответов
Код

    COMMTIMEOUTS CTO;
        char Port[10];

        DWORD nWritten;
        DCB dcb;
        int dwError, fSuccess;

        strcpy(Port, "COM1");

     hCom = CreateFile(Port,   GENERIC_READ | GENERIC_WRITE,
                  0,    NULL,     OPEN_EXISTING,
                 0,     NULL);


   fSuccess = GetCommState(hCom,&dcb);

 dcb.BaudRate = Speed; // настройки
   dcb.ByteSize = Data;
   dcb.Parity = Parity;
   dcb.StopBits =...;

    GetCommTimeouts(hCom, &CTO);  // вот тебе задержка

    CTO.ReadTotalTimeoutConstant = 2000; // в 2 сек
    CTO.WriteTotalTimeoutConstant = 2000;


    SetCommTimeouts(hCom, &CTO);



Здесь считываем нужное кол-во данных и проверяем на корректность
Код

ReadBuf()
{

   DWORD nWritten;
   unsigned char size;
   uint16 ksum = 0;

   bufp[0] = 0x01; //какие-то хитрые настройки из документации
   bufp[1] = 0x04; // какие-то хитрые настройки из документации

   bufp[2] = Address >> 8; // адрес ст.разр.
   bufp[3] = (Address-1) & 0x00FF;// адрес мл.разр.

   bufp[4] = Volume >> 8; // кол-во байт ст.разр
   bufp[5] = Volume & 0x00FF; // кол-во байт мл.разр


   ksum = KsCRC(bufp,6); // супер-пупер функция из стандарт Modbus

   bufp[6] = ksum >> 8;
   bufp[7] = ksum & 0x00FF;       

   if(!WriteFile(hCom,    bufp, 8, &nWritten, NULL) )  // запрос в bufp к COM
    {

         return 1;   // НЕТ ЗАПИСИ В ПОРТ
    }
   size = 5 + (Buf.V << 1); // размер счит. инф.

   if(ReadFile(hCom, buft, size, &nWritten, NULL) == 0) // ответ в buft
    {
       return 2;  //НЕТ ЧТЕНИЯ ИЗ ПОРТА
    }
   else
   {
     if ( nWritten == NULL )
      {
        return 3;     //СЧИТАН НУЛЕВОЙ ОБЪЕМ ИНФОРМАЦИИ
      }
     else
      {
        if ( ((nWritten-5)  != (Volume<<1)) || ((buft[2] != Volume<<1)) )
        {
            return 4; //СЧИТАН НЕВЕРНЫЙ ОБЪЕМ ИНФОРМАЦИИ
         }
               return 0;

       }
    }
}



PM MAIL   Вверх
JayTi
Дата 20.6.2008, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 22.5.2008

Репутация: нет
Всего: нет



А можеш исходник прислать полный, я так понимаю это работа с модбасом?
PM MAIL   Вверх
petlyura
Дата 20.6.2008, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



Цитата(JayTi @ 20.6.2008,  06:40)
А можеш исходник прислать полный, я так понимаю это работа с модбасом?

Модбас! Понимаешь верно, но одно дело задать вопросы и получать наводящие ответы. А другое дело - коммерческий продукт просить, за который нам деньги заказчики платят.

Я указал в предыдущем посте, в каком направлении искать. Ну а дальше: справка Билдера, техническая документация по контроллерам, гугл. Вот так вот!
PM MAIL   Вверх
JayTi
Дата 20.6.2008, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 22.5.2008

Репутация: нет
Всего: нет



CTO.ReadTotalTimeoutConstant - я так понимаю эта константа которая отвечает сколько максимум ждать ответа?
Я сам пишу сейчас сервер для модбас  протокола, просто я имхо думаю что надо как-то сделать чтобы к примеру прочитано было 8 байт максимально к примеру 100 мс.
PM MAIL   Вверх
petlyura
Дата 20.6.2008, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: 2
Всего: 2



Цитата(JayTi @ 20.6.2008,  08:40)
CTO.ReadTotalTimeoutConstant - я так понимаю эта константа которая отвечает сколько максимум ждать ответа?
Я сам пишу сейчас сервер для модбас  протокола, просто я имхо думаю что надо как-то сделать чтобы к примеру прочитано было 8 байт максимально к примеру 100 мс.

CTO.ReadTotalTimeoutConstant -  ты задаешь значение, через которое, если не будет ответа, чтение прекратится.
100 мс или сколько там еще. CTO.ReadTotalTimeoutConstant должно быть больше, иначе часто будешь пропускать чтение байтов. Надо понимать RS232 - протокол медленный. У Модбаса по этому делу есть где-то усредненные данные, сколько байт за сколько мс он читает, а сколько записывает.
Например,
  Bytes                                       Read               Write
   1-10                                       30-60 ms         10-30 ms
   10-60                                     60-110 ms        30-70 ms
  ...                                              ....                       ...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.