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

 
 
> Свой протокол поверх RS-485
kt361
сообщение Dec 2 2012, 14:08
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 28-10-09
Пользователь №: 53 272



Добрый день!

Для реализации своей задумки мне необходимо соединить порядка 20 устройств по общей шине в режиме Multi-Master.
В любой момент любое устройство независимо должно иметь возможность отправить свое сообщение в шину.
Если любое из устройств зависает или ломается, оно не должно никоим образом влиять на работоспособность других устройств в сети.
Ввиду стоимости и простоты переноса в различные среды я хочу использовать RS-485 на общей шине.

Исходя из условий, приходится отмести условно-стандартный для указанного физического уровня Modbus.
Соответственно, приходится выдумывать некую свою поделку, отправной точкой я хочу взять описание протокола от zap: http://electrotransport.ru/ussr/index.php?...12449#msg112449

Кратко: muli-master протокол с гарантированной отправкой над первичным протоколом, способным отправлять байты, но не биты.
Контроллер всегда слушает то, что творится в линии. Если линия свободна от передаваемых данных, котроллер может передавать свои данные. Если передаваемый байт не совпал с принятым, значит произошла одновременная отправка с другим контроллером. В этом случае оба затыкаются на время передачи двух символов и выбирают на рандом - начать отправлять снова, или ждать.
В описанном протоколе необходимо и для чтения, и для отправки необходимо знать время отправки одного символа (байта).

Реализовать передачу данных в преобразователь (st485/max485 итп) и измерять эти интервалы можно двояко:
1. Подключать встроенный в микроконтроллер UART. Интервал измерять временем выполнения функции uart_write в пустоту, с отключенным DE в преобразователе RS-485.
2. Реализовать UART программно на таймере и прерываниях, из прерываний таймера знаем время передачи одного символа.

Как лучше поступить?
В первой реализации используется меньше кода, ибо железная реализация uart. Но не очень нравится костыляция с пустой отправкой байтов.
Во второй реализации больше кода, зато полностью управляемая система с прерываниями, никаких костылей.

Благодарю за ответы и рассуждения!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
flakman
сообщение Dec 21 2012, 12:20
Сообщение #2





Группа: Участник
Сообщений: 11
Регистрация: 9-11-12
Пользователь №: 74 298



Позвольте добавить свой вопрос. Задача от части похожа на сабж от kt361, по этому прочитал весь топик и не стал создавать отдельный, да и назывался бы он точно также.
Нужно что-то вроде промежуточного варианта между мульти-мастер протоколом и традиционными. Сразу скажу что уйти от RS485 просто не могу - у меня готовое устройство с тем что есть, выбирать не из чего. Сеть может работать и с одним мастером, но особенность в том, что критично время реакции на запрос, счёт идёт на миллисекунды (сеть будет из устройств считывания RFID, всё сделать нужно за время, приемлемое для подноса человеком карты к считывателю). По этой причине хочется заменить опрос слэйвов на сигнализацию самими слэйвами о необходимости связи с мастером.

Есть такая идея. По сравнению с Modbus всё наоборот - мастер не клиент, а сервер. В тишине мастер не опрашивает слэйвов, а ждёт запроса на связь => wink.gif возникает проблема с коллизиями, которую попытаюсь объяснить как хочу обойти. Слэйвы в спокойном состоянии тоже слушают шину. Что-бы просигналить о необходимости связи, слэйв отсылает пакет определённого формата, включающий его собственный адрес. Мастер, если всё ок, в ответ отсылает пакет на широковещательный адрес, в котором содержится адрес запросившего слэйва. Данный пакет для инициатора связи означает что обмен разрешён, всеми остальными он должен распознаваться как "шина занята" (в пакете не их адрес), и нужно ждать широковещательного пакета означающего освобождение шины. Во избежании глюков можно периодически слать пакет "шина свободна" просто во время тишины. Это поможет и для распознавания вымершего матера. Но механизм поиска нового в моей задаче не стоит. Им в любом случае может быть только софт на ПК с совершенно другой логикой чем у остальных девайсов в сети.

