В этой статье мы рассмотрим три разных программных стека EtherCAT Master. Для каждого варианта и подхода, мы посмотрим на их преимущества и недостатки, главные различия между ними. Для сравнения мы возьмем коммерческое решение от Визутех Систем - VS EtherCAT Master, и две реализации с открытым исходным кодом: IgH EtherCAT-Master® как часть EtherLab® от IgH и Simple Open EtherCAT Master (SOEM) от rt-labs.
Все три стека доступны в виде исходного кода и могут быть скомпилированы для разных операционных систем и архитектур процессора с большими или меньшими затратами. Однако, давайте перейдем к результатам, которые мы получили...
Компания Визутех Систем была основана в 1998 году и с 2012 года является участником EtherCAT Technology Group (ETG) – международной ассоциации пользователей и разработчиков технологии EtherCAT. Компания стала одним из ведущих экспертов по данной технологии и предлагает для нее свою линейку программных продуктов, включающую VS EtherCAT Master, основанный на ETG.1000 EtherCAT Specification.
Со временем, к функционалу EtherCAT Master добавились Кабельное резервирование, Горячее подключение и другой полезный функционал.
За годы разработки EtherCAT Master был адаптирован под множество операционных систем, архитектур процессоров и Ethernet контроллеров. За это время Визутех Систем приобрела глубокие знания в области EtherCAT технологии и приложений реального времени. Пользователи EtherCAT Master ценят отзывчивость и знания команды Визутех Систем, когда речь идет об устранении неполадок, поддержке и поиске новых решений сложных проблем.
Основным языком разработки EtherCAT Master является С++, но используется также Программные Интерфейсы Приложения (APIs) для C/C++, C# и Python.
Основную техническую поддержку по продукту оказывают сотрудники и члены команды Визутех Систем. Кроме того, многочисленные клиенты по всему миру вносят свой вклад в улучшение исходного кода, регистрируя ошибки, проблемы и предлагая решения некоторых из них.
Существует два основных типа лицензирования. Продукт может быть приобретён в виде библиотеки или как исходный код. Лицензия привязывается к определенному оборудованию, операционной системе и архитектуре процессора. Обычно, покупатель начинает работать с пробной версией продукта, а затем, покупает лицензионную версию Master Development Kit (MDK). После того как клиент разработал и внедрил свое приложение, он может докупать лицензии для работы в реальном времени и техническую поддержку и обслуживание для получения квалифицированной помощи и обновлений.
Компания Ingenieurleistungen GmbH (IgH) была основана в 1995 году и уходит корнями в сферу гидравлики. Спустя годы они продолжили участвовать во множестве специальных проектов, связанных с механикой и электромеханикой. Кроме того, IgH попала в число членов ETG в пресс-релизе в марте 2004 года. Первая версия IgH EtherCAT Master® как части пакета EtherLab® была выпущена в августе 2006 и уже включала поддержку отправки аппликационных данных CAN протокола через EtherCAT (СоЕ) и Ethernet данных через EtherCAT (ЕоЕ). Последняя версия 1.5.2.0 была выпущена в 2013 с тех пор в программе не было изменений.
IgH EtherCAT Master® сопровождается подробной документацией, которая включает и описание архитектуры.
IgH EtherCAT Master® реализован как модуль Линукс ядра с поддержкой расширений Линукс для работы в реальном времени, например, Preempt RT. IgH EtherCAT Master® привязан к операционной системе Линукс и написан на языке С.
Одно отличие было замечено в работе этого EtherCAT Master стека, в том, что нецикличные (сервисные) данные упаковываются в циклические фреймы. Это влияет на время цикла, с которым сталкиваются некоторые слейвы, особенно когда время расходуется на получение фрейма.
С момента выпуска первой версии, Флориан Поуз из IgH отвечает за практически все изменения (>90%) в этом стеке. Трудолюбие и настойчивость Флориана заслуживают восхищения, и при этом он не умаляет вклада других участников.
Исходный код предоставляемый IgH лицензируется под версию 2 GNU General Public License (GPLv2). Поэтому необходимо уточнить, что пользователю данного программного продукта может также потребоваться распространять исходный код любых производных работ.
Компания Flanders Mechatronics Technology Centre (FMTC) решила сделать свою реализацию EtherCAT master (известную как EtherCAT master библиотека (EML)) общедоступной в 2006. Согласно информации в Интернете, SOEM уходит корнями к EML от FMTC. Она была написана и тестировалась на операционной системе eCos. В некоторых источниках автором исходных файлов называется Артур Кетелс из Speciaal Machinefabriek Ketels v.o.f. Также, в лицензионном файле указан TU/e Technische Universiteit Eindhoven.
SOEM написан на языке С и “из коробки" он работает как пользовательское приложение. Для работы с ОС и Ethernet адаптерами используется два интерфейса. Эти интерфейсы зависят от ОС и интерфейса сетевого адаптера и могут быть реализованы в виде около 700–1000 строк кода. Доступны адаптации для разных операционных систем и сетевых адаптеров (смотрите также Поддерживаемые операционные системы).
Похоже, что данная реализация поддерживается и обслуживается в основном сотрудниками rt-labs и Артуром Кетелс. Последняя версия 1.4.0 была выпущена в июле 2019.
Подобно IgH EtherCAT Master®, SOEM тоже лицензируется под GPLv2, однако с особым исключением которое позволяет компилировать его вместе с кодом приложения без необходимости делиться производной работой с сообществом работающим с открытыми исходными кодами. rt-labs также предлагает платную коммерческую лицензию на каждый продукту/проект. Не очень понятно, в чем разница между бесплатной и коммерческой версиями, хотя похоже, что коммерческая лицензия включает некоторую техническую поддержку и обслуживание.
В таблице ниже мы сравниваем какие операционные системы (ОС) поддерживают рассматриваемые EtherCAT программные стеки. Среди ОС есть операционные системы реального времени (RTOS) и не RTOS.
Так как все три стека доступны в виде исходного кода, то в принципе, с большими или меньшими затратами, возможно адаптировать их под любую ОС. Поэтому, мы акцентируем внимание на то, что доступно прямо “из коробки" на данный момент.
Так как мы не можем скомпилировать каждый стек для каждой ОС, мы доверяем тому, что указано в документации и что мы видим в исходном коде.
Таблица 1: Поддерживаемые ОС
Stack\OS | ERIKA | FreeRTOS | INTEGRITY | Linux | Xenomai2 | Xenomai3 | MAC OS | QNX6 | QNX7 | QNX7.1 | RTEMS | VxWorks6.8 | VxWorks6.9 | VxWorks7.0 | RTX64 | INtime6 | Windows | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
VS EtherCAT Master | + | + | + | + | + | + | + | + | + | + | + | + | + | + | 14 | |||
IgH EtherCAT Master | + | + | + | 3 | ||||||||||||||
SOEM | + | + | + | + | + | + | + | 7 |
VS EtherCAT Master поддерживает 14 ОС; IgH EtherCAT Master® - 3 и SOEM - 7.
Важно отметить, что количество ОС поддерживаемых VS EtherCAT Master и их список - не окончательны. Также отметим, что только SOEM стек поддерживает Erika Enterprise RTOS.
Таблица 2: Функционал EtherCAT Master (ETG.1500)
Функция | Краткое описание | ETG.1500 | VS EtherCAT Master | IgH EtherCAT Master | SOEM |
---|---|---|---|---|---|
Базовый функционал | |||||
Сервисные команды | Поддержка всех команд | Обязательно, если поддерживается импорт ENI | + | + | +2 |
IRQ поле в датаграмме | Использование IRQ информации от ведомого устройства в заголовке датаграммы | Рекомендовано | + | - | - |
Ведомые устройства с эмуляцией устройства | Поддержка ведомых устройств с/без контроллера | Обязательно | + | + | + |
Машина состояний EtherCAT (ESM) | Поддержка особенностей поведения ESM | Обязательно | + | + | + |
Обработка ошибок | Проверка ошибок в сети или на ведомом устройстве | Обязательно | + | +3 | +3 |
VLAN | Поддержка VLAN разметки | Опционально | + | - | - |
Типы EtherCAT фрейма | Поддержка EtherCAT фреймов | Рекомендовано | + | + | + |
Типы UDP фрейма | Поддержка UDP фреймов | Опционально | + | - | - |
Обмен данными процесса | |||||
Циклические PDO | Циклический обмен данными процесса | Обязательно | + | + | + |
Множественные задачи | Разные циклы задач Разная скорость обновления PDO |
Опционально | + | +1 | - |
Повторная отправка фреймов | Отправка циклических фреймов множество раз для усиления защищённости | Опционально | - | - | |
Настройка сети | |||||
Сканирование в режиме онлайн | Функционал Настройки сети включенный в EtherCAT Master | Хотя бы один | + | + | + |
Чтение ENI | Настройки сети из ENI файла | Хотя бы один | + | - | - |
Сравнение настроек сети | Сравнение новых и существующих настроек сети при запуске | Обязательно | + | - | - |
Явная идентификация устройства | Идентификация используемая при Горячем подключении и предотвращающая перепутывание кабелей | Рекомендовано | + | - | - |
Идентификация по статическому адресу | Поддержка заданного статического адреса (Station Alias) в ведомом устройстве | Опционально | + | + | + |
Доступ к EEPROM | Поддержка методов для доступа к EEPROM через ESC регистры | Чтение - обязательно Запись - опционально |
+ | + | + |
Асинхронный обмен данными (mailbox) | |||||
Поддержка технологии Mailbox | Основной функционал для технологии Mailbox | Обязательно | + | + | +3 |
Mailbox устойчивый уровень | Поддержка основного устойчивого уровня | Обязательно | + | - | + |
Восстановление коммуникации при потере данных | Опционально | + | - | - | |
Циклический опрос | Опрос устройств на наличие сообщения согласно заданному циклу | Опционально | + | +3 | + |
Асинхронные данные аппликационного уровня CAN через транспортный протокол (CoE) | |||||
SDO Загрузка | Нормальная и срочная передача | Обязательно | + | + | + |
Сегментированная передача | Сегментированная передача | Обязательно | + | +4 | + |
Полный доступ (complete access) | Передача всего объекта (со всеми подиндексами) за один запрос | Обязательно | + | +4 | + |
SDO информация | Службы для чтения списка объектов и их свойств | Обязательно | + | + | + |
Аварийное Сообщение | Получение аварийных сообщений | Обязательно | + | + | + |
PDO в СоЕ | PDO службы переданные через СоЕ | Опционально | - | - | + |
ЕоЕ | |||||
ЕоЕ протокол | Службы для туннелинга Ethernet фреймов, включает все указанные ЕоЕ службы | Обязательно | + | + | + |
Коммутатор | Маршрутизация Ethernet (EoE) траффика между устройствами | Обязательно | + | - | - |
Сетевой интерфейс | Интеграция в сетевой стек операционной системы | Рекомендовано | + | - | - |
FoE | |||||
FoE протокол | Поддержка FoE протокола | Обязательно | + | + | + |
Загрузка/выгрузка программно-аппаратного обеспечения | Приложение должно предоставить пароль и имя файла | Обязательно | + | + | + |
Режим прошивки | Поддержка режима прошивки для обновления программного обеспечения устройства | Обязательно | + | - | + |
SoE | |||||
SoE службы | Поддержка SoE служб | Обязательно | + | + | + |
AoE | |||||
AoE протокол | Поддержка АoE протокола | Рекомендовано | + | - | - |
VoE | |||||
VoE протокол | Поддержка пользовательского протокола | Опционально | + | + | - |
Синхронизация с распределенными часами (DC) | |||||
Поддержка DC | Поддержка синхронизации времени между устройствами | Обязательно | + | + | + |
Компенсация времени распространения сигнала | Расчет и коррекция времени распространения сигнала | Рекомендовано | + | +5 | - |
Мониторинг синхронизации | Непрерывный мониторинг разницы синхронизации на ведомых устройствах | Рекомендовано | + | +5 | - |
Коммуникация «ведомое устройство к ведомому устройству» | |||||
Через Ведущее устройство | Информация получается из ENI файла или может быть частью любой другой конфигурации сети Копирование данных может быть выполнено Master стеком или Master приложением. |
Обязательно | + | - | - |
Информация о ведущем устройстве | |||||
Библиотека объектов ведущего устройства | Поддержка Библиотека объектов ведущего устройства (ETG.5001 MDP подпрофайл 1100) | Рекомендовано | + | - | - |
1 Домен процессных данных вызванный в IgH EtherCAT Master
2 Нет поддержки APRW, FPRW, BRW
3 Базовый уровень поддержки
4 Поддержка только загрузки
5 Доступны примеры реализации
Было непросто заполнять эту таблицу для решений с открытым исходным кодом, так как практически отсутствует документация о функционале, который поддерживается, и большинство информации приходилось искать непосредственно в коде. Документация от IgH более полная чем от SOEM, при этом, документация от Визутех Систем наиболее полная.
Если IRQ поле в EtherCAT не проверяется, изменения топологии и состояние ведомого устройства не будут определены сразу. Если Ваше приложение включает, например, инструмент измерения, то это может быть проблемой для Вас.
Многие производители ведомых устройств поставляют устройства, которые требуют использования инициализационных команд CoE (“InitCmds”). Эта информация доступна только в ESI файле и не может быть вычитана из EEPROM у ведомого устройства, так как в нем обычно только значения, которые задаются по умолчанию. Если Master стек не может вычитать ESI файлы и преобразовать их в ENI файл, для таких ведомых устройств InitCmds должны быть заданы вручную, чтобы перевести их в работающее состояние (Operational state) - для каждого изменения состояния и каждой ревизии таких слейвов. Это может быть достаточно трудоемко. Подробнее, пожалуйста, смотрите в Приложении.
Поскольку мы можем сказать, что стеки с открытым исходным кодом не предоставляют возможность импортировать ENI и нет возможности установить коммуникацию между ведомыми устройствами, как следствие, они также не поддерживают Safety over EtherCAT (FSoE = FailSafe over EtherCAT). Если этот функционал обязателен или планируется использовать его в будущем в Вашем проекте, Вам следует пересмотреть свое решение об использовании стеков с открытым исходным кодом.
Таблица 3: Обработка ошибок
Проблема | Краткое описание | VS EtherCAT Master | IgH EtherCAT Master | SOEM |
---|---|---|---|---|
При запуске сети (как правило невозможно исправить) | ||||
Отсутствует конфигурации | + | -1 | -1 | |
Несоответствие на шине - Пересечение на линии | Поддержка ведомых устройств с/без контроллера | + | - | -1 |
Несоответствие на шине - отсутствуют ведомое устройство | Проверьте подключение устройства | + | -1 | -1 |
Несоответствие на шине - замена ведомого устройства | Не все устройства были определены при сканировании. проверьте правильность подключения устройств | + | -1 | -1 |
Подключение кабеля - отсутствие подключение | Проверьте подключение контроллера к сети | + | -1 | -4 |
Ошибка инициализации | Проверьте настройки ведомого устройства | + | -2 | -1 |
Проблема синхронизации времени | + | - | -2 | |
Постоянные ошибки при работе сети | ||||
Ведомое устройство перешло в более низкое состояние | Ведомое устройство будет создавать AL-Status IRQ и код ошибки AL Status | + | + | - |
Master контроллер - кабель отключен | Отключение контроллера от шины во время работы | + | + | + |
Master контроллер – переподключение кабеля | Переподключение контроллера к шине во время работы | + | + | + |
Сеть - кабель отключен | Кабель отключен или ведомое устройство без питания | + | + | + |
Сеть - кабель переподключен | Подключите кабель или включите питание на ведомом устройстве | + | + | + |
Периодические ошибки/сообщения | ||||
Потерян фрейм | + | - | -3 | |
Ошибка Работающего Счетчика (WKS) в циклических данных | + | - | -5 | |
Огромный разброс во времени Tx | + | -3 | -3 | |
DC: DCM рассинхронизирован | + | + | -2 |
1 Не "из коробки", должно быть запрограммировано вручную
2 Не поддерживаются инициализационные команды
3 Очень трудно определить
4 Ведомые устройства не найдены
5 Ведомое устройство Х потеряно
Как видно из таблицы, обработка ошибок у IgH немного лучше, чем у SOEM. Самый большой пробел у стеков с открытым исходном коде в обработке ошибок во время запуска сети.
В зависимости от ОС и других требований есть много хороших решений. Если у Вас статическая, маленькая и несложная сеть, то использование стеков с открытым исходным кодом может быть хорошим выбором. Однако, если конфигурация EtherCAT сети подвержена изменениям и/или очень сложная (включает драйвера, профайлы модулярных девайсов (MDP)) или ведомые устройства с/без разных ревизий оборудования/программ, где необходимо постоянно настраивать конфигурацию (например, PDO назначение, инициализационные команды), тогда выбирайте стек, который поддерживает импорт ENI файлов, например, VS EtherCAT Master.
Ниже Вы найдете некоторый SOEM тестовый код для инициализации PDO конфигурации привода Yaskawa Sigma. Этот примере написан для перехода из состояния Pre-Operational в Safe-OPerational. Запись PDO конфигурации на ведомое устройство такое же, как и у IgH. Все индексы, под-индексы и значения должны быть оценены, скопированы и/или рассчитаны и жестко закодированы. Отсутствует мета информация такая как комментарии к InitCmds. Очень сложно понять, что происходит, особенно в случае неправильной конфигурации и возникновения ошибок. Работать с ESI и ENI файлами очевидно более удобно. Так говорят клиенты VS EtherCAT Master. Смотрите пример кода ниже.
static int YaskawaSigmaDrivePDOConfiguration (uint16 slave) { int retval = 0; uint8 ui8Val = 0; uint16 ui16Val = 0; uint32 ui32Val = 0; ui8Val = 0; retval += ec_SDOwrite(slave, 0x1c12, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); retval += ec_SDOwrite(slave, 0x1c13, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 0; retval += ec_SDOwrite(slave, 0x1a00, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); ui32Val = 0x60410010; retval += ec_SDOwrite(slave, 0x1a00, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1617166368; retval += ec_SDOwrite(slave, 0x1a00, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1618411536; retval += ec_SDOwrite(slave, 0x1a00, 0x3, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1626603552; retval += ec_SDOwrite(slave, 0x1a00, 0x4, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1616969736; retval += ec_SDOwrite(slave, 0x1a00, 0x5, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 8; retval += ec_SDOwrite(slave, 0x1a00, 0x6, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1622736312; retval += ec_SDOwrite(slave, 0x1a00, 0x7, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1622802464; retval += ec_SDOwrite(slave, 0x1a00, 0x8, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui8Val = 8; retval += ec_SDOwrite(slave, 0x1a00, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 0; retval += ec_SDOwrite(slave, 0x1a01, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); ui32Val = 1614872592; retval += ec_SDOwrite(slave, 0x1a01, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1617166368; retval += ec_SDOwrite(slave, 0x1a01, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui8Val = 2; retval += ec_SDOwrite(slave, 0x1a01, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 0; retval += ec_SDOwrite(slave, 0x1a02, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); ui32Val = 1614872592; retval += ec_SDOwrite(slave, 0x1a02, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1617166368; retval += ec_SDOwrite(slave, 0x1a02, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui8Val = 2; retval += ec_SDOwrite(slave, 0x1a02, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 0; retval += ec_SDOwrite(slave, 0x1a03, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); ui32Val = 1614872592; retval += ec_SDOwrite(slave, 0x1a03, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1617166368; retval += ec_SDOwrite(slave, 0x1a03, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1618411536; retval += ec_SDOwrite(slave, 0x1a03, 0x3, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui8Val = 3; retval += ec_SDOwrite(slave, 0x1a03, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 0; retval += ec_SDOwrite(slave, 0x1600, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); ui32Val = 1614804056; retval += ec_SDOwrite(slave, 0x1600, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1618608160; retval += ec_SDOwrite(slave, 0x1600, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1627324448; retval += ec_SDOwrite(slave, 0x1600, 0x3, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1618018320; retval += ec_SDOwrite(slave, 0x1600, 0x4, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1618083856; retval += ec_SDOwrite(slave, 0x1600, 0x5, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1616904200; retval += ec_SDOwrite(slave, 0x1600, 0x6, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 8; retval += ec_SDOwrite(slave, 0x1600, 0x7, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1622671376; retval += ec_SDOwrite(slave, 0x1600, 0x8, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui8Val = 8; retval += ec_SDOwrite(slave, 0x1600, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 0; retval += ec_SDOwrite(slave, 0x1601, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); ui32Val = 1614807056; retval += ec_SDOwrite(slave, 0x1601, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1618608160; retval += ec_SDOwrite(slave, 0x1601, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui8Val = 2; retval += ec_SDOwrite(slave, 0x1601, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 0; retval += ec_SDOwrite(slave, 0x1602, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); ui32Val = 1614807056; retval += ec_SDOwrite(slave, 0x1602, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1627324448; retval += ec_SDOwrite(slave, 0x1602, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui8Val = 2; retval += ec_SDOwrite(slave, 0x1602, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 0; retval += ec_SDOwrite(slave, 0x1603, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); ui32Val = 1614807056; retval += ec_SDOwrite(slave, 0x1603, 0x1, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui32Val = 1618018320; retval += ec_SDOwrite(slave, 0x1603, 0x2, FALSE, sizeof(ui32Val), &ui32Val, EC_TIMEOUTSAFE); ui8Val = 2; retval += ec_SDOwrite(slave, 0x1603, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui16Val = 5633; retval += ec_SDOwrite(slave, 0x1c12, 0x1, FALSE, sizeof(ui16Val), &ui16Val, EC_TIMEOUTSAFE); ui8Val = 1; retval += ec_SDOwrite(slave, 0x1c12, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui16Val = 6657; retval += ec_SDOwrite(slave, 0x1c13, 0x1, FALSE, sizeof(ui16Val), &ui16Val, EC_TIMEOUTSAFE); ui8Val = 1; retval += ec_SDOwrite(slave, 0x1c13, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); ui8Val = 8; retval += ec_SDOwrite(slave, 0x6060, 0x0, FALSE, sizeof(ui8Val), &ui8Val, EC_TIMEOUTSAFE); while(EcatError) printf("%s", ec_elist2string()); printf("Servo slave %d set, retval = %d\n", slave, retval); return 1; }
VS EtherCAT Master
Как описано выше производители EtherCAT ведомых устройств поставляют ESI файл со своим оборудованием. Коллекция всех ESI файлов Ваших ведомых устройств описывает вашу EtherCAT сеть. Обычно с помощью EtherCAT конфигуратора с графическим интерфейсом эта коллекция файлов преобразуется в файл настройки сети (ENI). Этот ENI файл включает описание всей сети. А также много другой информации такой как команды (InitCmds) для выполнения на каждом изменении состояния каждого ведомого устройства в каждой ревизии. VS EtherCAT Master вычитывает всю эту информацию. Любое изменение состояния ведомого устройства отправляется Master стеку и из стека ведомому устройству InitCmds связанные с изменением состояния ведомого устройства, тоже отправляются к ведомому устройству. Это позволяет внедрить проверку конфигурации уже на этапе проектирования. Например, изменение ревизии ведомого устройства может привести к изменению списка доступных объектов и не соответствовать ожиданиям управляющей аппликации. Проверка на стадии инициализации шины позволяет выявить несоответствие на раннем этапе и сохраняет клиенту время и деньги.
Представленный фрагмент полностью инициализирует VS EtherCAT Master стек, включающий обработку ошибок, журнал сообщений и многое другое…
{ // declare master configurator initialization parameters PARAM_ENILOADER_ENI(ENIFile, "master.xml"); // define configuration file ENILOADER_CONFIG_DECLARE( CfgENILoader, &ENIFile); // init loader to get configuration from file PARAM_MASTER_INIT_DEPTH(Depth, MasterProcessorStateReady); // defines last initialization step (here is "here is 'Master & slaves are in the requested state'") PARAM_MASTER_ADAPTER_NO(AdapterNo, KPA_DEFAULT_ADAPTER_INDEX); // adapter index to connect to PARAM_MASTER_ON_INIT_COMPLETE(OnInitComplete, FnMasterOnInitComplete, pUserData); // callback to be used when master initialization is complete MASTER_CONFIG_DECLARE(CfgMaster, &Depth, &AdapterNo, &CfgENILoader, &OnInitComplete ); MasterProcessorStart(pUserData->hContext, &CfgMaster, &pUserData->hMaster); // process configuration KPASyncLoopMT(pUserData->hContext); // run message loop processing }