реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Опросить слейвы по CAN.
Jenya7
сообщение Feb 7 2018, 06:20
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 709
Регистрация: 29-03-12
Пользователь №: 71 075



Есть мастер и три слейва. У каждого слейва три параметра. Мне нужно за один опрос взять все три параметра с каждого слейва.
То есть для принятия решения мне нужно все 9 параметров. Потом я делаю свои дела и потом делаю новый опрос слейвов.
Вопрос как знать что все слейвы ответили именно на этот опрос? Есть какое то красивое решение или как всегда обычно?

Сообщение отредактировал Jenya7 - Feb 7 2018, 06:25
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 7 2018, 07:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 664
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Feb 7 2018, 09:20) *
Вопрос как знать что все слейвы ответили именно на этот опрос?

Добавить в пакеты поле "идентификатор запроса".
Go to the top of the page
 
+Quote Post
mrKirill
сообщение Feb 7 2018, 07:06
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 281
Регистрация: 13-06-07
Из: Челябинск
Пользователь №: 28 391



Что изменится, если все условные Slave будут постоянно вещать в шину, а условный Master когда ему угодно будет принимать посылки? Точно нужна система запрос-ответ?

В одном из оборудований Bosch встречался вариант, когда в посылке из 8 байт последний отводился под номер посылки, от 0 до 255 и далее по кругу.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 7 2018, 07:18
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 709
Регистрация: 29-03-12
Пользователь №: 71 075



Допустим при посылке вместе с данными я буду посылать номер опроса.
А при приеме если пришел тот же номер опроса выставлять флаг на каждый параметер.
Код
uint32_t CAN_GetMessage(void)
{
    uint32_t mot_idx;
    uint32_t opcode;
    uint32_t message_num;
    
    uint8_t position;
  
    CAN_Receive(CAN1, can_params.fifo_num,  &RxMessage);
    
    mot_idx = (RxMessage.StdId >> 8);
    
    opcode = (RxMessage.StdId - (mot_idx * 0x100));
          
    switch (opcode)
    {      
        case CAN_COM_IGET:
            motor_data[mot_idx].current = (RxMessage.Data[3]<<24) | (RxMessage.Data[2]<<16) |
                                          (RxMessage.Data[1]<<8)  | RxMessage.Data[0];
            position = CAN_IGET_POS;
        break;
        
        case CAN_COM_PGET:
            motor_data[mot_idx].position = (int32_t)((RxMessage.Data[3]<<24) | (RxMessage.Data[2]<<16) |
                                           (RxMessage.Data[1]<<8)  | RxMessage.Data[0]);
            position = CAN_PGET_POS;
        break;
        
        case CAN_COM_SGET:
            motor_data[mot_idx].speed = (RxMessage.Data[3]<<24) | (RxMessage.Data[2]<<16) |
                                        (RxMessage.Data[1]<<8)  | RxMessage.Data[0];
            position = CAN_SGET_POS;
        break;
    }
    
    message_num = (RxMessage.Data[7]<<8) | RxMessage.Data[6];
    if (can_message_num == message_num)
    {
         motor_data[mot_idx].can_rx_flags |= (1<<position);
    }
  
     return CAN_OK;
}

и потом проверять
Код
uint32_t MOT_DataReady(void)
{
    int i;
    uint32_t resp = 0;
    
    //check if all motors replied
    for (i = 0; i < MAX_MOTORS; i++)
    {
        if (motor_data[i].ena)
        {
            if ((motor_data[i].can_rx_flags & 0x0F) == 0x0F)
                resp++;
        }      
    }
    
    //all motors responded with all data
    if (resp == g_motors_num)
    {
        //clear all flags - get ready for the next data request
        for (i = 0; i < MAX_MOTORS; i++)
        {
            if (motor_data[i].ena)
                motor_data[i].can_rx_flags = 0;  
        }
        //next data request number
        can_message_num++;
        return 1;
    }
    else
        return 0;
}

Возникает вопрос как ожидать получения всех данных? в while?
Код
while (!MOT_DataReady());

А если какой то слейв умер?

Сообщение отредактировал Jenya7 - Feb 7 2018, 07:20
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 7 2018, 07:34
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 267
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Тогда сработает таймаут и большими красными буквами будет написано

ВАШЕ УСТРОЙСТВО ... СДОХЛО И НЕ ОТВЕЧАЕТ !!!
ИЩИТЕ ПАЯЛЬНИК !!!
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 7 2018, 07:40
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 709
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(x893 @ Feb 7 2018, 12:34) *
Тогда сработает таймаут и большими красными буквами будет написано

ВАШЕ УСТРОЙСТВО ... СДОХЛО И НЕ ОТВЕЧАЕТ !!!
ИЩИТЕ ПАЯЛЬНИК !!!

а когда начать новый опрос? тут есть проблема принятия решения.

Сообщение отредактировал Jenya7 - Feb 7 2018, 07:43
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 7 2018, 08:30
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 664
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Feb 7 2018, 10:40) *
а когда начать новый опрос? тут есть проблема принятия решения.

У вас реалтайм-система или как?
Я делаю так как писали выше. Контроллеры сами с нужной частотой шлют данные.
Мастер пакеты получает и перезапускает таймеры для каждого слейва.
В любой момент мастер имеет информацию о "свежести" данных и может либо их использовать,
либо сигнализировать о потере связи со слейвом.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 7 2018, 08:47
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 709
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Feb 7 2018, 13:30) *
У вас реалтайм-система или как?
Я делаю так как писали выше. Контроллеры сами с нужной частотой шлют данные.
Мастер пакеты получает и перезапускает таймеры для каждого слейва.
В любой момент мастер имеет информацию о "свежести" данных и может либо их использовать,
либо сигнализировать о потере связи со слейвом.

