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

30 одинаковых устройств на CAN шине. Как сделать автоматическую идентификацию.

Привет. Сразу вторая тема.

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

Как это разрешить без программирования каждого устройства вручную?

 

Пока я вижу только один выход - это забить в программаторе цикл, чтобы он в каждой следующей прошивке увеличивал какие-то байты, которые отвечали бы за идентификатор. Таким образом получится 2^10 вариантов ПО и вероятность того что 2 устройства с одинаковым идентификатором попадут в одну шину - низкая. Если перейти на 2.0B то вероятность будет еще меньше. Недостаток в том, что при запуске системы или замене такого устройства придется обучать контроллеры на шине, чтобы они понимали чему соответствует новый идентификатор или перепрошивали его. Но хорошо то что это можно сделать по CANу, потому что простым перебором идентификаторов обнаружить присутствие устройства и определить его идентификатор возможно.

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


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

Привет. Сразу вторая тема.

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

Как это разрешить без программирования каждого устройства вручную?

Существует несколько банальных способов:

- ДИП-переключатель

- EEPROM, которая записывается по одному общему идентификатору (устройства подключаются по одному)

- уникальный физический адрес, который можно прочитать (но не идентификатор!). Количество используемых идентификаторов не должно быть 2 в степени 19, их может быть всего 30+ (1..2).

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


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

Как вариант (уже рабочий):

В каждое устройство на этапе производства зашивается тип и порядковый номер.

Эти данные выступают в качестве идентификатора при включении (начальный ID).

Рабочие идентификаторы не должны пересекаться с начальными.

Должна быть широковещательная команда в поле начальных ID "ответить всем" - получаем список подключенного оборудования.

Затем центральный контроллер раздает рабочие (динамические) идентификаторы каждому устройству, далее обращение идут по динамическим адресам, причем возможно сохранение работы по статическим адресам (начальный ID).

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


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

Как вариант (уже рабочий):

В каждое устройство на этапе производства зашивается тип и порядковый номер.

Эти данные выступают в качестве идентификатора при включении (начальный ID).

Ну так это я и думал сделать.

Затем центральный контроллер раздает рабочие (динамические) идентификаторы каждому устройству, далее обращение идут по динамическим адресам, причем возможно сохранение работы по статическим адресам (начальный ID).

Вот тут то и проблема - откуда контроллер знает, что такому-то начальному ID соответствует такое-то устройство - т.е. придется на этапе запуска проводить операцию обучения контроллера.

 

- уникальный физический адрес, который можно прочитать (но не идентификатор!). Количество используемых идентификаторов не должно быть 2 в степени 19, их может быть всего 30+ (1..2).

Да, только если вдруг попадется в одной сети хотя бы 2 устройства с одинаковыми идентификаторами - как к ним обратиться, если они реагируют на один и тот-же идентификатор? Будет коллизия.

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


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

Вот тут то и проблема - откуда контроллер знает, что такому-то начальному ID соответствует такое-то устройство - т.е. придется на этапе запуска проводить операцию обучения контроллера.

Динамический адрес можно записать во flash, при монтировании или замене подключаем пульт и программим все что надо...

 

Да, только если вдруг попадется в одной сети хотя бы 2 устройства с одинаковыми идентификаторами - как к ним обратиться, если они реагируют на один и тот-же идентификатор? Будет коллизия.

Надо определиться с количеством серии, а не пытаться объять необъятное. Сразу закладывайте длинный идентификатор.

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


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

Да, только если вдруг попадется в одной сети хотя бы 2 устройства с одинаковыми идентификаторами - как к ним обратиться, если они реагируют на один и тот-же идентификатор? Будет коллизия.

Коллизия - это несколько иное, в этом случае не будет коллизии.

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


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

Коллизия - это несколько иное, в этом случае не будет коллизии.
Может и быть. Если я правильно помню, Кановский арбитраж работает только во время передачи идентификатора. Если два узла умудрятся выдать одинаковый ID одновременно, то данные они будут выдавать, и данные могут быть разными. Дальше они должны поймать ошибку на шине и выдать Error frame.

Вроде так (поправьте если нет).

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


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

Может и быть. Если я правильно помню, Кановский арбитраж работает только во время передачи идентификатора. Если два узла умудрятся выдать одинаковый ID одновременно, то данные они будут выдавать, и данные могут быть разными. Дальше они должны поймать ошибку на шине и выдать Error frame.

Вроде так (поправьте если нет).

 

Автор писал несколько иное:

" 2 устройства с одинаковыми идентификаторами - как к ним обратиться "

 

У узла нет идентификаторов, так как идентификатор - это свойство сообщения. Два узла синхронно примут одно и то же сообщение.

 

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

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


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

Автор писал несколько иное:
Да, я немного перескочил. Лучше, говоря про устройство, говорить - серийный номер (или адрес). А для телеграммы - CAN-ID или как-то еще, чтоб не было путаницы.

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


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

Ладно, все понятно. Во флэш при запуске никто залазить не будет. Скорее всего даже EEPROMa у этих устройств не будет вообще. Я именно подразумевал передачу сообщений с одинаковыми CAN-ID из разных источников.

Серия получается ну не меньше 10000-20000, при этом до 30-ти устройств будут работать в одной сети. Поэтому наверное придется на расширенной идентификации все делать, так как при 10-ти битной для удобства маскирования(будет еще насколько других устройств) для серийного номера останется 7 а то и 6 бит , т.е верятность, что два устройства с одинаковым серийным номером попадут в одну сеть становится ощутимой. Естественно с расширенной идентификацией, я даже не думаю что мы выпустим столько устройств, чтоб начать нумерацию сначала.

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


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

Address Claim

 

http://www.kvaser.com/can/hlps/index.htm

 

Если коллизия, то случайная задержка и другой Address Claim. Рано или позно поделят адреса :)

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


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

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

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

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

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

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

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

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

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

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