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

 
 
> Ошибки при обмене по протоколу CAN 2.0B в многопроцессорной системе
Fledgling
сообщение Sep 27 2008, 19:01
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 27-09-08
Пользователь №: 40 529



Здравствуйте!
На этом форуме я новичок, поэтому прошу прощения, если разместил вопрос не в том топике.

Ситуация следующая - есть многопроцессорная система (на базе процессоров семейства ST10), обмен данными между ними ведется по протоколу CAN 2.0B.

Каждый процессор выдает через КАН информаци, необходимую для расчетов другому. Выдача настроена на частоту 100Гц (выставление данных на шину КАН производится по прерыванию от таймера).

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

Проблема в том, что наблюдается потеря кадров при выдаче по шине при работе нескольких микропроцессоров одновременно. Второй процессор ведет счетчик обновления данных от первого (к примеру) и наблюдает потери (для теста МК1 выдает инкрементирующийся каждые 100Гц счетчик циклов, второй обрабатывает его прием с частотой 800Гц - второй процессор наблюдает в итоге "разрывы" по пришедшему счетчику - приходят значения 1000, 1001, 1002, 1003, 1005, 1006 - пропущено 1004).

Если включен только один передатчик(передача вдется только с одного из МК - потерь фактически не наблюдается). Если на шину выдает два передатчика - идут потери.

Обьясните пожалуйста чайнику, вследствие чего могут возникать потери при приеме\передаче по CAN 2.0B?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Fledgling
сообщение Sep 29 2008, 16:47
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 27-09-08
Пользователь №: 40 529



UP!
Go to the top of the page
 
+Quote Post
spf
сообщение Sep 29 2008, 17:17
Сообщение #3


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Fledgling @ Sep 29 2008, 22:47) *
UP!

можно долго апать, но это дело не сдвинет с места.
Ваш вариант описания ситуации мало что говорит.
По всей видимости дело в программе или в протоколе, который вы пытаетесь огранизовать.
Каким образом распределены ID CAN-сообщений по устройствам?


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
Fledgling
сообщение Sep 29 2008, 18:19
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 27-09-08
Пользователь №: 40 529



Цитата(spf @ Sep 29 2008, 23:17) *
можно долго апать, но это дело не сдвинет с места.
Ваш вариант описания ситуации мало что говорит.
По всей видимости дело в программе или в протоколе, который вы пытаетесь огранизовать.
Каким образом распределены ID CAN-сообщений по устройствам?

Прошу прощения, апнул исключительно от безысходностиsmile.gif.

Описывать весь алгоритм слишком долго, возможно кто либо еще сталкивался с ошибками в CAN'e иил есть причины для наиболее часто встречаемых багов (в этой теме я новичок - но тема то как раз для новичковsmile.gif).

Используется расширенный формат кадров (29 бит). В ОЗУ каждого процесора содержатся одинаковые таблицы с описанием кадров (номер кадра, что заполняется в поля данных кадра и прочее).
11 бит идентификатора определяют номер строки в этой таблице (определяют уникальность идентификатора кадра), распределение по процессорам ведется по этому номеру - т.е. МК1 выдает кадры например от 0 до 50, МК2 - от 51 до 100 и тп.
Остальные биты могут быть не уникальными, но в целом ситуация, когда 2 процессора пытаются выдать кадр с одним идентификаторам невозможна (проверял, хотя учитывая, что я чайник может быть что то прозевал)

Процедуры чтения/записи написаны по алгоритму, указанному в документации на процессор (блок схема), так что логически в этом ошибки быть не должно.
Из 15 обьектов CAN контроллера CAN процессора обьект №15 используется для приема (он буферизированный), обьекты 0-7 - для передачи.

Процессоры могут стартовать асинхронно, выдачу кадров осуществляют (всех, которые предназначены к выдаче с этого МК) с частотой 100 Гц. Тесты показали, что контроллер успевает выставить все данные на шину до наступления следующего цикла.

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

С удовольствием отвечу на любые интересующие вопросы по алгоритму и специфике обмена, но к сожалению описать его весь не вижу возможности.

Сообщение отредактировал Fledgling - Sep 29 2008, 18:27
Go to the top of the page
 
+Quote Post
spf
сообщение Sep 30 2008, 17:42
Сообщение #5


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Fledgling @ Sep 30 2008, 00:19) *
Процессоры могут стартовать асинхронно, выдачу кадров осуществляют (всех, которые предназначены к выдаче с этого МК) с частотой 100 Гц. Тесты показали, что контроллер успевает выставить все данные на шину до наступления следующего цикла.

Цитата

А частота у генераторов достаточно одинаковая ?