у меня слейвы не шлют данные сами по себе. они отвечают на запрос от мастера. а зачем нужны таймеры для каждого слейва?
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 7 2018, 09:15
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 664
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Feb 7 2018, 11:47) *
у меня слейвы не шлют данные сами по себе. они отвечают на запрос от мастера.

Просто нужно понимать, что слейвы могут слать данные и без запроса.
Например, мастер может сказать слейву: шли такие-то данные с такой-то периодичностью столько-то раз.

Цитата(Jenya7 @ Feb 7 2018, 11:47) *
а зачем нужны таймеры для каждого слейва?

У меня каждое устройство (узел) раз в секунду шлет SYNC-пакет с идентификационной информацией.
Мастер (я его/их называю Сервером) получает все SYNC-пакеты, пересбрасывает таймеры в таблице узлов,
при необходимости добавляет новые узлы в таблицу узлов, генерит сообщения "пропала/восстановлена" связь с узлом.
Если таймер в таблице узлов досчитал до 10 секунд, то это означает, что узел не пресылает SYNC-пакеты уже 10 секунд, а значит его нет.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 7 2018, 09:33
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 709
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(adnega @ Feb 7 2018, 14:15) *
Просто нужно понимать, что слейвы могут слать данные и без запроса.
Например, мастер может сказать слейву: шли такие-то данные с такой-то периодичностью столько-то раз.


У меня каждое устройство (узел) раз в секунду шлет SYNC-пакет с идентификационной информацией.
Мастер (я его/их называю Сервером) получает все SYNC-пакеты, пересбрасывает таймеры в таблице узлов,
при необходимости добавляет новые узлы в таблицу узлов, генерит сообщения "пропала/восстановлена" связь с узлом.
Если таймер в таблице узлов досчитал до 10 секунд, то это означает, что узел не пресылает SYNC-пакеты уже 10 секунд, а значит его нет.

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

Сообщение отредактировал Jenya7 - Feb 7 2018, 09:36
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 7 2018, 09:58
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 401
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Feb 7 2018, 11:33) *
нет. мне не нужно чтоб слейвы заваливали мастера данными когда не нужно. все четко - мастер послал запрос - получил ответ - принял решение на основе пришедших данных - послал следующий запрос.
Тогда зачем тут CAN? Потому что "стильно, модно, молодежно"? RS485 справился бы не хуже и дешевле. Изюминка CAN в том, что посылать могут все, при этом все смогут передать и конфликты будут разрешены на низком уровне в контроллере. Заложить в систему CAN и использовать его как RS485 по меньшей мере странно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 7 2018, 10:30
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 709
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Feb 7 2018, 14:58) *
Тогда зачем тут CAN? Потому что "стильно, модно, молодежно"? RS485 справился бы не хуже и дешевле. Изюминка CAN в том, что посылать могут все, при этом все смогут передать и конфликты будут разрешены на низком уровне в контроллере. Заложить в систему CAN и использовать его как RS485 по меньшей мере странно.

но мне реально не нужно чтоб слейвы заплевывали меня данными когда их не просят. только потому что КАН позволяет это - давайте шлите - нам не жалко? и как в таком случае отследить что я получил полный набор данных от всех слейвов?
к тому же можно поставить фильтры и слейвы получат только свои сообщения, в RS485 нужно парсить самому.

да. помню был проект. 5 узлов. все слали всем, все прекрасно работало. но там каждая посылка содержала все в себе. это был отдельный обект. а мне нужно получить все посылки от всех обыектов и чтоб посылки были синхронизированные.

Сообщение отредактировал Jenya7 - Feb 7 2018, 10:47
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Feb 7 2018, 11:15
Сообщение #13


Ally
******

Группа: Модераторы
Сообщений: 6 101
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Jenya7 @ Feb 7 2018, 08:20) *
Есть какое то красивое решение

Красиво будет взять STM32H7 с TT-CAN.
Go to the top of the page
 
+Quote Post
Baser
сообщение Feb 7 2018, 13:46
Сообщение #14


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Так и не понял, в чем у ТС проблема?

Если хочется, чтобы было так, как сделано: CAN по опросу, то ваш мастер же знает, когда и кому он послал запрос.
Прошел установленный таймаут ответа, если есть желание, можно сделать еще одну-две попытки перезапроса,
если ответа нет - все, ошибка. Мигать красным фонарем и дудеть в пищалку.
При приходе времени очередного цикла опроса всех датчиков - попытаться опросить снова. Если все ответили - отбой тревоги, если нет, продолжаем мигать красным свистком. И далее по циклу.

Если сделать, как принято в CAN, когда датчики сами регулярно публикуют свои данные, то adnega тоже уже все подробно расписал: мастер все принимает, у него есть вся инфа, кто передал, когда.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Feb 10 2018, 23:09
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 101
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(adnega @ Feb 7 2018, 12:30) *
У вас реалтайм-система или как?
Я делаю так как писали выше. Контроллеры сами с нужной частотой шлют данные.
. . .

Я только начал работать с CAN.
Вопрос из тойже оперы. У меня реалтайм система (управление 3 сервоприводами, скорость CAN 250kbit ).
Изначально так и заложено, каждый серво "отстреливает" 4 раза в секунду текущую координату положения.

Так или иначе, слейвы работают асинхронно по отношению друг к другу.
То что на шине не будет коллизий указано в стандарте на CAN.
т.е. все слейвы передадут свою инф., - рано или поздно.

? 1. Для такой схемы передачи инфорамции нужно самому планировать структуру трафика по CAN ?
(при большом кол-ве слейвов )

? 2. Обязательно ли в заголовках пакетов использовать биты приоритета ?

Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2018 - 07:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01068 секунд с 7
ELECTRONIX ©2004-2016