Перейти к содержанию
    

Помогите выбрать протокол

Добрый день

Есть устройства на полудуплексной шине (rs485). В каждом устройстве есть eeprom для хранения данных, так же в контроллере каждого устройства есть 96 бит uniq ID

Места на плате мало, ног у контроллера тоже, поэтому dip-switch отпадает

Задача - определить все устройства, присутствующие на шине и в дальнейшем иметь возможность адресовать каждое

Есть ли готовые реализации протоколов с подобным механизмом?

Или, если это возможно, как свернуть эти 96 бит ID во что-то максимум двухбайтовое, чтобы мастер мог за вменяемое время опросить все устройства и создать себе список подключенных?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите на тему распознавания идентификаторов на 1-wire. Либо могу предложить решение, которое я использовал применительно к радиоканалу - идет запрос, после которого ожидается ответ в некотором количестве (у меня 256) таймслотов, устройства отвечают своим идентификатором в случайном (с затравкой от своего серийника) таймслоте. Абоненты согласно списка опрашиваются и переводятся в неактивное состояние, после чего опрос повторяется и отвечают лишь "необработанные" устройства и так далее. Прекратили отвечать - поиск завершен.

Изменено пользователем rx3apf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, toweroff said:

Или, если это возможно, как свернуть эти 96 бит ID во что-то максимум двухбайтовое, чтобы мастер мог за вменяемое время опросить все устройства и создать себе список подключенных?

 

Полностью исключить совпадение невозможно - 96 бит нельзя упаковать в 16 без последствий.

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

Для этого следует выяснить принцип формирования этих 96 бит: какие битовые поля из всего ID как назначаются  при производстве некого устройства.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, toweroff сказал:

Или, если это возможно, как свернуть эти 96 бит ID во что-то максимум двухбайтовое, чтобы мастер мог за вменяемое время опросить все устройства и создать себе список подключенных?

А в той же EEPROM хранить уникальный ID, заданный еще при изготовлении устройства, нельзя? И при запуске девайса этот ID копируется в ОЗУ как текущий рабочий адрес, участвующий в обменах.

Потому как 96 бит в 16, даже с использованием хитрого хеширования, может привести к коллизиям и повторам результирующего 16-битного адреса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, toweroff сказал:

Или, если это возможно, как свернуть эти 96 бит ID во что-то максимум двухбайтовое, чтобы мастер мог за вменяемое время опросить все устройства и создать себе список подключенных?

При инициализации сети или подключения нового устройства, мастер считывает 96-бит адрес и назначает 8 бит-адрес, в дальнейшем им и пользоваться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, toweroff сказал:

Задача - определить все устройства, присутствующие на шине и в дальнейшем иметь возможность адресовать каждое

Не понятно: Сколько максимум может быть устройств одновременно на шине? Могут ли они в произвольное время включаться/выключаться? Может ли в произвольное время с ними пропадать связь и снова появляться? Насколько точно тактируются устройства на шине (сколько ppm погрешность их генераторов)? И т.д. От всего этого и будет зависеть реализация.

Но в общем случае Вам нужен протокол с последовательной изоляцией. Самый универсальный вариант - тот что предложил rx3apf выше. Или его вариации. Если устройства могут появляться/пропадать на шине в произвольное время, то сеанс энумерации устройств необходимо дополнить уникальным ID, который мастер будет генерить в начале сеанса (например - случайное длинное 32-битовое число), сообщать всем в начале сеанса, а потом каждый цикл обмена в процессе энумерации сопровождать этим ID (чтобы устройства его не знающие (только включившиеся) не рушили процесс; или устройства, с которыми пропала связь в предыдущем сеансе энумерации, и появилась снова в текущем сеансе тоже не рушили процесс).

Задача:

Есть класс детей, 30 душ. Приходит новая училка, она никого не знает, ей нужно познакомиться с детьми. И в учительской ей сказали, что все дети в классе имеют уникальные фамилии. Она заходит в класс и говорит (широковещательно): "Я Марь Иванна, начинаю опрос номер XXXX, сейчас будем знакомиться, запомните номер опроса, и прошу в течение 10 секунд после того как я скажу "СТАРТ!" каждого в классе 1 раз громко сказать свою фамилию в случайное время внутри этого 10-секундного интервала. СТАРТ!". После чего ученики называют свои фамилии. Естественно - часть фамилий совпадёт по времени и будут неразличимы (ну или FIFO у Марь Иванны переполнится ;)  Но одну фамилию она может различить. После чего записывает её в журнал "Петров" и говорит: "Я Марь Иванна, продолжаю опрос номер XXXX, Петров - больше не участвуй в текущем опросе, до его завершения. А для остальных - повторим опять 10 секунд, СТАРТ!". Ну и так далее. Пока Марь Иванна не услышит тишины в очередном 10 секундном интервале. Это значит все дети, которые были в классе на момент начала опроса переписаны в журнал (за исключением тех, которые вышли из класса в процессе проведения). Дети, вошедшие в класс в процессе опроса не знают Марь Иванну и номера опроса, поэтому будут молчать и не мешать текущему опросу. Но когда Марь Иванна закончит опрос XXXX, она, если обнаружит что в классе есть неучтённые дети, начнёт следующий опрос с номером YYYY и обнаружит их. Дети заснувшие во время опроса XXXX (с ними пропала связь) и проснувшиеся во время опроса YYYY, будут молчать и не мешать опросу, потому что они помнят номер XXXX, а сейчас идёт YYYY. Но они смогут участвовать и могут быть обнаружены Марь Иванной в следующем опросе номер ZZZZ.

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

 

Это универсальный, хоть и не самый быстрый способ. Он не зависит от особенностей канала, его можно применять и на RS-485 и на радиоканале и на др. Можно использовать другой, более быстрый способ, основанный на том факте, что линии данных RS-485 можно использовать как МОНТАЖНОЕ ИЛИ. Подобно тому как сделано в CAN для разрешения коллизий. Так должно работать намного быстрее, особенно при большом количестве устройств на шине. Тогда при длине уникального номера == 96 бит, я думаю можно сделать реализацию, тратящую на энумерацию одного устройства около 1 мсек (вне зависимости от общего количества устройств на шине).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо

Пока, в силу специфики всего комплекса устройств, найден способ заставить замолчать все устройства кроме одного, который получит уникальный ID для протокола первым, потом второй и т.д. Для данного случая это лучший метод, потому что, как оказалось, нужно знать ещё и порядок расположения в пространстве :cray2:

Если порядок неважен, то да - тайм-слоты на основании этих самых 96-бит (или той самой, действительно уникальной, части конкретных устройств)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...