Своими разработками соревнуюсь с брендами в АСУ ТП. Превзойти Codesys
3o|||sheet : комплекс для разработки промышленных контроллеров (виртуальных, или физических).Состоит из трех независимых частей:
1)Среда разработки. 2) Компилятор. 3) Среда выполнения на железе:
3o|||sheet IDE : Легкая кроссплатформенная среда разработки, может открываться даже на одноплатных ПК. Задача среды - транслировать языки программирования (любые) в набор текстовых инструкций для 3o|||sheet компилятора. А также, Устанавливать виртуальный RTOS (собственной разработки) если пользователь распараллеливает программу на независимые задачи. В данный момент поддерживается LD, FBD и текстовый редактор для языков типа ST
Возможности: отладка, наблюдение онлайн значения в блоках, а так же - обновление кода отдельных задач на лету, не останавливая ПЛК физически и не останавливая другие задачи и производственные процессы.
3o|||sheet - компилятор
3o|||sheet - компилятор собственной разработки: независимое кроссплатформенное приложение. Самая интеллектуальная часть. Писать программы можно и без 3o|||sheet IDE, Взяв любой текстовый редактор, например Visual Code.
“Родным” кодом компилятора есть собственный стиль, гибрид синтаксиса ассемблера (инструкции) и языка СИ (данные) , сделано с целью - максимально простой трансляции других высокоуровневых языков на платформу. Какая бы ни была среда разработки (LD FBD ST) своя или сторонняя, среда должна транслировать в наш код .3osheet.
Несмотря на то что данные / переменные в системе виртуальные - физический их размер такой же как у языка СИ или Ассемблера. По переменным - никакой избыточности нет. В отличии от lua, Java , MicroPython , где переменная типа bool - весит больше 20 байт . Тут все оптимизировано для экстремально слабого железа. Вся ответственность типизации и работы с массивами лежит на компиляторе.
3o|||sheet Runtime
3o|||sheet Runtime: регистровая виртуальная машина работающая на стороне железа. Написана на СИ. Не использует низкоуровневый код под конкретную архитектуру, и быстро компилируется на любое железо ARM, RISC V, x86, разница только в настройке периферии, которую также инициализировать можно из виртуального уровня.
Минимальные системные требования:
4 KB RAM.
48 KB Flash (полная версия).
32 KB Flash ( с ограничениями).
Указанные требования - только для запуска виртуальной машины.
Для пользовательских программ нужно + память программ ( к ОЗУ и Flash). С примерным расчетом 8-12 байт на каждую базовую инструкцию если мы говорим о LD языке. И 60-100 байт на каждый таймер / счетчик.
Если говорим о пользовательских LD/FBD то каждая атомарная инструкция входящая в него (ADD, SUB , инкременты разные, переходы по веткам ) - 4 байта.
3o|||sheet Runtime - это полноценная машина. Содержит все нужные типы инструкций в том числе по работе с виртуальным стеком / контекстом задач. Что позволяет исполнять любые программы (глубокие переходы между функциями, рекурсии, многопоточность/многоядерность ). Разрабатывалась специально под АСУ ТП и строгие временные рамки исполнения задач.
Преимущества перед мировыми брендами
Это первая система виртуализации для железа с критически малыми ресурсами . У мировых производителей есть ПЛК с вытесняющей многозадачностью (не на железе с 8кБ ОЗУ). У нас первый возможный ПЛК, который может работать в нескольких режимах одновременно ( в отличии от брендов где только что то одно). И в целом кардинально новое.
На базе микроконтроллера с 16 килобайт ОЗУ можно запустить несколько исполнителей, разделяя на критичность процессов.
Разделение программы на производстве - по критичности. Критическая ошибка в коде или процессе - не остановит ПЛК, другие исполнители продолжат работать.
Представьте что вы АСУ ТП шник, и меньше всего хотите остановить какой то процесс из-за простоя. Вы можете создать несколько изолированных исполнителей разделяя по критичности:
Первая VM0 это - общие задачи + RTOS. Хотя зависшая задача не повлияет на другие задачи так как периферийный таймер все равно переключит, но критическая ошибка кода - может положить систему/машину.
Обычный ПЛК от критической ошибки бы - лег. Тут ляжет только один из исполнителей.
Сюда мы можем установить HMI , не критическую связь, иной код с возможными рисками.
VM1 VM2 Критический код, безопасность (максимально простые процессы, не используя стек или глубокие переходы) - выполняем отдельными независимыми исполнителями.
На физическом уровне, в CPU - у каждого исполнителя своя область памяти (свой массив байт) что бы там не произошло - вылетит только один,
другие продолжат работать.
Физический CPU так же в полной безопасности, для него - каждая машина это просто какой то массив байт, в котором данные и программа не его, и чтобы там не случилось - хоть полное их удаление - это проблемы того кто этот массив использует ,а не проблемы физического CPU.
Используя подобную архитектуру, сейчас разрабатываю механизм для создания ПЛК под возможный стандарт безопасности SIL3 SIL4 обеспечивая механизмы которых нет даже в мировых брендов:
Множественные исполнители программ.
Выполняться код может в безопасном режиме. Например один исполнитель без доступа к физическим процессам - исполняет код, второй проверяет не слетела ли машина после этого , и самое главное - проверяет хэш исполнения на наличия “тихих ошибок” которые просто могут быть не замечены компилятором и даже средой выполнения ( не будет исключения, но данные могут быть ошибочны - вместе с ложным срабатыванием впоследствии физическим выводом).
Третий исполнитель (полная копия первой, но с доступом к физическим процессам) убедившись что код и данные безопасны - выполнит и повлияет уже на физические производственные процессы. Кроме того, такой подход позволяет создавать полностью идентичные процессы в одном ПЛК. Подключать к ним например разные дубликаты физических датчиков для подстраховки на случай физической неисправности одного из них.
Дублирование датчиков для подстраховки от физической неисправности или отказа. Так же дублирование исполнителей для подстраховки от программного сбоя.
Жесткая изоляция: Сбой в VM1 (например, из-за некорректных данных с Датчика 1) никак не повлияет на выполнение VM2.
В классическом ПЛК с одной общей памятью сбойная программа могла бы повредить общие данные и "положить" весь контроллер.
Arbiter - сверяет данные, перезапускает слетевшего исполнителя, другое.
Подобные механизмы были раньше только в системах на Linux, а не на микроконтроллерах с 8-16 кб ОЗУ в формате ПЛК. Но Linux - не система реального времени, и вообще темный лес для безопасности критических систем.
Виртуализация выполнения проигрывает по скорости в 2-4 раза в сравнении с нативным кодом. А создание нативных платформ для ПЛК - гораздо легче путь, так как свои LD ST программы можно транслировать в СИ и компилировать например СИ-шным компилятором, не заморачиваться о деталях реализации самому (как это делают открытые проекты типа Beremiz и разные отечественные разработчики ПЛК).
Но виртуализация дает обширные возможности по безопасности и контролю, изменению программ на лету не останавливая производственные процессы, и при этом полностью соответствовать - строгим временным интервалам.
Первое тестирование и сравнение с брендом: Своими разработками, соревнуюсь с брендами в АСУ ТП. Аналог Allen Bradley? STM32G030 против Micro810
Дальше буду тестировать свою разработку на разном железе и сравнивать с мировыми брендами. То что на быстрых CPU результаты будут хорошие итак понятно, но целенаправленно буду тестировать в основном "слабые" микроконтроллеры, для демонстрации уровня оптимизации и максимальные возможности которые можно эффективно выжать из слабого железа чего не предлагают мировые бренды в АСУ ТП.
Этот пост - обновленная справка по проекту, ссылаться на него буду в дальнейшем в тестах, как информация о проекте





















