ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
7 июля
212132 Топик полностью
pav256 (22.09.2010 10:16, просмотров: 117) ответил z00f на Какой алгоритм опроса slave устройств мастером на RS485? Чтобы не кричали все разом?
Первый вопрос который возникает - это вопрос о требуемом времени раздачи адресов, насколько быстро это НУЖНО делать? Связанный с этим вопросом - вопрос о скорости в канале? Я столкнулся с аналогичной проблемой, правда задача была несколько сложнее - управление обменом в канале было децентрализованным. Необходимо было в каждом устройстве создать таблицу адресов ВСЕХ устройств в системе (в частности, для децентрализованного мониторинга целостности системы). Правда процедура определения адреса, при 20-30 устройств занимала около 5-7 секунд (скорость 19200) Если время НАЧАЛЬНОГО определения адреса не критично (данная процедура проводится ОДИН раз при КОНФИГУРИРОВАНИИ системы, при изменении количества устройств процедуру требуется перезапустить), то можно, как уже советовали, воспользоваться случайным временным разбиением пакетов с контролем занятости канала! Фактически реализовать тот же алгоритм, что и в изернет (случайный доступ с контролем несущей). Кратко алгоритм МОЖЕТ выглядеть следующим образом: 1. Инициализируем датчик случайных чисел (оптимально воспользоваться как раз серийником, хотя даже при их совпадении остается большая вероятность рассинхронизации времени старта устройств в системе, хотя бы в небольших пределах) 2. Слушаем канал, если в течении времени передачи 2-3байт нет обмена передаем посылку со своим серийником master-у, осуществляя ПОБАЙТНЫЙ эхо-контроль. 3.1. Master получив пакет может в соответствии с порядком получения ЭТОГО серийника присвоить адрес и отправить его обратно в канал вместе с серийником, так же проводя эхо-контроль. Полученный серийник и присвоенный адрес сохрянить в таблице, если пакет не будет получен и придет повторный запрос с тем же серийником - выдать ТОТ ЖЕ адрес, что гарантирует непрерываность адресного пространства! При этом такой пакет может быть послан не сразу, а с задержкой (например, по причине перехвата управления другим устройством). 3.2 Более простой вариант. Master ждет определенное время складывая полученные серийники в таблицу (если нужно, можно их отсортировать). Одинаковые серийники игнорируются (повторное получение пакета от одного и того же устройства). Slave устройства должны послать в канал 2-3... пакета (зависит от вероятности возникновения ошибок в канале) при выполнении процедуры определения адреса (для увеличения вероятности получения master-ом ВСЕХ пакетов). По прошествии заданного времени master имеет таблицу серийников ВСЕХ slave устройств. Далее раздаем пакеты серийник-адрес. Очевидно работает медленнее чем 1 вариант. 3.3 придумай сам... 4. При возникновении ошибки передачи (ошибка эхо-контроля) устройство выдерживает случайную паузу (для этого и нужен датчик случайных чисел) из и интервала 2 периода передачи байта. Далее п.п.2. Если опять неудача, то интервал ВЫБОРА паузы увеличивается в 2 раза (4 периода передачи байта), следующая неудача - еще в 2 раза (до, например, мах 2^16). Счетчик периода паузы сбрасывается при успешной передачи пакета. Да забыл,стартовать процедура может по команде master (или любого другого устройства), при этом slave устройства должны отслеживать не только эту команду, но и чужие команды п.п.2 и по ним начинать данную процедуру. Реальный алгоритм естественно сложнее, т.к. любой узел UART микроконтроллера фиксирует ряд ошибок и "по-хорошему" их все нужно КОРРЕКТНО обрабатывать. У метода два основных недостатка: 1. Время на процедуру достаточно велико! 2. Запуск процедуры требуется каждый раз при изменении конфигурации системы. Хотя в ряде случаев (например для контроля целостности системы) это свойство является достоинством.