Скомпилировал и запустил простейший проект подчиненного устройства CANopen из примеров IAR (basic-microcanopen-project). Проект заработал сразу, однако для дальнейших экспериментов понадобился мастер сети CANopen и утилиты для генерации словарей (OD) и конфигурации подчиненных устройств. Нашел интересный бесплатный инструментарий - CanFestival [2]. Здесь приведен перевод документации из файла manual_en.pdf (The CanFestival CANopen stack manual site:automforge.net). Незнакомую терминологию и аббревиатуры см. в [1].
[Что такое CANfestival]
Если кратко, то это стек протоколов CANopen с открытым исходным кодом, свободный от выплат при коммерческом использовании (OpenSource LGPL и GPL). Если точнее, то это фреймворк (рабочая среда разработки) для создания подчиненных (slave) и главных устройств сети CANopen. В настоящее время CanFestival сфокусирован на предоставлении независимой платформы ANSI-C стека CANopen, который можно реализовать на PC (Windows, Linux), межпроцессного обмена в реальном времени (Real-time IPC) и различных микроконтроллерах (даже на платформах AVR и 8051). Что в нем есть:
Инструментарий. Библиотека поставляется с некоторым набором готовых инструментов:
1. Object Dictionary editor GUI. Это графический интерфейс пользователя на основе WxPython Model-View-Controler, который помогает в задаче генерации исходного кода для OD каждого узла сети.
2. Скрипт configure, позволяющий Вам выбрать опции времени компиляции, такие как целевой CPU/HOST, драйверы CAN и TIMER. Этот скрипт не генерируется системой autoconf, он сделан для генерации исходного кода микроконтроллеров.
Поддержка многих платформ. Исходный код библиотеки написан на C-ANSI. Драйвер и примеры кода могут быть перенесены на многие целевые платформы и компиляторы. Unix-совместимые интерфейсы должны компилироваться и работать на любой системе Unix (проверялось на GNU/Linux и GNU/FreeBSD).
Стандарты CANopen. В CanFestival реализованы основные стандарты DS-301 [5], DS-302, DS-305.
DS-301: поддерживаемые функции должны удовлетворять требованиям DS301 V.4.02, 13 февраля 2002 [5].
1. NMT master и slave. 2. Heartbeat consumer и producer. 3. NodeGuard slave reponder и basic master без трекинга. 4. Служба SYNC. 5. Поддержка обмена SDO между сервером и несколькими клиентами, сегментированная (segmented) и ускоренная (expedited). 6. PDO: реализация объектов TPDO и RPDO по отношению к типу передачи. 7. Побитное отображение объектов (переменных приложения) на PDO (PDO-mapping). 8. EMCY: отправка, и прием и отслеживание объектов аварии (emergency objects). 9. Типы данных: значения с разрядностью от 8 до 64 бит, строки фиксированной длины.
DS-302: только краткая поддержка DCF.
DS-305: полная поддержка LSS, однако она разрешается в момент компиляции. Опционально можно дополнительно разрешить службу FastScan LSS.
[Быстрый старт]
Для работы Вам понадобится обычный компьютер (Linux, FreeBSB, Windows) с установленным пакетом Python (я устанавливал Python 2.7) и библиотекой wxPython версии (минимальная версия 2.6.3, я устанавливал 3.0). Также понадобится пакет Gnosis xml tools (может быть установлен в проекте с помощью Makefile, подробнее см. "Использование Dictionary Editor GUI").
1. Рабочая станция под управлением Linux, FreeBSD, Cygwin (GNU toolchain). 2. Компилятор GNU C (gcc) или любой другой компилятор языка ANSI-C для Вашей целевой платформы. 3. Xpdf и официальный файл 301_v04000201.pdf для получения контекстной подсказки в GUI. 4. GNU Make. 5. Bash и sed.
Для традиционной платформы win32 понадобится следующее:
1. Visual Studio Express 2005 или более свежая и продвинутая версия. 2. Microsoft platform SDK (требуется Genuine Advantage). 3. Cygwin (только для конфигурации). 4. MinGW/MSYS.
Как получить CanFestival. Желательно всегда использовать CVS, это самый лучший способ получить поддержку от сообщества разработчиков:
(просто нажмите Enter, без ввода пароля). После этого логина введите команду:
cvs -z3 -d:pserver:anonymous@lolitech.dyndns.org:/canfestival co -P CanFestival-3
Назначение файлов и папок. Ниже в таблице приведено упрощенное описание назначение различных файлов CanFestival.
Каталог
Описание
./src
Исходный код стека CANopen (код ANSI-C).
./include
Экспортируемые файлы заголовков.
./drivers
Интерфейсы к различным аппаратным платформам.
./drivers/unix
Интерфейс к средам систем Linux и Cygwin.
./drivers/win32
Интерфейс к системе Win32.
./drivers/timers_xeno
Таймеры/потоки Xenomai (только Linux).
./drivers/timers_rtai
Таймеры/потоки Rtai (только Linux).
./drivers/timers_kernel
Таймеры/потоки ядра Linux.
./drivers/timers_unix
Таймеры/потоки Posix (Linux, Cygwin).
./drivers/can_virtual_kernel
Симуляция сети CAN на уровне ядра (Fake CAN network, kernel space).
./drivers/can_serial
Последовательное соединение точка-точка и хаб PTY (только системы *nix).
./drivers/can_peak_linux
Интерфейс библиотеки PeakSystem CAN.
./drivers/can_peak_win32
Интерфейс PeakSystem PCAN-Light.
./drivers/can_uvccm_win32
Интерфейс RS232 CAN-uVCCM от компании Acacetus.
./drivers/can_virtual
Симуляция сети CAN (Fake CAN network, системы Linux, Cygwin).
./drivers/can_vcom
Интерфейс VScom VSCAN.
./drivers/hcs12
Полный целевой интерфейс HCS12.
./examples
Примеры.
./examples/TestMasterSlave
Тест 2 узлов, NMT SYNC SDO PDO, win32+unix.
./examples/TestMasterSlaveLSS
Тест 3 узлов, NMT SYNC SDO PDO LSS, win32+unix.
./examples/TestMasterMicroMod
1 узел, управлением модулем Peak I/O Module, unix.
./examples/gene_SYNC_HCS12
Просто отправка периодических сообщений SYNC на HCS12.
./examples/win32test
Запрос некоторой информации DS301 [5] от узла (win32).
./objdictgen
Графический интерфейс редактора OD (Object Dictionary editor GUI).
./objdictgen/config
Предварительно определенные профили OD (Pre-defined OD profiles).
./objdictgen/examples
Некоторые примеры/тесты OD.
./doc
Исходники документации.
Реализация CanFestival в приложении показана на диаграмме:
Интерфейсы CAN для CanFestival. Поскольку большинство контроллеров CAN и драйверов реализуют буфер FIFO, в библиотеке CanFestival отправка сообщений считается неблокирующей операцией.
Чтобы предотвратить реентрантные вызовы стека, реализация приема сообщений у микроконтроллеров и операционной системы сделана по-разному:
Микроконтроллер должен предоставить маскирование прерывания, взаимно исключающий таймер и прерывания приема CAN:
Операционная система должна предоставить поток приема, поток таймера и мьютекс. Прием CAN осуществляется как блокирующая поток операция.
Планировщик событий CanFestival. Узел CANopen должен иметь возможность выполнять откладываемые действия. Например, периодическая выдача пакетов синхронизации (SYNC), генерация heartbeat или отслеживание таймаута SDO требует установки некоторых запланированных действий ("будильник", alarm), которые будут выполнены позже, в нужный момент.
Обычно у микроконтроллера нет достаточного количества свободных таймеров, чтобы непосредственно обслужить все функции CANopen. Кроме этого внутренние данные CanFestival могут быть повреждены реентрантными вызовами.
Для решения подобных проблем в CanFestival реализован специальный планировщик (micro-scheduler, модуль timer.c). Он использует только 1 таймер для симуляции нескольких таймеров, что обслуживает таблицу alarm и вызывает alarm-ы в нужное время.
Планировщик может обработать короткие интервалы времени с учетом ограничений, накладываемых аппаратурой таймера используемого микроконтроллера. В качестве примера: если счетчик таймера имеет разрядность 16 бит, и тактирование таймера происходит с периодом 4 мкс, то предельный интервал времени счета составит 0.26 секунд. Следовательно, длинные интервалы (long alarm) должны быть обработаны по частям.
Диаграмма выше иллюстрирует длинный интервал времени (Alarm A) и короткие периодические интервалы (Период Alarm B), где значение интервала времени A > предельного интервала времени таймера (диапазон счета) > значения интервала времени B. Значения t0 .. t8 соответствуют значениям параметров идущих друг за другом вызовов setTimer. t1 показывает промежуточный вызов TimeDispatch, что делает формируемый интервал дольше, чем диапазон счета таймера. На формировании длинного интервала времени по окончании t1 вызов TimeDispatch не приведет к вызову callback-функции, соответствующей срабатыванию alarm.
Компиляция и инсталляция. Вызовите ./conigure -help чтобы посмотреть доступные опции времени компиляции. После запуска команды ./conigure с опциями командной строки, относящимися к определенной платформе, просто выполните команду make.
./configure [список необходимых опций]
make
make install
[Узел CANopen для стандартной Linux]
./configure --timers=unix
Чтобы запустить узел CANopen на компьютере под управлением Linux, Вам потребуется:
1. Рабочий дистрибутив Linux. 2. Один или большее количество интерфейсов Peak system PC CAN, и установленный драйвер Peak Linux последней версии.
[Узел CANopen для Real-Time Linux]
Для Linux Xenomai:
./configure --timers=xeno
Для Linux Rtai:
./configure --timers=rtai
Чтобы запустить узел CANopen на компьютере PC под управлением Linux, Вам понадобятся:
1. Рабочий дистрибутив Linux с установленным патчем XENOMAI (2.1 или более новым) или RTAI (3.6). 2. Один или несколько интерфейсов Peak system PC CAN, и установленный драйвер Peak Real Time Linux последней версии.
[Узел CANopen на Linux, работающий на уровне ядра]
Чтобы запустить узел CANopen на компьютере PC под управлением Linux, работающий в kernel space, Вам понадобятся:
1. Рабочий дистрибутив Linux, собранный из 2.6.x.x kernel sources. 2. Драйвер карты CAN, совместимый с CanFestival.
[Устройства CAN]
Настоящий момент поддерживаемые устройства CAN и соответствующая опция скрипта conigure:
Peak systems
./configure --can=peak_linux
Интерфейс PeakSystems CAN автоматически выбирается как интерфейс CAN по умолчанию, если в системе присутствует библиотека libpcan. Загрузите драйвер с сайта http://www.peak-system.com/linux, и следуйте инструкциям по установке драйвера в Вашей системе.
Socket-Can (http://socketcan.berlios.de)
./configure --can=socket
Serial
./configure --can=serial
Драйвер CAN serial реализует последовательное соединение 1:1 между 2 устройствами CAN. Например, Вы можете соединить 2 приложения CANFestival через кабель NULL modem.
Также с этим драйвером поставляется программный хаб, с помощью которого можно соединить друг с другом до 16 приложений CANFestival, работающих на одном компьютере PC, с опциональным соединением с другим драйвером CAN. Имейте в виду, что настоящий момент поддерживается только драйвер serial. Этот хаб использует ptys (pseudo ttys), доступный на системах *nix.
LinCan
./configure --can=lincan
Виртуальные интерфейсы CAN (для теста/отладки)
./configure --can=virtual
или, для работы в kernel space:
./configure --can=kernel_virtual
Виртуальный интерфейс CAN использует каналы Unix (pipes) для эмуляции виртуальной сети CAN. Каждое сообщение, выданное из узла, повторяется для всех других узлов. Сейчас это функционирует только с узлами, работающими в одном процессе, и не поддерживается работа в системах Xenomai или RTAI.
VScom
./configure --can=vscom
После выдачи этой команды архив VSCAN API будет автоматически загружен и распакован (требуется unzip). Список доступных поддерживаемых адаптеров см. на сайте www.vscom.de.
[Службы LSS]
Canfestival опционально поддерживает службы LSS, но они должны быть разрешены на этапе конфигурирования, с последующей компиляцией.
./configure --enable-lss
Дополнительно может быть разрешена служба FastScan LSS.
[Код, работающий в пространстве пользователя (User space)]
Установленный пакет CanFestival предоставляет пример /example/TestMasterSlave.
TestMasterSlave. Библиотекой драйвера CAN является libcanfestival_can_virtual.so., которая будет просто передавать сообщения CAN через каналы Unix между узлами Master и Slave.
Вы также можете указать другой интерфейс CAN и определить некоторые порты CAN. Другой пример использует интерфейс Peak dual PCMCIA (конфигурируется и устанавливается с опцией --can=peak):
Если службы LSS разрешены, то также будет установлен пример в /example/TestMasterSlaveLSS. Это работает так же, как и TestMasterSlave, кроме факта, что здесь 2 узла без допустимых идентификаторов nodeID, чтобы взаимодействие узлов могло быть настроено службами LSS. Если опционально разрешена служба FastScan, то этот пример будет использовать её.
[Код, работающий в режиме ядра (Kernel space)]
example/kerneltest. Этот пример базируется на TestMasterSlave, и имеет тот же функционал. Здесь также по умолчанию используется виртуальный драйвер CAN. После успешной инсталляции Вы можете вставить модуль, если введете команду:
modprobe canf_ktest
Управление модулем осуществляется через простую консоль 'canf_ktest_console' которая используется для запуска/остановки отправки данных.
[Целевые системы Windows]
Библиотека CanFestival может быть скомпилирована и запущена на платформе Windows. Для этого можно использовать как среду выполнения кода Cygwin, так и традиционную win32.
Как устанавливать Object Dictionary Editor GUI, см. раздел "Использование Object Dictionary Editor GUI".
Cygwin должен быть установлен со следующими пакетами:
1. gcc 2. unzip 3. wget 4. make
В настоящий момент поддерживаются только устройства CAN компании PeakSystems с драйвером и библиотекой PcanLight. Поэтому кроме установленной системы Cygwin потребуется драйвер для устройства Peak CAN. Загрузите драйвер с сайта http://www.peak-system.com/themen/download_gb.html и следуйте инструкциям по установке на Вашей системе.
[Конфигурирование и компиляция Cygwin]
Откройте терминал Cygwin и выполните следующие действия:
a) Один узел с PcanLight и адаптером Peak CAN-USB adapter. Загрузите zip-файл PCAN-Light для Вашего оборудования:
wget http://www.peak-system.com/files/usb.zip
Распакуйте содержимое этого загруженного архива в домашний каталог (cygwin home), это создаст директорию Disk:
unzip usb.zip
Сконфигурируйте CanFestival3, предоставив путь на желаемую реализацию PcanLight:
cd CanFestival -3
export PCAN_INCLUDE=~/Disk/PCAN-Light/Api/
export PCAN_HEADER=Pcan_usb.h
export PCAN_LIB=~/Disk/PCAN-Light/Lib/Visual\ C++/Pcan_usb.lib
./configure --can=peak_win32
make
Чтобы провести тест, у Вас должен быть другой узел CanFestival, подключенный кабелем CAN.
Во время конфигурации требуется минимальная инсталляция Cygwin, чтобы создать специфические файлы заголовков (config.h и cancfg.h). Как только эти файлы созданы, больше cygwin не нужен.
Файлы проекта и решения (solution) были созданы и протестированы в среде Visual Studio Express 2005. Убедитесь, что у Вас установлен Microsoft Platform SDK, как это рекомендуется после завершения установки Visual Studio.
Конфигурация с помощью cygwin. Следуйте инструкциям "Конфигурирование и компиляция Cygwin" из врезки "Среда CYGWIN", но не вызывайте make и не делайте тесты, просто выполните шаги конфигурирования. Эти шаги создадут заголовочные файлы в соответствии с Вашими параметрами конфигурации для необходимой аппаратуры CAN.
Компиляция в Visual Studio. Вы можете либо загрузить отдельный файл проекта "*.vcproj", либо загрузить предоставленный проект решения CanFestival-3.vc9.sln (для Visual Studio 2009) или CanFestival-3.vc10.sln (для Visual Studio 2010). Сначала выполните сборку проекта CanFestival-3.
1>------ Перестроение всех файлов начато: проект: CanFestival-3, Конфигурация: Debug Win32 ------
1>Сборка начата 31.05.2017 15:16:01.
1>_PrepareForClean:
1> Файл "Debug\CanFestival-3.lastbuildstate" удаляется.
1>InitializeBuildStatus:
1> Создание "Debug\CanFestival-3.unsuccessfulbuild", так как было задано "AlwaysCreate".
1>ClCompile:
1> win32.c
1> timers_win32.c
1> timer.c
1> sync.c
1> states.c
1> sdo.c
1> pdo.c
1> objacces.c
1> nmtSlave.c
1> nmtMaster.c
1> lss.c
1> lifegrd.c
1>c:\asm\canfestival-3-8bfe0ac00cdb\src\lifegrd.c(231): warning C4550: вычисление выражения
дает функцию, в которой отсутствует список аргументов
1> emcy.c
1> dcf.c
1>c:\asm\canfestival-3-8bfe0ac00cdb\src\dcf.c(106): warning C4101: node: неиспользованная
локальная переменная
1> Создание кода...
1>Link:
1> Создается библиотека Debug\CanFestival-3.lib и объект Debug\CanFestival-3.exp
1> CanFestival-3.vc10.vcxproj -> C:\asm\CanFestival-3-8bfe0ac00cdb\Debug\CanFestival-3.dll
1>FinalizeBuildStatus:
1> Файл "Debug\CanFestival-3.unsuccessfulbuild" удаляется.
1> Обращение к "Debug\CanFestival-3.lastbuildstate".
1>
1>Построение успешно завершено.
1>
1>Затраченное время: 00:00:04.54
========== Перестроение всех: успешно: 1, с ошибками: 0, пропущено: 0 ==========
a) PcanLight и проект can_peak_win32 project. Выбранные файлы библиотек Pcan_xxx.lib и иногда Pcan_2xxx.lib должны быть добавлены в проект can_peak_win32 перед сборкой DLL.
Тестирование: скопируйте иногда необходимые библиотеки (например Pcan_Nxxx.lib) в директорию Release или Debug, и запустите программу теста:
Загрузите MSYS по ссылке from : http://sourceforge.net/project/showfiles.php?group_id=2435:
1. MSYS-1.0.10.exe. 2. MinGW-5.1.3.exe. 3. mingwPORT (в котором содержится wget-1.9.1).
Загрузите драйвер по ссылке http://www.peak-system.com/themen/download_gb.html и следуйте инструкциям для установки драйвера в Вашей системе. Требуется установка MSYS, MingW и драйвера для Вашего устройства Peak CAN. Откройте терминал MSYS, и выполните следующие действия:
• Распакуйте wget-1.9.1-mingwPORT.tar.bz2. • Скопируйте wget.exe в c:\msys\1.0\bin\. • Запустите MSYS, и проверьте, что файл /etc/fstab содержит строку c:/MinGW /mingw.
Конфигурирование и компиляция MSYS. Инструкции для компиляции почти те же самые, как были для CYGWIN.
a) Один узел с PcanLight и адаптером Peak CAN-USB. Загрузите zip-файл PCAN-Light для Вашей аппаратуры:
wget http://www.peak-system.com/files/usb.zip
Распакуйте его содержимое в домашний каталог (MSYS home), это создаст директорию Disk:
unzip usb.zip
Сконфигурируйте CanFestival3, предоставив путь до нужной реализации PcanLight:
cd CanFestival-3
export PCAN_INCLUDE=~/Disk/PCAN-Light/Api/
export PCAN_HEADER=Pcan_usb.h
export PCAN_LIB=~/Disk/PCAN-Light/Lib/Visual\ C++/Pcan_usb.lib
./configure --can=peak_win32
make
Для проверки у Вас должен быть другой узел CanFestival, подключенный кабелем CAN.
Эти примеры тестировались на микроконтроллере MC9S12DG255, смонтированном на плате Elektronikladen HCS12 T-board.
Имейте в виду, что есть несколько различий в модуле MSCAN микроконтроллеров 68HC12 и HCS12. Для HC12 Вы должны адаптировать драйвер, который разработчики предоставили для HCS12. Описание различий MSCAN HC12/HCS12 см. апноут AN2011/D от Motorola.
Опция configure:
--target=hcs12
Чтобы запустить узел CANopen на микроконтроллере Motorola MC9S12DP256, Вам нужно:
1. Компилятор GNU gcc для HC11, HC12, HCS12: m6811 -elf. Загрузите релиз 3.1 по ссылке http://m68hc11.serveftp.org/m68hc11_pkg_rpm.php. 2. Плата, на которой установлен этот чип. Разработчики использовали T-board от Electronikladen. 3. Как минимум 40 килобайт памяти программ. 4. Инструментарий для прошивки памяти (разработчики использовали дорогой отладчик Lauterbach).
Запуск узла HCS12. Скомпилируйте Canfestival:
./configure --target=hcs12
Войдите в папку примера HCS12 и запустите команду:
make all
Прошивка памяти. Используйте для этого то, что Вам больше подходит, например загрузчик. Если у Вас есть debugger Lauterbach, то можете загрузить файл bash: trace32_flash_programmer.cmm. Он непосредственно загрузит elf-файл.
Подключение к консоли RS232. Подключите portS(TxD0) HCS12 к консоли, сконфигурированной на 19200 бод, 8N1, через чип MAX232, чтобы привести в соответствие электрические уровни сигналов. На Linux можно использовать утилиту minicom. Подключение консоли полезно для чтения сообщений, но это не требуется.
Подключение к сети CAN. Подключите порт CAN0 (выводы PM0, PM1) к сети через контроллер CAN. На плате разработчиков в качестве контроллера CAN использовался чип PCA82C250. Для запуска узла нажмите кнопку сброса на Вашей плате HCS12.
[Примеры и тест-программы]
Папка examples содержит некоторые тестовые программы, которые Вы можете использовать в качестве примеров для своих собственных разработок.
Этот пример предоставляет узел, который может выполнять некоторые команды пользователя, введенные через stdin. С этим примером Вы можете:
1. Просканировать сеть (сбросить все узлы, и отобразить сообщение bootup узла). 2. Запустить (start) / остановить (stop) / сбросить (reset) дальний узел сети. 3. Получить информацию по дальнему узлу сети. 4. Прочитать / записать определенный элемент дальнего узла сети.
Узел может быть запущен как master или как slave. Отличие только в том, что когда запуск осуществлен как master, все узлы сети сбрасываются.
Первой командой должна быть команда "load". Для подсказки по командам выполните команду help, отобразится следующий экран:
****************************************************************************
* CANOpenShell *
* *
* ОБЯЗАТЕЛЬНАЯ КОМАНДА (должна быть первой) *
* load#CanLibraryPath,channel,baudrate,nodeid,type (0:slave, 1:master) *
* *
* СЕТЬ: (если nodeid=0x00, то broadcast) *
* ssta#nodeid : запуск узла *
* ssto#nodeid : остановка узла *
* srst#nodeid : сброс узла *
* scan : сброс всех узлов и печать сообщения, когда произошел bootup узла *
* wait#seconds : заснуть на n секунд *
* *
* SDO: (размер в байтах) *
* info#nodeid *
* rsdo#nodeid,index,subindex : прочитать sdo *
* ex : rsdo#42,1018,01 *
* wsdo#nodeid,index,subindex,size,data : записать sdo *
* ex : wsdo#42,6200,01,01,FF *
* *
* Примечание: все числа указываются в hex *
* *
* help : будет отображен этот экран *
* quit : выход из приложения *
****************************************************************************
Пример минимальной команды запуска (запуск узла как slave c номером узла nodeid 8, скорость 125K на канале 32):
./CANOpenShell load#libcanfestival_can_peak_linux.so,32,125K,8,1 \
help \
wait#5 \
wsdo#42,6200,01,01,FF
Эта команда запустит узел в режиме master с номером узла 8 на скорости 125K канала 32, отобразит меню подсказки, подождет 5 секунд для NMT bootup узла, и запишет значение FF по индексу 6200, субиндексу 01 в дальний узел сети с идентификатором 42.
Это простой пример для запуска на компьютере PC. Реализует 2 узла CANopen в одном и том же процессе, master и slave. Оба узла осуществляют взаимодействие друг с другом, периодически обмениваясь сообщениями NMT, SYNC, SDO и PDO. Master конфигурирует генератор сердцебиений (heartbeat producer) с интервалом 1000 мс для slave node-id 0x02 с помощью краткого DCF.
**************************************************************
* TestMasterSlave *
* *
* A simple example for PC. It does implement 2 CanOpen *
* nodes in the same process. A master and a slave. Both *
* communicate together, exchanging periodically NMT, SYNC, *
* SDO and PDO. Master configure heartbeat producer time *
* at 1000 ms for slave node-id 0x02 by concise DCF. *
* *
* Usage: *
* ./TestMasterSlave [OPTIONS] *
* *
* OPTIONS: *
* -l : Can library ["libcanfestival_can_virtual.so"] *
* *
* Slave: *
* -s : bus name ["0"] *
* -S : 1M,500K,250K,125K,100K,50K,20K,10K,none(disable) *
* *
* Master: *
* -m : bus name ["1"] *
* -M : 1M,500K,250K,125K,100K,50K,20K,10K,none(disable) *
* *
**************************************************************
Замечания по поводу использования сокращенного DCF: в этом примере master конфигурирует время 1000 мс heartbeat producer для подчиненного узла с идентификатором 0x02 по сокращенному DCF в соответствии с профилем DS-302. Индекс 0x1F22, sub-индекс 0x00 master OD соответствует количеству элементов. Оно равно максимальному возможному nodeId (127). Sub-индекс указывает на Node-ID устройства, которому принадлежит конфигурация.
Для добавления большего количества параметров конфигураций slave, значение sub-индекса 0x02 должно быть двоичным потоком данных (little-endian) со следующей структурой:
(UNS32) количество записей (UNS16) индекс параметра 1 (UNS8) sub-индекс параметра 1 (UNS32) размер данных параметра 1 (DOMAIN) данные параметра 1 (UNS16) индекс параметра 2 (UNS8) sub-индекс параметра 2 (UNS32) размер данных параметра 2 (DOMAIN) данные параметра 2 .... (UNS16) индекс параметра n (UNS8) sub-индекс параметра n (UNS32) размер данных параметра n (DOMAIN) данные параметра n
Таким образом, этот двоичный поток данных для конфигурирования времени heartbeat producer должен быть следующим:
0100000017100002000000e803
Узел slave конфигурируется сразу перед входом Master в состояние Pre_operational.
Пример основан на TestMasterSlave, который был незначительно модифицирован для удовлетворения требований по работе на уровне ядра. Все работает так же, как и TestMasterSlave, но сообщения отправляются на уровне ядра (например, они отображаются командой dmesg). Пример разработан как внешний модуль ядра, реализованный как символьное устройство. Имеется shell-скрипт insert.sh, который вставляет модуль и создает новый файл устройства /dev/canf_ktest (используется для отправки команд в модуль). Для реальной отправки команд Вы можете использовать простую консоль с именем 'canf_ktest_console'. Этот модуль зависит от другого отдельного модуля canfestival.ko, где реализован стек CanOpen с требуемыми экспортируемыми функциями. Модуль canfestival.ko зависит от модуля драйвера карты CAN, по умолчанию будет загружен виртуальный драйвер CAN. После установки модулей (командой make install) все зависимости автоматически разрешаются ядром. Для запуска примера введите команду:
sh run.sh
Этот скрипт запустит требуемые модули, отобразит консоль, и при выходе из консоли удалит модули из ядра.
FastScan это специальная служба LSS, которая позволяет динамически идентифицировать slave-узлы, даже если у них нет допустимых nodeID. Эта идентификация основана на адресе LSS, составленном по идентификатору производителя (vendor ID), коду изделия (product code), номеру ревизии (revision number) и серийному номеру (serial number). Для дополнительной информации см. документ DS305.
Адрес LSS может быть известен частично либо полностью неизвестен. Чтобы представить этот факт в Canfestival, разработчики использовали структуру lss_fs_transfer_t. Параметр FS_LSS_ID это массив из 4 элементов, где представлены эти 4 составляющих адреса LSS. Другой параметр FS_BitChecked это также массив, и он представляет информацию о том, как много бит в каждом элементе адреса LSS не известны (UNKNOWN). Следующий пример взят из TestMasterSlaveLSS, где не известны только последние 2 цифры (8 бит) vendor ID и product code, и полностью не известны revision number и serial number.
lss_fs_transfer_t lss_fs;
/* VendorID и ProductCode частично неизвестны,
кроме последних 2 цифр (8 бит). */
lss_fs.FS_LSS_ID[0]=Vendor_ID;
lss_fs.FS_BitChecked[0]=8;
lss_fs.FS_LSS_ID[1]=Product_Code;
lss_fs.FS_BitChecked[1]=8;
/* serialNumber и RevisionNumber неизвестны,
например неизвестны 8 цифр (32 бита). */
lss_fs.FS_BitChecked[2]=32;
lss_fs.FS_BitChecked[3]=32;
res=configNetworkNode(&d,LSS_IDENT_FASTSCAN,&lss_fs,0,CheckLSSAndContinue);
[Разработка нового узла]
Хорошей идеей будет использовать предоставленные примеры как базу для Вашего нового узла. Также Вы можете использовать предоставленные файлы *.od как базу для словаря объектов (OD) Вашего нового узла.
Создание нового узла CANopen подразумевает определение словаря объектов (Object Dictionary, OD) этого узла. Для этой цели разработчик должен предоставить C-файл. Этот файл содержит определение всех записей (элементов) словаря, некоторую таблицу индексов, которая помогает стеку получить прямой доступ к некоторым записям словаря.
Использование Object Dictionary Editor GUI. Object Dictionary Editor это графический интерфейс Phyton-приложения на основе библиотеки WxPython, используемый для создания C-файла, необходимого для создания нового узла CANopen.
Установите среду Python (как минимум версии 2.4, я устанавливал Python 2.7) и библиотеку wxPython (как минимум версии 2.6.3.2, я устанавливал wxPython3). Пользователи Cygwin могут установить утилиты Gnosis XML таким же способом, как и в Linux. Просто вызовите make.
cd objdictgen
make
Другим пользователям потребуется загрузить и установить Gnosis XML вручную. Загрузите последнюю версию по ссылкам:
Примечание: я скачал по первой ссылке архив gnosisXML.zip, и распаковал оттуда папку gnosis в каталог C:\Python27\Lib\. Установка Gnosis XML на этом завершена.
Загрузите архив CanFestival и распакуйте его. Используйте Проводник (Windows File Explorer), чтобы перейти в каталог CanFestival3\objdicgten, и выполните двойной клик на objdictedit.py. Откроется графический интерфейс, где Вы можете создавать новые и редактировать готовые словари OD. Файлы словарей хранятся в файлах с расширением *.od, также их можно экспортировать в файлы *.eds.
[Проблемы запуска Object Dictionary editor GUI]
К сожалению, мне не удалось запустить редактор (скрипт objdictedit.py) с последней на момент написания статьи версией Python (python-3.6.1) и библиотеки wxPhyton (wxPython-4.0.0a1-cp36) - из-за значительных изменений в синтаксисе языка. Для Phyton это обычное дело... Пришлось подбирать версии, и удалось запустить скрипт редактора на Phyton 2.7.13 (python-2.7.amd64.msi) и wxPhyton 3.0 (wxPython3.0-win64-3.0.2.0-py27.exe), см. архив [4].
1. Ошибка "ImportError: No module named 'wx'" - не установлена библиотека wxPython. Решение: установите библиотеку wxPython.
2. Ошибка "ImportError: No module named '__version__'" - проблема с несоответсвиями версий Python и библиотеки wxPython. Решение: установите Phyton 2.7 и wxPhyton 3.0, правильно настройте пути запуска в переменной окружения %Path%. Определите переменные окружения PYTHONHOME и PYTHONPATH, настроенные на корневой каталог Python и папку Lib, например вот так:
PYTHONHOME C:\Python27 PYTHONPATH C:\Python27\Lib
3. Ошибка "ImportError: No module named gnosis.xml.pickle" - не установлена библиотека Gnosis XML. Решение - установите эту библиотеку для Phyton. Я устанавливал из пакета gnosisXML.zip (см. архив [4]).
Главное окно OD editor. Редактор использует шаблон типа Model-View-Controller. Верхняя часть окна содержит список, в котором Вы можете выбрать секцию словаря. Нижняя левая часть окна показывает список выбранного индекса в этом словаре, а правая нижняя часть перечисляет редактируемые sub-индексы.
Создание нового узла. Выберите в меню File -> New, откроется окно диалога "Create a new Node". В выпадающем списке Type: выберите тип создаваемого устройства, master (главный узел сети) или slave (подчиненный узел). В появившемся окне диалога введите имя узла (поле ввода Name:), например MyMaster. В выпадающем списке Profile: выберите желаемый профиль устройства (если пока не разбираетесь, что это такое, то для подчиненного устройства выберите простейший вариант DS-401, это обычное устройство ввода/вывода). Для устройства master выберите None. Поле ввода Description не обязательное, его можно оставить пустым, либо добавить туда произвольную строку описания.
В правой части окна диалога имеются галочки, настраивающие дополнительные функции:
Network Management: здесь радиокнопками выбирается поддержка протокола NMT для управления сетью. Если используется NMT, то выберите Node Guarding или Heartbit (чаще используется Heartbit), иначе оставьте вариант None.
Options: DS-302 Profile. Эта галочка разрешает поддержку программируемых устройств CANopen (управление процедурой загрузки, устройства с модифицируемым хранилищем информации EDS и DCF). В простых случаях эта опция не нужна.
Options: Generate SYNC. Разрешает генерацию пакетов синхронизации. Если не знаете, что это, то галочку не ставьте.
Options: Emergency support. Разрешает поддержку оповещений о событиях ошибок (аварий). В простых случаях эту галочку можно не ставить.
Options: Save Configuration. По идее эта опция должна разрешать устройству сохранять изменения своей конфигурации в энергонезависимой памяти. В моем редакторе эта опция почему-то всегда была серенькой и не выбранной (включить её нельзя).
Закончив редактирование опций диалога, кликните OK.
Редактирование узла. Меню Edit позволяет отредактировать основную информацию описания узла (Node infos) и профили узла.
Примечание: к сожалению, пункт меню "Node infos" у меня по непонятной причине не работал из-за ошибки или в скрипте Python, или в библиотеке wxPython "Assert failure" failed at ..\..\src\common\sizer.cpp(1401) in wxGridSizer::DoInsert(): too many items ...".
Можно отредактировать профиль устройства, например DS-401 (профиль стандартного устройства ввода-вывода):
Меню Add позволяет добавить объекты PDO и SDO, а также типы переменных пользователя, задавать их предельные значения. Для строк можно задавать предельную длину строки.
Отображение переменных. Добавьте в словарь OD свои объекты и отображенные на них переменные приложения.
Сборка OD. Теперь все готово для генерации словаря объектов. Можно подготовить словарь в виде модуля (файлы *.c/*.h) для исходного кода, который Вы подключите к проекту узла, и также в виде файла описания электронного устройства *.EDS, который можно загрузить как описание узла в мастер сети CANopen.
Модуль на языке C генерируется пунктом меню File -> Build Dictionary, в результате появятся два файла с расширениями *.c и *.h (если файл проекта назывался MyMaster, то файлы получат имена MyMaster.c и MyMaster.h). Соответствующий EDS-файл генерируется пунктом меню File -> Export to EDS file.