Jump to content

    
bezobraznic

Перекличка блоков по CAN

Recommended Posts

14 minutes ago, jcxz said:

А зачем? Если уже есть CAN.

Тоже думаю, что проще подключить внешний мониторинг через один из блоков. Его же и назначить "мастером". И пускай он периодически шлет себе запросы с идентификаторами от IDmin до IDmax, а все остальные слушают линию и отмечают существующие идентификаторы в своей внутренней таблице. Хотя, с другой стороны, коль в сети будет мастер, зачем остальным знать идентификаторы присутствующих устройств? Как в том же примере про бортовую CAN-шину автомобиля: там есть один мастер (ЭБУ) и куча слейвов (причем количество слейвов варьируется в зависимости от "фарша"). Не нашел мастер модуль ESP — ОК, значит, машина будет без ESP ездить, не нашел контроль стеклоподъемников — ОК, пользователь ручками окна открывать/закрывать будет…

Edited by Eddy_Em

Share this post


Link to post
Share on other sites
3 часа назад, AKK сказал:

каждый блок, регистрируюсь в сети при включении посылает "address claim" со своим адресом и NAME (не знаю как поточнее перевести, но в этом NAME целый пласт инфы от производителя до кода с кратким описанием функционала), если адрес свободен, то занимает его если адрес занят, то там целая процедура разруливания кто и с какого адреса работать будет. Но смысл в том, что если адрес занят, то блок занявший этот адрес отвечает на сообщение что адрес занят. А если послать запрос "addresss claim" на широковещательный адрес (0x255), то ответят ВСЕ блоки с указанием адресов по которым они общаются. После чего зная занятые адреса можно запросить у каждого из блоков его HARD ID, SOFT ID и т.д. Там еще много тонкостей взаимодействия расписано, прочитайте документ, не пожалеете. Тем более в нем всего 40 страниц текста.

А теперь объясните - каким образом такое организовать поверх CAN? Вы знаете как он (CAN) работает?  :wink:

Вопрос был не о том какие есть красивые и мегастандартные протоколы, а о методе реализации поверх CAN.

Цитата

Данная сеть используется в грузовых автомобилях. Кто там важнее: контроллер двигателя, контроллер трансмиссии или контроллер АБС? Зачастую координатора просто нет, что позволяет гибко нафаршировывать автомобиль примочками: нет АБС, да х... на него всем остальным блокам, нашелся в сети контроллер круиз-контроля, добро пожаловать в общую сеть, дружище. А кто там вякает про то, что он координатор, ну попробуй, может что и получится... :-).

Что за "сеть"? Речь идёт о CAN или о какой-то другой сети?

Если о CAN, то у ТС имхо не тот случай. Так как у него все узлы - одинаковые, с одинаковым ПО, различающиеся только уникальным ID (кстати - ТС так и не сказал какой разрядности у него ID?). И если этот ID имеет большую разрядность (>=29 бит), то таким образом, как Вы привели пример, по CAN обмен организовать не удастся. Без предварительного назначения более коротких адресов по какому-то алгоритму.

Чтобы было более понятно, подумайте что будет с "этими нафаршированными примочками" в вашем грузовом автомобиле, если в эту сеть добавить ещё один идентичный "контроллер двигателя"?... А если ещё 5 добавить? :biggrin:

 

PS: Вопрос к ТС - какова разрядность уникальных ID (серийных номеров) узлов у вас? А то может всё гораздо проще решается (если разрядность малая)...

Share this post


Link to post
Share on other sites

Да даже для 29-битных адресов можно придумать процедуру автоматической идентификации навроде аналогичной процедуры у Dallas в их мерзком 1-wire: мастер поочередно по одному биту перебирает и регистрирует ответы. Но и здесь без мастера не обойтись.

А вот меня все терзает любопытство: что ж за одноранговая сеть  такая, где все устройства абсолютно одинаковые? Чем она должна заниматься, если нет мастера, через который выполняется внешнее управление и мониторинг?

Share this post


Link to post
Share on other sites
4 hours ago, jcxz said:

PS: Вопрос к ТС - какова разрядность уникальных ID (серийных номеров) узлов у вас? А то может всё гораздо проще решается (если разрядность малая)...

Разрядность 11 бит.

Share this post


Link to post
Share on other sites
27 минут назад, bezobraznic сказал:

Разрядность 11 бит.

С этого надо было начинать!

Тогда вообще никакой проблемы нет, всё элементарно: Выделить одно фиксированное значение адреса (18-битное) и пусть каждый узел периодически отправляет на адрес состоящий из этих 18 старших бит + 11 бит собственного уникального ID (в младших 11-ти битах), какое-то сообщение "я здесь, такой-то". А все узлы подпишутся на приём этого адреса с маскированными младшими 11-ю битами.

Share this post


Link to post
Share on other sites
22 minutes ago, jcxz said:

С этого надо было начинать!

Тогда вообще никакой проблемы нет, всё элементарно: Выделить одно фиксированное значение адреса (18-битное) и пусть каждый узел периодически отправляет на адрес состоящий из этих 18 старших бит + 11 бит собственного уникального ID (в младших 11-ти битах), какое-то сообщение "я здесь, такой-то". А все узлы подпишутся на приём этого адреса с маскированными младшими 11-ю битами.

А во времени их надо разделять?

Share this post


Link to post
Share on other sites

Посылки от блоков.

Я может глупые вопросы задаю, но это мое первое применение CANа.

За идею спасибо чую, это то, что надо!

Edited by bezobraznic

Share this post


Link to post
Share on other sites

У меня аналогичная одноранговая CAN сеть, и так же проблема с раздачей коротких адресов. Сейчас все держится на том, что ответы узлов с длинным первичным уникальным ID посылаются с недетерминированной задержкой, и перепосылаются в случае неудачи. Но я пока делал тесты только на игрушечной сети из трех устройств.

Share this post


Link to post
Share on other sites
20 часов назад, bezobraznic сказал:

Посылки от блоков.

Задайте вопрос более вразумительно и развёрнуто.

16 часов назад, amaora сказал:

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

Имхо - не лучшее решение, так как будет приводить к коллизиям в поле данных и ошибкам на шине. Довольно частым при достаточно большом количестве узлов на шине и достаточно плотном обмене (кроме этих передач).

Share this post


Link to post
Share on other sites
13 минут назад, jcxz сказал:

Задайте вопрос более вразумительно и развёрнуто.

Вы написали выделить 18 +11битный ID  для посылок от блоков. Эти посылки надо во времени разделять?

Share this post


Link to post
Share on other sites
45 минут назад, bezobraznic сказал:

Эти посылки надо во времени разделять?

В смысле "разделять"? Какие "эти" и от кого их "разделять"???  :wacko2:

Вот у вас 1-й CAN-узел, у него уникальный_ID=XXX. И 2-й, у которого уникальный_ID=YYY. XXX и YYY - 11-битные.

И есть некая константа в ПО - KKK (18-битная), которая задаёт старшие 18 бит адреса для всех сообщений данного протокола.

Так вот - 1-й узел должен периодически посылать CAN-кадр с ID = KKK << 11 | XXX. А 2-й узел - с ID = KKK << 11 | YYY. Период отправки - любой удобный. Данные кадра - любые (например - какая-нить дополнительная инфа об узле)

И все узлы, которые желают принимать такие кадры, должны подписаться на приём сообщений с ID = KKK << 11 | MMM, где: MMM - маска, маскирующая ненужные биты адреса для фильтра входящих CAN-кадров.

 

PS: Вроде же совершенно примитивный способ. Неужто неясно? :unknw:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.