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

 
 
> адресация устройств на шине RS-485 для AVR
Dmitry Sadikov
сообщение Jan 5 2009, 10:40
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 6-10-08
Пользователь №: 40 732



Здравствуйте.
Есть у меня несколько atmega128, обьединённых через RS-485 интерфейс, построенный на UARTе. Одна из них ведущая, все остальные - ведомые.
Подскажите пожалуйста, какие есть методы распределения адресов ведомых устройств на такой шине?
В данный момент адреса каждой из ведомых atmegа128 задаются джамперами на плате, подключенными к порту.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
VladimirYU
сообщение Jan 5 2009, 10:46
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Dmitry Sadikov @ Jan 5 2009, 13:40) *
Здравствуйте.
Есть у меня несколько atmega128, обьединённых через RS-485 интерфейс, построенный на UARTе. Одна из них ведущая, все остальные - ведомые.
Подскажите пожалуйста, какие есть методы распределения адресов ведомых устройств на такой шине?
В данный момент адреса каждой из ведомых atmegа128 задаются джамперами на плате, подключенными к порту.

А что не устраивает а вашем способе, или чего хотелось бы?
Go to the top of the page
 
+Quote Post
Dmitry Sadikov
сообщение Jan 5 2009, 10:54
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 6-10-08
Пользователь №: 40 732



хотелось бы в идеале, чтобы адреса распределял ведущий контроллер. Хотя я не представляю, как это возможно.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Jan 5 2009, 11:03
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Dmitry Sadikov @ Jan 5 2009, 13:54) *
хотелось бы в идеале, чтобы адреса распределял ведущий контроллер. Хотя я не представляю, как это возможно.

Это возможно при поочередном подключению к сети ведомых устройств, по умолчанию настроенных на default-адрес, например 127. Мастер опрашивает этот адрес, если есть ответ, то назначает специальной инструкцией устройству адрес, которого в сети еще нет (например по возрастанию, запоминая первый свободный адрес в своем ЕЕПРОМ). Устройство принимает этот адрес и запоминает его также в ЕЕПРОМ и далее откликается только на него. Способ не идеальный но на практике используется.
Go to the top of the page
 
+Quote Post
Dmitry Sadikov
сообщение Jan 5 2009, 11:12
Сообщение #5





Группа: Новичок
Сообщений: 5
Регистрация: 6-10-08
Пользователь №: 40 732



Спасибо. воспользуюсь этим способом.
ну а при одновременном подключении нескольких устройств с одинаковым начальным адресом, я полагаю, распределить уникальные адреса не получиться?
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Jan 5 2009, 11:21
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Dmitry Sadikov @ Jan 5 2009, 14:12) *
Спасибо. воспользуюсь этим способом.
ну а при одновременном подключении нескольких устройств с одинаковым начальным адресом, я полагаю, распределить уникальные адреса не получиться?

В этом случае на команду опроса от мастера одновременно откликнутся несколько устройств, и будут на передачу включены несколько драйверов RS485. В лучшем случае мастер просто ничего не поймет, в худшем кто-то из драйверов может и выйти из строя, зависит от реализации.
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Jan 5 2009, 12:01
Сообщение #7


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

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
ну а при одновременном подключении нескольких устройств с одинаковым начальным адресом, я полагаю, распределить уникальные адреса не получиться?
ну можно как-нибудь извратиться, например использовать псевдослучайное время ответа узлов и выделенный начальный адрес (например 0). но это уже будет не совсем Modbus, при работе в одной сети с другими устройствами могут возникнуть проблемы.

Сообщение отредактировал ukpyr - Jan 5 2009, 12:03
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 5 2009, 13:04
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Можно зарезервировать какую-л команду для присвоения адреса, а девайсы снабжать длинным уникальным идентификатором, который должен быть виден юзеру (типа наклейка). Но появляется другая проблема - в память ведущего прописывать идентификаторы...

Лично я свожу количество джамперов к минимуму - 2/3/4 штуки. Те девайсы, что делаю под rs-485, имеют фиксированные адресные пространства по их функционалу (например, измерители температуры с адресами 0x30.. 0x3F, приводы 0x28..0x2f). Вот такая песня. Конечно, если конфликтует с чем-то, адреса подвигаются.
Go to the top of the page
 
+Quote Post
Dmitry Sadikov
сообщение Jan 5 2009, 13:17
Сообщение #9





Группа: Новичок
Сообщений: 5
Регистрация: 6-10-08
Пользователь №: 40 732



Цитата(ukpyr @ Jan 5 2009, 15:01) *
ну можно как-нибудь извратиться, например использовать псевдослучайное время ответа узлов и выделенный начальный адрес (например 0). но это уже будет не совсем Modbus, при работе в одной сети с другими устройствами могут возникнуть проблемы.


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

Цитата(_Pasha @ Jan 5 2009, 16:04) *
Можно зарезервировать какую-л команду для присвоения адреса, а девайсы снабжать длинным уникальным идентификатором, который должен быть виден юзеру (типа наклейка). Но появляется другая проблема - в память ведущего прописывать идентификаторы...

Лично я свожу количество джамперов к минимуму - 2/3/4 штуки. Те девайсы, что делаю под rs-485, имеют фиксированные адресные пространства по их функционалу (например, измерители температуры с адресами 0x30.. 0x3F, приводы 0x28..0x2f). Вот такая песня. Конечно, если конфликтует с чем-то, адреса подвигаются.



