1

Тема: Примеры передачи сообщений CAN

После размещения ролика иллюстрирующего прием CANNY 7 сообщений из  CAN нам стали задавать вопросы вопросы по отправке сообщениий в CAN. Приведу несколько примеров:
 
Пример отправки №1: https://forum.canny.ru/files/example_send_CAN_1.cfd
https://forum.canny.ru/files/example_send_CAN_1_prev.png
Здесь показана отправка сообщения со стандартным идентификатором 0x001: 0xDE 0xAD 0xBE 0xEF 0x12 0x34 0x56 0x78 по появлению сигнала на восьмом канале контроллера.
 
Пример отправки №2: https://forum.canny.ru/files/example_send_CAN_2.cfd
https://forum.canny.ru/files/example_send_CAN_2_prev.png
Здесь показана отправка сообщения с расширенным идентификатором 0x1f110001: 0xDE 0xAD 0xBE 0xEF 0x12 0x34 0x56 0x78 по появлению сигнала на восьмом канале контроллера.
 
Отличия в отправке расширенного сообщения от отправки стандартного:
установить бит 15 регистра [Регистр сообщения передачи CAN ERL],
старшую часть идентификатора записать в регистр [Регистр сообщения передачи CAN IDH]

Пример отправки №3: https://forum.canny.ru/files/example_send_CAN_3.cfd
https://forum.canny.ru/files/example_send_CAN_3_prev.png
К первому примеру добавлена отправка сообщения  при пропадании сигнала восьмом канале контроллера, с тем же ID но с нулевыми данными.
 
 
Пример отправки №4: https://forum.canny.ru/files/example_send_CAN_4.cfd
https://forum.canny.ru/files/example_send_CAN_4_prev.png
Пример периодической отправки нескольких сообщений.
UPD 14.02.2014: Откорректирована диаграмма примера №4.

2

Re: Примеры передачи сообщений CAN

Возможно ли при помощи одного контроллера реализовать такую схему:
слушаем CAN на предмет длительного удержания кнопки (напр 3 сек), после чего выдаем нужную нам комаду в тот же CAN?
(длительное удержание кнопки на брелке для закрытия крышки багажника)

3

Re: Примеры передачи сообщений CAN

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

4

Re: Примеры передачи сообщений CAN

Доброго дня! Прошу Вас помочь с реализацией решения. К сожалению, самому не удалось. Необходима периодическая отправка в CAN сообщения с идентификатором 0х621 : 0х00 0х20 0х80 0хff 0х17 0х7f 0хfd .. с периодом 0.25сек , скоростью 100 кбит/сек  по появлению сигнала на любом из каналов контроллера. Заранее благодарен

5

Re: Примеры передачи сообщений CAN

Вариант решения Вашей задачи: https://forum.canny.ru/files/example_send_CAN_5.cfd
https://forum.canny.ru/files/example_send_CAN_5_prev.png
В  задаче не совсем четко описано условие отправки CAN-сообщения. В  решении отправка выполняется по появлению отрицательного потенциала на любом из  сконфигурированных каналов, а именно на канале 9 или 10, и продолжается  пока потенциал на этих каналах не изменится. Для других каналов или для  большего их количества все делается аналогично.

6

Re: Примеры передачи сообщений CAN

Спасибо за оперативность! Вечером попробую

7

Re: Примеры передачи сообщений CAN

Подскажите как реализовать.
Одной кнопкой отправляет одну команду другой другую.

8

Re: Примеры передачи сообщений CAN

Реализация этой задачи уже частично рассмотрена в примерах 3 и 4 данного раздела.
Вариант решения Вашей задачи:
https://forum.canny.ru/files/example_send_CAN_6_prev.png
При  появлении отрицательного потенциала на канале 9 выполняется отправка  CAN-сообщения:
0x621: 0x00 0x20 0x80 0xFF 0x17 0xF7 0xFD.
При появлении отрицательного потенциала на канале 10 выполняется отправка  CAN-сообщения:
0x622: 0x20 0x20 0xFF 0xFF 0x00 0xF7 0xFD 0xFF.
Исходный файл: https://forum.canny.ru/files/example_send_CAN_6.cfd

9

Re: Примеры передачи сообщений CAN

я не вижу как идет индексация коммутатора

10

Re: Примеры передачи сообщений CAN

если будет четыри канала и четыре посылки.

11

Re: Примеры передачи сообщений CAN

На приведенной в сообщении 7 диаграмме индекс формируется  следующим образом: если регистр входного значения канала 10 равен "1",   на выходе блока №4 будет установлено значение "1", которое и является  значением индекса для блоков №№5...10 "Коммутатор 2-в-1".  Если регистр входного значения канала 10 равен "0",  значение индекса равно "0".
Вариант формирования индекса для четырех каналов:
https://forum.canny.ru/files/example_send_CAN_6c_prev.png
Для большего числа каналов достаточно нарастить цепочку коммутаторов.

12

Re: Примеры передачи сообщений CAN

Спасибо, не сообразил что так можно сделать.

13

Re: Примеры передачи сообщений CAN

Есть необходимость запустить три разных CAN сообщения с разной периодичностью, первое 0,1с, второе 0,2с, третье 0,5с. Подскажите, лучше каждому поставить свой генератор ШИМ с заданными параметрами или поставить один на 0,1с и каждому сообщению организовать счётчик или ещё что-нибудь..

14

Re: Примеры передачи сообщений CAN

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

