Проект SDP LogiC

Данная статья является анонсом моего нового проекта, цель которого заключается в разработке программного комплекса для построения программируемых логических контроллеров (ПЛК). Проект задумывался как альтернатива пакету CODESYS, который является крайне популярным в системах промышленной автоматизации, но с той разницей, что в качестве средства описания логики работы ПЛК будет использоваться почти полноценный язык программирования, который будет иметь СИ-подобный синтаксис и поддерживать все «стандартные» операторы, такие как if, for, switch, и т.д.

Введение

В CODESYS, и подобных пакетах, создание логики работы ПЛК выполняется с помощью логических элементов в виде принципиальной электрической схемы, либо релейной логикой с элементами программирования на паскале-подобном языке:

Почему такой подход не является оптимальным?

1. Не каждый алгоритм возможно реализовать в виде принципиальной электрической схемы.

Разговаривал я с профессорами Мехмата ЮФУ, с их слов, есть инструменты, которые умеют конвертировать с разной степенью успеха код, написанный на СИ, в VHDL, для последующего использования, например, в ПЛИС. Цифровые фильтры, FFT, и многое другое из цифровой обработки сигналов преобразуется в VHDL практически влет, однако, если взять произвольную программу на СИ, то скорее всего ничего не выйдет. Приходим к выводу, что реализация алгоритмов в виде программного кода является более универсальной вещью. В тех же ПЛИС, часто реализуют так называемый софт-процессор [2], который выполняет необходимые вычисления. В CODESYS как раз для таких ситуаций часть логики можно описать на языках Instruction List и Structured Tex.

2. Языки МЭК 61131-3, которые как раз таки и реализованы в CODESYS [3] — темный лес для программистов.

Вы когда-нибудь видели программистов, которые сидят и пишут какое-нибудь новомодное приложение для смартфона на релейных схемах? Лично я не слышал о подобном. Сейчас очень популярны такие языки, как Java, C#, C++, JavaScript, php, Go, и тд, и общее у них то, что все они являются СИ-подобными, т.е. синтаксис СИ для современных программистов является как родной! Ладно-ладно, есть еще питон, и другие не-си-подобные и популярные языки программирования. но какой-нибудь C++ или C# преподают в любом ВУЗ-е. Так что приложение на СИ-подобном языке худо-бедно может реализовать любой программист, в отличие от МЭК 61131-3.

Случай из жизни. Рассказывал мне сотрудник на работе. Был он на одном небольшом заводе, там растительное масло разливали по пластиковым тарам. Бутылки надували из «зародышей» на месте, пробки штамповали там же. Так вот, линия розлива. Вдоль линии стоит куча ПЛК, и все выключены. А линия работает! Как так-то? Оказывается, то ли прошивка слетела у ПЛК, то ли еще что-то произошло, но местный электрик не смог исправить ситуацию «стандартным» методами. Выход из положения просто гениален: всю логику работы за пару вечеров он сделал на реле! Собрал шкаф, в нем радов пять реле, штук по 10-15 в каждом ряде. Задержки на RC-цепочках, все как полагается. Ну не умеет человек в ПЛК, зато на реле влет, вот так. К чему это я, на самом деле, людей, которые могут что-то сделать на релейных схемах не так много, в сравнении с «классическими» программистами.

3. А зачем ограничиваться только ПЛК?

На самом деле, существует множество случаев, когда было бы неплохо внедрить в железку какой-то скриптовой интерпретатор, при этом не превращать конечное изделие в компьютер. Сейчас есть очень модное направление, такое как IoT, и было бы очень удобно писать скрипты, которые к тому же можно обновлять/загружать по воздуху, для какого-нибудь модема сбора данных с чего угодно. По скорости выполнения подобных скриптов обычно серьезных ограничений нет, и если взять какой-нибудь STM32F103C8, и все сделать правильно, то скрипт будет выполняться со скоростью, сопоставимой со скоростью работы программы в какой-нибудь ардуине. К тому же СИ-подобный синтаксис позволит конфигурировать подобные устройства людям, далеким от промышленной автоматизации, схемотехники, и т.д.

 

SDP LogiC — что это и как работает?

SDP LogiC (Software Development Platform for programmable Logic Controllers) — это платформа, которая будет содержать все необходимые компоненты для создания ПЛК (и не только ПЛК). Сайт проекта расположен по этому адресу: https://sdplogic.ru, там будут появляться новости по мере их появления)).

Давайте немного подумаем, из чего должен состоять ПЛК.