да. как ни крути, а с джамперами всё значительно проще. у меня их 2 штуки для задания адреса на каждом устройстве. хватает.
вот только при возможном выходе из строя одного из устройств придётся выставльть джамперы в строгом соответствии со сгоревшим девайсом, а делать это возможно придётся посторонним людям. Поэтому и хотелось сделать распределение адресов автоматически.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jan 5 2009, 13:24
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Dmitry Sadikov @ Jan 5 2009, 16:13) *
я тоже думал использовать временные задержки при ответах от ведомых устройств, но это уж совсем как то не очень выглядит. да и при возникновении сбоев кавардак в сети может начяться

Однако, если и в самом деле хочется уйти от первоначального жесткого распределения адресов вручную, думаю, что иного способа не найти. Устройства надо как-то "сериализовать" (т.е. присвоить им уникальные идентификаторы на этапе программирования), и на этапе поиска устройств (отдельная широковещательная команда) они должны отдавать идентификатор хосту. И уж он будет назначать адрес по идентификатору. Я такой метод использовал в беспроводной сети (после запроса ответы в 256 тайм-слотах, главное - использовать генератор случайных чисел с хорошим распределением). При 256 тайм-слотах до полутысячи устройств "разруливаются" за разумное число попыток, предел - порядка 2000 устройств. Для одной ветки RS-485 256 устройств все равно разумный максимум, да и адрес обычно однобайтовый... Правда, у меня скорости были довольно большие и общее время ответа составляло полсекунды. А, скажем, для 9600 это будет заметно дольше. Впрочем, если такой поиск надо проводить однократно или изредка, то почему бы и нет ?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 5 2009, 13:47
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(rx3apf @ Jan 5 2009, 17:24) *
Для одной ветки RS-485 256 устройств все равно разумный максимум, да и адрес обычно однобайтовый...

Почему 256? 31+адрес общего вызова !!! Так что может быть рандомизация еще оптимистичнее.
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jan 5 2009, 13:50
Сообщение #12


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

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



проблема еще в том, что для 485-го, как указывали выше, коллизия - это плохо. Т.е. помимо написаного аля езернет, надо еще следить какие микросхемы используешь тк вдруг у купленой нет защиты от КЗ. я использовал два варианта для таких вещей
1. дип-свитч. 8-переключателей. из минусов это громоздкость. из плюсов у пользователей(если их можно так назвать) при замене проблем не возникает, тк все просто - поставь "клацалки" на новом так же как на старом.
2. служебный адрес(0x01) и удаленая загрузка конфигурации с писюка. те только что прошитый контроллер имеет адрес 1, а потом мы ему даем любой кроме 1.из минусов - пользователю тяжелее осознать, что все просто. вводить в сеть такие контроллеры надо по одному. надо писать программу и для компа. из плюсов: сидишь на стуле и просто клацаешь. нет съедающего площадь дип-свитча.

зы. а сейчас я безпроводку ипсользую... в ней при коллизии ничего не сгорит

Сообщение отредактировал smalcom - Jan 5 2009, 13:52
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 5 2009, 13:54
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Dmitry Sadikov @ Jan 5 2009, 17:17) *
а делать это возможно придётся посторонним людям. Поэтому и хотелось сделать распределение адресов автоматически.

Тогда, пусть давят кнопку "регистрация в сети". Как только девайс сконфигурирован, он из режима вышел. Потом - к следующему... При собсно конфигурации используется некий широковещательный адрес. Слушают все, но отвечает только тот, у кого кнопкодавы включили режим.
Go to the top of the page
 
+Quote Post
Dmitry Sadikov
сообщение Jan 5 2009, 19:09
Сообщение #14





Группа: Новичок
Сообщений: 5
Регистрация: 6-10-08
Пользователь №: 40 732



Цитата(rx3apf @ Jan 5 2009, 16:24) *
Правда, у меня скорости были довольно большие и общее время ответа составляло полсекунды. А, скажем, для 9600 это будет заметно дольше. Впрочем, если такой поиск надо проводить однократно или изредка, то почему бы и нет ?
ну скорость у меня 115200. да и подчинённых устройств в сети всего 4. так что сделать широковещательный запрос и дождаться жёстко разнесённых по времени ответов от них по очереди будет не сложно. но в каждом из девайсов изначально должен быть зашит свой уникальный идентификатор, который он по этой команде отсылает ведущему контроллеру, если я правильно понял? а потом на основании их уже распределяются адреса. может тогда сразу прошивать в каждый девайс уникальный адрес на шине?
Цитата(smalcom @ Jan 5 2009, 16:50) *
1. дип-свитч. 8-переключателей. из минусов это громоздкость. из плюсов у пользователей(если их можно так назвать) при замене проблем не возникает, тк все просто - поставь "клацалки" на новом так же как на старом.
ну вариант с джамперами, как я сейчас и использую, почти аналогичен свитчу. только и делов что поставить два джампера в соответствии с заменяемым девайсом. но как показывает практика, монтажникам ничего не стоит запутаться в 4 платах и выставить одинаковые адреса((((
Цитата(_Pasha @ Jan 5 2009, 16:54) *
Тогда, пусть давят кнопку "регистрация в сети". Как только девайс сконфигурирован, он из режима вышел. Потом - к следующему... При собсно конфигурации используется некий широковещательный адрес. Слушают все, но отвечает только тот, у кого кнопкодавы включили режим.
если доведётся мне ещё раз править плату, то можно и кнопку воткнуть. зато уж не ошибёшся.

От модератора.
Из сообщения удалено излишнее цитирование. Вы нарушаете п.3.4 Правил форума! Учитесь пользоваться редактором сообщений!
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Jan 5 2009, 19:50
Сообщение #15


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

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



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

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

Сообщение отредактировал ukpyr - Jan 5 2009, 19:53
Go to the top of the page
 
+Quote Post

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

 


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


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