От прикладного проекта к библиотеке

Polygon — графическая среда программирования промышленных контроллеров с собственной реализацией FBD. Короткое вычисление или подготовка диагностической строки часто требуют цепочки преобразований, сравнений и соединений.

Во время работы над проектом на ПЛК210 мы исследовали устройство проектов и библиотек Polygon, чтобы воспроизводимо создавать внешние C++-блоки. Так появилась PLExt — независимая библиотека, в которой вычисления можно записывать текстовыми выражениями внутри функционального блока.

На момент исходной публикации в PLExt было 11 блоков. Пять из них составляли семейство Expression* для bool, int32, uint32, float и строк. Остальные решали преобразование строк и служебные задачи тестирования связей.

Состав PLExt в дереве библиотек Polygon

Одно вычислительное ядро

Пять вариантов Expression* используют общий компилятор и исполнитель выражений. Отдельные типизированные блоки нужны из-за ограничений Polygon: переменное количество входов и выходов разных типов нельзя объединить в один универсальный блок.

Ядро сначала разбирает формулу и строит внутреннюю программу, а затем исполняет её в цикле контроллера без повторного синтаксического анализа. Входы обозначаются как iN, выходы — как oN; несколько операций разделяются точкой с запятой.

o0 = i0 + i1;
o1 = i0 - i1;
o2 = i0 * i1;

Поддерживаются арифметика, сравнения, битовые операции, сдвиги, математические функции, преобразования типов и ленивые &&, || и ?:. Одна программа может вычислить общую часть и разложить её по нескольким выходам:

v0 = i0 - i1;
o0 = v0 * i2;
o1 = v0 + i3;
o2 = v0 < 0 ? -v0 : v0;

Временные vN существуют в пределах одного запуска. Переменные wN сохраняют состояние между циклами; на них можно строить счётчики, накопители и небольшую последовательностную логику.

Проверка математических и логических выражений PLExt в Polygon

Строковые выражения

Для журнала, сообщения об аварии или значения с единицей измерения обычная FBD-схема требует преобразования типов, форматирования и нескольких конкатенаций. ExpressionStr собирает результат одной программой и может формировать сразу несколько выходов.

o0 = f"Температура: {i0:.1f} °C";
o1 = f"Уставка: {i1:.1f} °C";
o2 = i0 > i1 ? "Выше уставки" : "Норма";

Реализованы UTF-8, индексация и срезы, поиск, изменение регистра с кириллицей, русская транслитерация, ограниченные варианты sprintf и fmt, а также шаблонные строки.

ExpressionStr: UTF-8, срезы, транслитерация и форматирование

Граница между вычислением и промышленной средой

Основные ограничения проявились при передаче строк из блока. Обычный char* не обеспечивает нужного времени жизни и не подходит для записи через OPC. Тип st::STRING совместим с Polygon, проводными соединениями и внешней записью, но среда не даёт общей блокировки между обновлением строки в цикле контроллера и параллельным чтением OPC-клиентом.

Для обнаружения частично обновлённых данных в блоках используется протокол ready/updated. Клиент записывает номер запроса в ready; блок вычисляет программу, обновляет выходы и затем переносит номер в updated. Равенство значений означает, что снимок готов к чтению.

Ошибки публикуются отдельно. Строка err не переписывается, если текст ошибки не изменился, а счётчик err_seq позволяет клиенту обнаружить пересечение чтения с обновлением. Это не заменяет блокировку памяти, но позволяет контролировать согласованность обмена.

Результат

PLExt переносит локальное вычисление из нескольких блоков и связей в одну программу с явно заданными входами и выходами. Библиотека также используется для проверки генерации и сборки внешних блоков Polygon.

Библиотека развивается в проектах автоматизации. Новые блоки добавляются после проверки в Polygon, в цикле контроллера и при внешнем доступе к данным.

РЕЛИЗ / ЗАГРУЗКА

Скачать PLExt

Архив содержит предсобранную библиотеку для платформ WINmingw и LinuxOwen3.

ZIP / 2,9 МБ

PLExt для Polygon

Единый предсобранный архив для платформ WINmingw и LinuxOwen3.

Скачать ZIP
SHA-256e2ab30b24eec64e663c45d5435462078b59494366cc0e9a74adf4972d856dddd