Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2013, 10:56   #11
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
нц и как поступают те что поговаривают?
Шутки шутками, но даже в MSDN оговаривается, что возможны варианты, когда ДатаРесивед() не сработает.
Мануал по нему не читал, но вроде он срабатывает на каждый байт, а мне нужно снимать массив по 73 байта.
При условии, что с одного устройства прилетает по 73 байта, а их (устройств) две с лишним тысячи (!) глюк в ДатаРесивед, может обернуться печалькой.
Или можно краткий принцип, как срабатывает это событие?
alexusankov вне форума Ответить с цитированием
Старый 29.11.2013, 10:59   #12
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Мануал по нему не читал
так с этого и надо начинать
eval вне форума Ответить с цитированием
Старый 29.11.2013, 11:03   #13
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
так с этого и надо начинать
а можно краткий пример, как бы решить эту задачу с помощью датаресивед?
Простейшая задача - отправить в ком 8 байтов, и получить 73.
Если 73 байта не поступают в течении секунды, продолжать дальше.
Просто не могу представить, как это будет выглядеть :
Пишем в порт данные.
Датаресивер сработает, когда придет какой нибудь байт
Цитата:
Событие DataReceived необязательно наступает для каждого полученного байта.
Но не суть. С помощью BytesToRead смотрим - есть ли у нас 73 байта, если есть - то считываем?
И такая проверка будет вылетать на каждом срабатывании Датаресивер(почти каждом).
Мыслю примерно правильно?
Если да, то :
1. Как организовать прием 73 байтов в течении секунды? Если по истечении 1000мс не пришло 73 байта, то отправить следующий запрос - таймер?
То есть вешаем таймер на секунду, в него - датаресивер, в котором условие, что по BytesToRead == 73 вызывается процедура считывания в массив?
Если да - то к чему эти костыли, когда можно просто протянуть секунду, и после считать и сравнить Length != 73?

Последний раз редактировалось alexusankov; 29.11.2013 в 11:23.
alexusankov вне форума Ответить с цитированием
Старый 29.11.2013, 17:11   #14
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Не знаю что Вы прочли в МСДН - я там увидел только то что НЕ ДЛЯ КАЖДОГО БАЙТА возникает событие. Т.е. вероятно что байты придут собранными в пакеты.
А то что событие не возникнет вообще - про это не увидел там ни слова.

Примерное алго для Вашей задачки:
- При отправке запроса его же ложите в какой то список с пометкой ДатаВремя отправки.
- В Datareceived прицепите обычное чтение в буфер всего что есть.
- Туда же прицепите обработчик "ЕстьДанныеДляУжеОтправленногоЗапро са?" который тупо будет шерстить этот буфер на предмет ответа(повторять просроченные и т.д. и т.п.).

Все - у Вас есть все данные для кошерной обработки запросов/ответов.

Последний раз редактировалось simples; 29.11.2013 в 17:19.
simples вне форума Ответить с цитированием
Старый 29.11.2013, 23:39   #15
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от simples Посмотреть сообщение
Примерное алго для Вашей задачки:
- При отправке запроса его же ложите в какой то список с пометкой ДатаВремя отправки.
- В Datareceived прицепите обычное чтение в буфер всего что есть.
- Туда же прицепите обработчик "ЕстьДанныеДляУжеОтправленногоЗапро са?" который тупо будет шерстить этот буфер на предмет ответа(повторять просроченные и т.д. и т.п.).

Все - у Вас есть все данные для кошерной обработки запросов/ответов.
Оке, моделируем ситуёвину.
Пуляю запрос в ком порт.
В Datareceived стоит чтение, которое складывает байтики в массив.
Там же, еще одна функция смотрит, когда же массив байтов заполнился. Как только массив заполнился до 73 байтов - все ок, выходим оттуда.
Ситуация - помехи на линии, и два байта не дошли.
Функция, что шерстит, все шерстит и ждет когда сработает условие Length == 73;
Ваш вариант сработает, если нужно опросить одно устройство.
А если их два? Или десять, пятьдесят? Или как в моем случае - несколько тысяч?
И лишь одна секунда дана на то, чтобы устройство ответило.
И опять же костыль на костыле, обработчик в обработчике.
Ведь любому устройству нужно время для ответа. это как то легко и изящно должно решаться же...
alexusankov вне форума Ответить с цитированием
Старый 29.11.2013, 23:53   #16
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

