Имя: 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 архитектуры c предустановленным окружением ОС 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 --disable-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 мкс, в сравнении с ~15 мкс на N800 с VFP и ~2 мкс на x86, детальнее в таблице по этой ссылке. Таким образом, рассматривать данный контроллер как платформу для хоть сколь-нибудь серьёзных вычислений нельзя! Мало того, вещественные числа при работе с FPA хранятся по-другому, а именно - особый big-endian, что требует преобразования в случае с бинарным внешним обменом в типовое little-endian представление, например, для DAQ.OPC_UA.
В исходной конфигурации порт COM1 (/dev/ttySA0) используется в роли консоли, которая инициализируется командой ядра "console=/dev/ttySA0". Однако, после настройки это не нужно, а часто и желательно освободить ещё один COM-порт для других целей. Освободить COM1 от работы на консоль можно переназначив другое устройство для этой роли, например, командой: $ busybox setconsole /dev/tty1. Однако, этот способ не полностью освобождает COM-порт и запросы теряются, вычитываясь параллельным подключением.
В процессе использования созданного программного окружения с OpenSCADA обнаружена странная проблема, которая заключается в падении OpenSCADA при доступе к экземпляру ресурсной строки из разных потоков. Проблема воспроизводится при опросе контроллера по протоколу ModBus/RTU с периодичностью 100мс, опросе отсутствующего модуля посредством DCON на том-же интерфейсе RS485, что и ModBus/RTU. В этот же момент осуществляется периодическая (1 секунда) запись двух регистров в опрашиваемый по протоколу ModBus/RTU контроллер. Падение происходит не сразу, а в течении 10 минут - 5 часов. Процедура разбора проблемы:
В результате была получена сборка OpenSCADA для Linux контроллеров ARM-архитектуры фирмы "ICP DAS". Сборку можно загрузить прямо на любой Linux-ARM контроллер, распаковав её в корне работающей исходной системы. При этом, однако, останутся дубликаты старых базовых библиотек (/lib/*), которые после удачной перегрузки можно удалить.
Для контроллеров семейства LP-5x4x создана прошивка со сборкой OpenSCADA, которую можно загрузить стандартным для данных контроллеров образом, который описан в фирменной документации "ICP DAS". Прошивка для LP-5x4x возможно подойдёт и для LP-5x3x, однако это не проверялось!
Ввиду устаревшей и неоптимальной исходной сборки Linux окружения от "ICP_DAS", что накладывает ограничение на свободу сборки оптимального окружения, по завершению проекта планируется обратиться к фирме "ICP_DAS" с просьбой исправить данное положение.