Ім'я: LP-5xxx Засновано: серпень 2011р Завершено: вересень 2011р Версія: 1.0.0 Учасники: Роман Савоченко Опис: Проект присвячено збірці OpenSCADA та прошивки для ARM контролерів серії LP-5xxx та LP-8x{3|4}x фірми ICP DAS. Матеріали: ftp://ftp.oscada.org/OpenSCADA/PLC/LP5xx1 |
Фірма ICP_DAS достатньо давно випускає контролери на процесорах ARM архітектури з передвстановленим оточенням ОС Linux, що робить цікавим створення збірки OpenSCADA або нової прошивки з OpenSCADA.
До останнього часу була низка причин, на перепоні збірки OpenSCADA для ARM-контролерів ICP DAS:
На цей час всі ці перепони було усунено. Так, завдяки Петру Літковцю на руках з'явився контролер LP-5141, а до цього часу OpenSCADA у значній мірі було вже адаптовано до роботи на ARM-архітектурі, за посередництвом відпрацювання та стабілізації на долонному комп'ютері фірми Nokia - N800. У наслідок же роботи з контролером LP-5141 було усунено останню перепону шляхом оновлення початкового програмного оточення із збереженням поточного функціоналу.
В цілому, метою даного проекту є відпрацювання механізмів та створення збірки OpenSCADA для контролерів сімейства ARM фірми "ICP DAS", а також створення прошивок під контролери "ICP DAS", які будуть потрапляти до рук розробників OpenSCADA.
ПЛК (рис.1) конструктивно виконано у вигляді моноблоку, який не містить вбудованого УСО, а підключення зовнішнього здійснюється за посередництвом вбудованого інтерфейсу RS-485, наприклад, у вигляді модулів серії I-7000, фірми "ICP DAS".
Процесор контролеру має наступні технічні характеристики:
CPU | PXA270 або сумісний (32-біт та 520МГц) |
SDRAM | 128 MB |
Flash | 64 MB |
EEPROM | 16 KB Збереження даних: 40 років; 1,000,000 циклів видалення/запису. |
Розширена Flash пам'ять | microSD сокет з однією microSD картою на 2GB (може підтримувати 16 GB microSDHC картки) |
64-біт Серійний Номер Обладнання | Наявний |
Подвійний Watchdog таймер | Наявний |
VGA | 800 × 600 |
Ethernet порти | RJ-45 x 2, 10/100 Base-TX Ethernet Контролер (Авто-узгодження, авто MDI/MDI-X, LED індикатор) |
USB 1.1 (хост) | 1 |
COM1 (/dev/ttySA0) | RS-232 (RxD, TxD and GND); Не ізольовано |
COM2 (/dev/ttySA1) | RS-485 (D2+,D2-); 2500 VDC; Ізольовано |
COM3 (/dev/ttySA3) | RS-232 (RxD, TxD and GND); Не ізольовано |
Робоча температура | -25 ~ +75 °C |
Програмне оточення, основане на ОС Linux, для ARM контролерів фірми ICP DAS за звичай мають: ядро Linux 2.6.19, GLibC 2.2.5 та GCC 2.95. Для збірки стороннього ПЗ фірмою ICP-DAS надається SDK з кроскомпілятором, набором бібліотек та заголовків до них (Linux toolchain). Як можна бачити, версії GLibC та GCC дуже старі, а саме 2001 року. Збірка OpenSCADA у такому оточені фактично неможлива. Якщо використання GLibC версії 2.2.5 ще можливе, то GCC версії 2.95 має C++ компілятор, який на збірці коду OpenSCADA просто рушиться, а стандартна бібліотека C++, або STL, дуже обмежена та під неї потрібна значна і головне безглузда адаптація. По цій причині потрібне було оновлення первинного програмного оточення до версії GCC компілятору, або бібліотеки C++, не менш 3.
Оскільки внутрішня флеш-пам'ять має порівняно невеликий об'єм (64 Мб), а повна перезбірка початкового програмного оточення контролера — достатньо трудомісткий процес то було вирішено забезпечити сумісність базових бібліотек нового та старого оточення. А саме, можливість використовувати бібліотеки на зразок fontconfig, i8k з первинного оточення та роботу програм первинного оточення з новими бібліотеками.
У процесі підбору нового програмного оточення для процесору PXA-270, контролера "ICP DAS", було апробовано декілька варіантів, оскільки частина з них мала ті або інші недоліки:
Збірка OpenSCADA з використанням кросскомпілятору здійснюється наступним чином:
# Розпакування архіву інструментарію
$ cd /
$ tar --lzma -xvf lincon.tlz
# Ініціалізація оточення збірки
$ . /lincon/linpac_new.sh
# Перехід до дерева вихідних текстів OpenSCADA, конфігурація та збірка
$ cd /lincon/OpenSCADA
$ ./configure --host=arm-linux --enable-CrossCompile --disable-QTStarter --disable-QTCfg --disable-Vision --disable-MySQL --disable-FireBird --disable-PostgreSQL --disab
le-AMRDevs --disable-BFN --disable-SoundCard
$ make
Результуюче оточення контролеру з OpenSCADA було сформовано шляхом заміни базових бібліотек первинного оточення на бібліотеки з набору інструментів від "Voipac", збірки OpenSCADA та розташування файлів OpenSCADA у дереві первинного оточення.
OpenSCADA була зібрана з виключенням низки бібліотек та модулів. Так були зібрані та перевірені модулі та функції OpenSCADA:
З метою зручного розповсюдження та застосування отриманої збірки OpenSCADA для ARM-контролерів фірми "ICP DAS" було виконано розбір формату прошивок для цих контролерів та формування нової, яка включає OpenSCADA. Прошивка ARM-контролерів "ICP DAS" представляє з себе бінарний файл з назвою типу "lp5x4x_1.1.bin". Структурно цей файл містить ядро та кореневу файлову систему типа JFFS2. Дізнатися точне їх розташування можна за допомогою команди у попередньому оточені контролеру, наприклад, для LP-5141:
$ cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "Bootloader"
mtd1: 00040000 00020000 "Bootloader Param"
mtd2: 00280000 00080000 "Kernel"
mtd3: 03c80000 00080000 "JFFS2 Filesystem"
Із отриманого результату команди можна зробити висновок, що точка поєднання образу ядра та файлової системи знаходиться за зсувом файлу прошивки 0x280000, а розмір блоку стирання флешу складає 0x80000 (512кБ). Маючи цю інформацію ми можемо розібрати прошивку та внести зміни до образу її файлової системи:
# Вилучення попередніх образів ядра та кореневої файлової системи
$ dd if=lp5x4x_1.1.bin of=kernel_orig bs=1K count=2560
$ dd if=lp5x4x_1.1.bin of=jffs2_orig bs=1K skip=2560
# Підключення попереднього образу файлової системи
# Створення емуляції блокового пристрою у пам'яті.
# Може викликати помилку у випадку використання неперервної області пам'яті іншими програмами та малим її разміром.
# Для вирішення цієї проблеми потрібно додати параметр командного рядка ядра, під час завантаження, **vmalloc=512MB**.
$ modprobe mtdram total_size=65536 erase_size=512
$ modprobe mtdblock
$ dd if=root_orig.img of=/dev/mtdblock0
$ mount -t jffs2 /dev/mtdblock0 /mnt/tmp
# Копіювання змін та файлів OpenSCADA у кореневу файлову систему контролеру
# Створення нової файлової системи із змінами.
$ mkfs.jffs2 --root=/mnt/tmp --pad=$((61952*1024)) --eraseblock=512 --output=root.img
# Збираємо новий образ прошивки
# cat kernel_orig.img root.img > lp5x4x_oscada_1.0.bin
Таким чином ми отримуємо нову прошивку з OpenSCADA у файлі lp5x4x_oscada_1.0.bin, яку можна завантажити до контролеру стандартним чином, описаним у документації "ICP DAS".
Оскільки з'ясувалося, що операції з реальними числами виконуються за посередництвом команд сопроцесору FPA (Float Point Acceleration), якого у цьому процесорі просто немає, а виклики самих команд здійснюються через виключення, шляхом імітації у ядрі Linux, то продуктивність математичних обчислень виявляється дуже низькою, навіть у порівнянні з прямим "Software FP", "VFP". Наприклад, обчислення однієї операції sin(pi) здійснюється ~200 мкс, у порівняні із ~20 мкс на N800 з VFP та ~2 мкс на x86, детальніше у таблиці нижче. Таким чином, розглядати цей контролер як платформу для хоч якихось серйозних обчислень не можна! Мало того, реальні числа, при роботі із FPA, зберігаються по іншому, а саме особливий big-endian, що вимагає перетворення, у випадку із бінарним зовнішнім обміном, до типового little-endian вигляду, наприклад, для DAQ.OPC_UA.
Обладнання | Операція sin(Пі) (у JavaLikeCalc), мкс | Операція pow(Пі,2) (у JavaLikeCalc), мкс |
ICP DAS LP-5141 (PXA270, FPA) | 100 (200) | 51 (152) |
Segnetics SMH2Gi (ARM926EJ-S, SoftVFP) | 23 (44) | 12 (31) |
Nokia N800 | 6 (15) | 6 (17) |
Nokia N900, N950 | 3 (6) | 2 (6) |
AMD Athlon X2 3600+ | 3 (3) | 3 (3) |
AMD Turion L625 1.6 | 3 (4) | 3 (4) |
Intel Core2 Duo 1.6 | 2 (2) | 2 (3) |
Значна різниця у часі обчислення на ARM при прямому виклику математичної операції з віртуальної машини JavaLikeCalc можливо пов'язана із невирівняним читанням з області пам'яті під час читання команд віртуальної машини, з чим має сенс пізніш розібратися та можливо якось скомпенсувати.
У первинній конфігурації порт COM1 (/dev/ttySA0) використовується у ролі консолі, яка ініціалізується командою ядра "console=/dev/ttySA0". Однак після налаштування це не потрібно, а часто і бажано звільнити ще один COM-порт для інших цілей. Звільнити COM1 від роботи на консоль можно перепризначивши інший пристрій для цієї ролі, наприклад, командою: $ busybox setconsole /dev/tty1. Однак цей метод не повністю звільняє COM-порт та запити втрачаються, вичитуючися паралельним підключенням.
У результаті було отримано збірку OpenSCADA для Linux контролерів, ARM-архітектури, фірми "ICP DAS". Збірку можна завантажити безпосередньо на будь який Linux-ARM контролер, розпакувавши її у корні працюючої первинної системи. При цьому однак залишаться дублікати старих базових бібліотек (/lib/*), які, після вдалого перевантаження, можна видалити.
Для контролерів сімейства LP-5x4x створено прошивку зі збіркою OpenSCADA, яку можна завантажити стандартним для даних контролерів чином, який описано у фірмовій документації "ICP DAS". Прошивка для LP-5x4x можливо підійде і для LP-5x3x, однак це не перевірялося!
У зв'язку із застарілою та неоптимальною початковою збіркою Linux оточення від "ICP_DAS", що накладає обмеження на свободу збірки оптимального оточення, по завершенню проекта планується звернутися до фірми "ICP_DAS" з проханням виправити це становище.