«Нефтепромавтоматика»: как разработать no-code платформу для программирования микроконтроллеров
Компания «Нефтепромавтоматика», выпускающая промышленные контроллеры, обратилась к нам с задачей: разработать программу-конструктор, которая позволит управлять контроллерами без написания программного кода. При построении графических схем пользователем в ней должен автоматически создаваться код на языке C, который используется в прошивках контроллеров. А процесс построения — быть таким же простым, как сборка фигуры из кубиков LEGO.
Цель проекта: помочь нашему клиенту быстрее масштабировать бизнес и предоставить его заказчикам инструмент, позволяющий настраивать устройства самостоятельно, не привлекая разработчиков.
О клиенте и его продукции
Компания «Нефтепромавтоматика» с 1975 года помогает нефтяникам по всей России: строит АЗС, прокладывает нефтепроводы, устанавливает и ремонтирует оборудование для добычи нефти и газа, автоматизирует процессы.
Инженеры компании создают системы сбора данных и контроля на базе собственных промышленных контроллеров. Среди заказчиков «Нефтепромавтоматики» — крупнейшие предприятия страны: «Газпром», «Лукойл» и «Роснефть».
Что такое контроллер, и как он используется?
Это устройство, которое меняет поведение одного механизма за счет поведения другого.
Пример: водоснабжение в высотных зданиях требует высокого давления в трубах. Давление регулируется насосами, а управляет этим процессом контроллер. Он следит за сигналами от датчиков давления и запускает насосы, если они показывают спад. Благодаря этому в пентхаусе на 21-м этаже вода идет с тем же напором, что в однушке на 3-м.
Промышленные контроллеры управляют работой сложных систем на водоканалах, заводах, электростанциях и фермах. Они позволяют автоматизировать процессы и почти полностью заменить ручное управление. Контроллеры нашего клиента используются в нефтяной и нефтеперерабатывающей отрасли.
На фото ниже — контроллер БРИГ-015 от «Нефтепромавтоматики».
С какой сложностью столкнулся клиент
Контроллер работает по заданной программе (прошивке), написанной на языке C. Прошивка определяет, как устройство должно реагировать на входящие сигналы и какие сигналы отправлять на выход.
Но программирование контроллеров — особая специализация. Программист должен не только владеть сложным языком C, но и понимать внутреннее устройство контроллера, чтобы правильно настроить обработку сигналов.
Клиент заметил: многие заказчики его компании не могут сами писать прошивки. Поэтому компании пришлось не только продавать устройства, но и брать на себя их настройку.
Это создало сложную систему поддержки. Специалистов компании нашего клиента стали вызывать не только при установке, но и при любых изменениях.
Например, если в нефтепроводе меняют старый насос на новый, нужно обновлять прошивку контроллера — и тут не обойтись без специалиста по программированию на языке C. Этих разработчиков на рынке немного, а их услуги стоят дорого, ведь низкоуровневое программирование требует редкой экспертизы.
Такая система неудобна всем:
- Заказчикам «Нефтепромавтоматики» приходится обращаться к производителю при каждом изменении.
- Из-за этого компания вынуждена развивать программное направление и вкладывать ресурсы в поддержку, что тормозит рост компании.
Задача
Нам предстояло автоматизировать процесс так, чтобы заказчики компании «Нефтепромавтоматика» могли менять настройки оборудования сами, без обращения к производителю.
Клиент решил использовать no-code / low-code подход. В этих редакторах пользователь работает с графическим интерфейсом, а программа сама генерирует готовый код. Но это «верхушка айсберга». Наша задача намного глубже: вместо веб-кода нужно было обеспечить создание низкоуровневого системного кода из графических схем.
Вызовы проекта
- Проект состоял из двух частей: с одной стороны, нужно было разработать графический редактор, с другой — конвертер схем в прошивку для контроллера. Схемы могут описывать самые разные процессы — всё предусмотреть просто невозможно. Поэтому мы работали без готового ТЗ: погружались в тему и уточняли детали в диалоге с заказчиком.
- Тестирование в этом проекте тоже стало вызовом: если веб-приложение можно проверить на тестовом стенде, то контроллер для управления давлением в нефтепроводе в офисе не испытаешь.
Клиент прислал нам один из своих контроллеров с документацией. Использовали его для тестов — имитировали типовые сценарии: создавали прошивку, загружали её в контроллер, имитировали сигналы датчиков и проверяли выходные значения.
Наши решения
Создали удобный графический редактор
Мы разработали редактор — это позволило достичь максимальной производительности и полного контроля над низкоуровневыми операциями.
Редактор преобразует нарисованные схемы в код для контроллера. В нём есть:
- входы — сигналы от оборудования (например, от датчика давления);
- выходы — команды оборудованию (например, насосу в нефтепроводе).
Между входами и выходами можно настроить логику обработки: проанализировать входной сигнал и определить нужную команду на выход. Для этого мы создали библиотеку графических элементов с готовым кодом. Теперь вместо программирования достаточно собрать схему в редакторе:
В правой панели находится библиотека готовых блоков для создания схем, которые можно добавлять в нужное место перетаскиванием (drag-and-drop).
Блоки бывают двух типов:
- Системные — предустановленные блоки, которые мы разработали вместе с заказчиком. Они покрывают большинство типовых задач.
- Пользовательские — их можно создавать и настраивать под свои задачи через режим редактирования. В такие блоки можно добавить любой код.
Исходный код доступен для просмотра в любом блоке, но системные блоки нельзя менять.
Блоки обоих типов можно объединять в тематические библиотеки. Например, отдельная библиотека для управления насосами и отдельная — для запорной арматуры, которая автоматически перекрывает трубы при утечке.
Такой подход позволяет настраивать даже сложную логику и удобно управлять ею через собственные библиотеки — собирать прошивку из блоков можно как из кубиков LEGO.
Глубоко продумали удобство использования
Мы учли, что с редактором будут работать люди без технической подготовки, привыкшие только к графическим интерфейсам. Поэтому сделали интерфейс максимально понятным и добавили подсказки.
Редактор помогает создавать схемы без ошибок: отмечает проблемные места красным цветом и объясняет, как их исправить. Так пользователь сразу видит, что пошло не так и что нужно сделать.
В итоге формируется готовый код на языке C, из которого собирается рабочая прошивка для контроллера. Там, где раньше было не обойтись без C-разработчика c зарплатой от 160 000 руб., теперь справляется оператор без компетенций программиста.
Позаботились об опытных пользователях
Нашим инструментом пользуются и опытные программисты на C. Они могут создавать собственные блоки и настраивать библиотеки под задачи предприятия.
Для них мы добавили продвинутые возможности:
- Перед компиляцией схема преобразуется в код на C. Опытные разработчики могут отлаживать программу прямо в коде — иногда это удобнее, чем работать со схемой.
- Код организован понятно: отдельно глобальные и локальные переменные, константы и функции.
- Встроенный редактор кода с подсветкой синтаксиса позволяет работать с программой, не переключаясь в другие редакторы или IDE (Integrated Development Environment, интегрированная среда разработки).
После всех правок достаточно сделать один клик, и программа создаст готовую прошивку для контроллера.
Тщательно тестировали интерфейс
Интерфейс приложения получился нестандартным. В нём много компонентов:
- библиотеки с группировкой блоков по пользовательским правилам и проектам;
- формы для создания схем и их группировки в проекты;
- система drag-and-drop для удобного создания схем;
- правила соединения блоков.
Все эти функции нужны для удобной работы с большой системой. Но чем сложнее интерфейс, тем больше в нём может быть ошибок. Поэтому мы уделяем особое внимание тестированию.
Тестирование интерфейса заняло много времени. Мы проверяли:
- Как пользователи создают схемы: перетаскивают блоки, соединяют их, группируют. Засекали время на типовые операции и спрашивали, что неудобно.
- Работу с библиотеками: получится ли случайно удалить нужный блок? Как быстро можно найти нужный элемент? Помогает ли группировка?
- Поведение редактора при ошибках: правильно ли подсвечиваются проблемные места? Понятны ли подсказки?
- Крайние случаи: что будет, если добавить в схему сотню блоков? А если попытаться соединить несовместимые типы данных? Или создать циклическую зависимость?
Мы собрали группу инженеров-технологов — будущих пользователей системы. Они пробовали собрать типовые схемы: управление насосами, контроль давления, аварийные сценарии. Записывали их замечания и постепенно улучшали интерфейс.
Проверили и работу с кодом. Программисты на C пытались добавить свои блоки и библиотеки, отредактировать готовые схемы в режиме кода. Смотрели, хватает ли им встроенных инструментов или приходится переключаться в другие редакторы.
Результаты
- Превратили сложное низкоуровневое программирование на C в понятный no-code конструктор. Такого решения ещё не было на рынке.
- Упростили программирование контроллеров. Теперь настраивать их могут обычные операторы, а не только программисты. Вместо написания кода достаточно собрать схему из готовых блоков — редактор сам подскажет, как исправить ошибки, можно не бояться что-то сломать.
- Сэкономили деньги заказчикам компании «Нефтепромавтоматика». Программистов на C теперь можно привлекать только для нестандартных задач, а не держать в штате постоянно. Не приходится подключать специалистов со стороны производителя при каждом изменении.
- Помогли «Нефтепромавтоматике» масштабироваться. Наш клиент может продавать больше контроллеров — и теперь их проще настраивать. Высвободились ресурсы компании, так как заказчики компании справляются с управлением контроллерами сами. А ещё появился новый продукт и конкурентное преимущество — удобный софт для работы с контроллерами.