Прошивка та створення програмного оточення ПЛК архітектури x86
Архітектура x86 порівняно недавно стала позиціюватися як вбудована та реальні рішення на її основі, у цій галузі, рідко мають ресурси (< i386), яких недостатньо для виконання повноцінної ОС та розвинутого оточення. З цієї причини, а також з причини більшої уніфікації архітектури, індивідуальні збірки ядра Linux та базових програм оточення ОС здійснюються достатньо рідко, що за звичай характерно для архітектури ARM. Більш цікавим та практичним для x86, для широкого кола обладнання, є збірка прошивок зі стисненою кореневою файловою системою (КФС). Однак все ще можлива індивідуальна збірка прошивок за допомогою систем складання на кшталт "BuildRoot" або "PTXDist", нижче. Також можлива і пряма установка дистрибутиву Linux.
Інструменти та збірка робочих оточень прошивок зі стиснутою КФС, на основі дистрибутиву ALTLinux
Перед реалізацією прошивки ПЛК, даного розділу, ставились наступні вимоги:
- Компактність. У зв'язку з прямою залежністю ціни на промислові флеш-диски від їх об'єму, а також реальною відсутністю потреби частого оновлення, образ прошивки потрібно упаковувати, досягнувши рівня компактності 8-50Мб на середовище виконання ПЛК у оточенні повноцінної ОС.
- Уніфікований вихідний репозиторій. Оскільки прошивка не є чимось немодифікованим, не розширюваним та остаточно фіксованим, то у її основі має лежати реальний репозиторій пакетів ОС який розвивається-супроводжується. Це дозволить тривалий час формувати оновлення та розширення, не підтримуючи при цьому опосередкованого репозиторію.
- Відлагоджена та проста процедура складання. Враховуючи той факт, що конфігурація прошивки може деякий час стабілізуватися, крім того у компонентах ОС та OpenSCADA будуть знаходитися та усуватися помилки, то процедура складання прошивки не має бути обтяжливою, а напроти — легко адаптованою.
- Прозора реалізація режиму запису до дерева ОС. Хоча прошивка і має на увазі створення упакованого немодифікованого образу прошивки, однак специфіка роботи середовища виконання ПЛК передбачає модифікацію БД та ведення архівів. Крім того, наявність можливості корекції вихідної конфігурації є важливою вимогою.
- Надійність та стійкість до раптових вимикань. Специфікою експлуатації ПЛК є, як правило, відсутність можливості коректного вимикання, а також практична реальність ситуацій миттєвого та непередбачуваного пропадання живлення. ПЛК у таких випадках має зберігати працездатність, у сенсі того, що містити журнальовану ФС та забезпечувати її перевірку і автоматичне усунення помилок.
- Умовний поділ конфігурації ПЛК на два типа:
- ПЛК без локального дисплею, можливо з простим текстовим табло.
- Touch-панелі з функцією ПЛК.
Враховуючи вищенаведені вимоги для створення прошивки було обрано інструмент створення дистрибутивів
mkimage ALTLinux.
mkimage — інструмент для складання штампів Sisyphus-based системи за шаблоном. У якості вихідного набору шаблонів було взято набір шаблонів формування дистрибутивів ALTLinux за адресою git://git.altlinux.org/people/boyarsh/packages/mkimage-profiles-desktop, командою:
За основу формування PLC шаблону було взято стандартний "rescue", як найбільш компактний та близький до цільової задачі ПЛК.
Первинне складання здійснювалось на основі пакетної бази дистрибутиву
ALTLinux 5.1, де присутнє ядро реального часу від
XENOMAI. Для отримання низки специфічних пакетів потрібно підключити репозиторій "ALTLinux 5.1" від проекту OpenSCADA:
rpm ftp://ftp.oscada.org/ALTLinux/5.1 openscada main
Складання
У першу чергу створювалась конфігурація ПЛК без локального дисплею, у зв'язку з наявністю обладнання такого типу та відсутності обладнання для 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/3. У випадку з EXT3 монтування ФС відбувається як EXT2, через проблеми у ініціалізаторі. У випадку із EXT2/EXT3 потрібно буде використовувати не завантажувач
syslinux, а
extlinux, конфігурація якого власне майже нічим не відрізняється.
Надалі монтуємо носій та розміщуємо на ньому файли з вихідної теки, наступним чином.
У випадку із FAT та
syslinux:
У випадку із EXT2/3 та
extlinux:
Для забезпечення надійного функціонування робочі дані розміщуються у файлі "work" з файловою системою EXT3. Файлова система цього файлу перевіряється на цілісність під час ініціалізації. Створюється цей файл наступним чином:
У випадку з файловою системою EXT2/3 на цільовому диску можна файл "work" не створювати. Тоді робочі дані будуть розміщуватися безпосередньо у директорії "root" цільового диску.
Це ненадійне рішення, оскільки файлова система цільового диску становиться нестатичною, а перевірити її немає можливості, у зв'язку з раннім монтуванням у "ro" та потенційною ненадійністю перевірки ФС, змонтованої у "ro", а також неможливості перемонтування як EXT3.
Наступним етапом є конфігурація та ініціалізація завантажувача. Для конфігурації завантажувача потрібно відредагувати файл "syslinux/syslinux.cfg" або "extlinux/extlinux.conf" наступним чином:
У випадку вибору ідентифікації завантажувального розділу за ідентифікатором дізнатися його для нашого розділу можна командою:
blkid.
У випадку з міткою це завдання дещо складніше оскільки робиться це для різних файлових систем по різному.
Для файлових систем EXT2/3 це робиться утилітою
e2label. Наприклад, так:
$ e2label /dev/sdb1 PLС
Для файлової системи FAT це робиться низкою утиліт із комплекту
mtools або за допомогою
parted, що простіше. За допомогою
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.
- Виконання OpenSCADA з наявними мережевими інтерфейсами:
- конфігурація та середовище виконання через WEB (порти: 10002 та 10004);
- інтерфейс управління OpenSCADA (порт 10005).
OpenSCADA
У якості середовища виконання ПЛК використано систему OpenSCADA. Для цього випадку візьмемо збірку з окремими пакетами на кожний модуль та вкажемо для встановлення віртуальний пакет openscada-plc, який містить залежності на всі пакети OpenSCADA, які за звичай використовуються для даної конфігурації. Пакет графічної бібліотеки gd2 було перезібрано без підтримки формату графічного файлу xpm та який отримав назву libgd2-noxpm. Перезбирання робилася для того щоб виключити тяжкі залежності на бібліотеки графічного інтерфейсу XOrg.
У результаті отримано середовище виконання ПЛК з підтримкою:
- БД:
- Транспорти:
- Транспортні протоколи:
- Джерело даних:
- Архівування:
- Користувацький інтерфейс:
Конфігурація OpenSCADA запускається у режимі демону та у локалі "en_US.UTF-8" (ще доступні локалі "ru_RU.UTF-8" та "uk_UA.UTF-8"), з використанням локальної БД SQLite, надаючи по замовченню мережеві сервіси:
- конфігурація та середовище виконання через Web (порти: 10002 та 10004);
- інтерфейс управління OpenSCADA (порт: 10005).
Деталі реалізації
У цьому розділі розглянемо деталі дерева ОС прошивки, скрипт ініціалізації rc.sysinit.plc та скрипт приготування дерева ОС прошивки.
Для побудови прошивки ПЛК було використано наступний перелік пакетів:
Перелік модулів ядра Linux, стадії попередньої ініціалізації, з метою зменшення розміру штампу ініціалізації було зменшено до переліку:
До скрипту приготування дерева було додано функції:
- зміна найменування дистрибутива;
- заміщення скрипту ініціалізації на "inittab.plc";
- створення користувача-адміністратора "admin" та встановлення паролів по замовченню у "123456" для користувачів "root" та "admin";
- ініціалізація /etc/fstab;
- встановлення локалі у "en_US.UTF-8";
- конфігурація мережі;
- встановлення годинника та зони у "/usr/share/zoneinfo/Europe/Kiev", для зміни потрібно замінити файл "/etc/localtime" у потрібну зону;
- включення потрібних сервісів;
- видалення: документації, сторінок допомоги та інформації, іконок, RPM-БД та кеша apt;
- видалення непотрібних локалей та перекладів, залишені en_US, uk_UA та ru_RU;
- відбір тільки використаних модулів ядра та видалення всіх інших; по замовченню вимкнено та може вмикатися для приготування фінальної прошивки під конкретне обладнання;
- видалення теки з ядром (/boot), у зв'язку із виносом його у корінь завантажувального розділу.
Скрипт ініціалізації (rc.sysinit.plc) було наділено функціями:
- перемонтування кореневого розділу у режим RW;
- перевірка та підключення файлової системи (/image/root) робочих даних користувача (файл "work");
- відбиття тек ПЛК, які підлягають модифікації (/etc, /var, /root, /home, /mnt та /lib) на файлову систему з робочими даними користувача (/image/root) за посередництвом файлової системи "aufs" або "unionfs".
У результаті цих дій таблиця монтування кінцевого дерева ПЛК набула вигляду:
Налаштування графічного інтерфейсу
Один із варіантів прошивки складається із графічним інтерфейсом, який, однак, потрібно налаштувати для отримання автоматичного запуску з середовищем візуалізації OpenSCADA. Крім того потрібно відзначити, що прошивка з графічним інтерфейсом не містить всіх драйверів та може потребувати її перебудови під потрібне обладнання.
Після завантаження та входу до консолі потрібно сконфігурувати XServer, автоматичний графічний вхід, запуск графічного оточення та автоматичний запуск OpenSCADA із оточення IceWM:
Пакетна база ALTLinux T6
Наступним етапом у створені прошивок став перехід на пакетну базу дистрибутиву
ALTLinux T6. В цілому процедуру створення прошивки було збережено, з низкою змін, але при цьому було додано деякі покращення та розширення:
- Використано нову функція "propagator" (система попередньої ініціалізації обладнання, пошуку та завантаження штампів ФС) пошуку/створення розділу EXT2/3/4 з міткою "alt-live-storage" для формування кореневого розділу "root" з можливістю модифікації. Ця функція надає повноцінну можливість встановлення додаткових пакетів прямо із репозиторія дистрибутива, а також оновлення упакованих у прошивку пакетів, виключаючи ядро та низку системних сервісів.
- Додано можливість створення прошивки у вигляді комбінованого ISO-штампу, який можна (окрім запису на CD/DVD) прямо, за допомогою утиліти dd, записати на USB-flash, HDD, SSD та отримати робоче оточення із розділом "alt-live-storage", відбиття "root", на вільне місце носія.
- Для можливості збірки нових прошивок під "LP-8x81" від ICP DAS було здійснено перенесення ядра реального часу "rt-up" із репозиторію "ALTLinux 5.1" у "ALTLinux T6". Ядро "rt-up" з успіхом адаптовано та отримано робочу прошивку на пакетній базі "T6" для "LP-8x81".
Оскільки з'явилася можливість легко довстановлювати потрібні пакети безпосередньо із репозиторія то відпала потреба у окремій збірці прошивок із GUI. Тобто можна легко довстановити потрібний менеджер вікон (WM) або оточення робочого столу із потрібними драйверами, чим створювати окрему прошивку із обмеженим переліком драйверів.
Скрипт "startup-plc" виявився непотрібним у нових прошивках оскільки перемонтування на запис кореневої ФС "root" здійснюється раніше, на стадії первинної ініціації. Скрипт "profiles/plс/image-scripts.d/01system" перейменовано у "profiles/plс/image-scripts.d/init1-PLC", оскільки змінено та розширено. Перелік пакетів прошивки залишився у "profiles/pkg/lists/plс.in" та дещо змінено.
Для отримання низки специфічних пакетів потрібно під'єднати репозитірий "ALTLinux T6" від проекту OpenSCADA:
rpm ftp://ftp.oscada.org/ALTLinux/t6 openscada main
Процедура створення прошивки із шаблону фактично не змінилась:
# Створення скрипту конфігурації "configure"
$ ./autoconf
# Конфігурація складальника для генерації штампів дисків. Ключ "--with-imagetype" можна встановити у "iso", або опустити,
# для створення комбінованого ISO-штампу
$ ./configure --with-distro=kdesktop --with-branding=altlinux-kdesktop --with-version=6.0 --with-language=en_US --with-imagetype=flash
# Збірка штампу
$ make plc.cd
Вміст вихідної теки із штампом та встановлення прошивки на файлову систему FAT та EXT2/3/4 відрізняється тільки перейменуванням файлу архіву ФС із "plc" у "live". Встановлення ISO-штампу на USB-flash, HDD, SSD виконується командою
dd:
$ dd if=LP8x81-ALTLinuxT6-OpenSCADA_0.8.0.6-i586-plc.iso of=/dev/sd{x} bs=4096
Замість файлу "work" потрібно створити розділ EXT3 з міткою "alt-live-storage", якщо це не ISO-штамп. Створювати новий розділ можна за допомогою
fdisk, якщо FAT розділ було створено не на всьому доступному просторі диску, або за допомогою
parted, де розділ FAT можна зменшити. За деталями створення розділу відішлемо до документації на
fdisk або
parted.
Конфігурація файлів "syslinux/syslinux.cfg" та "extlinux/extlinux.conf" не змінилася, окрім зміни ім'я архіву ФС із "plc" на "live".
У результаті отримуємо прошивку розміром від яка забезпечує:
- Завантаження протягом 25 секунд від включення контролеру, включаючи ініціацію BIOS.
- Перевірку та відновлення журналу робочої файлової системи "root" у "alt-live-storage".
- Зберігання користувацьких даних та змін прошивки, а також нових та оновлених пакетів програм, у розділі "alt-live-storage".
- Автоматичне налаштування мережі за DHCP (або 192.168.0.1), для першого інтерфейсу.
- Доступ до контролеру по SSH та зручний інтерфейс роботи, включаючи mc. Паролі відсутні, а користувач "root" має доступ для підключення за SSH.
- Синхронізацію часу за посередництвом NTP.
- Виконання OpenSCADA із доступом за посередництвом мережевих інтерфейсів:
- конфігурація та середовище виконання через Web (порти: 10002 та 10004);
- інтерфейс управління OpenSCADA (порт 10005).
Для побудови прошивки ПЛК використовувався наступний перелік пакетів:
Перелік модулів ядра Linux, стадії попередньої ініціалізації, був дещо змінений та склав:
Скрипт підготовки дерева "profiles/plс/image-scripts.d/init1-PLC" виконує функції:
- зміна найменування дистрибутива;
- відкриття входу від "root" через SSH, без пароля;
- встановлення локалі у "en_US.UTF-8";
- конфігурація мережі для використання DHCP або встановлення "192.168.0.1" для першого інтерфейсу;
- встановлення годинника та зони у "/usr/share/zoneinfo/Europe/Kiev", для зміни потрібно замінити файл "/etc/localtime" у потрібну зону;
- увімкнення потрібних сервісів;
- видалення: документації, сторінок допомоги та інформації, іконок;
- видалення непотрібних локалей та перекладів, залишено en_US, uk_UA та ru_RU;
- відбір тільки використаних модулів ядра та видалення всіх інших; по замовченню вимкнено та може вмикатися для приготування фінальної прошивки під конкретне обладнання; уніфіковано для зазначення модулів за групами підсистем ядра та специфічними для обладнання;
- видалення тек з ядром (/boot), у зв'язку із виносом його у корінь завантажувального розділу.
Ядро реального часу
Для низки задач ПЛК важливим, часто і критичним, критерієм оточення є його рівень забезпечення реального часу (RealTime), тобто можливість роботи задач згідно із пріоритетами реального часу та забезпечення реакції на повідомлення згідно цим приорітетам.
Ядро Linux само по собі надає POSIX політики планування в реальним часом "SCHED_FIFO" та "SCHED_RR" із діапазоном пріоритетів (0...100). Однак важливий критерій "Частота таймеру та час реакції на нього"
до версий ядер Linux 2.6.24 були дуже низькими, за мірками систем реального часу. У сучасних ядрах Linux (> 2.6.24) забезпечено підтримку таймерів високої роздільної здатності (HPET), що зменшило час реакції на таймер до рівня 100 мікросекунд, однак стабільність цього часу реакції не забезпечено. Для забезпечення стабільності реакції на таймер на рівні 60 мікросекунд, а також низки інших критеріїв реального часу, на цей день, потрібно ядро складати з одним із розширень реального часу.
У дистрибутивах
ALTLinux помічено ядро 2.6.29-rt-up, яке зібрано із розширенням реального часу
XENOMAI. У інших дистрибутивах, наприклад
OpenSuSE помічено навіть продукти з такими розширеннями.
На цей час більш високі показники реального часу забезпечує розширення
The Real Time Preempt Patch, при увімкнені повної підтримки (CONFIG_PREEMPT_RT), процес складання та результати роботи Linux ядер з якими будуть відстежуватися у цьому розділі.
Для тестування рівня реального часу тих або інших ядер будемо користуватися утилітою "
Cyclictest", типовий рядок виклику та аргументи будуть такими: "
$ cyclictest -t1 -c1 -p 80 -n -i 200 -l 100000". Де:
- -t1 — один потік тестування;
- -с1 — використовувати годинник реального часу CLOCK_REALTIME;
- -p 80 — пріоритет потоку тестування;
- -n — використовувати функцію "clock_nanosleep";
- -i 200 — інтервал виклику потоку тестування: 200 мкс, як близький до середнього значення 50 мкс;
- -l 100000 — кількість ітерацій тестування.
Пара вимірів для ядер Linux загального призначення:
- Стандартне ядро дистрибутиву ALTLinux T6 (3.0.79-std-def, LP8781):
- навантаження 0%: Avg: 37 us; Max: 152 us
- навантаження 100%: Avg: 37 us; Max: 191 us
- Ядро дистрибутиву ALTLinux T6 (3.4.45-un-def, LP8781):
- навантаження 0%: Avg: 53 us; Max: 217 us
- навантаження 100%: Avg: 40 us; Max: 183 us
kernel-image-rt-up-2.6.29
Це ядро міститься у дистрибутиві ALTLinux 5.1, а також перенесено у локальний репозиторій проекту OpenSCADA, для ALTLinux T6. Це ядро зібрано із розширенням
XENOMAI та
AUFS, що дозволяє використовувати його у прошивках із упакованою КФС, що і зроблено для ПЛК
LP-8x81.
Результати тестів цього ядра:
- LP8781 (XENOMAI)
- навантаження 0%: Avg: 26 us; Max: 136 us (помічено скиди до 1 мс, схоже через нестабільність джерела годинника "tsc", причому "acpi_pm" тут ще гірше)
- навантаження 100%: Avg: 24 us; Max: 3655 us
- LP8781 (CONFIG_PREEMPT_NONE)
- навантаження 0%: Avg: 29 us; Max: 71 us
- навантаження 100%: Avg: 28 us; Max: 117 us (помічено зісковзування на безперервне нарощування)
- LP8781 (CONFIG_PREEMPT_RT)
- навантаження 0%: Avg: 29 us; Max: 64 us
- навантаження 100%: Avg: 29 us; Max: 82 us
- AMD Turion Neo X2 L625 (CONFIG_PREEMPT_RT)
- навантаження 0%: Avg: 57 us; Max: 74 us
- навантаження 100%: Avg: 57 us; Max: 78 us
Як видно із результатів тесту, патч XENOMAI не забезпечує пристойного рівня реального часу при використані стандартних механізмів планування реального часу POSIX, в той час як ядра версії 3 навіть без наявності особливих розширень реального часу забезпечують помітно кращий результат.
Потреба складання саме цього ядра із патчем/параметром CONFIG_PREEMPT_RT стоїть через наявність низки бінарних модулів від ICP_DAS, для "LP8x81". Також стоїть питання збірки ядра 2.6.33 з тієї-ж причини, але для "LP8x81 Atom". Попередні збірки ядер 2.6.29 та 2.6.33 виявили низку проблем, які будуть тут описані. Розглядається також варіант збірки сучасного ядра із CONFIG_PREEMPT_RT, а потім запит на збірку бінарних модулів у "ICP DAS".
Процес складання та тестування:
- Патчі CONFIG_PREEMPT_RT та AUFS часів 2.6.29 конфліктують на функції "debug_mutex_set_owner()", у CONFIG_PREEMPT_RT видалена — замінено на "mutex_set_owner()".
- При складанні виявлено низку проблем із "# typedef void irqreturn_t;" — замінено на "#include <linux/irqreturn.h>".
- Перший запуск із CONFIG_PREEMPT_RT, але без AUFS, пройшов вдало — результат вище.
- Запуск із AUFS виявив проблему виділення пам'яті AUFS у "aufs_mmap()" — робочий код AUFS взято цілком із попередньої збірки "rt-up-2.6.29.alt2".
- Запуск із AUFS виявив проблему зависання на корінні ФС у AUFS, схоже через можливість зациклювання/блокування RT-задачі — встановлено CONFIG_PREEMPT_NONE, на LP8781 та "AMD Turion" проблем не виявлено (можливо ця проблема через відсутність HPET на PLX8).
- На перший погляд ядро працює нормально, але помічено зісковзування на безперервне нарощування часу запізнення.
- Виконано адаптацію ядра для бінарної сумісності із модулями "slot" та "icp" від ICP_DAS. Модуль "8250_linpac" падає при завантажені, а "icpdas_8250" має безліч нерозв'язаних символів — потрібно ці модулі перескладати або пробувати інтерфейси > COM2 ініціювати через setserial — модулі перескладено, завдяки Golden Wang (тех. підтримка ICPDAS).
- Нове ядро встановлено під високе навантаження, конфігурацією проекту САУ кульових барабанних млинів:
- Збій мережі із драйвером "via_rhine", після 4 діб роботи — збій очікуваний, зібрано драйвер "rhinefet", випробування продовжено.
- На драйвері "rhinefet" система під навантаженням пропрацювала три тижні. Однак помічено, що переривання 11, на якому висить майже все стандартне обладнання (USB, Ethernet та може ще чогось), вимикається та мережа працює у режимі "Pool", що повільніше. Можливо вимкнення цього переривання відбувається і з "via_rhine", а він не може працювати у режимі "Pool", чому і пакети у/із мережі не ходять. Проблема пов'язана із відмовою та генерацією необроблених переривань одним із обладнань на переривані 11.
- Виправлено виключенням вимкнення переривань за допомогою параметра ядра Linux "noirqdebug".
- Адаптацію вдало завершено та прошивки на основі цього ядра готові до промислової експлуатації!
- 01.03.2015: Замість функції EnableWDT() використано EnableSysWDT(), у зв'язку із обмеженням до 30 секунд та циклічних перевантажень якщо не завантажується за 30 секунд (до трьох перевантажень).
- 17.03.2015: При участі служби підтримки ICP_DAS виправлено проблему драйверу послідовних інтерфейсів більш за COM2, яка призводила до "замерзання" ядра Linux (схоже у зв'язку із блокуванням переривань) після закриття одного порту та активності на хоча-б одному іншому.
- 29.07.2015: Виявлено ще одну проблему із мережею із схожими симптомами вимкнення переривання 11, але: переривання 11 не вимикається та всі інші пристрої на ньому працюють, відтворюється тільки на конфігураціях із використанням обох інтерфейсів мережі, причому можливе "гальмування" тільки одного із них. Проблема вирішується тільки перевантаженням "загальмованого" мережевого інтерфейсу, командою: ifdown eth0; ifup eth0. Для виявлення та перезапуску рекомендується на рівні OpenSCADA додавати контроль трафіку та безпосереднє перевантаження інтерфейсу за його відсутністю.
- 21.11.2016: Драйвер "rhinefet" адаптовано на предмет запобігання блокування переривань та вимкнення вектору переривань оскільки режим SHARE використовується. Наразі драйвер працює однак 19.12.2016 також було помічено гальмування мережі із двома цими адаптерами після біля двох тижнів роботи.
Відтак це обладнання зламане для роботи двох адаптерів та у цьому ПЛК ви можете використовувати лише один, для стабільної роботи!
Отримане ядро, перейменовано у "kernel-image-rt1-up-2.6.29.alt1", можна використовувати для PLC із HPET або таймером високої роздільної здатності, а також у "LP-8x81" та "LP-8x81 Atom" (тільки одне ядро)!
kernel-image-rt-up-2.6.33
Складання ядра версії 2.6.33 потрібне для контролерів фірми "ICP DAS" LP-8x81 та LP-8x81 Atom з причини наявності саме для нього, із патчем CONFIG_PREEMPT_RT, бінарних драйверів "ICP DAS", для LP-8x81 Atom.
Результати тестів цього ядра:
- AMD Turion Neo X2 L625
- навантаження 0%: Avg: 65 us; Max: 86 us
- навантаження 100%: Avg: 57 us; Max: 72 us
- LP8781
- навантаження 0%: Avg: 37 us; Max: 88 us
- навантаження 100%: Avg: 34 us; Max: 108 us
- LP8781-Atom (оригінальна збірка ядра 2.6.33.7-rt29-ICPDAS)
- навантаження 0%: Avg: 17 us; Max: 50 us
- навантаження 100%: Avg: 12 us; Max: 32 us
Процес складання та тестування:
- Збірка ядра із вихідних "ICP DAS" (2.6.33.7) та конфігурацією, успадкованою з ядра 2.6.29 (вихідні тексти містять підозріло багато *.rej файлів, а також "staging/comedi" не може бути складений) — вантажиться та в цілому працює; модулі "ipic" та "slot" вантажаться; модуль "8250_linpac" падає у функції "platform_device_add"; низка програм зависає на операціях із ФС, з повідомленням: "task openscada:2153 blocked for more than 120 seconds".
- Заміна AUFS на версію із 2.6.29-rt1 — падає у rtmutex прямо на завантажені; заміна на офіційну із git показала такий-же результат, від початку використано патч "aufs+sqfs4lzma-2.6.33.patch" від DLink.
- Збірка оригінального ядра з патчами CONFIG_PREEMPT та AUFS — проблема знову з AUFS, але тепер він "/sbin/mingetty" у кінці знайти не може.
- Збірка оригінального 2.6.33.9 ядра з патчами CONFIG_PREEMPT та AUFS — проблеми ті-ж.
- Збірка із вихідних "ICP DAS" (2.6.33.7) для SMP — модуль OpenSCADA DAQ.JavaLikeCalc падає за незрозумілою причиною.
- Збірка оригінального ядра з патчами CONFIG_PREEMPT та AUFS для SMP — та-ж проблема, що і без SMP, хіба-що тільки не одразу, а на приблизно п'ятому потоці.
На цей момент ядро 2.6.33 у зв'язці із CONFIG_PREEMPT_RT та AUFS неробоче. Відповідно якщо потрібна буде робота на "LP-8x81 Atom" то рекомендується використовувати оригінальне Linux оточення, зібравши та встановивши OpenSCADA туди.
Плати від "Diamond Systems" стали першими на яких тестувалась та стабілізувалась OpenSCADA. Першою платою став одно-платний комп'ютер
ATH400 формфактору
PC/104, наведені на рисунку нижче. На цьому комп'ютері оточення ОС, на початку, встановлювалося традиційним методом, а надалі згідно викладеній вище концепції створення прошивки.
Апаратні характеристики плати:
Центральний процесор: | VIA Eden 400-660MHz |
Оперативна пам'ять: | 128MB, запаяно на плату |
Постійна пам'ять: | IDE (44) порт с UDMA-33 |
Відео підсистема: | S3 Savage 4 Chipset з розширеним 3D/2D відео; підтримуються плоскі панелі, CRT та LCD |
Аудіо підсистема: | присутня |
Інтерфейси/порти: | 10/100Mbps Ethernet; 4 RS-232 послідовні порти; 4 USB 1.1 порти; PS/2 клавіатура та миша |
Джерело живлення: | +5VDC ±10% @ 2A |
Робочі умови: | -40 ... +85°C |
DAQ: | 16AI (16 біт, 100 кГц), 4AO, 24DIO, 2CNTR |
Першим завданням цієї плати та OpenSCADA була реалізація функції високочастотного (10 КГц * 8 каналів) архіватору сигналів газового компресору для вивчення явища
помпажу на
Анастасіївській ГЛКС.
Другим завданням став прототип ПЛК вузлів електропідстанцій. Вже для цієї задачі прошивка збиралась на основі нової
пакетної бази. У межах цієї задачі
модуль опитування даних плат "Diamon Boards" було уніфіковано для підтримки всіх плат виробника.
Другою платою стала плата ППО
DMM32-AT, представлена на рисунку нижче. Плата використовувалась для створення макетів та емуляторів поля технологічного ПЗ. Плата має характеристики:
Джерело живлення: | +5VDC ±10% @ 200mA |
Робочі умови: | -40 to +85°C |
DAQ: | 32AI (16 біт, 200 кГц), 4AO, 24DIO, 2CNTR |
Дослідження шумових властивостей високо-імпедансних входів плат від Diamond Systems у різних умовах зведено до таблиці нижче:
Умови | Зовнішній БЖ: Рівень шуму, мВ [Гц] | Внутрішній БЖ: Рівень шуму, мВ [Гц] | Зауваження |
(10 кГц, ±0.625 В, 20 мкс), Заземлено-32 | 0.08 [-] | | |
(10 кГц, ±5 В, 20 мкс), Заземлено-32 | 0.5 [-] | 0.35 [-] | |
(10 кГц, ±5 В, 20 мкс), Заземлено-31, Навантаження ∞ | 5 [50, 270] | 18 [50, 150] | |
(10 кГц, ±5 В, 20 мкс), Заземлено-31, Навантаження 1мОм | 10 [50, 270] | | |
(10 кГц, ±5 В, 20 мкс), Заземлено-31, Навантаження 100кОм | 7 [150, 50, 270] | 7 [-] | |
(10 кГц, ±5 В, 20 мкс), Заземлено-31, Навантаження 10кОм | 4.5 [100] | 6 [-] | |
(10 кГц, ±5 В, 20 мкс), Заземлено-31, Навантаження 1кОм | 0.9 [150] | 1 [-] | |
(10 кГц, ±5 В, 20 мкс), Заземлено-31, Навантаження 100Ом | 0.5 [-] | 0.5 [-] | |
MOPSlcdLX представляє собою одно-платний комп'ютер формфактору
PC/104, представлено на рисунку нижче. Цей комп'ютер привабив увагу з причини порівняно невеликої вартості, за рахунок звичайного діапазону експлуатації та меншого енергоспоживання та як наслідок меншого нагріву.
Апаратні характеристики плати:
Центральний процесор: | AMD LX800™ 500 MHz, безвентиляторний |
Оперативна пам'ять: | DDR-RAM-SODIMM сокет |
Постійна пам'ять: | IDE (44) порт |
Відео підсистема: | вбудована графіка із підтримкою виводу на плоскі панелі, CRT та LCD |
Аудіо підсистема: | немає |
Інтерфейси/порти: | 10/100Mbps Ethernet (Intel® 82551ER); 2 RS-232 послідовних порти; 2x USB 2.0; PS/2 клавіатура та миша, Floppy, LPT |
Джерело живлення: | +5VDC ±10% @ 1A |
Робочі умови: | 0 ... 60°C |
Плата використовувалася для опробування створення станцій/панелей оператора з OpenSCADA, у подібному оточені. Згодом виплила низка проблем з цією платою:
- Відсутність батарейки для годинника і як наслідок необхідність встановлення часу при кожному завантажені або встановлення зовнішньої батарейки. При цьому налаштування BIOS зберігаються не у CMOS, а у FLASH, що начебто і добре, але якщо врахувати, що скинути налаштування BIOS немає можливості то виходить дуже погано.
- Проблема у схемі переривань, яка призводить до блокування всіх або багатьох суміжних переривань, у випадку завантаження модуля "geode_aes".
- В якийсь момент відгоріла відеокарта або відео-вихід, а налаштування BIOS у FLASH не дозволяють їх повернути, для виправлення ймовірного вимкнення відео у BIOS. Також BIOS не підтримує видачі свого інтерфейсу на COM-порт. Можна спробувати із CRT, коли з'явиться.
- Відсутній лічильник високої роздільної здатності (HPET), що дивно та робить цю плату непридатною для систем реального часу оскільки звичайним лічильником можна отримати затримку біля 4мс.
На цей час, на основі цієї плати, готується "Програмний осцилограф", для чого на нього з успіхом завантажено сучасну прошивку із ядром "std-def" та довстановлено плату DMM-32X-AT, про яку вище.
VSX104 представляє собою одно-платний комп'ютер формфактору
PC/104, представлено на рисунку нижче. Цей комп'ютер привабив увагу з причини невеликої ціни та низького енергоспоживання (< 2Вт) та як наслідок меншого нагріву. Однак у зв'язку використання на ньому процесору "Vortex86SX-300 МГц" вимагається особливий підхід до формування оточення ОС, оскільки використано набір інструкцій i486 та відсутній математичний сопроцесор.
Апаратні характеристики плати:
Центральний процесор: | DM&P SoC Vortex86SX-300 МГц |
Оперативна пам'ять: | 128 МБ DDR2 RAM розпаяна на платі |
Постійна пам'ять: | слот CompactFlash Type I, microSD та 2 порти EIDE (Ultra DMA 100) |
Відео підсистема: | немає |
Аудіо підсистема: | немає |
Інтерфейси/порти: | 10/100Mbps Ethernet; 4 RS-232 послідовних портів; 2x USB 2.0; PS/2 клавіатура та миша, LPT, Резервування, SPI |
Джерело живлення: | +5VDC ±10% @ 370mA |
Робочі умови: | -40 ... 85°C |
DAQ: | 1 порт 16-бітного GPIO |
На цей час рішень на цій платі немає, однак планується зібрати для неї оточення, можливо для автономної системи обліку.
Перенаправлення інтерфейсу BIOS на COM-порт можна примусово включити заземленням 10 піну COM-порту.
VDX-6354D представляє собою одно-платний комп'ютер формфактору
PC/104, представлено на рисунку нижче. Цей комп'ютер побудовано на процесорі "DM&P SoC CPU Vortex86DX- 800MHz", який продуктивніше "Vortex86SX-300 МГц" у попередньому розділі, однак і енергоспоживання цієї плати вже не 2, а 4 Вата
більше на сторінці проекту (RU)
Промислові контролери сімейства
LP-8x81 фірми
ICP DAS є першим продуктом із серії LinPAC, який побудовано на x86 сумісному процесорі, попередні контролери цього сімейства основані на процесорі сімейства ARM. Крім x86 процесору ці контролери мають значні ресурси оперативної пам'яті та дискового простору. Все це дозволило розглядати цей контролер як першого кандидата із продукції ICP DAS для адаптації OpenSCADA у якості середовища виконання
більше на сторінці проекту (RU).
Фірма
Avalue, сумісно з її дистриб'ютором у Росії фірмою
ElTech, надає широкий спектр панельних ПК, які можуть використовуватися починаючи із звичних офісних моноблоків та закінчуючи промисловими сенсорними панелями у фронтальному виконанні класу IP65. У зв'язку використання стандартного обладнання запуск та робота OpenSCADA на них не викликає проблем
більше на сторінці проекту (RU).
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°C. Продуктивності даного комп'ютера достатньо для виконання як функцій серверу збору, контролю та керування, так і функцій станції візуалізації. Однак у зв'язку із використанням непродуктивного процесору родини Atom виконання математичних моделей технологічних процесів потребує всіх ресурсів процесору. Наприклад, при виконанні математичної моделі
АГЛКС процесор навантажується на 86%. Контролер має сертифікат "УкрСЕПРО", що може бути важливим для багатьох користувачів на території України.
Робоче оточення OpenSCADA для цього комп'ютера будувалося на основі пакетної бази дистрибутиву
ALTLinux T6, а також свіжо-зібраного оточення стільниці
Trinity (TDE). Збірка оточення здійснювалася на основі вищенаведеної концепції за допомогою оновленого профілю "mkimage". У новий профіль також було додано мету "plc", однак її сутність змінилася фактично ставши копією мети "live", що стало можливим завдяки впровадженню на етапі первинної ініціалізації прозорого монтування розділу з міткою "alt-live-storage" як відображення упакованої файлової системи із довільним доступом на модифікацію. В цілому це дозволило створити фіксоване ядро прошивки з базовим набором програмного оточення, розміром 300Мб, та можливістю вільного розширення шляхом довстановлення потрібних пакетів із дистрибутиву.
У якості оточення стільниці було обрано "Trinity" з причини наявності проблеми фонового артифактингу у зв'язці XOrgServer 1.10 + Qt4, а також малої ресурсомісткості TDE при високій розвинутості та стабільності.
Архів профілів збірки нового оточення отримав назву
mkimage-profiles-6-kdesktop-plc.tgz, а остання збірка прошивки
ALTLinux_6-OpenSCADA_0.8.1-TDE_3.5.13.1-i586-flash.tar.
Фірма
Advantech випускає широкий спектр обладнання для автоматизації, починаючи від панельних ПК та закінчуючи модулями збору даних
ADAM.
У межах проекту
системи збору та візуалізації котла №1 цеху ТЭЦ (RU) до рук потрапив панельний ПК PPC-L126 та індустріальний ПК на шасі IPC-6608, з процесорною платою PCA-6753.
Індустріальний ПК "PCA-6753" має наступні характеристики:
Центральний процесор: | Мало-споживаний NS GXm-200 МГц (безвентиляторний) |
Оперативна пам'ять: | 64 МБ DIMM SDRAM |
Постійна пам'ять: | SSD DiskOnChip® 2000, IDE (40 pin, UDMA 33, 256МБ IDE Flash) |
Відео підсистема: | CX5530 VGA/LCD и 18-бит LCD TFT |
Аудіо підсистема: | немає |
Інтерфейси/порти: | 10/100Mbps Ethernet (RTL-8139); RS-232 + RS-232/422/485 послідовні порти; 2 x USB 1.1 (хост), IR порт; LPT; Floppy |
Джерело живлення: | +5VDC ±10% @ 1.54A |
Робочі умови: | 0 ... 60°C |
Цей контролер є вже достатньо старим та низькопродуктивним для сучасного програмного забезпечення однак для задач середовища виконання ПЛК він ще годиться і на нього було з успіхом завантажено прошивку на основі
пакетної бази ALTLinux 5.1. При цьому про реальний час мова не велась, у зв'язку із відсутністю таймеру високої роздільної здатності (HPET).
Панельний ПК "PPC-L126" має наступні характеристики:
Центральний процесор: | VIA Eden 667 MHz |
Оперативна пам'ять: | Два 168-pin DIMM сокет (128 МБ) |
Постійна пам'ять: | CompactFlash типа I/II, IDE (44 pin, UDMA 33/66/100, 10 ГБ) |
Відео підсистема: | VIA Savage4 2D/3D/Video, сенсорний екран 12.1", фронтальна панель: IP65/NEMA4 |
Аудіо підсистема: | AC97 Ver. 2.0 |
Інтерфейси/порти: | 10/100Mbps Ethernet (RTL-8139); 3 x RS-232 + RS-232/422/485 послідовні порти; 2 x USB 1.1 (хост); PS/2 клавіатура та миша; LPT |
Джерело живлення: | 19VDC @ 3.3A |
Робочі умови: | 0 ... 40°C |
Панельний ПК також має малі ресурси для запуску сучасного графічного оточення, тому для установки на нього використовувався дистрибутив "ALTLinux T6" із заходами по оптимізації:
- продуктивність носія даних — у якості сховища даних використано IDE жорсткий диск, який забезпечує 10 МБ/c, що більш ніж на доступних CompactFlash;
- вимкнення всіх зайвих сервісів;
- використання оточення робочого столу TDE, як менш ресурсомісткого, але більш розвиненого; в резерві доступне IceWM;
- збірка OpenSCADA без бібліотек Phonon та WebKit, які достатньо ресурсомісткі.
Приведені заходи дозволили втиснутися у 128 МБ оперативної пам'яті і отримати при цьому розвинуте та продуктивне графічне оточення. Для налаштування сенсорного екрану ELO використовувався пакет із драйвером "elographics" — "xorg-drv-elographics". До конфігураційного файлу "xorg.conf" додано секцію: