toweroff 0 27 декабря, 2018 Опубликовано 27 декабря, 2018 · Жалоба Добрый день Есть устройства на полудуплексной шине (rs485). В каждом устройстве есть eeprom для хранения данных, так же в контроллере каждого устройства есть 96 бит uniq ID Места на плате мало, ног у контроллера тоже, поэтому dip-switch отпадает Задача - определить все устройства, присутствующие на шине и в дальнейшем иметь возможность адресовать каждое Есть ли готовые реализации протоколов с подобным механизмом? Или, если это возможно, как свернуть эти 96 бит ID во что-то максимум двухбайтовое, чтобы мастер мог за вменяемое время опросить все устройства и создать себе список подключенных? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 27 декабря, 2018 Опубликовано 27 декабря, 2018 (изменено) · Жалоба Посмотрите на тему распознавания идентификаторов на 1-wire. Либо могу предложить решение, которое я использовал применительно к радиоканалу - идет запрос, после которого ожидается ответ в некотором количестве (у меня 256) таймслотов, устройства отвечают своим идентификатором в случайном (с затравкой от своего серийника) таймслоте. Абоненты согласно списка опрашиваются и переводятся в неактивное состояние, после чего опрос повторяется и отвечают лишь "необработанные" устройства и так далее. Прекратили отвечать - поиск завершен. Изменено 27 декабря, 2018 пользователем rx3apf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 27 декабря, 2018 Опубликовано 27 декабря, 2018 · Жалоба 7 minutes ago, toweroff said: Или, если это возможно, как свернуть эти 96 бит ID во что-то максимум двухбайтовое, чтобы мастер мог за вменяемое время опросить все устройства и создать себе список подключенных? Полностью исключить совпадение невозможно - 96 бит нельзя упаковать в 16 без последствий. Но можно выбрать те биты, вероятность совпадения которых минимальна. Т. е. сократить вероятность коллизий до минимум. Для этого следует выяснить принцип формирования этих 96 бит: какие битовые поля из всего ID как назначаются при производстве некого устройства. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 27 декабря, 2018 Опубликовано 27 декабря, 2018 · Жалоба 1 час назад, toweroff сказал: Или, если это возможно, как свернуть эти 96 бит ID во что-то максимум двухбайтовое, чтобы мастер мог за вменяемое время опросить все устройства и создать себе список подключенных? А в той же EEPROM хранить уникальный ID, заданный еще при изготовлении устройства, нельзя? И при запуске девайса этот ID копируется в ОЗУ как текущий рабочий адрес, участвующий в обменах. Потому как 96 бит в 16, даже с использованием хитрого хеширования, может привести к коллизиям и повторам результирующего 16-битного адреса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 65 27 декабря, 2018 Опубликовано 27 декабря, 2018 · Жалоба 1 час назад, toweroff сказал: Или, если это возможно, как свернуть эти 96 бит ID во что-то максимум двухбайтовое, чтобы мастер мог за вменяемое время опросить все устройства и создать себе список подключенных? При инициализации сети или подключения нового устройства, мастер считывает 96-бит адрес и назначает 8 бит-адрес, в дальнейшем им и пользоваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 декабря, 2018 Опубликовано 28 декабря, 2018 · Жалоба 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 мсек (вне зависимости от общего количества устройств на шине). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 28 декабря, 2018 Опубликовано 28 декабря, 2018 · Жалоба Всем спасибо Пока, в силу специфики всего комплекса устройств, найден способ заставить замолчать все устройства кроме одного, который получит уникальный ID для протокола первым, потом второй и т.д. Для данного случая это лучший метод, потому что, как оказалось, нужно знать ещё и порядок расположения в пространстве Если порядок неважен, то да - тайм-слоты на основании этих самых 96-бит (или той самой, действительно уникальной, части конкретных устройств) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться