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

Обнаружение слейвов в сети.

Вопрос общий по всем интерфейсам - CAN, RS485, LAN. Раньше я знал сколько слейвов сидит на линии и их ID. Поэтому опрос не представлял проблем. Теперь мой мастер подключается к линии и я не знаю сколько слейвов сидит на линии.

До каких пор вести опрос, как знать что все слейвы выявлены?

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


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

20 минут назад, jenya7 сказал:

До каких пор вести опрос, как знать что все слейвы выявлены?

Пока не окончатся таймауты ответа. Выявить просто  - посчитать подключенные устройства, сравнить с кол-вом ответивших.

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


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

21 минуту назад, jenya7 сказал:

До каких пор вести опрос, как знать что все слейвы выявлены?

А как Вы опрашиваете слэйвы, ID которых не известно? В этом и кроется ответ.

2 минуты назад, HardEgor сказал:

Пока не окончатся таймауты ответа.

На таймаутах свет клином не сошёлся.

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


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

3 minutes ago, HardEgor said:

Пока не окончатся таймауты ответа. Выявить просто  - посчитать подключенные устройства, сравнить с кол-вом ответивших.

если бы я знал количество подключенных устройств вопрос бы не возник. :)

2 minutes ago, jcxz said:

А как Вы опрашиваете слэйвы, ID которых не известно? В этом и кроется ответ.

Я всегда знал конечное число слейвов.

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


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

1 минуту назад, jenya7 сказал:

если бы я знал количество подключенных устройств вопрос бы не возник. :)

Для выявления (и перечисления) неизвестных устройств в канале связи, придумано множество протоколов последовательной изоляции.

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


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

1 минуту назад, jenya7 сказал:

если бы я знал количество подключенных устройств вопрос бы не возник. :)

Ну значит слейвы должен уметь отвечать на бродкаст - "есть кто живой?"

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


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

2 minutes ago, jcxz said:

Для выявления (и перечисления) неизвестных устройств в канале связи, придумано множество протоколов последовательной изоляции.

огласите весь список пожалуйста.

1 minute ago, HardEgor said:

Ну значит слейвы должен уметь отвечать на бродкаст - "есть кто живой?"

они то умееют. вопрос когда я знаю что все ответили.

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

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


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

38 минут назад, jenya7 сказал:

огласите весь список пожалуйста.

Они все строятся по примерно одному алгоритму:

1. Мастер посылает широковещательный кадр "Начало цикла обнаружения-изоляции" с номером цикла == K. (номер должен быть уникальным длинным, случайно генерируемым мастером)

2. Все слэйвы, получившие кадр и у которых сброшен флаг "Я перечислен", запоминают номер цикла (K). (Изначально, после старта ПО у каждого слэйва сброшен флаг "Я перечислен" (в ОЗУ), и номер цикла тоже сброшен).

Реализация дальнейших шагов зависит от интерфейса. Например для CAN:

3. Все слэйвы, вошедшие в текущий цикл обнаружения-изоляции, записывают в мэйлбокс с признаком RTR (CAN) кадр с информацией о себе. Свой уникальный ID узла они записывают в старшие биты CAN-ID; младшие биты CAN-ID этого мэйлбокса равны некоему const значению Z; в поле данных - контрольную инфу (CRC и т.п.).

4. Мастер запрашивает мэйлбоксы с CAN-ID в младших битах которого ==Z, а на старшие он ставит маску (чтобы получить кадр от любого слэйва, заполнившего мэйлбокс). Если есть хотя-бы один слэйв-узел участвующий в цикле обнаружения-изоляции, то он получит кадр от одного из них (имеющего наименьший уникальный ID). Если нет ни одного (все обнаружены и перечислены), то мастер тоже узнает об этом.

5. Из полученного кадра обнаружения, мастер выясняет уникальный ID слэйв-узла, запоминает его у себя и посылает этому узлу адресное сообщение "Ты перечислен". Слэйв, получив этот кадр, устанавливает у себя флаг "Я перечислен" и более не участвует в следующих циклах обнаружения-изоляции. Т.е. - выполняется изоляция этого слэйв-узла от процесса обнаружения-перечисления.