Теперь если всё не ок. Если несколько слэйвов начинают передачу, то получившийся пакет мастер просто отбрасывает как не корректный пакет запроса на связь, в тишине он ждёт только его. Если при коллизии например модифицировался адрес запрашивающего, а формат пакета остался корректным, и мастер отправил широковещательный ответ, то обладатель этого случайного адреса просто не ответит, передача навернётся по таймауту, а мастер снова объявит о свободности шины. Настоящие же запросившие связь в случае не получения положительного ответа ждут объявления свободности шины, рандомят себе задержку и пробуют снова.
Пакеты запросов связи могут слушать и все слэйвы, что-бы затыкаться сразу же, пока не получат подтверждения свободности шины. Это избавит от влезания "желающих" во время уже начавшейся попытки установить связь, и сильно снизит вероятность коллизий.

На вскидку, в случае отсутствия коллизии, связь будет установлена за один запрос-ответ и самое главное - инициирована слэйвом, опрос не нужен. Правда рассматривал только логическую сторону вопроса. Физическую - кз передатчиков не рассматривал. Разработка внутренняя, не на продажу, и все конкретные девайсы добавляемые в сеть будут заранее известны с возможностью проверки наличия защиты драйверов RS485 на защиту от кз. Наверно это плохой тон конечно.

Возможно это велосипед какого-нибудь протокола вообще без фиксированного матера-сервера (прошу ткнуть носом sm.gif), возможно это вообще не будет работать (прошу обсуждения). Изначально рассматривал Modbus, но там как раз традиционный вариант с опросом. Если описанное выше имеет место быть, не знаю - стоит писать с нуля или быстрее будет модифицировать какую-нибудь реализацию Modbus. Это потому-что на самом деле после установки связи, она может происходить точно так-же как в Modbus, что избавляет от написания реализации самого обмена данными.
Go to the top of the page
 
+Quote Post
=AK=
сообщение Dec 23 2012, 10:20
Сообщение #3


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(flakman @ Dec 21 2012, 22:50) *
Нужно что-то вроде промежуточного варианта между мульти-мастер протоколом и традиционными. Сразу скажу что уйти от RS485 просто не могу - у меня готовое устройство с тем что есть, выбирать не из чего. Сеть может работать и с одним мастером, но особенность в том, что критично время реакции на запрос, счёт идёт на миллисекунды

Похоже что мало кто знает, что помимо "традиционных" протоколов "master-slave", в которых есть какой-то мастер, есть протоколы "producer-consumer", в которых мастера нет в принципе.

В протоколах "producer-consumer" (к которым, в частности, относится CAN) передачу начинает любой "производитель информации", которому "есть что сказать". А принимает информацию не какое-то одно устройство, а все, кому эта информация нужна. В результате этого информация передается очень быстро даже при малых бодовых скоростях. Суммарный выигрыш по скорости при раздаче информации получается на один-два порядка, хоть людям неискушенным в это трудно поверить.

В обычных "master-slave" мастер должен:
- все время опрашивать другие узлы на предмет наличия новой информации
- если у одного из узлов появилось что-то новое, мастер должен прочитать инфу
- после этого мастер должен по очереди разослать инфу тем узлам, которым она нужна

В "улучшенных" конфигурациях вместо одного мастера есть координатор, который опрашивает те узлы, которые способны быть мастером - не желают ли они "немножко порулить" интерфейсом? Если желают, то координатор на некоторое время дает им сеть во владение, а уж они сами "выковыривают" инфу из периферийных устройств. Понятно, что никаких преимуществ по времени по сравнению с предыдущим вариантом это не дает.

