Впервые эту тему я затрагивал в ноябре 2021 года. Тогда они еще были «Виртуализированные ПЛК» и рассматривались как одни из вестников смены парадигмы автоматизации в сторону граничных(EDGE) и облачных(CLOUD) вычислений в промышленной автоматизации.
Виртуальный ПЛК (vPLC) — программный ПЛК, работающий в виртуализированных средах, таких как облако, периферийные серверы или промышленные ПК. Виртуальные ПЛК используют технологии контейнеризации и гипервизора, что позволяет им развертывать логику управления независимо от базового оборудования.
За прошедшее время уже чаще стали встречаться решения с граничными вычислениями, где многие вычислительные процессы и работы с данными выносятся за пределы ПЛК, чтобы его не сильно нагружать, а сам ПЛК занимается исключительно технологическим процессом.
Docker так совсем стал базовым инструментом для развертывания различных программных решений, да и многие производители ПЛК и разработчики программных решений для автоматизации выпустили ряд продуктов, которые называют vPLC.
Сфера применения
Для начала стоит договориться, что если в вашей сфере промышленной автоматизации вы не можете найти применение vPLC, то есть шанс, что он там не нужен, но это не значит, что он не найдет применения в других сферах.
Теперь схематично глянем где крутятся эти vPLC:

На схеме можно заметить, что должна быть какая-то зона граничных вычислений — это может быть отдельный сервер, ПК или даже одноплатный компьютер, где запущена среда виртуализации, которая выступает местом где разворачиваются инстансы vPLC, которые имеют способность к масштабированию, быстрому обновлению, возможность для мониторинга состояния работы.
Обмен данными с полевыми устройствами осуществляются через сети передачи данных, которые уже есть на производстве, в большинстве случаев это будет Ethernet.
Так что если возникла идея модернизировать старое оборудование, то можно соорудить следующее решение:

Изменив вычислительный модуль и поставив конвертор можно завести старые модули в новую систему, что позволит организовать поэтапную модернизацию.
Также стоит помнить об ограничениях, которые в себе несут сети передачи данных, ОС с Soft Real-Time, решения на базе vPLC не могут конкурировать в процессах где важна стабильность вычислительного цикла и требуется быстрая реакция системы на изменения.
OTee.io
Одним из вариантов vPLC, с которым мне удалось ознакомиться — это OTee.io.
Там имеется бесплатная версия для теста, которая включает в себя:
— Облачный редактор для ПЛК
— 1 Runtime для виртуального ПЛК
— Драйвер Modbus TCP
ВАЖНО. Система не будет работать если IP из России.
Для запуска потребуется любая платформа, которая может в Docker Compose, имеет 2Гб оперативной памяти и примерно 4Гб на накопителе и любая Linux подобная ОС. Можно и на Windows это развернуть, но к сожалению там все равно придется ставить WSL, чтобы поднять Docker.
Сойдут как и стационарные ПЛК, так и однолатники, к примеру OrangePI или облачный сервер, которые подойдет по характеристикам.
Для ознакомления с этим решением я взял облачный сервер с Ubuntu 22.04.
Я опишу те моменты, которые вызвали небольшие трудности в тесте и запущу простой опрос сервера.
Для старта всего понадобятся начальные знания bash и Docker, как правильно зарегестрироваться думаю вы и сами справитесь.
Конфигурация сервера
Для запуска vPLC и всей инфраструктуры необходимо установить Docker и все его окружение.
Для этого можно запустить данный скрипт:
# Docker Install
apt-get update -y
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
apt-get update -y
systemctl start docker
systemctl enable docker
usermod -aG docker ${USER}
systemctl restart docker
systemctl status docker
docker --version
# Docker Compose Install
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
apt update -y
apt upgrade -y
docker-compose --version
И далее запускается код сгенерированный сервисом. Должно быть примерно так

IDE
Теперь пару слов про среду разработки — это Beremiz, со всеми недоработками, которые в нем есть.
Нам доступны стандартные типы данных и стандартный набор FB, на базе которого мы можем реализовывать наше решение.
Конфигурация vPLC
Первым делом требуется создать vPLC, в терминологии OTee «Device»
Для этого в разде Devices(1) нажать на кнопку «Onboard a device»(2)

Во всплывающем окне требуется указать имя устройства и выбрать архитектуру.

Тут уже требуется отталкиваться от архитеутры CPU, где будет запущен vPLC
После создания нам выдадут программный код для установки агента.

Данный код необходимо запустить в терминале сервера, на котором будут запущены контейнеры, необходимые для работы vPLC.
Редактор кода
Чтобы начать писать код в разделе проектов(1) добавляем новый проект (2)

После создания проекта будет доступен шаблон с начальными настройками

Для начала в разделе конфигурации(1) можно настроит задачи(2) выбрать время цикла и добавить туда(3) новые экземпляры программы.
Также здесь можно добавить глобальные переменные(4). Особенностью данного решения является то, что нам доступно только одно фиксированное место для глобальных переменных, структурирование этих переменных позволяют осуществить группы глобальных переменных.
Открыв файл с программой станет доступен редактор кода. Интерактивная подсказка, она же автозавершение кода, доступно через ^I.

Особое внимание стоит уделить правому toolbar, который содержит в себе различные типы переменных для программы и самый большой интерес — это тип External. В моей практике он встречался только в Beremiz подобных средах разработки.
External — это внешние переменные, условное обозначение для программы, что где-то в другом файле есть переменная с таким же именем, которую нам и надо использовать. Через External происходит обращение к глобальным переменным, скажем спасибо бессмертному дедушке Си.
Опрос устройств
Для начала опроса требуется создать специальную сущность с типом Driver Config:

В поле драйвера доступен только Modbus.
После необходимо добавить клиента:

В настройках клиента указываем имя(1), цикл опроса(2), адрес устройства(3) и порт(4) для соединений.

Далее формируется пакет опросов.

Тут стандартные настройки для опроса ModbusTCP, я оставлю лишь опрос для 10 holding registers.
А дальше начинаются манипуляции для того чтобы можно было взаимодействовать с этими данными.
Для этого в разделе конфиграции(1) надо создать глобальную переменную(2) и указать адрес (3):

Добавлю пока первую переменную, а затем в файле program0 в разделе External необходимо указать эту глобальную переменную.

Можно просто выбрать из списка

Немного про сервер
Для тестирования опроса я взял заготовку сервера и развернул его на локальной машине.

Получается так, что мы программируем через web-интерфейс, после заливаем проект на vPLC, который находиться где-то в Нидерландах и он опрашивает сервер, который развернут на моей локальной машине.
Загрузка проекта
Для начала загрузки требуется выбрать необходимы vPLC

И потом нажать иконку для загрузки

После сообщения об успешной загрузки можно посмотреть значения переменной(1)

И вот можно увидеть что мы получили значения от сервера.

Да и на сервере можно увидеть, что наш vPLC сконектился и начал опрос.
Вывод
Интересно ли это было — определенно. Удалось развернуть vPLC, настроить работу опроса vPLC, и начать обмен данными с сервером.
Хорошее ли решение у OTee — для тестирования и ознакомления очень хорошее, но очень сложные проекты там сделать невозможно практически.
В целом, мне нравится как происходит развитие в этой сфере, что позволит ускорить интеграцию мелких решений по автоматизации.
Мы в ТГ: «Я вам че — Автоматизатор?»
