|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.11.2013, 10:56 | #11 |
Пользователь
Регистрация: 04.01.2011
Сообщений: 66
|
Шутки шутками, но даже в MSDN оговаривается, что возможны варианты, когда ДатаРесивед() не сработает.
Мануал по нему не читал, но вроде он срабатывает на каждый байт, а мне нужно снимать массив по 73 байта. При условии, что с одного устройства прилетает по 73 байта, а их (устройств) две с лишним тысячи (!) глюк в ДатаРесивед, может обернуться печалькой. Или можно краткий принцип, как срабатывает это событие? |
29.11.2013, 10:59 | #12 | |
Подтвердите свой е-майл
Регистрация: 29.08.2012
Сообщений: 4,011
|
Цитата:
|
|
29.11.2013, 11:03 | #13 | |
Пользователь
Регистрация: 04.01.2011
Сообщений: 66
|
а можно краткий пример, как бы решить эту задачу с помощью датаресивед?
Простейшая задача - отправить в ком 8 байтов, и получить 73. Если 73 байта не поступают в течении секунды, продолжать дальше. Просто не могу представить, как это будет выглядеть : Пишем в порт данные. Датаресивер сработает, когда придет какой нибудь байт Цитата:
И такая проверка будет вылетать на каждом срабатывании Датаресивер(почти каждом). Мыслю примерно правильно? Если да, то : 1. Как организовать прием 73 байтов в течении секунды? Если по истечении 1000мс не пришло 73 байта, то отправить следующий запрос - таймер? То есть вешаем таймер на секунду, в него - датаресивер, в котором условие, что по BytesToRead == 73 вызывается процедура считывания в массив? Если да - то к чему эти костыли, когда можно просто протянуть секунду, и после считать и сравнить Length != 73? Последний раз редактировалось alexusankov; 29.11.2013 в 11:23. |
|
29.11.2013, 17:11 | #14 |
Форумчанин
Регистрация: 03.10.2013
Сообщений: 142
|
Не знаю что Вы прочли в МСДН - я там увидел только то что НЕ ДЛЯ КАЖДОГО БАЙТА возникает событие. Т.е. вероятно что байты придут собранными в пакеты.
А то что событие не возникнет вообще - про это не увидел там ни слова. Примерное алго для Вашей задачки: - При отправке запроса его же ложите в какой то список с пометкой ДатаВремя отправки. - В Datareceived прицепите обычное чтение в буфер всего что есть. - Туда же прицепите обработчик "ЕстьДанныеДляУжеОтправленногоЗапро са?" который тупо будет шерстить этот буфер на предмет ответа(повторять просроченные и т.д. и т.п.). Все - у Вас есть все данные для кошерной обработки запросов/ответов. Последний раз редактировалось simples; 29.11.2013 в 17:19. |
29.11.2013, 23:39 | #15 | |
Пользователь
Регистрация: 04.01.2011
Сообщений: 66
|
Цитата:
Пуляю запрос в ком порт. В Datareceived стоит чтение, которое складывает байтики в массив. Там же, еще одна функция смотрит, когда же массив байтов заполнился. Как только массив заполнился до 73 байтов - все ок, выходим оттуда. Ситуация - помехи на линии, и два байта не дошли. Функция, что шерстит, все шерстит и ждет когда сработает условие Length == 73; Ваш вариант сработает, если нужно опросить одно устройство. А если их два? Или десять, пятьдесят? Или как в моем случае - несколько тысяч? И лишь одна секунда дана на то, чтобы устройство ответило. И опять же костыль на костыле, обработчик в обработчике. Ведь любому устройству нужно время для ответа. это как то легко и изящно должно решаться же... |
|
29.11.2013, 23:53 | #16 |
Подтвердите свой е-майл
Регистрация: 29.08.2012
Сообщений: 4,011
|
я не понял, несколько тысяч на 1 порту? чета мне сомнительно..
и эта у устройства есть протокол? ну и настройки по таймаутам тоже должны быть |
30.11.2013, 17:09 | #17 |
Форумчанин
Регистрация: 03.10.2013
Сообщений: 142
|
Вы не фантазируйте - а пишите прототип и тестируйте.
Отпадет куча фантазий. Фантазия №1 - "100500 девайсов на одном ком порту обрабатываемых за одну секунду". |
30.11.2013, 17:11 | #18 |
Форумчанин
Регистрация: 03.10.2013
Сообщений: 142
|
По Вашему "моделированию":
- пришел битый ответ? Вышел таймаут ожидания ответа? - Повторите запрос. |
01.12.2013, 14:58 | #19 | |
Пользователь
Регистрация: 04.01.2011
Сообщений: 66
|
Цитата:
Схема следующая - по RS485 ряд устройств (~250) цепляются на концентратор (промышленная железяка). Сами концентраторы в свою очередь так же по rs485 соединены друг с другом. Один из концентраторов - прицеплен к ПК через преобразователь интерфейса 485-232. Задача концентратора - циклический опрос железяк. Для каждой железяки у концентратора есть диапазон регистров, прочтя которые я получу данные с железяки. Адреса регистров определяются заранее, руками. В вакууме это выглядит так : 100 железяк сидят на концентраторе. Для первой железяки на концентраторе выделены регистры с первого по тридцатый. Для второй - с тридцать первого по шестьдесят первый итд. Концентратор непрерывно опрашивает железяки и хранит данные в соот-щих регистрах. Раз в сутки, я читаю регистры концентратора. Т.е. по факту, если взять сферического коня в вакууме, я опрашиваю как бы одно устройство, отсюда и берется время в секунду (по документации, на 1 запрос дается 100-200 мс, с учетом линии в километр - до 500 мс). Я беру 1000мс. По rs485 бегает довольно шустро. Количество устройств я привел лишь для понимания какое количество запросов будет проходить в rs232.(!) --------------- А по сабжу - отваливается по таймауту. Подозреваю, что для чтения нужно открывать еще один поток, и читать уже в нем, тогда не будет отваливаться по таймауту, и за отведенные 1000 мс, буду получать нужные 73 байта. Завтра попробую, отпишу вкратце итог |
|
01.12.2013, 17:00 | #20 | |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
...вообще-то, до 32-х устройств на одной шине без концентраторов, это адресов до 247. Но не суть.
Цитата:
MODBUS на привязи. Цикл 1 2 3 4 5 (ваша ситуация в 5-й части, с.53 статьи)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation Последний раз редактировалось raxp; 01.12.2013 в 17:12. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |