1

Тема: Объясните где ошибка

Собстно, только осваиваю, но даже простой шлюз ретранслятор что то не работает....

питание - индикатор работает
активность интерфейсов - на CAN1 отображается, ошибок передачи нет, на CAN0 - активность не отображается, ошибка передачи.

Зеленый светодиод не загорается совсем.
Ретрансляции между интерфейсами нет.

Если оба приемника/передатчика цепляю к одному CAN1(например) то они друг друга слышат, т.е. мои передатчики настроены норм. Оба на 500кбит.

Отбор просто копировал из примера....  он мне не нужен пока.... вообщем не понял где затык...Настройки интерфейсов видимо?

Вложений в сообщении

Иконка вложения gate2.cfd 1.69 кб, скачивался 81 раз, последний раз 2017-11-15 

2 (16-11-2017 09:37:48 отредактировано ladan)

Re: Объясните где ошибка

видимо на CAN0  нет кан терминатора?  На CAN1 есть место(перемычка), но R121 уже стоит я так понимаю на лицевой стороне, правильно?  Т.е. на CAN1 терминатор стоит, а на CAN0 - нет. И места на плате нет....

3

Re: Объясните где ошибка

Если я правильно понимаю, сейчас предпринимается попытка собрать испытательный стенд, т.е. включение контроллера выполняется не в реально существующую CAN-сеть, а в локальную.
Интерфейс CAN0 контроллера действительно не имеет терминатора, т.к. предполагается что он должен подключаться к существующей CAN-сети, в которой обычно уже имеется терминатор. Интерфейс CAN1 предполагается подключать к отрываемому от сети устройству, со стороны которого терминатора может не быть, по этому CAN1 имеет терминирующее сопротивление на плате контроллера.
По диаграмме.
Драйвер шлюза работает асинхронно функциональной диаграмме. Регистры наличия принятых данных CAN обоих интерфейсов будут реагировать на получение сообщений только тех ID, которые попадают в диаграмму, например попадают в активированный отбор. Соответственно в описанном случае может и не включаться совсем - сообщения CAN0 не попадают в отбор, а сообщения CAN1 - вообще не попадают в диаграмму. Если включить режим логирования одного или обоих CAN интерфейсов (записать "1" в соответствующий регистр), то сообщения со всеми ID "логируемого" интерфейса будут попадать в диаграмму и регистры наличия принятых данных CANx будут реагировать на получение сообщенний.
Конфигурацию трансивера интерфейса CAN1 при скорости шины 500кБит следует установить HS.

В общем, проблему должна решить установка терминатора на CAN0.

Дополнительную информацию можно найти здесь.

4 (16-11-2017 12:49:49 отредактировано ladan)

Re: Объясните где ошибка

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

Базовый дроп пакета тоже сделал....

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

Отсюда 2 вопроса:

  • Можно ли сделать при равенстве данных из d1:d0 и d3:d2 заданным константам  дроп, а по умолчанию - передачу. или только ручная передача

  • При загрузке шины 500кБод на 50% целевой ID засылает пакет каждые 2-3 мс - ручная обработка в диаграмме облом?

5

Re: Объясните где ошибка

ladan пишет:

...с транссивером просто игрался уже(искал трабл до запайки терминатора).....  Кстати, не нашел документацию по этой фиче...

Описание регистра конфигурации трансивера CAN1 есть в таблице "Регистры конфигурации драйвера CAN" описания драйвера CAN.

ladan пишет:

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

Существует 3 основных режима работы шлюза (см. примеры из описания драйвера шлюза CAN):
* статический шлюз - запрет ретрансляции ID, постоянная замена определенных бит/байт данных, изменение ID, изменение длины сообщения, и т.п.
* динамический шлюз - то же что и статический шлюз, но с возможностью изменения настроек отборов по определенным условиям (внешним командам и т.п.).
* обработка и ретрансляция сообщений с помощью диаграммы - возможность управления работой шлюза по более сложным условиям.

ladan пишет:

Можно ли сделать при равенстве данных из d1:d0 и d3:d2 заданным константам  дроп, а по умолчанию - передачу. или только ручная передача

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

ladan пишет:

При загрузке шины 500кБод на 50% целевой ID засылает пакет каждые 2-3 мс - ручная обработка в диаграмме облом?

Не факт. При небольшой диаграмме, установке CAN-фильтров... должно справляться.

6

Re: Объясните где ошибка

Дроп - это сброс пакета.
Нужно "сбросить"( не передать ) 1 конкретный пакет(IDXXX D0=XX D1=XX D2=XX ...), при том что все остальные пакеты от этого ID должны проходить нормально
Остальных пакетов от этого ID бывает 300-400 в 1 сек.(в определенных режимах) Фильтр на этих режимах не поможет, так как сторонних сообщений (других ID) в это время нет (можно пренебречь)
Мы говорим не про стандартный "пакет состояния", а про передачу большого массива данных для которой используется CAN как транспортный уровень. Опять же из-за этого - велики потенциальные проблемы в случае потери части сообщений

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

Идеальный вариант - отбор по ID ->отбор по данным из пакета -> обработка в диаграмме.

В случае если НЕ СТОИТ запрет ретрансляции для шлюза, пакет попавший в диаграмму можно сбросить(не передать)? или он передается независимо и можно только использовать данные из него?

7

Re: Объясните где ошибка

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

В примере 3, из описания драйвера шлюза CAN, показан подход который можно использовать для данной задачи: получить в диаграмму сообщение с нужным ID через установленный отбор, запретить его ретрансляцию, обрабатывать данные в диаграмме. Т.е. после получения сообщения, при невыполнении условий "дропа" - перегрузить данные из регистров приема CAN0 в регистры отправки CAN1 и отправить сообщение в CAN1 на этом же цикле выполнения диаграммы; при выполнении условий "дропа" - не отправлять сообщение или отправить с нужными данными.

8

Re: Объясните где ошибка

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

9

Re: Объясните где ошибка

Ну вот как то так получилось у меня....
Ловим пакеты ID 111   и все пакеты кроме 111 11 22 33 44 передаем на другой интерфейс. 
отбор для 222 - на вторую часть(фильтр в обратном направлении), на него пока не обращаем внимания.

Что скажете, с точки зрения логичности и оптимизации?
Отмена ЮИ  (моргания светодиодиками) имеет смысл для ускорения?

Вложений в сообщении

Иконка вложения test_f_1.cfd 3.8 кб, скачивался 68 раз, последний раз 2017-11-16 

10

Re: Объясните где ошибка

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

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

Вложений в сообщении

Иконка вложения test_f_1a.cfd 3.65 кб, скачивался 69 раз, последний раз 2017-11-16 

11 (16-11-2017 20:23:00 отредактировано ladan)

Re: Объясните где ошибка

ЭЭЭ, мне кажется или ваша диаграмма будет отправлять только то сообщение которое нужно сбросить? а все остальные - сбрасывать ? )))

ХМ....  а почему в дебагере  на логическом И два нуля дают 1 на выходе?  Чет ваще в дебагере запутка с логическим И....
В реале так же?

Допустим, добавим "НЕ"
При соблюдении только 1 равенства (по данным) - логическое "И" должно давать 0 - нет ретрансляции

Из вашего варианта получился такой, если конечно логическое И в реале работает правильно.


Я вот подумал, можно наверное еще изящнее - подменить IDL "при разрешении ретрансляции" на шлюзе по умолчанию, и пакет уйдет "в никуда" как думаете?
Это как раз и будет аналог "все ретранслируем, кроме сообщения прошедшего условия диаграммы"

Подскажите еще - номера имеют какое то значение?

Вложений в сообщении

Иконка вложения test_f_2.cfd 3.85 кб, скачивался 66 раз, последний раз 2017-11-16 

12

Re: Объясните где ошибка

Как было указано в сообщении №10:

Проверил работу вложенной диаграммы "на столе" - должно работать.

Представленный мной вариант диаграммы (test_f_1a.cfd) работает корректно, тем более что в симуляторе как раз все и видно.
У блока №10 "Логическое И" на выходе установлена инверсия. Отправляться будут все сообщения у которых указанные байты (все 4, т.е. оба регистра принятого сообщения) НЕ равны заданным константам. Иначе на выходе блока №10, с учетом инверсии, будет 0 и в регистр начала передачи сообщения не будет записано значение 1.

