Работа с словарем

SDO (service data object) используются для прямого доступа к объектному словарю устройства CANopen. С помощью команд SDO можно изменить объекты в словаре для настройки устройства. Для изменения некоторых объектов нужно перевести устройство в предварительный режим с помощью команд NMT.

Команда на чтение

Структура посылок SDO для параметризации описана ниже.

Client -> Server, Запрос

11 bit идентификатор

8 byte данные

0x600 + node ID

0x40

Index0

Index1

SubIdx

0x00

0x00

0x00

0x00

Параметр

Пояснение

Index0

Младший байт индекса (Unsigned16, LSB)

Index1

Старший байт индекса (Unsigned16, MSB)

SubIdx

Субиндекс (Unsigned8)

Server -> Client, Ответ

11 bit идентификатор

8 byte данные

0x580 + node ID

0x4x

Index0

Index1

SubIdx

0x00

0x00

0x00

0x00

Параметр

Пояснение

Index0

Младший байт индекса (Unsigned16, LSB)

Index1

Старший байт индекса (Unsigned16, MSB)

SubIdx

Субиндекс (Unsigned8)

Data0

Младший байт данных (LLSB)

Data3

Старший байт данных (MMSB)

Параметры с типом данных Unsigned8 передаются в байте D0, параметры с типом данных Unsigned16 используют D0 и D1.

Количество действительных байтов данных кодируется следующим образом в первом байте данных CAN (0x4x):

Количество байт параметров

Первый байт данных CAN

0x4F

0x4B

0x47

0x43

Команда на запись

Client -> Server, Запрос

11 bit идентификатор

8 byte данные

0x600 + node ID

0x22

Index0

Index1

SubIdx

Data0

Data0

Data0

Data0

Параметр

Пояснение

Index0

Младший байт индекса (Unsigned16, LSB)

Index1

Старший байт индекса (Unsigned16, MSB)

SubIdx

Субиндекс (Unsigned8)

Data0

Младший байт данных (LLSB)

Data3

Старший байт данных (MMSB)

Опционально можно указать количество байт данных в первом байте запроса CAN.

Количество байт параметров

Первый байт данных CAN

0x2F

0x2B

0x27

0x23

Server -> Client, Ответ

11 bit идентификатор

8 byte данные

0x580 + node ID

0x60

Index0

Index1

SubIdx

0x00

0x00

0x00

0x00

Параметр

Пояснение

Index0

Младший байт индекса (Unsigned16, LSB)

Index1

Старший байт индекса (Unsigned16, MSB)

SubIdx

Субиндекс (Unsigned8)

Ошибки SDO

Обмен параметрами прерывается, если он неисправен. Для этой цели клиент или сервер отправляют телеграмму SDO следующей структуры:

11 bit идентификатор

8 byte данные

0x580(client) или 0x600(server)+node ID

0x80

Index0

Index1

SubIdx

Error0

Error1

Error2

Error3

Параметр

Пояснение

Index0

Младший байт индекса (Unsigned16, LSB)

Index1

Старший байт индекса (Unsigned16, MSB)

SubIdx

Субиндекс (Unsigned8)

Error0

Младший младший байт кода ошибки SDO (LLSB)

Error3

Старший байт кода ошибки SDO (MMSB)

Список кодов ошибок

Код ошибки 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):

Код ошибки 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

Тайм-аут связи с терминалом

Пример: Чтение параметра

В примере чтение интервала сердцебиения

Приложение ⇒ Устройство

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 - не заполняется

Устройство ⇒ Приложение

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 байт

Пример: Запись параметра

В примере изменение интервала сердцебиения

Приложение ⇒ Устройство

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 байт

Пример: Адрес устройства

Чтение адреса устройства

Приложение ⇒ Устройство

COB-ID

DLC

0

1

2

3

4

5

6

7

600 + NodeID

[8]

40

01

21

00

00

00

00

00

Изменение адреса устройства

Приложение ⇒ Устройство

COB-ID

DLC

0

1

2

3

4

5

6

7

600 + NodeID

[8]

2F

01

21

00

xx

00

00

00

  • Байт 4 укажите новый NodeID

Изменения вступят только после сохранения конфигурации (см. в разделе ниже)

Пример: Сохранение конфигурации

Приложение ⇒ Устройство

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

Пример: Возврат заводских параметров

Приложение ⇒ Устройство

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