я не понял, несколько тысяч на 1 порту? чета мне сомнительно..
и эта у устройства есть протокол? ну и настройки по таймаутам тоже должны быть
eval вне форума Ответить с цитированием
Старый 30.11.2013, 17:09   #17
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Вы не фантазируйте - а пишите прототип и тестируйте.
Отпадет куча фантазий.
Фантазия №1 - "100500 девайсов на одном ком порту обрабатываемых за одну секунду".
simples вне форума Ответить с цитированием
Старый 30.11.2013, 17:11   #18
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

По Вашему "моделированию":
- пришел битый ответ? Вышел таймаут ожидания ответа?
- Повторите запрос.
simples вне форума Ответить с цитированием
Старый 01.12.2013, 14:58   #19
alexusankov
Пользователь
 
Регистрация: 04.01.2011
Сообщений: 66
По умолчанию

Цитата:
Сообщение от simples Посмотреть сообщение
Фантазия №1 - "100500 девайсов на одном ком порту обрабатываемых за одну секунду".
Вы чуть - чуть неверно меня поняли.
Схема следующая - по RS485 ряд устройств (~250) цепляются на концентратор (промышленная железяка).
Сами концентраторы в свою очередь так же по rs485 соединены друг с другом.
Один из концентраторов - прицеплен к ПК через преобразователь интерфейса 485-232.
Задача концентратора - циклический опрос железяк.
Для каждой железяки у концентратора есть диапазон регистров, прочтя которые я получу данные с железяки.
Адреса регистров определяются заранее, руками. В вакууме это выглядит так :
100 железяк сидят на концентраторе. Для первой железяки на концентраторе выделены регистры с первого по тридцатый. Для второй - с тридцать первого по шестьдесят первый итд.
Концентратор непрерывно опрашивает железяки и хранит данные в соот-щих регистрах.
Раз в сутки, я читаю регистры концентратора.
Т.е. по факту, если взять сферического коня в вакууме, я опрашиваю как бы одно устройство, отсюда и берется время в секунду (по документации, на 1 запрос дается 100-200 мс, с учетом линии в километр - до 500 мс).
Я беру 1000мс.
По rs485 бегает довольно шустро.
Количество устройств я привел лишь для понимания какое количество запросов будет проходить в rs232.(!)
---------------
А по сабжу - отваливается по таймауту.
Подозреваю, что для чтения нужно открывать еще один поток, и читать уже в нем, тогда не будет отваливаться по таймауту, и за отведенные 1000 мс, буду получать нужные 73 байта.
Завтра попробую, отпишу вкратце итог
alexusankov вне форума Ответить с цитированием
Старый 01.12.2013, 17:00   #20
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...вообще-то, до 32-х устройств на одной шине без концентраторов, это адресов до 247. Но не суть.

Цитата:
Ситуация - помехи на линии, и два байта не дошли.
если не дошли, есть контрольная сумма в пакете Modbus, делайте повторный запрос и запускайте таймер ожидания, если в течении секунды устройство не ответило с кодом запроса в ответе - повторный запрос, если и после второго, то запрос помечаем у себя для данного устройства как авария или неактивное и посылаем следующий запрос со следующим адресом в модбас-пакете и т.д.

MODBUS на привязи. Цикл 1 2 3 4 5 (ваша ситуация в 5-й части, с.53 статьи)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 01.12.2013 в 17:12.
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Com port Эрвин1233 Visual C++ 1 29.06.2013 23:58
Банальное обновление программы. qwizz Общие вопросы Delphi 7 08.04.2013 09:44
ip:port Reglament_ Работа с сетью в Delphi 3 29.12.2011 18:50
com port чтение запись delphi SonicBob Помощь студентам 5 15.11.2011 10:20
Банальное равенство парсинга bulldog5293 Общие вопросы Delphi 2 29.03.2011 00:29