Первое, это прошивка самого ПЛК. В нее должны входить драйверы для всей периферии, какие-либо полезные библиотеки, возможно RTOS, и, самое главное, это среда выполнения пользовательского скрипта/приложения/программы (нужное подчеркнуть). В качестве этой среды выполнения можно взять интерпретатор микро-питона, lua, или еще что-то. Однако, это решение будет довольно ресурсоемким, придется использовать достаточно жирный МК во всей конструкции… Не, так не пойдет.

Немного баек. Когда-то очень давно, когда я учился на первом-втором курсе, узнал я про (внезапно) Minecraft. А потом и про моды к нему. А потом про мод RedPower. Кроме всего прочего, данный мод добавлял в minecraft компьютеры, причем там сделано так, что мод эмулирует какой-то настоящий процессор, т.е. мы получаем настоящую виртуальную машину. В Minecraft. Да-да))). Более того, через эмулируемый дисковод можно было загрузить FORTH [4] и писать настоящие программы, и управлять какими-либо механизмами в игре. Посмотрел я на все это и такой: «Ээ, а че, так моооожно было??? O_o. Так, это же можно и на МК такое замутить!!!» Крышу мне сорвало с этого тогда знатно.

Так вот, в качестве среды выполнения пользовательской программы будет использоваться виртуальная машина, которая будет интерпретировать очищенный от шелухи и скомпилированный байт-код. В сравнении с прямой интерпретацией, данный подход нам даст намного более высокую скорость выполнения программы, и сама программа будет занимать мизерный объем ПЗУ (ну, это если все правильно сделать 🙂 ).

Что еще нам дает вириальная машина? ВМ позволяет отделить пользовательское приложение от основной системы, и если в приложении что-то пойдет не так, и оно рухнет, то прошивка продолжит работать как ни в чем не бывало. Это позволит реализовать механизм реакции на подобные случаи, такие как отправка краш-репорта, перевод выходов в безопасное состояние, перезапуск приложения, и т.д. Вот тут можно кинуть камень в сторону недо-ПЛК на базе ардуины: там пользовательское приложение и основная система ПЛК представляют собой монолитную прошивку, и если пользователь сделает что-то не так, то рухнет все, возможно даже с искрами и фейерверком.

Идем дальше. На чем будем писать пользовательские приложения? Не в машинных кодах же? Самое простое, что можно придумать, так это писать на ассемблере ВМ, и затем компилировать в бай-код, ассемблер написать не очень большая проблема. Но это как-то совсем грустно, хочется чего-то высокоуровневого и СИ-подобного… Ничего не поделаешь, надо делать компилятор. Это самая сложная задача, к которой я не знал как подойти долгое время. Но, все же взяв волю в кулак (благо был период, когда свободного времени было достаточно для изучения новых технологий), занялся я изучением теории компиляторов. Довольно сильно помогла книга, которую называют DragonBook [5]. Ну и еще тонны материалов из интернета. Чтобы начинать въезжать в тему, было потрачено около полугода, ну и еще примерно столько же на различные пробы и ошибки, переделки с нуля, чтобы получить более-менее подающий надежды результат. Было весело, но повторять такой самурайский подвиг еще раз пока не хочется)))

На данный момент на руках уже есть что-то похожее на компилятор, который пытается компилировать что-то СИ-подобное в байт-код виртуальной машины. Надо бы заняться описанием спецификации этого СИ-подобного языка, который, к стати, получил рабочее название DragonScript (ну раз книжку [5] называют DragonBook, то почему бы мне язык не называть DragonScript?)).

Итого получаем основные компоненты проекта SDP LogiC:

  1. Runtime, который запускается на микроконтроллере
  2. Компилятор

Стоит отметить, что для полного счастья нужен еще отладчик и IDE, но это планы на будущее. Чуть более подробно можно почитать здесь: https://sdplogic.ru/project-description.

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

Литература

  1. ПИД-регулятор для преобразователей частоты в CoDeSys [Электронный ресурс] URL: https://www.asutp-volgograd.com/blog/pid-regulator-for-inverters-codesys.html
  2. Soft-микропроцессор [Электронный ресурс] URL: https://ru.wikipedia.org/wiki/Soft-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80
  3. CoDeSys [Электронный ресурс] URL: https://ru.wikipedia.org/wiki/CoDeSys
  4. Форт (язык программирования) [Электронный ресурс] URL: https://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D1%82_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
  5. Компиляторы: принципы, технологии и инструменты // Альфред Ахо, Моника С. Лам, Рави Сети, Джеффри Ульман
  6. Сайт проекта SDP LogiC: https://sdplogic.ru
Закладка Постоянная ссылка.

Обсуждение закрыто.