Прошивка и создание программного окружения ПЛК архитектуры x86
Перед реализацией прошивки ПЛК ставились следующие требования:
- Компактность. В связи с прямой зависимостью цены на промышленные флеш-диски от их объёма, а также реальным отсутствием необходимости частого обновления, образ прошивки нужно упаковывать, достигнув уровня компактности 8-50Мб на среду исполнения ПЛК в окружении полноценной ОС.
- Унифицированный исходный репозиторий. Поскольку прошивка не является чем-то немодифицируемым, нерасширяемым и окончательно фиксированным, то в её основе должен лежать реальный развивающийся репозиторий пакетов ОС. Это позволит продолжительное время формировать обновления и расширения, не поддерживая при этом опосредованный репозиторий.
- Отлаженная и простая процедура сборки. Учитывая тот факт, что конфигурация прошивки может некоторое время стабилизироваться, кроме того в компонентах ОС и Open SCADA будут обнаруживаться и устраняться ошибки, то процедура сборки прошивки не должна быть обременительна, а напротив - легко адаптируемой.
- Прозрачная реализация режима записи в дереве ОС. Хотя прошивка и подразумевает создание упакованного немодифицируемого образа прошивки, однако специфика работы среды исполнения ПЛК подразумевает модификацию БД и ведение архивов. Кроме того, наличие возможности коррекции исходной конфигурации является важным требованием.
- Надёжность и устойчивость к внезапным выключениям. Спецификой эксплуатации ПЛК является, как правило, отсутствие возможности корректного выключения, а также практическая реальность ситуаций мгновенного и непредсказуемого пропадания питания. ПЛК в таких ситуациях должен сохранять работоспособность, в смысле содержать журналлируемую ФС и обеспечивать её проверку и автоматическое устранение ошибок.
- Условное разделение конфигурации ПЛК на два типа:
- ПЛК без локального дисплея, возможно с простым текстовым табло.
- Touch-панели c функцией ПЛК.
Инструменты и сборка рабочих окружений
Учитывая вышеприведенные требования, для создания прошивки был выбран репозиторий пакетов дистрибутива ОС Linux
ALTLinux и инструмент создания дистрибутивов
mkimage. mkimage - инструмент для сборки образов Sisyphus-based системы по шаблону. В качестве исходного набора шаблонов был взят набор шаблонов формирования дистрибутивов ALTLinux по адресу git://git.altlinux.org/people/boyarsh/packages/mkimage-profiles-desktop командой:
За основу формирования PLC шаблона был взят стандартный "rescue", как наиболее компактный и близкий к целевой задаче ПЛК.
Сборка
В первую очередь создавалась конфигурация ПЛК без локального дисплея в виду наличия оборудования такого типа и отсутствия оборудования для Touch-панелей.
Новый шаблон ПЛК был назван "plc" и тестировался на платах формфактора PC/104
MOPSlcdLX фирмы Kontron,
ATH400-128 фирмы Diamond Systems и модульного ПЛК
LP-8781 фирмы ICP DAS. Архив результирующего дерева mkimage с шаблоном "plc" можно загрузить здесь
ftp://ftp.oscada.org/OpenSCADA/PLC (шаблоны и материалы отдельных контроллеров размещены в собственных директориях).
Ключевым моментом конфигурации нового шаблона стало написание скрипта инициализации (rc.sysinit), скрипта послеинсталляционной конфигурации образа прошивки и перечня пакетов в образе прошивки. Первый скрипт оформлен в виде пакета "startup-plc". Второй скрипт вложен в шаблоне "plc" по пути: profiles/plс/image-scripts.d/01system. Перечень пакетов вложен в шаблоне "plc" по пути: profiles/pkg/lists/plс.in
Процедура создания прошивки из шаблона следующая:
В результате получаем выходную директорию в profiles/out/ вида:
Инсталляция
Загружать прошивку можно на: USB-flash, IDE-flash и HDD. Однако, в случае с USB-flash может быть проблема с ожиданием инициализации USB-подсистемы и нужно будет немного побегать по диалогам загрузчика.
Файловая система может быть fat или ext2/ext3. В случае с ext3 монтирование корня производится как ext2, из-за проблем в инициализаторе. В случае с ext2/ext3 нужно будет использовать не загрузчик syslinux, а extlinux, конфигурация которого впрочем почти ничем не отличается.
Далее монтируем носитель и размещаем на нём файлы из выходной директории следующим образом.
В случае с fat и syslinux:
В случае с ext2/ext3 и extlinux:
Для обеспечения надёжного функционирования рабочие данные размещаются в файле "work" с файловой системой ext3. Файловая система этого файла проверяется на целостность при инициализации. Создаётся этот файл следующим образом:
В случае с файловой системой ext2/ext3 на целевом диске можно файл "work" не создавать. Тогда рабочие данные будут размещаться в директории root целевого диска.
Внимание. Это ненадёжное решение, поскольку корневая файловая система целевого диска становится нестатичной, а проверять её нет возможности, ввиду раннего монтирования в "ro" и потенциальной ненадёжности проверки ФС, смонтированной в "ro", а так же невозможности перемонтировать как ext3.
Следующим этапом является конфигурация и инициализация загрузчика. Для конфигурации загрузчика нужно отредактировать файл syslinux/syslinux.cfg или extlinux/extlinux.conf следующим образом:
В случае выбора идентификации загружаемого раздела по идентификатору узнать его для нашего раздела можно командой:
blkid.
В случае с меткой эта задача чуть сложнее поскольку делается это для разных файловых систем по разному.
Для файловых систем ext2/ext3 это делается утилитой e2label. Например, так: "
e2label /dev/sdb1 PLС"
Для файловой системы FAT это делается набором утилит из комплекта mtools следующим образом:
Теперь можем инициализировать загрузчик:
На этом с загрузкой и инициализацией прошивки всё. Если полученный диск не грузится то:
- Отсутствует флаг загружаемости на рабочем разделе.
- Некорректен или повреждён "MBR". Проверить и восстановить его можно с помощью утилиты "ms-sys".
- Разделы носителя созданы помощью parted. Данная утилита странным образом выравнивает разделы, что не позволяет с них загружаться на USB-flash. Нужно носитель переразметить с помощью fdisk.
- Загрузка также может не работать на старых системах, которые не умеют грузится с USB-HDD. Для них нужно будет адаптировать геометрию диска, подстраивая под USB-ZIP или что нибудь подобное.
Результат
В результате получаем прошивку размером от 30 до 100Мб, удовлетворяющую фактически всем заявленным требованиям и обеспечивающую:
- Загрузку в течении 27 сек от включения контроллера и включая инициализацию BIOS.
- Проверку и восстановление рабочей файловой системы в файле work.
- Хранение пользовательских данных и изменений прошивки в файле work.
- Автоматическую настройку сети по DHCP (или 192.168.0.1).
- Доступ к контроллеру по SSH и удобный интерфейс работы, включая mc. Пароли по умолчанию (root:123456; admin:123456).
- Синхронизацию времени посредством ntp.
- Исполнение Open SCADA с доступными сетевыми интерфейсами:
- конфигурация через Web (порты: 10002 и 10004);
- среда исполнения через Web (порты: 10002 и 10004);
- интерфейс управления Open SCADA (порт 10005).
Open SCADA
В качестве среды исполнения ПЛК используем систему
Open SCADA. Для данного случая возьмём сборку с отдельными пакетами на каждый модуль и укажем для установки виртуальный пакет openscada-plc, который содержит зависимости на все пакеты
Open SCADA, обычно используемые для данной конфигурации. Пакет графической библиотеки gd2 был пересобран без поддержки формата графического файла xpm и получил название libgd2-noxpm. Пересборка делалось для того что бы исключить тяжелые зависимости на библиотеки графического интерфейса XOrg.
В результате получилась среда исполнения ПЛК с поддержкой:
- БД:
- Архивирование:
- Источник данных:
- вычислитель функциональных блоков
- вычислитель на Java-подобном языке высокого уровня
- контроллеры логического уровня
- различные ПЛК по протоколу Mod Bus (RTU,ASCII,TCP)
- данные ОС
- Транспорт:
- последовательные интерфейсы;
- TCP, UDP и UNIX сокеты;
- безопасный слой сокетов (SSL).
- Транспортные протоколы:
- HTTP
- собственный протокол контроля Open SCADA
- Пользовательский интерфейс:
- движок среды визуализации и управления (СВУ)
- визуализатор СВУ на основе Web-технологий
- конфигуратор Open SCADA на основе Web-технологий
Конфигурация
Open SCADA запускается в режиме демона в локали uk_UA.UTF-8 с использованием локальной БД SQLite, предоставляя по умолчанию сетевые сервисы:
- конфигурация через Web (порты: 10002 и 10004);
- среда исполнения через Web (порты: 10002 и 10004);
- интерфейс управления Open SCADA (порт: 10005).
Детали реализации
В этом разделе рассмотрим детали дерева ОС прошивки, скрипт инициализации rc.sysinit.plc и скрипт подготовки дерева ОС прошивки.
Для построения прошивки ПЛК использовался следующий перечень пакетов:
Перечень модулей ядра системы загрузчика с целью уменьшения размера образа инициализации был уменьшен до списка:
В скрипте подготовки дерева были добавлены функции:
- смены наименования дистрибутива;
- подмены скрипта инициализации на inittab.plc;
- создание пользователя-администратора "admin" и установка паролей по умолчанию в "123456" для пользователей "root" и "admin";
- инициализация /etc/fstab;
- установка локали в uk_UA.UTF-8;
- конфигурация сети;
- установка часов;
- включение нужных сервисов;
- удаление: документации, страниц помощи и информации, иконок, RPM-БД и кеша apt;
- удаление ненужных локалей и переводов, оставлены en_US, ru_RU и uk_UA;
- добавлен код для отбора только используемых модулей ядра и удаления всех остальных; по умолчанию отключен и может включаться для подготовки финальной прошивки под конкретное оборудование;
- удалена директория с ядром (/boot), в связи с выносом его в корень загрузочного раздела.
Скрипт инициализации (rc.sysinit.plc) был наделён функциями:
- перемонтирование корневого раздела в режим RW;
- проверка и подключение файловой системы (/image/root) рабочих данных пользователя (файл work);
- отражение модифицируемых директорий дерева ПЛК (/etc, /var, /root, /home, /mnt и /lib) на файловую систему с рабочими данными пользователя (/image/root) посредством файловой системы "aufs" или "unionfs";
В результате этих мероприятий таблица монтирования конечного дерева ПЛК приняла вид:
Настройка графического интерфейса
Один из вариантов прошивки собирается с графическим интерфейсом, который, однако, нужно настроить для получения автоматического запуска со средой визуализации
Open SCADA. Кроме того, нужно отметить, что прошивка с графическим интерфейсом не содержит всех драйверов и может потребоваться её пересборка под нужное оборудование.
После загрузки и входа в консоль нужно сконфигурировать XServer, автоматический графический вход, запуск графического окружения и автоматический запуск
Open SCADA из окружения
Ice WM:
iROBO-3000a представляет из себя безвентиляторный промышленный компьютер с установленным Intel Atom D425 1.8 GHz с VGA, 2xGb LAN, 4xCOM, 4xUSB, 1GB RAM, 1x2.5" SATA HDD 120GB, Mini-PCIe, 4x4 DIO, CF слот, SIM Card слот, Audio, WDT, рабочий диапазон температур -5..+55°С. Производительности данного компьютера достаточно для выполнения как функций сервера сбора, контроля и управления, так и функций станции визуализации. Однако, ввиду использования непроизводительного процессора семейства Atom выполнение математических моделей технологических процессов потребует всех ресурсов процессора. Например, при исполнении математической модели
АГЛКС процессор нагружается на 86%. Контроллер имеет сертификат "
Укр СЕПРО", что может быть важным для многих пользователей на территории Украины.
Рабочее окружение
Open SCADA для этого компьютера строилось на основе пакетной базы дистрибутива
ALTLinux T6, а также свежесобранного окружения рабочего стола
Trinity (TDE). Сборка окружения осуществлялась на основе вышеописанной концепции с помощью обновлённого профиля "mkimage". В новый профиль также была добавлена цель "plc", однако её суть изменилась, фактически став копией цели "live", что стало возможным благодаря внедрению на этапе первичной инициализации прозрачного монтирования раздела с меткой "alt-live-storage" как отражения упакованной файловой системы с произвольным доступом на модификацию. В целом это позволило создать фиксированное ядро прошивки с базовым набором программного окружения размером 300Мб и возможностью свободного расширения путём доустановки нужных пакетов из дистрибутива.
В качестве окружения рабочего стола было выбрано Trinity по причине наличия проблемы фонового артефактинга в связке XOrgServer 1.10 + QT4, а также малой ресурсоёмкости TDE при высокой развитости и стабильности.
Архив профилей сборки нового окружения получил название
mkimage-profiles-6-kdesktop-plc.tgz, а последняя сборка прошивки
ALTLinux6-OpenSCADA_0.7.2-i586-plcUI_TDE-generic.flash.tar.