Простой пример использования в ПЛК нейросетевого контроллера
Современный мир движется к объединению технологий: промышленной автоматизации и искусственного интеллекта. Но для меня, занимающегося программированием в сфере АСУ ТП, было трудно понять, как на ПЛК, с его скромными техническими характеристиками и средой Codesys или TIA Portal можно применить технологии ИИ. На форумах готового решения не нашел, но проникся мыслью, что лучше обучить нейросеть на Python, а затем готовые веса и структуру перенести в Codesys. Я решил использовать OpenAI Gym, задачу CartPole. Это классическая задача обучения с подкреплением, где цель агента состоит в том, чтобы удерживать шест в вертикальном положении, выбирая действия (движение влево 0 или вправо 1), на основе текущего состояния системы. План действий: для получения весов написать класс нейросети на PyTorch с использованием пакет DEAP. После этого написать Modbus TCP сервер на Python с окружающей средой CartPole, подсоединиться к нему с помощью ПЛК. Полученные данные обрабатывать в ПЛК и передавать сигнал, который будет управлять тележкой, на сервер.
Структура нейросетевого контроллера выглядит так:
На вход подается: позиция, скорость тележки, угол шеста, угловая скорость. На выходе управляющий сигнал 0 (шаг тележки влево) или 1 (вправо). В PyTorch получилась такая модель:
nn.Sequential(
nn.Linear(self.input_size, self.hidden_size),
nn.ReLU(),
nn.Linear(self.hidden_size, self.output_size),
nn.Sigmoid()
)
Полный код можно посмотреть на https://github.com/Cheshire22/PyTorch-and-GA.
После получения весов, написал Modbus TCP сервер, который запускает CartPole, записывает данные в регистры, принимает управляющий сигнал с ПЛК и передает в CartPole. Код сервера можно посмотреть на https://github.com/Cheshire22/Codesys-and-AI.
Программа на ПЛК, несмотря на все опасения, оказалась очень простой. Написал FB с двумя методами. Установка весов SetWeights:
Вычисление управляющего сигнала Predict:
И главная программа PLC_PRG:
В итоге получилась связка Modbus TCP сервер (с включенной средой CartPole) ↔ ПЛК. Где ПЛК управляет тележкой.
Проект можно посмотреть на https://github.com/Cheshire22/Codesys-and-AI.