Частота по идее абсолютно одинаковая

Частота только по идее у них одинаковая smile.gif . Плавали, знаю. Все процессоры будут плыть с разной скоростью в разные направления. Так что уповать на то, что все будут всегда попадать в нужные 100мс не стоит. На шине должен быть один синхронизатор, эталон общесистемных часов, который должен управлять временем в системе, на него должны все модули равняться.



Цитата(Fledgling @ Sep 30 2008, 23:30) *
МК3 регистрирует пропуски по счетчикам.

И снова не договариваете smile.gif
Сколько пропусков на каком количестве посылок, стабильно ли это возникает?
Как регистрирует, N1 != N2 или анализируется линейность изменения каждого счётчика по-отдельности?

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

Может оказаться что вся бяда именно в том, что все синхронно только "по идее", а на деле все плывет.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
Fledgling
сообщение Sep 30 2008, 17:50
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 27-09-08
Пользователь №: 40 529



Цитата(spf @ Sep 30 2008, 23:42) *
И снова не договариваете smile.gif
Сколько пропусков на каком количестве посылок, стабильно ли это возникает?
Как регистрирует, N1 != N2 или анализируется линейность изменения каждого счётчика по-отдельности?

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

Может оказаться что вся бяда именно в том, что все синхронно только "по идее", а на деле все плывет.


Третий процессор проверяет так:

if (cnt1 - cnt1_old > 1) {errorMK1++;}
if (cnt2 - cnt2_old > 1) {errorMK2++;}

cnt1_old = cnt1;
cnt2_old = cnt2;

cnt1 и cnt2 - счетчики, принимаемые от МК1 и МК2.
И все это проверяется в 800 Гц (для верности воткнули на макс. частоту) цикле (в 8 раз чаще чем выдается).
Если новое значение счетчика еще не пришло - errorMK не изменится.

errorMK1 и errorMK2 даже приблизительно не равны друг другу. на значение счетчика 10000 (т.е. выдалось от 0 до 10000) errorMK1 может насчитать 10, а errorMK2 - 500. И наоборот.
Тенденция - счетчики растут лавинообразно - то есть могут не изменятся достаточно долго, потом резко растут, и снова "затыкаются".

Сообщение отредактировал Fledgling - Sep 30 2008, 17:53
Go to the top of the page
 
+Quote Post
spf
сообщение Oct 1 2008, 12:34
Сообщение #7


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(Fledgling @ Sep 30 2008, 23:50) *
Третий процессор проверяет так:

if (cnt1 - cnt1_old > 1) {errorMK1++;}
if (cnt2 - cnt2_old > 1) {errorMK2++;}

cnt1_old = cnt1;
cnt2_old = cnt2;

cnt1 и cnt2 - счетчики, принимаемые от МК1 и МК2.

Хм, это странно, что счетчики изменяются нелинейно.

Надо проверять успешно ли завершается отправка из МК1 и МК2.

Но скорее всего ошибка в другом:
Цитата
И все это проверяется в 800 Гц (для верности воткнули на макс. частоту) цикле (в 8 раз чаще чем выдается).
Если новое значение счетчика еще не пришло - errorMK не изменится.

Если ваш контроллер не использует режим FIFO то следует работать по прерыванию.
Все сообщения принимается в один приемный слот?
Фильтры каким-то образом используются?

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

Нельзя полингом работать при таких скоростях, даже если вы сделаете 1600 или 3200 Гц опроса.


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 1 2008, 14:35
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(spf @ Oct 1 2008, 15:34) *
Теряться они будут когда два контроллера синхронно выдадут ответы друг за другом. Придет один пакет, придет второй, второй затрет первый, считать получиться только последний.

Кстати, это объясняет неравномерность счет ошибок. Два узла неизбежно передают с небольшой рассинхронизацией, вот они и бьются друг о друга. Правда, это не соответствует утверждениям про несколько слотов. Нужно внимательно изучить периоды опросов слотов в шлюзе.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Fledgling
сообщение Oct 2 2008, 04:08
Сообщение #9


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 27-09-08
Пользователь №: 40 529



Цитата(Dog Pawlowa @ Oct 1 2008, 20:35) *
Кстати, это объясняет неравномерность счет ошибок. Два узла неизбежно передают с небольшой рассинхронизацией, вот они и бьются друг о друга. Правда, это не соответствует утверждениям про несколько слотов. Нужно внимательно изучить периоды опросов слотов в шлюзе.

На приеме только один слот, который буферизированный (обьект №15).
Чтение из него производится по прерыванию (у обоих контроллеров есть по прерыванию в таблице векторов).

