1

Тема: Получение и отправка пакета в CAN шину

Добрый день! Требуется сделать следующее:
Читать шину CAN на предмет присутствия в ней определенного пакета, к примеру 02С2 0200000050
Если такой пакет встречается, то в шину выдается аналогичный пакет, но с другим идентификатором, к примеру 05С5 0200000050
Помогите пожалуйста примером.
Автомобиль семейства VAG, адаптер canny7

2

Re: Получение и отправка пакета в CAN шину

Можно, например, так (клик для увеличения):
http://forum.canny.ru/files/evk_prev.png
Файл диаграммы: http://forum.canny.ru/files/evk.cfd

3

Re: Получение и отправка пакета в CAN шину

Спасибо, попробую!

4

Re: Получение и отправка пакета в CAN шину

Несколько вопросов по диаграме:
Что дают регистры CAN IDH и CAN ERL если идентификация пакета идет все равно по регистру CAN IDL?
Как можно в режиме симуляции симулировать появление нужного пакета, чтобы увидеть реакцию контроллера?
Набросал диаграмму, попытка чтения пакета 05С3 3906 и отправка в шину пакета 05С1 0406 0000 0600
Правильно ли прописан пакет "05С3 3906"? На кан мониторе он выглядит именно так, дальше прочерки
http://forum.canny.ru/files/oldpic/06adf312-0615-4d9e-9650-78575d450173.jpg
http://forum.canny.ru/files/oldpic/391259c7-3fae-4931-b6fb-ded8ab64c893.jpg

5

Re: Получение и отправка пакета в CAN шину