15

Re: Примеры передачи сообщений CAN

Спасибо! А что можете посоветовать по отправке CAN-сообщений? При одинаковом времени отправки драйвер сам выберет приоритет или нужно организовать алгоритм? Тем более выходной регистр должен быть один, как написано в описании.

16

Re: Примеры передачи сообщений CAN

CAN-последовательная шина данных. В каждый момент времени может в общем случае передаваться лишь одно сообщение. За один цикл исполнения диаграммы CANNY 7 может передать на отправку строго одно сообщение CAN. Если необходимо передать подряд два сообщения с минимальным интервалом - передавайте их немедленно друг за другом в смежных циклах исполнения. Переданные на отправку сообщения, если они по какой либо причине не могут быть отправлены немедленно, буфиризируются, и будут отправлены в том порядке в каком были переданы на отправку из диаграммы. Какая-либо иная приоритезация сообщений не предусмотрена.

17

Re: Примеры передачи сообщений CAN

Константин, а что происходит при переполнении буфера? И вообще каким объемом данных его можно переполнить?
К примеру у меня стоит ШИМ генератор выдающий сообщения с интервалом 1 сообщение в 300мс

18

Re: Примеры передачи сообщений CAN

Буфер вмещает 4 сообщения CAN. При переполнении буфера устанавливается значение "0" в регистре "Регистр готовности буфера передачи CAN" драйвера CAN, все сообщения переданные на отправку в то время пока буфер переполнен теряются.
Переполнение буфера может никогда не возникнуть, даже если отправлять сообщения лавинообразно, буквально на каждом цикле исполнения диаграммы. А может возникнуть и после передачи на отправку всего четырех сообщении с интервалом в 10 секунд. Всё зависит от наличия или отсутствия в сети минимум одного узла готового принять ваше сообщение и в отсутствии в течение некоторого времени попыток передачи более высокоприоритетных сообщении со стороны других узлов. Но это уже общие сведения о CAN, а не о CANNY 7.

19

Re: Примеры передачи сообщений CAN

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

Не могу привыкнуть к программированию мышью и все еще не понял реализации аналогов простых циклов for, while или паузы.
Прошу вашей помощи.

20

Re: Примеры передачи сообщений CAN

PSYcho пишет:

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

Вариант модификации примера 4:
https://forum.canny.ru/files/example_send_CAN_4_upd_a.png
Исходный файл диаграммы: http://forum.canny.ru/files/example_sen … _upd_a.cfd
Выполнение диаграммы остановить нельзя, однако можно задать условия для задержки выполнения каких-либо её участков. В данном примере блок №13 (замена блока №3 примера №4), по достижению счетчиком, блок №2, значения "8", остановит генератор ШИМ, блок №1, и исключит дальнейшее инкриминирование счетчика и отправку сообщений в CAN.

PSYcho пишет:

Не могу привыкнуть к программированию мышью и все еще не понял реализации аналогов простых циклов for, while или паузы.

Т.о. сочетание блоков №№2, 13 и 14 измененного примера дает аналог цикла while, а сочетание блоков №№17, 18, 15 - паузы. Естественно, это не единственно возможные варианты реализации аналогов циклов и пауз - это решение адаптированное для этой задачи.

P.S.: Нумерация блоков дана в соответствии с представленным в здесь измененным примером диаграммы.

UPD 16.04.2015: Изменена картинка примера, добавлена ссылка на исходный файл диаграммы.
UPD 18.04.2015: Нумерация блоков в тексте сообщеия приведена в соответствие с измененной диаграммой.

21

Re: Примеры передачи сообщений CAN

Денис, спасибо. Работает.

22

Re: Примеры передачи сообщений CAN

Добрый день.
Не очень понятно в примере №1 как связаны правые регистры установки CAN.
В варианте, если у нас будет использоваться только один выход и по его значению будет присылаться только одна посылка в кан он должен работать,
а если у нас 2 входа и соответственно высылаются 2 разные посылки?
Если поставить рядом вторую такую же схему, изменив вход нужных регистров и попробовать залить или включить через симулятор,  программа ругается: Адрес подключен более чем к 1 выходу

23

Re: Примеры передачи сообщений CAN

Пример 1 иллюстрирует отправку одного сообщения. Отправка нескольких сообщений показана в четвертом примере.

24 (28-11-2015 20:18:38 отредактировано tim20061)

Re: Примеры передачи сообщений CAN

Константин, CANNY пишет:

Пример 1 иллюстрирует отправку одного сообщения. Отправка нескольких сообщений показана в четвертом примере.

Так, с отправкой вроде понятно, то что можно задать значения каждому входу коммутатора, а вот как задать допустим входу контроллера № 1 число 5 на выходе, если на него поступает (-) и 0 если не поступает(ну ноль задавать понятное дело задавать не нужно).
Проще говоря, как сделать что бы посылка 1 отправлялась со входа 1 (если там появляется минус), посылка 2 отправлялась со входа 2 (если минус).
Ибо я смотрю на шим, который инициирует работу счетчика а счетчик уже управляет коммутаторами, но как реализовать это без шима и счетчика, на прямую, не могу понять

25

Re: Примеры передачи сообщений CAN

Для того, чтобы при появлении логической единицы на входе формировалось на выходе значение 5 а при логическом ноле на входе формировалось на выходе значение 0, используйте, например, блок Умножение, на один из входов подавайте ваш логический вход а на другом установите константу 5.