Работа с модулями ПЛК по SDO
Запись и чтение параметров модулей ввода/вывода можно осуществлять при помощи SDO-сообщений.
SDO – это протокол, обеспечивающий ведущему устройству в сети CAN возможность считывать или изменять данные в объектных словарях (OD) подключенных к шине устройств (в данном случае – модулей ввода/вывода).

Схема работы SDO
Важно! Большое количество команд в одном цикле приводит к увеличению трафика на CAN-шине, что создает высокую нагрузку на контроллер.
|
Функциональный блок SDO_WRITE позволяет изменять параметры модулей ввода/вывода через пользовательское приложение, разработанное в IDE. Данный ФБ используется для записи конкретного значения параметра в объектный словарь модулей ПЛК. ФБ находится в библиотеке AbakPLCUtils.

ФБ SDO_WRITE
Входные параметры:
NodeID – Адрес CAN устройства;
Index – Индекс параметра в словаре CAN;
SubIndex – Подиндекс параметра;
aData – Адрес буфера с данными;
aLen – Размер буфера в байтах;
TimeOut – Таймаут ожидания ответа;
Repeats – Количество повторов при закрытом семафоре.
Выходные параметры:
Confirm – Признак завершения записи (0 - запись не запущена или не завершена, 1 - Успешное завершение);
Kz – Код завершения (0 - успешно; 1 - неуспешное создание семафора; 2 - не освобожден семафор; 3 - превышен таймаут);
Рассмотрим пример кода, позволяющего настроить типы каналов модуля K2.AI.00.08.00 (AI Type Channel).
Пример использования данных ФБ:
PROGRAM PLC_PRG
VAR
sdowrite:AbakPLCUtils.SDOWrite;
b: UINT:= 255;
xxExecute:BYTE:=0;
END_VAR
{PLC_PRG}
IF
xxExecute=0 AND sdowrite.Confirm THEN
xxExecute:=1;
END_IF
sdowrite.NodeID:=3;
sdowrite.Index:=16#2021;
sdowrite.aLen:=1;
sdowrite.TimeOut:=T#500MS;
sdowrite.aData:=ADR(b);
sdowrite(xExecute:=xxExecute);
ФБ SDO_READ используется для считывания данных из объектного словаря модулей ПЛК (стандартизированное описание устройства).

ФБ SDO_READ
Входные параметры:
NodeID – Адрес CAN устройства;
Index – Индекс параметра в словаре CAN;
SubIndex – Подиндекс параметра;
aData – Адрес буфера с данными;
aLen – Размер буфера в байтах;
TimeOut – Таймаут ожидания ответа;
Repeats – Количество повторов при закрытом семафоре.
Выходные параметры:
Confirm – Признак завершения чтения (0 - чтение не запущено или не завершено, 1 - Успешное завершение);
Kz – Код завершения (0 - успешно; 1 - неуспешное создание семафора; 2 - не освобожден семафор; 3 - превышен таймаут);
aOutLen – Количество полученных байтов в ответе.
Пример использования ФБ SDO_READ в программе:
VAR
sdoread:AbakPLCUtils.SDORead;
b: UINT;
xxExecute:BYTE:=0;END_VAR
{PLC_PRG}
IF
xxExecute=0 AND sdoread.Confirm THEN
xxExecute:=1;
END_IF
sdoread.NodeID:=3;
sdoread.Index:=16#2021;
sdoread.aLen:=1;
sdoread.TimeOut:=T#500MS;
sdoread.aData:=ADR(b);
sdoread(xExecute:=xxExecute);
Результат работы программы:

Результат работы программы
NETWORK – номер сети CAN, предназначенный для работы функционального блока;
ENABLE – включает функциональный блок по переднему фронту. Прерывает операцию по заднему фронту;
TIMEOUT – таймаут в мс (0 означает отсутствие тайм-аута);
CONFIRM – true (функциональный блок завершен без ошибок);
ERROR – код ошибки: см. CANOPEN_KERNEL_ERROR для получения дополнительной информации;
DEVICE – NodeID целевого устройства; 0 означает локальное устройство (= CANopenManager);
CHANNEL – канал SDO:
-
0 – используйте любой свободный канал;
-
1..n – конкретный канал;
INDEX – индекс объекта;
SUBINDEX – подиндекс объекта;
MODE – указывает используемый режим SDO;
DATA – указатель на память, в которую должны быть записаны данные;
DATALENGTH – VAR_IN – размер памяти, на который указывает Data.
VAR_OUT – объем данных, записанных в Data