Работа с словарем ================= .. contents:: :depth: 1 :local: SDO (service data object) используются для прямого доступа к объектному словарю устройства CANopen. С помощью команд SDO можно изменить объекты в словаре для настройки устройства. Для изменения некоторых объектов нужно перевести устройство в предварительный режим с помощью команд NMT. Команда на чтение ----------------- Структура посылок SDO для параметризации описана ниже. .. table:: Client -> Server, Запрос +-----------------------+-------------------------------------------------------------+ | 11 bit идентификатор | 8 byte данные | +=======================+======+========+========+========+======+======+======+======+ | 0x600 + node ID | 0x40 | Index0 | Index1 | SubIdx | 0x00 | 0x00 | 0x00 | 0x00 | +-----------------------+------+--------+--------+--------+------+------+------+------+ .. table:: +------------+----------------------------------------+ | Параметр | Пояснение | +============+========================================+ | Index0 | Младший байт индекса (Unsigned16, LSB) | +------------+----------------------------------------+ | Index1 | Старший байт индекса (Unsigned16, MSB) | +------------+----------------------------------------+ | SubIdx | Субиндекс (Unsigned8) | +------------+----------------------------------------+ .. table:: Server -> Client, Ответ +-----------------------+-------------------------------------------------------------+ | 11 bit идентификатор | 8 byte данные | +=======================+======+========+========+========+======+======+======+======+ | 0x580 + node ID | 0x4x | Index0 | Index1 | SubIdx | 0x00 | 0x00 | 0x00 | 0x00 | +-----------------------+------+--------+--------+--------+------+------+------+------+ .. table:: +------------+----------------------------------------+ | Параметр | Пояснение | +============+========================================+ | Index0 | Младший байт индекса (Unsigned16, LSB) | +------------+----------------------------------------+ | Index1 | Старший байт индекса (Unsigned16, MSB) | +------------+----------------------------------------+ | SubIdx | Субиндекс (Unsigned8) | +------------+----------------------------------------+ | Data0 | Младший байт данных (LLSB) | +------------+----------------------------------------+ | Data3 | Старший байт данных (MMSB) | +------------+----------------------------------------+ Параметры с типом данных Unsigned8 передаются в байте D0, параметры с типом данных Unsigned16 используют D0 и D1. Количество действительных байтов данных кодируется следующим образом в первом байте данных CAN (0x4x): .. table:: +----------------------------+------+--------+--------+--------+ | Количество байт параметров | 1. | 2. | 3. | 4. | +============================+======+========+========+========+ | Первый байт данных CAN | 0x4F | 0x4B | 0x47 | 0x43 | +----------------------------+------+--------+--------+--------+ Команда на запись ----------------- .. table:: Client -> Server, Запрос +-----------------------+-----------------------------------------------------------------+ | 11 bit идентификатор | 8 byte данные | +=======================+======+========+========+========+=======+=======+=======+=======+ | 0x600 + node ID | 0x22 | Index0 | Index1 | SubIdx | Data0 | Data0 | Data0 | Data0 | +-----------------------+------+--------+--------+--------+-------+-------+-------+-------+ .. table:: +------------+----------------------------------------+ | Параметр | Пояснение | +============+========================================+ | Index0 | Младший байт индекса (Unsigned16, LSB) | +------------+----------------------------------------+ | Index1 | Старший байт индекса (Unsigned16, MSB) | +------------+----------------------------------------+ | SubIdx | Субиндекс (Unsigned8) | +------------+----------------------------------------+ | Data0 | Младший байт данных (LLSB) | +------------+----------------------------------------+ | Data3 | Старший байт данных (MMSB) | +------------+----------------------------------------+ Опционально можно указать количество байт данных в первом байте запроса CAN. .. table:: +----------------------------+------+--------+--------+--------+ | Количество байт параметров | 1. | 2. | 3. | 4. | +============================+======+========+========+========+ | Первый байт данных CAN | 0x2F | 0x2B | 0x27 | 0x23 | +----------------------------+------+--------+--------+--------+ .. table:: Server -> Client, Ответ +-----------------------+-------------------------------------------------------------+ | 11 bit идентификатор | 8 byte данные | +=======================+======+========+========+========+======+======+======+======+ | 0x580 + node ID | 0x60 | Index0 | Index1 | SubIdx | 0x00 | 0x00 | 0x00 | 0x00 | +-----------------------+------+--------+--------+--------+------+------+------+------+ .. table:: +------------+----------------------------------------+ | Параметр | Пояснение | +============+========================================+ | Index0 | Младший байт индекса (Unsigned16, LSB) | +------------+----------------------------------------+ | Index1 | Старший байт индекса (Unsigned16, MSB) | +------------+----------------------------------------+ | SubIdx | Субиндекс (Unsigned8) | +------------+----------------------------------------+ Ошибки SDO ---------- Обмен параметрами прерывается, если он неисправен. Для этой цели клиент или сервер отправляют телеграмму SDO следующей структуры: .. table:: +-----------------------+---------------------------------------------------------------------+ | 11 bit идентификатор | 8 byte данные | +=======================+======+========+========+========+========+========+========+========+ | 0x580(client) или | 0x80 | Index0 | Index1 | SubIdx | Error0 | Error1 | Error2 | Error3 | | 0x600(server)+node ID | | | | | | | | | +-----------------------+------+--------+--------+--------+--------+--------+--------+--------+ .. table:: +------------+---------------------------------------------+ | Параметр | Пояснение | +============+=============================================+ | Index0 | Младший байт индекса (Unsigned16, LSB) | +------------+---------------------------------------------+ | Index1 | Старший байт индекса (Unsigned16, MSB) | +------------+---------------------------------------------+ | SubIdx | Субиндекс (Unsigned8) | +------------+---------------------------------------------+ | Error0 | Младший младший байт кода ошибки SDO (LLSB) | +------------+---------------------------------------------+ | Error3 | Старший байт кода ошибки SDO (MMSB) | +------------+---------------------------------------------+ .. table:: Список кодов ошибок +----------------+----------------------------------------------------------------------+ | Код ошибки SDO | Пояснение | +================+======================================================================+ | 0x05 03 00 00 | Бит переключения не изменен | +----------------+----------------------------------------------------------------------+ | 0x05 04 00 01 | Спецификатор команды SDO недействителен или неизвестен | +----------------+----------------------------------------------------------------------+ | 0x06 01 00 00 | Доступ к этому объекту не поддерживается | +----------------+----------------------------------------------------------------------+ | 0x06 01 00 02 | Попытка записи в параметр Read_Only | +----------------+----------------------------------------------------------------------+ | 0x06 02 00 00 | Объект не найден в каталоге объектов | +----------------+----------------------------------------------------------------------+ | 0x06 04 00 41 | Объект не может быть отображен в PDO | +----------------+----------------------------------------------------------------------+ | 0x06 04 00 42 | Количество и/или длина отображаемых объектов превысит длину PDO | +----------------+----------------------------------------------------------------------+ | 0x06 04 00 43 | Общая несовместимость параметров | +----------------+----------------------------------------------------------------------+ | 0x06 04 00 47 | Общая внутренняя ошибка устройства | +----------------+----------------------------------------------------------------------+ | 0x06 06 00 00 | Доступ прерван из-за аппаратной ошибки | +----------------+----------------------------------------------------------------------+ | 0x06 07 00 10 | Тип данных или длина параметра не совпадают или неизвестны | +----------------+----------------------------------------------------------------------+ | 0x06 07 00 12 | Тип данных не соответствует, длина параметра слишком велика | +----------------+----------------------------------------------------------------------+ | 0x06 07 00 13 | Тип данных не соответствует, длина параметра слишком коротка | +----------------+----------------------------------------------------------------------+ | 0x06 09 00 11 | Субиндекс отсутствует | +----------------+----------------------------------------------------------------------+ | 0x06 09 00 30 | Общая ошибка диапазона значений | +----------------+----------------------------------------------------------------------+ | 0x06 09 00 31 | Ошибка диапазона значений: слишком большое значение параметра | +----------------+----------------------------------------------------------------------+ | 0x06 09 00 32 | Ошибка диапазона значений: значение параметра слишком | +----------------+----------------------------------------------------------------------+ | 0x06 0A 00 23 | Ресурс недоступен | +----------------+----------------------------------------------------------------------+ | 0x08 00 00 00 | Общая ошибка | +----------------+----------------------------------------------------------------------+ | 0x08 00 00 21 | Доступ невозможен из-за локального приложения | +----------------+----------------------------------------------------------------------+ | 0x08 00 00 22 | Доступ невозможен из-за текущего состояния | +----------------+----------------------------------------------------------------------+ Кроме того, для связи регистров были введены коды ошибок, зависящие от производителя (индекс 0x4500, 0x4501): .. table:: +----------------+----------------------------------------------------------------------+ | Код ошибки SDO | Пояснение | +================+======================================================================+ | 0x06 02 00 11 | Неверная таблица: таблица или канал отсутствуют | +----------------+----------------------------------------------------------------------+ | 0x06 02 00 10 | Неверный регистр: таблица отсутствует | +----------------+----------------------------------------------------------------------+ | 0x06 01 00 22 | Защита от записи все еще включена | +----------------+----------------------------------------------------------------------+ | 0x06 07 00 43 | Неверное количество аргументов функции | +----------------+----------------------------------------------------------------------+ | 0x06 01 00 21 | Функция все еще активна, повторите попытку позже | +----------------+----------------------------------------------------------------------+ | 0x05 04 00 40 | Общая ошибка маршрутизации | +----------------+----------------------------------------------------------------------+ | 0x06 06 00 21 | Ошибка доступа к таблице BC | +----------------+----------------------------------------------------------------------+ | 0x06 09 00 10 | Общая ошибка связи с терминалом | +----------------+----------------------------------------------------------------------+ | 0x05 04 00 47 | Тайм-аут связи с терминалом | +----------------+----------------------------------------------------------------------+ Пример: Чтение параметра ------------------------ В примере чтение интервала сердцебиения .. table:: Приложение ⇒ Устройство +--------------+-----+----+----+----+----+----+----+----+----+ | COB-ID | DLC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +==============+=====+====+====+====+====+====+====+====+====+ | 600 + NodeID | [8] | 40 | 17 | 10 | 00 | 00 | 00 | 00 | 00 | +--------------+-----+----+----+----+----+----+----+----+----+ - NodeID - номер устройства в формате hex - COB-ID - 600 + NodeID (Сообщение SDO на устройство NodeID) - DLC - [8] (длина сообщения SDO всегда 8 байт) - Байт 0 - 0x40 - команда на чтение - Байт 1 - 0x17 - 2й байт номера регистра 0x1017 - Байт 2 - 0x10 - 1й байт номера регистра 0x1017 - Байт 3 - 0x00 - субрегистр - Байт 4-7 - не заполняется .. table:: Устройство ⇒ Приложение +--------------+-----+----+----+----+----+----+----+----+----+ | COB-ID | DLC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +==============+=====+====+====+====+====+====+====+====+====+ | 580 + NodeID | [8] | 4B | 17 | 10 | 00 | E8 | 03 | 00 | 00 | +--------------+-----+----+----+----+----+----+----+----+----+ Устройство отвечает ускоренной передачей (2 байта данных) - NodeID - номер устройства в формате hex - COB-ID - 580 + NodeID (Сообщение SDO с устройства NodeID) - DLC - [8] (длина сообщения SDO всегда 8 байт) - Байт 0 - 0x4B - команда ответа - Байт 1 - 0x17 - 2й байт номера регистра 0x1017 - Байт 2 - 0x10 - 1й байт номера регистра 0x1017 - Байт 3 - 0x00 - субрегистр - Байт 4-7 - E8 03 00 00 - данные в в порядке справа на лево 03E8h = 1000мс Команды ответа отличаются в зависимости от размера полученных данных 1 - 4 байта. - 0x43 - Получено 4 байта - 0x47 - Получено 3 байта - 0x4b - Получено 2 байта - 0x4f - Получен 1 байт Пример: Запись параметра ------------------------ В примере изменение интервала сердцебиения .. table:: Приложение ⇒ Устройство +--------------+-----+----+----+----+----+----+----+----+----+ | COB-ID | DLC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +==============+=====+====+====+====+====+====+====+====+====+ | 600 + NodeID | [8] | 2B | 17 | 10 | 00 | 88 | 13 | 00 | 00 | +--------------+-----+----+----+----+----+----+----+----+----+ - NodeID - номер устройства в формате hex - COB-ID - 600 + NodeID (Сообщение SDO на устройство NodeID) - DLC - [8] (длина сообщения SDO всегда 8 байт) - Байт 0 - 0x2B - команда на запись (Отправить 2 байта) - Байт 1 - 0x17 - 2й байт номера регистра 0x1017 - Байт 2 - 0x10 - 1й байт номера регистра 0x1017 - Байт 3 - 0x00 - субрегистр - Байт 4-7 - 88 13 00 00 - данные в в порядке справа на лево 1388h = 5000мс Для записи в объектный словарь необходимо указать команду в зависимости от размера данных 1 - 4 байта. * 0x23 - Отправить 4 байта * 0x27 - Отправить 3 байта * 0x2b - Отправить 2 байта * 0x2f - Отправить 1 байт Пример: Адрес устройства ------------------------ Чтение адреса устройства .. table:: Приложение ⇒ Устройство +--------------+-----+----+----+----+----+----+----+----+----+ | COB-ID | DLC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +==============+=====+====+====+====+====+====+====+====+====+ | 600 + NodeID | [8] | 40 | 01 | 21 | 00 | 00 | 00 | 00 | 00 | +--------------+-----+----+----+----+----+----+----+----+----+ Изменение адреса устройства .. table:: Приложение ⇒ Устройство +--------------+-----+----+----+----+----+----+----+----+----+ | COB-ID | DLC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +==============+=====+====+====+====+====+====+====+====+====+ | 600 + NodeID | [8] | 2F | 01 | 21 | 00 | xx | 00 | 00 | 00 | +--------------+-----+----+----+----+----+----+----+----+----+ - Байт 4 укажите новый NodeID Изменения вступят только после сохранения конфигурации (см. в разделе ниже) Пример: Сохранение конфигурации ------------------------------- .. table:: Приложение ⇒ Устройство +--------------+-----+----+----+----+----+----+----+----+----+ | COB-ID | DLC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +==============+=====+====+====+====+====+====+====+====+====+ | 600 + NodeID | [8] | 23 | 10 | 10 | 01 | 73 | 61 | 76 | 65 | +--------------+-----+----+----+----+----+----+----+----+----+ - NodeID - номер устройства в формате hex - COB-ID - 600 + NodeID (Сообщение SDO на устройство NodeID) - DLC - [8] (длина сообщения SDO всегда 8 байт) - Байт 0 - 23 - команда на запись (Отправить 4 байта) - Байт 1 - 10 - 2й байт номера регистра 1010 - Байт 2 - 10 - 1й байт номера регистра 1010 - Байт 3 - 00 - субрегистр - Байт 4-7 - 73 61 76 65 - данные в в порядке справа на лево SAVE Пример: Возврат заводских параметров ------------------------------------ .. table:: Приложение ⇒ Устройство +--------------+-----+----+----+----+----+----+----+----+----+ | COB-ID | DLC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +==============+=====+====+====+====+====+====+====+====+====+ | 600 + NodeID | [8] | 23 | 11 | 10 | 01 | 6C | 6F | 61 | 64 | +--------------+-----+----+----+----+----+----+----+----+----+ - NodeID - номер устройства в формате hex - COB-ID - 600 + NodeID (Сообщение SDO на устройство NodeID) - DLC - [8] (длина сообщения SDO всегда 8 байт) - Байт 0 - 23 - команда на запись (Отправить 4 байта) - Байт 1 - 11 - 2й байт номера регистра 1010 - Байт 2 - 10 - 1й байт номера регистра 1010 - Байт 3 - 00 - субрегистр - Байт 4-7 - 6C 6F 61 64 - данные в в порядке справа на лево LOAD