Промышленный контроллер на российском микроконтроллере АМУР MIK32

Микроконтроллер АМУР MIK32 стал основой для тестирования программной платформы промышленного контроллера. Автор проекта разрабатывает собственную среду — от IDE и компилятора до рантайма, работающего непосредственно на микроконтроллере. Главная цель — переносимость: один и тот же стек должен быстро разворачиваться на разных чипах без глубокой адаптации под конкретное оборудование.
Ранее среда проверялась на микроконтроллерах от STM32G030 до FPGA Altera Cyclone 4. Минимальные требования рантайма составляют около 5 КБ ОЗУ и не менее 32 КБ Flash либо примерно 3000 LUT при использовании FPGA. Диапазон в 12–20 КБ ОЗУ автор рассматривает как достаточный для полноценного ПЛК с вытесняющей многозадачностью, заменой кода на лету, интерфейсом RS-485 и онлайн-отладкой.
Как тестируется Ladder-логика
Для сравнения производительности используется программа на языке Ladder. Такой подход распространён в промышленной автоматизации: производители ПЛК нередко приводят в документации результаты выполнения дискретной логики, поэтому их удобно сопоставлять. В тестах измеряется среднее время обработки контактов и катушек в сложном ранге — участке схемы с большим количеством ветвлений.
Помимо самих логических операций, в таких рангах появляются дополнительные инструкции для сохранения промежуточных результатов вычислений. В проекте используется концепция, близкая к программному обеспечению Allen-Bradley: поддерживаются сложные ветвления и знакомая для промышленных контроллеров организация логики. При этом собственный компилятор ориентирован и на языки высокого уровня, включая Structured Text, а также умеет работать со сложными типами данных и пользовательскими конструкциями прямо внутри Ladder-цепей.
Виртуальное ядро и переносимость
Рантайм построен как софт-процессор — виртуальное ядро с программными регистрами R0–R32. Такой уровень абстракции отделяет исполняемую программу от аппаратной платформы и позволяет, по оценке автора, развернуть ПЛК на новом микроконтроллере примерно за два часа. Обратная сторона подхода — производительность в 3–5 раз ниже нативного кода. При этом рантайм работает в 5–10 раз быстрее Lua или MicroPython и сохраняет строго детерминированное время выполнения.
Нативная часть прошивки использует единую область памяти для программы, данных, стека и связанных структур. Разделения на память инструкций и данных нет: если программа занимает меньше места, оставшийся объём можно использовать под данные, и наоборот. Из IDE прошивка передаётся в микроконтроллер по UART. После проверки хешей начинается выполнение, а процессор последовательно читает инструкции и передаёт их соответствующим обработчикам через таблицу указателей. Программный счётчик PC хранит адрес текущей инструкции.
Результаты измерений
Один сложный ранг с 40 булевыми инструкциями и шестью ветвлениями выполняется примерно за 0,5 мс. В эту оценку входят не только исходные операции: транслятор Ladder добавляет около 25 инструкций для сохранения промежуточных результатов, то есть примерно по 3–4 инструкции на ветвь.
Время работы типовых функциональных блоков зависит от условий выполнения. Для таймера оно составляет от 80 до 320 мкс, для счётчика — от 80 до 390 мкс, для триггера — от 20 до 120 мкс. Максимальные значения соответствуют полному циклу, когда срабатывают все условия. В менее затратных сценариях, например при неактивном таймере или уже завершённом отсчёте, обработка занимает около 20–25 мкс, а пик нагрузки приходится на момент обновления состояния.
При цикле контроллера длительностью 10 мс система может выполнить около десяти сложных рангов с учётом накладных расходов на чтение и запись портов. Передача 128 байт по кадру на хост через интерфейс со скоростью 4400 бод/с способна добавить несколько сотен миллисекунд при блокирующей реализации. Итог зависит от организации обмена и конкретной скорости передачи данных.
Дальнейшее развитие
На момент тестирования MIK32 онлайн-мониторинг в среде ещё не был завершён. Однако измеренные времена выполнения позволяют заранее оценивать длительность обработки программы: к базовой стоимости рангов можно добавить известное время работы таймеров, счётчиков и триггеров. Архитектура также допускает создание собственных функциональных блоков и их добавление в библиотеку.
Проект не позиционируется как коммерческая разработка и не оптимизируется специально под производительность MIK32. Приоритетом остаются простая переносимость, быстрые изменения и полный рабочий цикл — от проектирования в IDE до запуска и отладки на контроллере. Такой подход даёт возможность собирать промышленный контроллер на разных микроконтроллерах, сохраняя единые принципы работы программной платформы.