пс Изображения черти как вставились(
Здесь оригиналы изображений и файл диаграммы: https://drive.google.com/folderview?id= … sp=sharing

6

Re: Получение и отправка пакета в CAN шину

По порядку.
Регистр IDH содержит старшую часть идентификатора CAN-сообщения и применяется при использовании в CAN-сети расширенных идентификаторов, например в автомобилях Honda (0x12F84010).
Регистр ERL содержит информацию о количестве байт данных в принятом (регистр принятого сообщения CAN ERL) или отправляемом (регистр сообщения передачи CAN ERL) сообщении. Во втором случае он сообщает драйверу CAN сколько байт нужно передать в следующем сообщени и обязателен к указанию при отправке. Кроме того, в этом регистре могут также содержаться специальные данные. Подробнее о драйвер CAN и его регистрах читайте в соответствующей главе руководства пользователя по интегрированной среде разработки CannyLab, доступном из программы при нажатии клавиши F1 или в каталоге  CannyLab (..\cannylab_v1_1\canny7manual.pdf).
В симуляторе эмулировать работу регистров пока нельзя. Внутрисхемный отладчик пока тоже не реализован. Для возможности изучения работы диаграммы в симуляторе можно временно замениить регистры контроллера на фиктивные линии-связи (сети), не подключаемые ни к чему кроме выводов блоков, где указывались регистры контроллера. В режиме симуляции этим линиям можно задавать значения используя пункт контекстного (клик на линию правой кнопкой мыши) меню "Установка занчения".
Приложенная диаграмма требует несколько небольших дополнений, которые были указаны в примере из первого ответа этой ветки.
Пакет "05С3 3906" в диаграмме указан верно.
Доработанный вариант диаграммы: http://forum.canny.ru/files/evk3.cfd
Диаграмма (кликабельно):
http://forum.canny.ru/files/oldpic/63fd4182-6727-4eb2-8831-3cd6c6c790fd.png
Добавленный блок №5 дополнительно идентифицирует сообшение проверяя что пинято именно 2 байта данных. Наличие в цепочке блока №7 позволяет обеспечить работу только с актуальными (принятыми в данный момент - свежими) полученными данными. Блок №16 устанавливает количество отправляемых байт данных - без него данные рагистров D0...D5 отправлены не будут.
Подробнее о работе с драйвером CAN читайте в соответствующей главе canny7manual.pdf (страница 116).

7

Re: Получение и отправка пакета в CAN шину

Денис, спасибо за разъяснения. С CAN ERL и CAN IDH разобрался. Но в Вашей диаграме мне непонятен набор блоков: 1, 16,18,19, 20. Каково условие срабатывания этих блоков. Я запускаю симуляцию и эти блок сразу же срабатывает, хотя по сути в шине еще "тишина". Впоследствии при установке флага равным 1 в выходе блока 7 это также ни на что не влияет:
https://drive.google.com/open?id=0B8BhF … authuser=0
Посмотрите другой вариант моей диаграммы, можно ли так делать? "Слушаем" шину на присутствие пакета 05С3 3906 и отправляем в нее пакет 05С1 0406 0000 60 (обратите внимание на кол-во байт)
https://drive.google.com/open?id=0B8BhF … authuser=0
https://drive.google.com/open?id=0B8BhF … authuser=0
Пробую на машине, пакеты контроллер видит, что подтверждает зеленый светодиод, но в шину похоже сигнал не отправляется либо я не правильно его формирую...
Диаграмма здесь: https://drive.google.com/open?id=0B8BhF … authuser=0

8

Re: Получение и отправка пакета в CAN шину


Блоки №№1, 16,18,19, 20 предназначены для заполнения регистров сообщения передачи CAN. Они выполняются на каждом цикле работы диаграммы без какого либо дополнительного условия и позволяют быть уверенным, что, в случае выполнения условия отправки данных в шину CAN, содержимое этих регистров будет именно таким. В общем случае, при необходимости отправки нескольких CAN-сообщений с разными данными (в зависимости от тех или иных условий) можно использовать для формирования посылок коммутаторы. Заполенные регистры сообщения отправки сами по себе ни на что не влияют и не отправляются в шину до установки значения "1" в регистр старта передачи CAN. Подробнее читайте в соответствующей главе canny7manual.pdf.
Настоятельно рекомендую при обработке принятых данных CAN использовать регистр наличия принятых данных CAN (блок 7 в примере evk3.cfd), иначе есть риск использовать неактуальные данные. Актуальность данных гарантироется только на одном цикле выполнения диаграммы, при наличии значения "1" в регистре наличия принятых данных CAN.
Да, для отправки 5 байт данных регистр сообщения отправки CAN ERL должен быть равен 5.
Использование Триггера D в данном случае почти ничем не отличается от использования блока "Копирование": только до первого выполнения условия установки значений в регистры отправки в этих регистрах будут значения "0", в последствии триггер их в любом случае там сохранит (смотрите описание работы триггеров в соответствующей главе canny7manual.pdf). Как написано выше, лучше использовать коммутаторы, но в данной диаграмме это бессмысленно. Блок "Копирование" - здесь самый экономичный вариант.
Использование индикации приема данных CAN с помощью светодиода контроллера - хорошее решение.
Для отправки данных в шину необходимо использовать регистр старта передачи данных CAN с детектором фронта (для единичногой отправки сообщения CAN при выполнении условия отправки), как это показано в примере evk3.cfd (блок №15).

9

Re: Получение и отправка пакета в CAN шину

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

10

Re: Получение и отправка пакета в CAN шину

а можно на данном примере показать, как сделать отправку 2 сообщений.
причем 1 - разово а 2- циклично? (положим что ID одинаковые)

Входные данные те же - один пакет

11

Re: Получение и отправка пакета в CAN шину

SiMuS пишет:

а можно на данном примере показать, как сделать отправку 2 сообщений.
причем 1 - разово а 2- циклично? (положим что ID одинаковые)

Входные данные те же - один пакет

Не совсем понятен вопрос.
В каком случае начинать отправку и когда ее прекращать? Что имеется в виду под "входные данные"? Пожалуйста, опишите задачу более конкретно.
Основные приемы отправки CAN-сообщений описаны в теме http://forum.canny.ru/viewtopic.php?id=12.

12 (31-03-2016 14:05:28 отредактировано SiMuS)

Re: Получение и отправка пакета в CAN шину

крогда на выходе блока 7 появится единица, единоразово  отправить один пакет в шину , и  зацикленно посылать второй пакет.
до тех пор пока в блоке 7 опять не появится единица

вопрос не в методике послыки данных а в общей логике.

я так понимаю целевая схема приближена к примеру 4

13

Re: Получение и отправка пакета в CAN шину

SiMuS пишет:

крогда на выходе блока 7 появится единица, единоразово  отправить один пакет в шину , и  зацикленно посылать второй пакет.
до тех пор пока в блоке 7 опять не появится единица

вопрос не в методике послыки данных а в общей логике.

я так понимаю целевая схема приближена к примеру 4

Это что-то среднее между примером 4 и примером 3.

Вот вариант решения указанной задачи. Отправка периодическая, по генератору ШИМ.

UPD 31.03.2016: Добавлена картинка диаграммы

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

Иконка вложения evk4.cfd 2.06 кб, скачивался 472 раз, последний раз 2016-03-31 

Иконка вложения evk4.png 108.81 кб, скачивался 228 раз, последний раз 2016-03-31 

14

Re: Получение и отправка пакета в CAN шину

пишет что моя версия программы не совместима.


По рисунку посмотрел.
Правильно ли я понимаю логику, что в вашей схеме пока нет входящий сообщений,  с заданой в ШИМ периодчинотью будет слаться команда с выходов 0?

15

Re: Получение и отправка пакета в CAN шину

Да. Пока на входах "Индекс" коммутаторов №№9...13 установлено значение 0, т.е. на выходе блока №7 находится 0 - не принято CAN-сообщение с оговоренными параметрами, в регистры сообщения передачи CAN передаются значения с входа 0 коммутатора, которые и отправляются по сигналам генератора ШИМ.
При появлении 1 на выходе блока №7 коммутатры запишут в регистры отправки CAN данные с входов 1 и будет выполнена отправка этого сообщения в CAN.

В предыдущей версии файла я кое-что не учел. Новый вариант диаграммы, сохраненный под CannyLab версии 1.17 во вложении.

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

Иконка вложения evk4a.cfd 2.37 кб, скачивался 388 раз, последний раз 2016-03-31 

Иконка вложения evk4a.png 124.56 кб, скачивался 152 раз, последний раз 2016-03-31 

16

Re: Получение и отправка пакета в CAN шину

Спасибо, схема понятна, но я немного другое хотел.
Как обычно проблема с объяснением smile

Суть в том что при появлении устойчивого 1 на входе (например аналоговом)
Надо:
1 раз послать пакет  5с1  03 00
1 через секунду послать пакет  5с1  00 20
продолжать посылать пакет 5с1  00 20 с интервалом в 1 секунду пока на входе не появится 0

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

17

Re: Получение и отправка пакета в CAN шину

Попробуйте этот вариант. Тут все еще проще, т.к. вариантов сообщений всего 2. В целом подход такой же.

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

Иконка вложения evk4b.cfd 1.65 кб, скачивался 478 раз, последний раз 2016-03-31 

Иконка вложения evk4b.png 92.96 кб, скачивался 172 раз, последний раз 2016-03-31 

18 (31-03-2016 18:13:45 отредактировано SiMuS)

Re: Получение и отправка пакета в CAN шину

Работает!
Спасибо!

19 (26-04-2016 18:27:00 отредактировано Dark-angel)

Re: Получение и отправка пакета в CAN шину

Добрый вечер. С наскока не нашел примеров.   Есть 3 пакета 1,2,3
если  в шине появляется пакет 1 то нужно отправить пакет 11
если  в шине появляется пакет 2 то нужно отправить пакет 12
если  в шине появляется пакет 3 то нужно отправить пакет 13

Без фильтрации.

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

Столкнулся с ситуацией когда соединить 2 пакета на выходе в единую сеть с коммутаторами не получается.

Спасибо заранее

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

Иконка вложения замена трех пакетов1.cfd 6.3 кб, скачивался 553 раз, последний раз 2016-04-26 

20

Re: Получение и отправка пакета в CAN шину

В целом подход верный. Вот вариант решения данной задачи.

В исходной диаграмме на выходе блока 7 была установлена инверсия - в прилагаемом файле исправлено.

Исправлено условие отправки данных в CAN.

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

Иконка вложения замена трех пакетов1a.cfd 6.85 кб, скачивался 588 раз, последний раз 2016-04-26 

21 (26-04-2016 18:53:33 отредактировано Dark-angel)

Re: Получение и отправка пакета в CAN шину

спасибо, получается что ограничение такого конфига 15 пакетов?  а больше можно?

22

Re: Получение и отправка пакета в CAN шину

Да, можно расширить и более чем на 15 - связывать коммутаторы между собой, как например показано здесь: http://forum.canny.ru/viewtopic.php?id=75.

23

Re: Получение и отправка пакета в CAN шину

супер.  спасибо.

24

Re: Получение и отправка пакета в CAN шину

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

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

Иконка вложения упрощенка.cfd 2.86 кб, скачивался 527 раз, последний раз 2016-04-26 

25

Re: Получение и отправка пакета в CAN шину

Dark-angel пишет:

Накидал упрощенный вариант расширения коммутаторов

При приходе по CAN сообщения с ID 0x0001, на выходе блока №6 установится единица. А при приходе по CAN сообщения с ID 0x0002, на выходе блока №6 установится... тоже единица.

При приходе по CAN сообщения с ID 0x0003, на выходе блока №13 установится единица. А при приходе по CAN сообщения с ID 0x0004, на выходе блока №13 установится... тоже единица.

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

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