Работа со строками в CODESYS V3.5
OWEN.RU
Оборудование для автоматизации
Подписаться:

Работа со строками в CODESYS V3.5

Работа со строками в CODESYS V3.5

Стандарт МЭК 61131-3 определяет типы данных при программировании ПЛК. Они делятся на четыре основных группы: биты, числа, строки и временные типы.
В статье описывается работа со строками в среде CODESYS V3.5, применяемой для программирования контроллеров ОВЕН СПК и ПЛК210.

Первые программируемые контроллеры появились в 60-70 годах прошлого века для замены электромеханических реле и аналоговых регуляторов. Тогда для разработки программ было достаточно двух основных типов данных: логического – для представления дискретных сигналов и целочисленного – для представления аналоговых сигналов. Эволюция ПЛК расширила спектр выполняемых задач, что потребовало введения новых типов данных, одним из которых стали строки.

Строки могут использоваться для задач:

  • визуализации (формирование таблиц рецептов, сообщений о тревогах и т.д.);
  • записи данных в файлы в понятной человеку форме (в формате CSV, JSON и т.д.);
  • реализации строковых протоколов обмена (DCON, MQTT и т.д.);
  • работы с SMS;
  • хранения паролей, серийных номеров и т.д.

Типы строк в CODESYS V3.5

Строка – это массив чисел, каждое из которых соответствует определенному символу. Соответствие между числами и символами называется кодировкой. В CODESYS V3.5 присутствуют два типа строк – STRING и WSTRING. Основные характеристики типов строк приведены в Таблице 1.

Таблица 1. Характеристики типов STRING и WSTRING

Параметр

STRING

WSTRING

Кодировка

ASCII

UCS-2 (Unicode)

Размер символа

1 байт

2 байта

Пример записи литерала

(важен тип кавычек)

‘hello, world’

“привет, мир”

Выбор типа зависит от решаемой задачи. Например, для отображения строк в визуализации контроллеров ОВЕН следует использовать только тип WSTRING. При работе с SMS удобнее применять STRING, так как при формировании AT-команд для модемов используется кодировка ASCII.

Длина и размер строки

В CODESYS V3.5 при объявлении строки задается ограничение числа ее символов. Если число символов не указано, то по умолчанию используется значение 80. Ограничение максимального числа символов строки в явном виде отсутствует. Фактически длина строки ограничена только объемом памяти, выделенной под проект.

В CODESYS используются нуль-терминированные строки (как в языке С), то есть каждая строка завершается NUL-символом
с кодом «0». Память под этот символ выделяется автоматически, и он не учитывается при объявлении переменной (Пример 1).

VAR
// Максимальная длина – 40 символов
// Выделенная память – 41 байт
sMessage: STRING(40) := ‘test’;
// Максимальная длина – 80 символов (по умолчанию)
// Выделенная память – 162 байта
wsTitle: WSTRING := “test”;
END_VAR

Пример 1

Базовые функции работы со строками

Значение строковой переменной можно присвоить не только при ее объявлении, но и в коде программы. Однако одного присваивания недостаточно. Для реализации алгоритмов требуются дополнительные операции, например, объединение нескольких строк в одну, поиск в строке нужного символа и т.д. Для этих операций используются базовые функции из библиотеки Standard. Список этих функций с кратким описанием представлен в Таблице 2, использование – в Примере 2.

Таблица 2. Строковые функции библиотеки Standard

Функция

Краткое описание

CONCAT (STR1, STR2)

Объединяет две строки в одну

DELETE (STR, LEN, POS)

Удаляет из строки заданное число символов с нужной позиции

FIND (STR1, STR2)

Производит поиск подстроки в строке

INSERT (STR1, STR2, POS)

Добавляет подстроку в строку с заданной позиции

LEFT (STR, SIZE)

Выделяет из строки подстроку заданной длины (начиная с первого символа)

LEN (STR)

Вычисляет длину строки

MID (STR, LEN, POS)

Выделяет из строки подстроку заданной длины (начиная с нужной позиции)