Есть мнение что когда мы производим чтение из обьекта, приходит второй кадр - а обьект №15 в это время "заблокирован".
Может ли увеличение числа обьектов-приемников помочь или не стоит даже пытаться?smile.gif
Или нужно менять весь алгоритм в целом и вводить синхронизацию?

Кстати пакеты все равно будут висеть на шине последовательно, даже при максимальной скорости передача одного пакета (CAN кадра) будет около 100 мкс, процессор вроде бы должен успевать обработать и считать в свой буфер содержимое кан-обьекта до поступления следующего кадра.

Сообщение отредактировал Fledgling - Oct 2 2008, 04:32
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 2 2008, 07:41
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Fledgling @ Oct 2 2008, 07:08) *
Чтение из него производится по прерыванию (у обоих контроллеров есть по прерыванию в таблице векторов).

Какому прерыванию? Сколько времени занимает обработка?

Цитата(Fledgling @ Oct 2 2008, 07:08) *
Или нужно менять весь алгоритм в целом и вводить синхронизацию?

Вы же молчите как партизан - не говорите ни сколько буферов в приемнике задействовано, ни про фильтрацию. Синхронизация абсолютно не нужна.
Получается, мы должны рассказывать, что у Вас происходит.
Буфер у Вас один. Из-за несинхронности наступает момент, когда кадры идут один за другим. Первый принимается, а второй нет, потому как буфер занят. А на второй кадр подтверждение дает то устройство, что передало первый кадр, поэтому второе устройство считает, что оно успешно приняло. А шлюз и не подозревает, что был еще кадр.
Даже в старом MCP2515 три буфера приема. И обрабатываются они примерно так:

Код
//запись принятого фрейма(ов) в циклический буфер
void CanSpyReceiveService(void)
{    if (msg_head>=CAN_ARR_SIZE)  msg_head=0;
    if (!can_readMessage(&can_msg_array[msg_head])) return;
    else  msg_head++;
}
// чтение фрейма
uchar can_readMessage(CanMessage *msg)
{    uchar stat, res;
    
    stat = mcp2515_readStatus();
    if ( stat & MCP_STAT_RX0IF )
  {        // Msg in Buffer 0
        mcp2515_read_canMsg( _MCP_RXBUF_0, msg);
        mcp2515_modifyRegister(MCP_CANINTF, MCP_RX0IF, 0);
        res = 1;  //CAN_OK;
    }
    else if ( stat & MCP_STAT_RX1IF )
  {    // Msg in Buffer 1
        mcp2515_read_canMsg( _MCP_RXBUF_1, msg);
        mcp2515_modifyRegister(MCP_CANINTF, MCP_RX1IF, 0);
        res = 1;  //CAN_OK;
    }
    else
  {    res = 0;//CAN_NOMSG;
    }    
    return res;
}

Успехов


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Fledgling
сообщение Oct 2 2008, 11:17
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 27-09-08
Пользователь №: 40 529



Цитата(Dog Pawlowa @ Oct 2 2008, 13:41) *
Буфер у Вас один. Из-за несинхронности наступает момент, когда кадры идут один за другим. Первый принимается, а второй нет, потому как буфер занят. А на второй кадр подтверждение дает то устройство, что передало первый кадр, поэтому второе устройство считает, что оно успешно приняло. А шлюз и не подозревает, что был еще кадр.

Как такое возможно? Кадр передается по шине со скоростью 1МБит/сек порядка 100 мкс (примерно), а ассемблерная процедура приема успевает считать гораздо быстрее (просто посчитали количество инструкций, посмотрели сколько времени выолняется каждая, например MOV выполняется за 2 такта - 50 наносекунд). Значит до прихода следующего кадра уже точно слот №15 (приемник) освободится? или я ошибаюсь?