6. Цикл обнаружения-изоляции с номером K завершён. Мастер может запускать следующий цикл с новым номером.

Если узлы могут пропадать из обмена (отключаться), то где-то внутри этого цикла (например - между 1-м и 2-м пунктами), мастер должен опросить те узлы, которые он обнаружил ранее (которые есть в его таблице слэйвов). Чтобы выяснить кто из них ещё жив. И удалить мёртвые (не ответившие) узлы из своей таблицы. Опрос может быть простым по их известным адресам из таблицы. Узлы только включившиеся, и имеющие сброшенный флаг "Я перечислен", не отвечают на такие кадры опроса. И вообще  - пока у слэйв-узла сброшен флаг "Я перечислен" он не отвечает на адресные кадры от мастера (кроме кадра "Ты перечислен").

 

Циклы обнаружения-изоляции должны периодически (с некоторым желаемым периодом) вставляться в штатный обмен на канале. При старте ПО мастера, его таблица слэйвов изначально пуста.

 

PS: Это примерный вариант реализации процесса обнаружения методом последовательной изоляции. Могут быть вариации в зависимости от конкретной системы и от интерфейса.

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


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

 

35 minutes ago, jenya7 said:
35 minutes ago, jenya7 said:

Ну значит слейвы должен уметь отвечать на бродкаст - "есть кто живой?"

они то умееют. вопрос когда я знаю что все ответили.

ну значит слэйвы должны уметь отвечать на броадкаст "есть кто живой с  ID >= id0 && ID <= id1"

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


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

12 minutes ago, jcxz said:

Они все строятся по примерно одному алгоритму:

 

ааа...ну можно сделать еще проще - слейвы вернут бит своей позиции и тогда я буду знать сколько слейвов на линии. а по ID слейв вычислит вес бита.

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

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


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

4 минуты назад, _pv сказал:

ну значит слэйвы должны уметь отвечать на броадкаст "есть кто живой с  ID >= id0 && ID <= id1"

Для RS-485 на запрос "есть кто живой" живой и не перечисленный-изолированный ранее слэйв, может ответить просто одним байтом например == 0xFF. Если хоть один или множество неизолированных слэйвов ответят одновременно, то все эти ответы наложатся один на другой и мастер получит ЧТО-ТО. Если нет ни одного - получит тишину. Может конечно наложиться помеха, но это не страшно.

Если мастер получил индикацию что кто-то ответил, значит в канале есть как минимум один не перечисленный-изолированный узел. Значит он должен запустить очередной цикл обнаружения-изоляции. Тогда получается таймаут здесь не нужен (ну т.е. - он очень маленький) и это нисколько не затормозит остальной обмен в канале.

5 минут назад, jenya7 сказал:

ааа...ну можно сделать еще проще - слейвы вернут бит своей позиции и тогда я буду знать сколько слейвов на линии.

Не знаю что такое "бит своей позиции".

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


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

19 minutes ago, jcxz said:

Они все строятся по примерно одному алгоритму:

 

спасибо. идея понятна. надо только будет сделать модифицированную версию под каждый протокол.

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


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

3 минуты назад, jenya7 сказал:

спасибо. идея понятна. надо только будет сделать модифицированную версию под каждый протокол.

Да, для этого протокола ещё необходимо чтобы каждый слэйв-узел имел уникальный ID. Например - уникальный серийный номер, зашитый при производстве. Тогда весь алгоритм сводится к поиску этих уникальных ID, присутствующих в данный момент в канале. И назначения им коротких адресов (перечисление).

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


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

В бродкаст-запрос добавить данные-маску адреса, которые должны откликаться. Если FFFF - все, если 4000 только соотв-ие этой маске.

По этому принципу можно отловить кто-есть-ху за ограниченное кол-во бродкаст-запросов, по принципу бинарного поиска.

Нечто похожее в "адресации" CAN. 

ps Наличие коллизии при таком методе - это не ошибка а информация, что надо "в этом месте" копнуть "глубже" :buba:

 

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


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

В DALI есть широковещательная  команда присвоить всем слэйвам случайный номер , а потом их поиск и расстановка правильных адресов

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


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

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

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

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

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

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

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

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

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

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