Jump to content

    

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

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

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

Share this post


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

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

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

Share this post


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

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

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

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

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

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

Share this post


Link to post
Share on other sites
3 minutes ago, HardEgor said:

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

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

2 minutes ago, jcxz said:

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

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

Share this post


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

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

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

Share this post


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

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

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

Share this post


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

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

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

1 minute ago, HardEgor said:

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

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

Edited by jenya7

Share this post


Link to post
Share on other sites
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: Это примерный вариант реализации процесса обнаружения методом последовательной изоляции. Могут быть вариации в зависимости от конкретной системы и от интерфейса.

Share this post


Link to post
Share on other sites

 

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

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

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

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

Share this post


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

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

 

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

Edited by jenya7

Share this post


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

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

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

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

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

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

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

Share this post


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

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

 

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now