Сообщение отредактировал Fledgling - Oct 2 2008, 11:19
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Fledgling   Ошибки при обмене по протоколу CAN 2.0B в многопроцессорной системе   Sep 27 2008, 19:01
- - Fledgling   UP!   Sep 29 2008, 16:47
|- - Dog Pawlowa   Цитата(Fledgling @ Sep 29 2008, 21:19) С ...   Sep 30 2008, 09:12
||- - Fledgling   Цитата(Dog Pawlowa @ Sep 30 2008, 15:12) ...   Sep 30 2008, 14:51
||- - Andrew2000   Цитата(Fledgling @ Sep 30 2008, 18:51) .....   Sep 30 2008, 15:53
||- - spf   Цитата(Fledgling @ Sep 30 2008, 20:51) Во...   Sep 30 2008, 15:58
||- - Vokchap   Цитата(spf @ Sep 30 2008, 18:58) В CAN со...   Sep 30 2008, 16:04
|- - spf   Цитата(Fledgling @ Sep 30 2008, 00:19) Пе...   Sep 30 2008, 15:45
||- - Fledgling   Цитата(spf @ Sep 30 2008, 21:45) Перегруз...   Sep 30 2008, 16:09
||- - spf   Цитата(Fledgling @ Sep 30 2008, 22:09) Им...   Sep 30 2008, 16:27
|- - spf   Еще раз перечитал первые ваши посты. Сообщалось чт...   Oct 1 2008, 13:36
|- - spf   Цитата(Fledgling @ Oct 2 2008, 10:08) Чте...   Oct 2 2008, 07:35
||- - Fledgling   Цитата(spf @ Oct 2 2008, 13:35) Вектора т...   Oct 2 2008, 08:13
|- - Fledgling   Цитата(Dog Pawlowa @ Oct 2 2008, 13:41) К...   Oct 2 2008, 09:20
|- - spf   Цитата(Fledgling @ Oct 2 2008, 17:17) Как...   Oct 2 2008, 12:35
|- - Dog Pawlowa   Цитата(Fledgling @ Oct 2 2008, 14:17) Как...   Oct 2 2008, 12:40
|- - spf   Цитата(Dog Pawlowa @ Oct 2 2008, 18:40) Н...   Oct 2 2008, 13:16
|- - Dog Pawlowa   Цитата(spf @ Oct 2 2008, 16:16) Не вводит...   Oct 3 2008, 06:29
|- - spf   Цитата(Dog Pawlowa @ Oct 3 2008, 12:29) У...   Oct 3 2008, 07:24
|- - Dog Pawlowa   Цитата(spf @ Oct 3 2008, 10:24) Операция ...   Oct 3 2008, 08:34
- - Огурцов   Цитата(Fledgling @ Sep 27 2008, 19:01) вс...   Sep 30 2008, 05:33
- - Vokchap   У вас восемь каналов у каждого узла сконфигурирова...   Sep 30 2008, 15:16
|- - Fledgling   Цитата(Vokchap @ Sep 30 2008, 21:16) У ва...   Sep 30 2008, 15:31
|- - Vokchap   Цитата(Fledgling @ Sep 30 2008, 18:31) Оч...   Sep 30 2008, 15:57
|- - Andrew2000   Цитата(Vokchap @ Sep 30 2008, 19:57) ...а...   Sep 30 2008, 16:04
||- - spf   Цитата(Andrew2000 @ Sep 30 2008, 22:04) ...   Sep 30 2008, 16:17
||- - Andrew2000   Цитата(spf @ Sep 30 2008, 20:17) Приплыли...   Sep 30 2008, 16:24
|||- - Vokchap   Цитата(Andrew2000 @ Sep 30 2008, 19:24) У...   Sep 30 2008, 16:30
|||- - Fledgling   Цитата(Andrew2000 @ Sep 30 2008, 22:24) П...   Sep 30 2008, 16:33
||- - Dog Pawlowa   Цитата(spf @ Sep 30 2008, 19:17) Приплыли...   Sep 30 2008, 16:32
||- - spf   Цитата(Dog Pawlowa @ Sep 30 2008, 22:32) ...   Sep 30 2008, 16:37
||- - Andrew2000   Цитата(Dog Pawlowa @ Sep 30 2008, 20:32) ...   Sep 30 2008, 16:38
||- - Fledgling   Цитата(Dog Pawlowa @ Sep 30 2008, 22:32) ...   Sep 30 2008, 16:39
||- - spf   Цитата(Fledgling @ Sep 30 2008, 22:39) У ...   Sep 30 2008, 16:46
|||- - Fledgling   Цитата(spf @ Sep 30 2008, 22:46) Такие по...   Sep 30 2008, 16:56
||- - Dog Pawlowa   Цитата(Fledgling @ Sep 30 2008, 19:39) Кс...   Sep 30 2008, 16:48
||- - spf   Цитата(Dog Pawlowa @ Sep 30 2008, 22:48) ...   Sep 30 2008, 17:00
||- - Fledgling   Цитата(Dog Pawlowa @ Sep 30 2008, 22:48) ...   Sep 30 2008, 17:30
|- - spf   Цитата(Vokchap @ Sep 30 2008, 21:57) Если...   Sep 30 2008, 16:06
|- - Vokchap   Цитата(spf @ Sep 30 2008, 19:06) Если кон...   Sep 30 2008, 16:23
- - TookeR   Введение большего кол-ва приемников приведет к дру...   Oct 2 2008, 06:41


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:40
Рейтинг@Mail.ru


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