December 29, 2015

Структурные типы данных AX5000

Ряд параметров сервоусилителей серии AX5000 являются сложными типами данных. По сути, это структуры или списки (list), что в принципе одно и то же, но не стоит забывать о порядке полей.

Для работы с такими параметрами нужно сделать чуть больше телодвижений, чем при работе с простыми типами данных: перед записью структурных параметров, нужно "завернуть" их в структуру-контейнер.
Этот контейнер – обычный массив байт, оформленный определенным образом, со строгим соблюдением порядка полей в структуре. 
В самом начале контейнера содержится два поля: размер структуры (WORD, 2 байта) и максимальный размер структуры (WORD, 2 байта). Затем, в заданном порядке, идут данные конкретного параметра. Размеры задаются в байтах без учета длины самих полей размера.
В документации указана общая длина параметра в битах с учетом длины полей размера, тогда как сами поля размера должны содержать длину в байтах без учета длины самих полей размера. Еще проще – общая длина в байтах минус 4 байта.
Посмотрим на примерах. Возьмем параметр P-0-0251 – это параметр конфигурации сканера позиции.
  1. Берем из конца таблицы значение общей длины: "Data length: 96". Это общее значение длины в битах.
  2. Делим на 8, чтобы получить значение общей длины в байтах = 96 бит / 8 = 12 байт.
  3. Вычитаем длину поля длины (WORD, 2 байта) и длину поля максимальной длины (WORD, 2 байта) = 12 - 2 - 2 = 8 байт. Получили значение поля максимальной длины. Если мы записываем все поля структуры, то это же значение подойдет и для поля длины.

Еще один пример – параметр вывода текста на дисплей сервоусилителя P-0-0313.
Data length: 416 бит / 8 - 4 байта = 48 байт.

Для задания таких параметров удобно создавать собственные структуры вида:

TYPE ST_SoE_ParameterList :
    STRUCT
        Length    : WORD := 48;
        MaxLength : WORD := 48;

        First  : UDINT;
        Second : INT;
        Third  : WORD;
        (* ... *)
    END_STRUCT
END_TYPE


Тогда вся работа по их записи сводится к заполнению полей структуры, а запись производится точно так же, как и для простых типов данных:

ParamList : ST_SoE_ParameterList;

ParamList.First  :=  1;
ParamList.Second := -2;
ParamList.Third  :=  3;

SoeWrite(...
    pSrcBuf  := ADR(SoeList),
    cbBufLen := SIZEOF(SoeList),
    ...);


Если переменная такого структурного типа используется многократно, можно очищать ее через функции работы с областями памяти:

MEMSET(ADR(ParamList) + 4, 0, SIZEOF(ParamList) - 4);

No comments

Post a Comment

Note: Only a member of this blog may post a comment.