REPLACE (STR1, STR2, LEN, POS)

Заменяет в строке один фрагмент на другой (начиная с нужной позиции)

RIGHT (STR, SIZE)

Выделяет из строки подстроку заданной длины (начиная с последнего символа)

sVar1 := ‘Hello, ’;
sVar2 := ‘world’;
// sVar3 теперь имеет значение ‘Hello, world’
sVar3 := CONCAT(sVar1, sVar2);
// iLen будет иметь значение 12
iLen := LEN(sVar3);

Пример 2

Функции из библиотеки Standard могут работать только с переменными типа STRING. Для работы с WSTRING используется библиотека Standard64 с идентичным набором функций, имеющих префикс «W» (WCONCAT, WDELETE и т. д.).

Расширенные функции работы со строками

Важно отметить, что функции из библиотек Standard/Standard64 могут работать только со строками, длина которых не превышает 255 символов. Для работы с более длинными строками используется библиотека StringUtils. В ней содержатся функции, которые в качестве аргументов принимают не строки, а указатели на них. Кроме того, библиотека содержит дополнительные функции для перевода строк в верхний/нижний регистр, удаления пробелов и т. д.

Типы строк STRING и WSTRING предназначены для работы с разными кодировками (табл. 1). Иногда требуется выполнить конвертацию этих типов, например, ввести в визуализацию строку-сообщение типа WSTRING и отправить ее по SMS в виде
STRING-значения. Стандартные операторы конверсии STRING_TO_WSTRING/WSTRING_TO_STRING в этом случае не подходят,
так как не производят конвертации кодировок, а перекладывают содержимое памяти одной переменной в другую. Решить проблему поможет библиотека OwenStringUtils, разработанная компанией ОВЕН.

Библиотека позволяет:

  • конвертировать кодировки (Пример 3);
  • работать с подстроками;
  • форматировать вывод переменных типа DATE/TOD/DT/REAL (Пример 3).
// неправильная конвертация
// wsMessage получит значение "òåñò"
wsMessage := TO_WSTRING('тест');
// правильная конвертация
// wsMessage получит значение "тест"
wsMessage := OSU.CP1251_TO_UNICODE('тест');
// sDateTime получит значение '02.04.2019 08:11:30'
dtDateTime := DT#2019-04-02-08:11:30;
sDateTime := OSU.DT_TO_STRING_FORMAT (dtDateTime, '%t[dd.MM.yyyy HH:mm:ss]');

Пример 3

Большой набор функций для работы со строками можно найти в библиотеке OSCAT Basic. Часть из них повторяет функционал OwenStringUtils, но присутствуют и уникальные: например, зеркалирование строки и преобразование числа в строку с его
HEX-значением (Пример 4). Русскоязычное описание библиотеки доступно на сайте owen.ru в разделе CODESYS V3.

// sMessage получит значение ‘dcba’
sMessage := MIRROR(‘abcd’);
// sMessage получит значение ‘FF’
sMessage := BYTE_TO_STRH(255);

Пример 4

Управляющие последовательности

Помимо видимых символов (букв, цифр, знаков препинания) строка может содержать спецсимволы, которые называются управляющими последовательностями. С их помощью, например, можно организовать перевод строки для вывода нескольких сообщений в одном элементе визуализации.

В редакторе CODESYS для ввода спецсимволов используется знак ‘$’ (Пример 5). Полный список спецсимволов приведен в документе CODESYS V3.5. Визуализация.

sMessage := ‘Один$r$nДва’// Использование спецсимволов переноса строки

Пример 5

Строки и массивы

Как было сказано в начале статьи, строка представляет собой массив символов. CODESYS V3.5 позволяет осуществлять индексный доступ к строке – как к массиву значений типа BYTE (для STRING) или WORD (для WSTRING). Это удобно при работе с файлами и реализацией протоколов обмена. В Примере 6 демонстрируется обработка строки в цикле FOR для определения позиций символов, разделяющих значения. Это может потребоваться при чтении информации из файлов формата «.csv».

