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