реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Как лучше организовать протокол (логический) для RS-485
Diusha
сообщение Feb 22 2010, 09:15
Сообщение #1


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



На главный блок должна стекаться инфа с нескольких периферийных.
Есть такие варианты:
1) Каждый периферийный посылает данные (по мере их готовности) и в теч. нек. времени ждет подтверждение от главного. Если подтверждения нет, посылает еще раз. Если случайно 2 периферийных пошлют одновременно, то контрольная сумма не совпадет -> не будет подтверждения -> повтор.
2) Главный постоянно периферийным шлет запросы. Если у периферийного данные готовы, то он посылает.

Вроде оба варианта имеют право на существование, но чего-то не нравятся. Может предложите получше варианты или есть решения, проверенные временем?
Go to the top of the page
 
+Quote Post
ASN
сообщение Feb 22 2010, 10:40
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Diusha
Второй способ используем достаточно давно. Работает устойчиво.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 22 2010, 14:05
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Diusha @ Feb 22 2010, 11:15) *
1) Каждый периферийный посылает данные (по мере их готовности) и в теч. нек. времени ждет подтверждение от главного. Если подтверждения нет, посылает еще раз. Если случайно 2 периферийных пошлют одновременно, то контрольная сумма не совпадет -> не будет подтверждения -> повтор.
А как он узнает, что в этот момент канал свободен и он своей передачей никому не помешает?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 22 2010, 14:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Diusha @ Feb 22 2010, 14:15) *
Вроде оба варианта имеют право на существование, но чего-то не нравятся. Может предложите получше варианты или есть решения, проверенные временем?
Второй вариант типовой: мастер, который опрашивает все слейвы по принципу запрос-ответ. Первый весьма замороченный, т.к. требует постоянной прослушки линии всеми устройствами сети и передачи маркеров по которым устройства имеют право занять линию для передачи. Основная сложность в том, что RS485 не имеет штатных аппаратных средств для детектирования и "разруливания" коллизий. Если вам нужен именно первый вариант, то переходите на CAN.
Go to the top of the page
 
+Quote Post
Diusha
сообщение Feb 22 2010, 15:42
Сообщение #5


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(rezident @ Feb 22 2010, 17:53) *
Первый весьма замороченный, т.к. требует постоянной прослушки линии всеми устройствами сети и передачи маркеров по которым устройства имеют право занять линию для передачи. Основная сложность в том, что RS485 не имеет штатных аппаратных средств для детектирования и "разруливания" коллизий.

Цитата(Сергей Борщ @ Feb 22 2010, 17:05) *
А как он узнает, что в этот момент канал свободен и он своей передачей никому не помешает?

Цитата(Diusha @ Feb 22 2010, 12:15) *
Если случайно 2 периферийных пошлют одновременно, то контрольная сумма не совпадет -> не будет подтверждения -> повтор.

Дело в том, что передачи относительно редки => вероятность коллизии невысока. Коллизии разрулятся с помощью контрольной суммы. Прослушивать ничего не надо.
2-й вариант смущает тем, что линию придется держать занятой на несколько порядков бóльшее время (лишние помехи), т.к. главный должен получить данные быстро => запросы придется слать с большой частотой.

Цитата(rezident @ Feb 22 2010, 17:53) *
Если вам нужен именно первый вариант, то переходите на CAN.

САN - в следующий раз, сейчас железо сделано под 485

Какие будут советы в свете моих уточнений? Может есть еще какой-нибудь 3-й вариант?
Go to the top of the page
 
+Quote Post
ASN
сообщение Feb 22 2010, 15:50
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Diusha
Линию в любом случае кто-то должен держать.
Большая частота - это какая величина?
Мастер опрашивает состояния устройств достаточно быстро, и если есть данные - осуществляет обмен с устройством.
Чем не устраивает такой протокол?
Go to the top of the page
 
+Quote Post
Andron_
сообщение Feb 22 2010, 17:06
Сообщение #7


.NET developer
***

Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532



а гарантированная доставка пакета от периферийного устройства необходима?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 22 2010, 17:17
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Diusha @ Feb 22 2010, 17:42) *
Дело в том, что передачи относительно редки => вероятность коллизии невысока. Коллизии разрулятся с помощью контрольной суммы.
Для 485 коллизия является нештатной ситуацией. Производитель не гарантирует, что драйвера выдержат сколь-нибудь долгую эксплуатацию в таком режиме. Хотите иметь неприятности из-за отказов - делайте.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 22 2010, 17:32
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Diusha @ Feb 22 2010, 20:42) *
Дело в том, что передачи относительно редки => вероятность коллизии невысока. Коллизии разрулятся с помощью контрольной суммы. Прослушивать ничего не надо.
Это вы так думаете. "Человек предполагает, а Господь располагает" smile.gif Я с ходу могу предложить ситуацию в которой будет коллизия, которую разрулить будет весьма сложно. Представьте, что на контролируемом объекте произошла авария и все устройства с этого объекта пытаются одновременно передать информацию об аварийном событии. laughing.gif
Цитата(Diusha @ Feb 22 2010, 20:42) *
2-й вариант смущает тем, что линию придется держать занятой на несколько порядков бóльшее время (лишние помехи), т.к. главный должен получить данные быстро => запросы придется слать с большой частотой.
"Быстро" это не технический термин. Укажите скорость обмена, количество передаваемой информации, количество узлов и максимально допустимое время отклика.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Feb 23 2010, 04:40
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Не мучайтесь, сделайте Модбас.
Заодно получите возможность подключать вместе с Вашими ещё кучу других устройств и опрашивать их не только своей программой, но и многими другими системами сбора данных.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Don2
сообщение Feb 23 2010, 07:24
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 30-11-06
Из: Запорожье
Пользователь №: 22 958