Основной проблемой протоколов "producer-consumer" является обнаружение и "разруливание" столкновений (CSMA/CD). Очень хорошим вариантом является предотвращение столкновений (CSMA/CA), для реализации которой как правило используют передатчики с открытым коллектором или их эквиваленты. CAN использует эквивалент открытого коллектора, гибрид ОК и RS485.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kt361   Свой протокол поверх RS-485   Dec 2 2012, 14:08
- - stells   Цитата(kt361 @ Dec 2 2012, 18:08) Если пе...   Dec 2 2012, 14:42
- - _Pasha   ТС забыл указать физ. длину этой шины, потому что,...   Dec 2 2012, 15:04
- - Lagman   похоже на CAN   Dec 2 2012, 15:15
|- - kt361   Цитата(Lagman @ Dec 2 2012, 19:15) похоже...   Dec 2 2012, 16:47
|- - demiurg_spb   Цитата(Lagman @ Dec 2 2012, 19:15) похоже...   Dec 3 2012, 05:28
- - kt361   На КЗ не стоит рассчитывать, шина предположительно...   Dec 2 2012, 15:24
|- - stells   Цитата(kt361 @ Dec 2 2012, 19:24) На КЗ н...   Dec 2 2012, 15:27
- - kt361   Точно. Но в драйверах ставят защиту от КЗ. Я рассч...   Dec 2 2012, 15:39
- - =AK=   Цитата(kt361 @ Dec 3 2012, 00:38) Контрол...   Dec 3 2012, 03:46
- - MrYuran   Есть такой лисапедег ЦитатаИмеется доминантный и ...   Dec 3 2012, 05:47
- - kt361   Так. ладно. разочаруюсь в RS485. В CAN, как я пон...   Dec 3 2012, 07:06
- - редактор   раз уж речь зашла о CAN, и стандартные протоколы н...   Dec 3 2012, 07:32
- - ILYAUL   Цитатаесли 255 - значит, широковещательный пакет, ...   Dec 3 2012, 13:01
- - kt361   Так помогите разобраться. В RS ничего кроме физиче...   Dec 3 2012, 13:27
- - haker_fox   А нельзя протокол переделать так, чтобы в сети был...   Dec 3 2012, 14:07
- - kt361   Нельзя. Ибо выходит из строя мастер - вся сеть пер...   Dec 4 2012, 06:13
|- - stells   Цитата(kt361 @ Dec 4 2012, 10:13) Нельзя....   Dec 4 2012, 06:45
|- - _Pasha   Цитата(stells @ Dec 4 2012, 09:45) Вы поч...   Dec 21 2012, 13:07
- - редактор   Если зациклициваться на RS, то можно передавать уп...   Dec 4 2012, 06:40
|- - flakman   Цитата(=AK= @ Dec 23 2012, 14:20) Похоже ...   Dec 24 2012, 07:44
- - Smen   Тоже возникла похожая задача. Сперва хотел реализо...   Jul 16 2013, 08:31
|- - =AK=   Цитата(Smen @ Jul 16 2013, 18:01) Однако ...   Jul 16 2013, 12:49
|- - Smen   Цитата(=AK= @ Jul 16 2013, 16:49) А что, ...   Jul 16 2013, 14:42
- - Fujitser   Не взлетит. RS-485 не поддерживает режим с возможн...   Jul 16 2013, 17:00
- - ZASADA   +1, переходите на CAN, мы везде где можно от RS-48...   Jul 16 2013, 18:54
- - редактор   ЦитатаВ данном случае, сошёлся, ибо не я его делаю...   Jul 17 2013, 07:32
|- - dac   имхо Ethernet полностью снимает проблемы коллизий....   Jul 17 2013, 07:48
|- - Kane   Цитата(редактор @ Jul 17 2013, 11:32) В т...   Jul 17 2013, 14:04
|- - Smen   Цитата(ZASADA @ Jul 16 2013, 22:54) перех...   Jul 24 2013, 05:27
|- - Fujitser   Цитата(Smen @ Jul 24 2013, 11:27) А разве...   Jul 24 2013, 13:17
|- - Smen   Цитата(Fujitser @ Jul 24 2013, 17:17) CAN...   Jul 24 2013, 14:17
- - редактор   Только ПК оперативно эти коллизии не разрулит (пер...   Jul 18 2013, 07:12


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

 


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


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