Что показывает симулятор на диаграмме test_f_2.cfd? У блока №12 "Логическое И" осталась инверсия, которая снова инвертируется блоком "Логическое НЕ". Комбинация блоков №№6,11,8 вообще не позволит отправить ни одного сообщения с ID=0x111.

Все блоки и в симуляторе и в "реале" работают правильно. Ознакомьтесь с описанием языка CFD.

Наверное, более "изящный" вариант не подойдет.

Номера блоков - справочные, присваиваются по мере добавления блоков на поле диаграммы, могут быть изменены пользователем или автоматически при перенумерации и используются для возможности быстрого поиска нужного блока по номеру. Номера, дополнительно добавляемые в режиме симулятора (над блоком в правом углу), показывают порядок выполения элементов функциональной диаграммы. Все это есть в соответствующих разделах wiki.

13

Re: Объясните где ошибка

ladan пишет:

Отсюда 2 вопроса:

  • Можно ли сделать при равенстве данных из d1:d0 и d3:d2 заданным константам  дроп, а по умолчанию - передачу. или только ручная передача

  • При загрузке шины 500кБод на 50% целевой ID засылает пакет каждые 2-3 мс - ручная обработка в диаграмме облом?

  • Это потребует изменения системного ПО контроллера. Посмотрим что можно сделать.

  • В контексте вашей задачи, вероятнее всего - да. Но возможны варианты.

14

Re: Объясните где ошибка

ladan пишет:

Я вот подумал, можно наверное еще изящнее - подменить IDL "при разрешении ретрансляции" на шлюзе по умолчанию, и пакет уйдет "в никуда" как думаете?

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

15 (17-11-2017 02:06:33 отредактировано ladan)

Re: Объясните где ошибка

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

И все таки, в вашем варианте при совпадении условия по данным( D1:D0=CONST D3:D2=CONST2) и при НЕ СОВПАДЕНИИ по IDL ретрансляции нет.
В данном варианте (когда отбирается только 1 IDL), согласен, будет работать, можно даже совсем убрать блоки 6 и 7, но при расширении отбора будут проблемы.
В моем последнем - нужно убрать блоки НЕ и поставить еще одну инверсию.(ну либо убрать инверсию, о которой я не знал)

Если дорабатывать ПО то может, все-таки, сделать второй(или параллельный) круг отбора по значению? мне кажется это более перспективно, судя по количеству аналогичных задач на форуме. Хотя "сброс" тоже пригодится и, вероятно, сильно проще доработать.

По производительности - оттестирую в понедельник, дам знать.

16

Re: Объясните где ошибка

ladan пишет:

...И все таки, в вашем варианте при совпадении условия по данным( D1:D0=CONST D3:D2=CONST2) и при НЕ СОВПАДЕНИИ по IDL ретрансляции нет.

В исходной постановке задачи значился отбор только по 1 ID. Все остальные сообщения ретранслируются автоматически.
Даже если отборов будет больше и с ними нужно будет производить подобные действия, подход не изменится: пришел нужный ID, заданные байты данных равны установленным константам (через блок "И" с инверсией), отправка сообщения. Просто для нескольких ID эта конструкция будет размножена (скопирована) соответствующее количество раз, только со своими параметрами и потребуется еще несколько небольших изменений. Если на дополнительные отборы не будет установлен запрет ретрансляции, то принудительно отправлять сообщения с их ID не потребуется.

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

17

Re: Объясните где ошибка

Ну что ж, коллеги, результат теста производительности - положительный.
блоки по 16 сообщений от целевого ID(попадающие в отбор) с интервалом 1 мс,
перерыв между блоками 2 мс,
2 теста по 8 мин
Общее количество трафика(в обе стороны) примерно 820-850 сообщений в секунду
потерь данных - нет.

В целом очень приятные ощущения от работы с вашим продуктом, хорошая концепция GUI, большое спасибо!
Обязательно будем пользовать в дальнейших разработках!

18

Re: Объясните где ошибка

Рады, что у Вас все получилось. Желаем успехов в Ваших проектах!