Почти у каждого контроллера, преобразователя частоты или сервопривода, а иногда даже у драйвера шагового двигателя имеется порт RS485 с Modbus или аналогичным протоколом на борту со всеми плюсами в виде простоты и минусами в виде скорости передачи информации и невозможностью обеспечить более сложные процессы взаимодействия.
Рассмотрим следующий по доступности и востребованности протокол - CAN, точнее его реализацию CANopen (кстати DeviceNet - это тоже реализация CAN, а еще профиль устройства CANopen может быть реализован поверх другого транспортного протокола, например EtherCAT, что собственно и можно увидеть на сервоприводах Delta Electronics).
Первое беглое представление о стандарте CANopen можно (а возможно даже нужно) получить в Википедии или ином источнике, где можно посмотреть какие-то общие моменты, здесь я это описывать не стану, но постараюсь расставить акценты. Если оставить временно в стороне вопросы общего характера, такие как количество узлов сети, уникальность номеров, описание самого физического уровня со всеми принципами доминантности, правила формирования COBID итд итп тк многое уже реализовано на уровне программного обеспечения, с практической точки зрения нас должны интересовать следующие: CANopen разработан как надстройка, работающий поверх физического протокола CAN (Controller Area Network), то есть для организации сети не забываем про терминальный резистор 120 Ом, документ The CANopen Application Layer and Communication Profile (CiA Draft Standard 301 или просто DS 301) представляет собой основной документ, в котором описаны основные положения и принципы работы CANopen, соответственно DS 301 выбирается в качестве настройки связи, если конечно это не обеспечено Special driver или еще каким-либо образом. Для специализированных применений имеются CiA 401 для модулей ввода-вывода и CiA DS 402 для управления движением (сервоприводы и преобразователи частоты). Именно эти документы, точнее их интерпретации под используемое оборудование необходимо использовать для настройки связи. Для ASDA-A2 это "CANopen technical guide for ASDA-A2_eng.pdf".
Механизм передачи данных
Протокол CANopen определяет несколько методов передачи сообщений по сети CAN. Эти сообщения называются объектами связи (communication objects). CANopen поддерживает синхронизованную передачу сообщений, которая обеспечивается объектами Sync и Time Stamp. Асинхронные сообщения (или события) могут пересылаться в любой момент времени. В целом CANopen определяет четыре типа сообщений (communication objects):
- сообщения управления сетью, например Layer Management (LMT) и Network Management (NMT) сообщения
- Service Data Objects (SDO) механизм обычно используется для конфигурирования устройств, достоинство это то, что имеется возможность контролировать соединение и ответ устройства. Недостатки - более низкий приоритет по сравнению с PDO и невозможность организации синхронной передачи данных.
- Process Data Objects (PDO) механизм используется для передачи с высокой скоростью высокоприоритетных данных, так как PDO сообщения не содержат никаких дополнительных протокольных данных. Обычно используется для заранее сконфигурированного регулярного обмена информацией. При этом используется инструмент так называемый Маппинг (Mapping), при котором происходит отображение сетевого обмена на встроенные регистры ПЛК.
- Предопределенные сообщения (Sync Object, Time Stamp Object, Emergency Object)
Словарь объектов CANopen
Основной функциональной единицей протокола является объект. Под объектом может пониматься любой набор данных, например, текущая скорость или задание положения сервопривода. Поэтому для устройства (узла) необходимым условием работы в сети является наличие словаря (OD), описывающего связь между объектом и его индексом/субиндексом. С каждым устройством, использующим интерфейс CANopen, производитель должен предоставить файл с расширением *.eds (Electronic DataSheet), содержащий словарь объектов и дополнительную информацию. Опять же если брать дельту - то это файл "CANopen technical guide for ASDA-A2_eng.pdf" либо программное обеспечение CANopen Builder, например, "CANopen_Builder-V5.00_SW_20141128.zip-V5.00_SW_20141128.zip".
Давайте перейдем к практике: откроем простой проект для ПЛК AS228T-A и для начала воспользуемся документацией "AS_OM_EN_20200707.pdf". В разделе "Chapter 10 CANopen Function and Operation" мы найдем "The Input/Output Mapping Areas", где будет указано, что регистры D25000–D25031 используются составления пакета отправки SDO (а также NMT), а D24000–D24031 для получения ответа и анализа. Следующие же за ними D25032–D25978 и D24032–D24978 для маппинга отправляемых запросов RxPDO и получаемых в ответ TxPDO, конфигурация распределения которых настраивается в CANopen Builder. В проекте ПЛК дважды щелкнем левой кнопкой на HWCONFIG в дереве проекта. В появившемся окне левой кнопкой щелкнем на Built-in CAN communication. В случае выбора другого ПЛК, например, AS332T-A, нужно доустановить плату AS-FCOPM во второй (нижний слот) и щелкнуть по Function Card 2 Settings.
При этом выбрать для CAN working mode - CANopen DS301, выставить необходимую скорость, проверить что на всех устройствах стоит именно эта скорость, а адрес node ID не совпадает с адресами узлов сети. Если используются встроенные функциональные блоки INITC, CASD, ASDON, COPRW, DDRVAC, то выбирается Delta Special driver & AS Remote Mode, а адрес платы выставить равным 18, но это совсем другой режим и совсем другая история.
Для дальнейшего конфигурирования вызывается CANopen Builder из контекстного меню как Communication software->CANopen Builder. В программе добавляются необходимые узлы перетаскиванием Device List, при необходимости туда могут быть импортированы сторонние устройства посредством импорта их EDS-файлов. Дважды щелкнув левой клавишей по узлу (в нашем случае это сервопривод) открываем конфигурацию.
Если кого-то напугает обилие индексов, не обращайте внимания, наши индексы - это индексы словаря устройства, приведённые здесь индексы - это коммуникационные индексы, относятся к коммуникационным объектам, нас они волновать не должны.
В нижней части приведена простейшая настройка (да ничего не делая там уже есть). Дважды щелкнув по строке с Description RxPDO1 мы увидим:
А это стандартный объект всех устройств, поддерживающих CANopen DS402 - слово управления. Не забывая про то, что PDO поддерживает отправку всего 8 байт информации можем добавить объекты из верхней части Aviable Objects нажимая стрелку "вниз" и убрать стрелкой "вверх", если объем отправляемых данных превысит 8 байт, программа не добавить объект и выведет предупреждающее сообщение. Если все равно нужно добавить еще один объект, то нужно нажав ОК в текущем PDO Mapping, дважды щелкнуть левой кнопкой в окне Node Configuration на следующий по порядку Recive PDO Communication Parameter (в нашем случае с индексом 1401). Здесь можно добавить параметры, изменяемые нами в процессе управления сервоприводом, например Target position:607Ah или Profile velocity:6081h. Аналогичные действия доступны и с Transmit PDO Communication Parameter, где приведен по умолчанию Statusword или слово состояния и можно поместить например параметры для мониторинга (Position actual value:6064h, Velocity actual value:606Ch). Если нажать на кнопку Properties на выбранном в нижнем поле PDO можно увидеть и поменять при необходимости Transmitiom Type, который по умолчанию стоит асинхронный 255.
Завершает настройку следующая процедура: дважды щелкаем на ПЛК, выбираем в левом верхнем поле Aviable Nodes наш сервопривод и дважды щелкаем по нему левой кнопкой мыши (можно нажать на кнопку-стрелку "направо") так, чтобы он попал в правое верхнее поле Node List, а в нижнем поле регистрам ПЛК будут присвоены наши данные, это и есть Mapping. сохраняем настройку и заливаем ее в ПЛК.
Но не все же нам PDO работать, мы можем конфигурировать и с помощью SDO, что в принципе нам и потребуется.
Давайте попробуем настроить работу ПЛК в Profile Position Mode или другими словами заставим сервопривод двигаться в режиме контура положения, осуществить трапецеидальный профиль движения (другие варианты могут быть, но на ASDA-A2 объявлен только этот профиль). Для этого нам необходимо сконфигурировать следующую последовательность:
- определить режим (Setting [Mode of operations:6060h] to profile position mode=1),
- выставить коэффициенты электронного редуктора, ведь те, что введены в сервопривод не действуют в режиме CANopen (Setting [Position factor:6093h] Position factor =Numerator / Feed_constant),
- выставить ускорения и замедления (Setting [Profile acceleration:6083h] to plan acceleration slope, Setting [Profile deceleration:6084h] to plan deceleration slope),
- выставить окно Position window (Setting [Position window:6067h] to 0).
Для этого изучим раздел "AS_OM_EN_20200707.pdf" 10.4 Sending SDO, NMT and Reading Emergency Message through the Ladder Diagram
PLC device | Request message | ||
High byte | Low byte | ||
D25000 | Message Header | ReqID | Command (Fixed to 01) |
D25001 | Reserved | Size | |
D25002 | Type | Node ID | |
D25003 | Message Data | High byte of main index | Low byte of main index |
D25004 | Reserved | Sub-index | |
D25005 | Data 1 | Data 0 | |
D25006 | Data 3 | Data 2 | |
D25007 - D25031 | Reserved |
Что стоит здесь прокомментировать, так это заполнение поля ReqID - при смене отправляемого SDO необходимо менять это поле, например инкрементируя его. Это необходимо для отслеживания протоколом, тк если поле не изменится, то обмена не произойдет. Поле Size определяется типом объекта, точнее его длинной, обычно это указано в словаре. Type: 01 для операции чтения; 02 для операции записи. Node ID - адрес узла, которому предназначен для отправки SDO.
Обычно перед отправкой SDO идут команды очистки буферов ZRST D24000 D24031, ZRST D25000 D25031.
Для приема и обработки служит следующий буфер:
PLC device | Response message | ||
High byte | Low byte | ||
D24000 | Message Header | ResID | Status code |
D24001 | Reserved | Size | |
D24002 | Type | Node ID | |
D24003 | Message Data | High byte of main index | Low byte of main index |
D24004 | Reserved | Sub-index | |
D24005 | Data 1 | Data 0 | |
D24006 | Data 3 | Data 2 | |
D24007 - D24031 | Reserved |
Status code я приводить не буду, но любой вариант отличный от 1 должен заставить задуматься о достоверности полученных данных.
Ниже приведен пример отправки настройки режима работы сервопривода - режим PPM Position profile mode (Setting [Mode of operations:6060h]:8bit to profile position mode=1). В случае отправки 16 битных данных поле Size заполняется значением 6, а в случае 32 битных - 8.
Слово управления стоит отправлять когда все необходимые настройки уже сделаны и задания для режима управления уже имеются в приводе, потому нужно это делать либо по истечении паузы, либо еще как-то обеспечивая получение узлом этих данных до получения слова управления.
Само слово управления описано в "CANopen technical guide for ASDA-A2_eng.pdf" по индексу 6040h и стоит прокомментировать это следующим образом: если мы хотим запустить привод, точнее выставить сигнал Servo On или для отправки на "обнуление", выставляем биты 0,1,2,3, если снять Servo On - сбрасываем биты 0,1,2,3. Для подтверждения задания положения/скорости для PPM Mode выставляем бит 4 в единичку. Дополнительные биты 5 и 6 для PPM служат для настройки системы получения нового задания, бит 5 позволяет получать задание "на лету", то есть не дожидаясь выхода сервопривода в предыдущее полученное задание, другими словами без остановки. В паре с 6-ым битом можно в абсолютной системе координат менять скорость (бит 6 сброшен для абсолютной) не меняя координаты, а можно и координату менять. Если необходима пауза - выставляется бит 8 Halt, при этом старое задание сохраняется и при подаче нового в относительных координатах (бит 6 выставлен для относительной) добавляется. Остановка осуществляется сбросом бита 2 Quick Stop, но стоит учесть, что для него существует свое время замедления. Сброс ошибки осуществляется выставлением 7 бита. Важно сбрасывать биты 4, 7, 8, после выполнения команды, тк повторное выполнение команды возможно по фронту.
Слово состояние тоже описано в "CANopen technical guide for ASDA-A2_eng.pdf" по индексу 6041h, и думаю в особых комментариях не нуждается.