Цитата(Diusha @ Feb 22 2010, 12:15) *
Вроде оба варианта имеют право на существование, но чего-то не нравятся. Может предложите получше варианты или есть решения, проверенные временем?


Если чего-то уж очень не нравится, то можете применить общий запрос от ведущего в ответ на который ведомые выдают ответ с разносом во времени с целью гарантированного устранения коллизий.Время старта выдачи ответа ведомым равно некоторой константе умноженной на номер ведомого.В ответе должен присутствовать номер ведомого.
Go to the top of the page
 
+Quote Post
stells
сообщение Feb 23 2010, 07:45
Сообщение #12


внештатный сотрудник
******

Группа: Участник
Сообщений: 2 458
Регистрация: 10-05-08
Из: МО, Медвежьи озера
Пользователь №: 37 401



Цитата(Don2 @ Feb 23 2010, 10:24) *
можете применить общий запрос от ведущего в ответ на который ведомые выдают ответ с разносом во времени

в принципе как таковой запрос не нужен, мастер должен просто линию дернуть и сформировать таким образом синхросигнал для отсчета времени ответа слейва в соответствии с его приоритетом
Go to the top of the page
 
+Quote Post
Diusha
сообщение Feb 23 2010, 08:04
Сообщение #13


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(ASN @ Feb 22 2010, 18:50) *
Линию в любом случае кто-то должен держать.

Зачем ее обязательно кому-то держать? (я не спорю, а просто спрашиваю smile.gif )

Цитата(ASN @ Feb 22 2010, 18:50) *
Большая частота - это какая величина?

Пока только расплывчато… Чтобы на глаз задержка не была заметна. Думаю, миллисек 50 от готовности данных до их получения на центральном.

Цитата(ASN @ Feb 22 2010, 18:50) *
Чем не устраивает такой протокол?

Да вроде только тем, что линия будет трещать без умолку, тогда как могла бы быть занята только на время передачи нескольких байт раз в неск. секунд.
Честно говоря, не знаю даже, это плохо или нейтрально

Цитата(Andron_ @ Feb 22 2010, 20:06) *
а гарантированная доставка пакета от периферийного устройства необходима?

Да. Думаю это организовать с помощью добавления в пакет его номера. Интересно было бы посмотреть примеры, как делают умные люди.

Цитата(rezident @ Feb 22 2010, 20:32) *
Я с ходу могу предложить ситуацию в которой будет коллизия, которую разрулить будет весьма сложно. Представьте, что на контролируемом объекте произошла авария и все устройства с этого объекта пытаются одновременно передать информацию об аварийном событии. laughing.gif

Разруливается весьма легко: У каждого устройства свой период повторной передачи в случае неполучения подтверждения.

Цитата(Сергей Борщ @ Feb 22 2010, 20:17) *
Для 485 коллизия является нештатной ситуацией. Производитель не гарантирует, что драйвера выдержат сколь-нибудь долгую эксплуатацию в таком режиме.

Логично! Не подумал об этом. Чего-то не нашел в ДШ на МАХ485 про допустимую нагрузку.

Цитата(SSerge @ Feb 23 2010, 07:40) *
Не мучайтесь, сделайте Модбас.
Заодно получите возможность подключать вместе с Вашими ещё кучу других устройств и опрашивать их не только своей программой, но и многими другими системами сбора данных.

«Куча» не понадобится и опрос другими системами тоже. Так что подгонгять под определенный готовый стандарт и проверять, действительно ли оно соответствует, – как раз лишнее мучение. Но общие принципы модбаса стоит взять на вооружение.
Go to the top of the page
 
+Quote Post
ASN
сообщение Feb 23 2010, 10:12
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326



Diusha
Держать желательно, чтобы не линия "болтала".
Были в практике неприятные истории, когда устройства постоянно "дёргались" обрабатывать запросы по UART, потому что линией никто не управлял и она "ловила" шумы.
При скорости 19200 время передачи одного байта около 0,5 мс.
Даже если сообщение состоит из 10 байт + время на включение/выключение опрос одного устройства займёт не более 5 мс.
Сколько у Вас устройств? Для 10, IMHO, времени достаточно.
Плюс к тому, чтобы на глаз задержка не была заметна для нескольких байт ограничение будет выступать, IMHO, не задержки передачи, а задержки отрисовки в ПЭВМ.
Если надо опрашивать много устройств, IMHO, лучше сделать концентраторы, которые собирают информацию с удалённых объектов и отсылают её в host.
На подобие дерева.
P.S. Я бы рекомендовал Modbus - лучше день потерять, потом за час долететь smile.gif Просто, надёжно.
Go to the top of the page
 
+Quote Post
Diusha
сообщение Feb 23 2010, 13:34
Сообщение #15


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(ASN @ Feb 23 2010, 13:12) *
Держать желательно, чтобы не линия "болтала".
Были в практике неприятные истории, когда устройства постоянно "дёргались" обрабатывать запросы по UART, потому что линией никто не управлял и она "ловила" шумы.

В любом случае если не повесить подтяжки, линия болтать будет: мастер послал запрос и переключился на прием. Пока слейв не ответил, все устройства слушают болтавню.
Или я что-то не понимаю?

Цитата(ASN @ Feb 23 2010, 13:12) *
чтобы на глаз задержка не была заметна для нескольких байт ограничение будет выступать, IMHO, не задержки передачи, а задержки отрисовки в ПЭВМ.

Ну я имел в виду задержку не передачи, а периода посылки запросов мастером, если период будет велик

Сообщение отредактировал Diusha - Feb 23 2010, 13:30
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 23:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016