VAR
 sRecord: STRING := '123;456;789';
 sSeparatorChar: STRING := ';';
 auiSeparatorPos: ARRAY [0..10] OF INT;
 i: INT;
 j: INT;
END_VAR

j := 0;

FOR i:= 0 TO LEN(sRecord) DO

 IF sRecord[i] = sSeparatorChar[0] THEN

  auiSeparatorPos[j] := i;
  j := j + 1;

  // TODO: добавить проверку
  // для верхней границы массива
 END_IF

END_FOR

Пример 6

В некоторых случаях требуется очистить строку. Для этого достаточно присвоить ей «пустое» значение. Но следует учитывать, что эта операция не очищает строку полностью – она только записывает NUL-терминатор в ее начальный символ. В примере 7 продемонстрирована ситуация, когда переменной сначала присваивается значение ‘ABCD’, которое потом перезаписывается пустой строкой.
Но фактически происходит только обнуление начального символа строки, а коды остальных символов остаются на своих местах. Поэтому, записав значение в начальный элемент через индексный доступ, вы получите строку не из одного символа (как могли ожидать), а из четырех. Обычно такие проблемы проявляются при реализации строкового протокола обмена. Чтобы избежать их, надо очищать строку с помощью специальных функций (например, MemFill из библиотеки CAA Memory).

sMessage := ‘ABCD’;
sMessage := ‘’;
// sMessage получит значение ‘EBCD’
sMessage[0] := 16#45;

Пример 7

Заключение

Рассмотрены ключевые моменты работы со строками в среде CODESYS V3.5. Все перечисленные библиотеки доступны для загрузки на сайте owen.ru в разделе CODESYS V3. Подробная информация о работе со строками приведена в документации к этим библиотекам, а также в справке среды программирования.

Смотри также
Опрос датчика вакуума с нестандартным протоколом обмена в CODESYS V3.5
Программируемые устройства Программное обеспечение, устройства связи CODESYS
Опрос датчика вакуума с нестандартным протоколом обмена в CODESYS V3.5
CODESYS V3.5 для enterprise-разработчика
Программируемый контроллер CODESYS ПЛК210
CODESYS V3.5 для enterprise-разработчика
Средства обеспечения информационной безопасности в контроллерах ОВЕН. Часть 1
Программируемые устройства CODESYS ПЛК210
Средства обеспечения информационной безопасности в контроллерах ОВЕН. Часть 1
Обновления возможностей ОВЕН ПЛК в 2022 году. Часть 1
Программируемый контроллер Программное обеспечение, устройства связи CODESYS
Обновления возможностей ОВЕН ПЛК в 2022 году. Часть 1
Автоматизация нового завода по производству цинковых белил на базе ОВЕН ПЛК210 и ПО MasterSCADA
Программируемые устройства Программное обеспечение, устройства связи ПЛК210
Автоматизация нового завода по производству цинковых белил на базе ОВЕН ПЛК210 и ПО MasterSCADA
Как ОВЕН АЙРА360 решает задачу управления типовыми вентиляционными системами
Контрольно-измерительные приборы OwenCloud Вентиляция
Как ОВЕН АЙРА360 решает задачу управления типовыми вентиляционными системами
Автоматика для систем вентиляции. Как подобрать?
Датчики Силовые и коммутационные устройства OwenCloud
Автоматика для систем вентиляции. Как подобрать?
Сравнение производительности ПЛК210 модификаций 1х и 0х
Программируемый контроллер CODESYS ПЛК210
Сравнение производительности ПЛК210 модификаций 1х и 0х
Протокол OPC UA в приборах ОВЕН
Программное обеспечение, устройства связи ПЛК210 СПК1хх
Протокол OPC UA в приборах ОВЕН
Хроники импортозамещения: переход из TIA Portal в CODESYS V3.5
Программное обеспечение, устройства связи CODESYS
Хроники импортозамещения: переход из TIA Portal в CODESYS V3.5