OpenSCADAWiki: Using/LP5xxx ...

Home | Index | Changes | Comments | Users | Registration | Login  Password:  
 
This is an old revision of Using/LP5xxx from 2012-02-01 20:24:14..

Сборка OpenSCADA и прошивки для ARM-контроллеров фирмы ICP DAS (LP-5141)

Имя: 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
 (27 Kb)


Contents

Введение

Фирма 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. ПЛК LP-5141

ПЛК (рис.1) конструктивно выполнен в виде моноблока, который не содержит встроенного УСО, а подключение внешнего осуществляется посредством встроенного интерфейса RS-485, например, в виде модулей серии I-7000 фирмы "ICP DAS".


 (27 Kb)
Рис. 1. ПЛК серии LP-5xxx.

Процессор контроллера имеет следующие технические характеристики:

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

2. Программное окружение на основе OpenSCADA.

Программное окружение, основанное на ОС 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".

3. Замечания

Поскольку выяснилось, что операции с вещественными числами выполняются посредством команд сопроцессора 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 часов. Процедура разбора проблемы:

(*) В случае отключения записи в контроллер по протоколу ModBus/RTU падения не наблюдаются.
(*) Выяснено, что падения начинают происходить в случае достижения функции TMdContr::modBusReq() модуля DAQ.ModBus, а именно параллельного доступа к свойству объекта контроллера "mPrt", в контексте конструктора "XMLNode req(mPrt);" из разных потоков чтения и записи.
(*) Для выяснения природы проблемы была настроена генерация предсмертного дампа памяти, а так-же собран кроссовый отладчик gdb. При изучении предсмертного дампа памяти выяснено, что происходит разрушение стека и разумных причин в OpenSCADA для данного явления нет, а значит это проблема системного окружения для специфических условий.
(*) При доступе к свойству "mAddr", в первой строке функции TMdContr::modBusReq() и проблемном контексте "XMLNode req(mPrt);" (при неполной записи), падения не замечено.
(*) Проверка вызова второй строки "XMLNode req(mPrt);", при записи и в целом, с постоянной "RTU". При замене на "RTU" в целом падение замечается уже в другом месте. При замене только неполной записи падение не замечается. Вторым и последним местом падения оказалась следующая строка req.setAttr("id",id()). Общее между ними то, что осуществляется доступ к элементу конфигурации строкового типа, использующий объект ресурсного типа "ResString". Вывод, текущее программное окружение некорректно работает с объектом "ResString" при доступе на чтение (немодифицирующий) из двух разных потоков.
(*) Способ хранения объекта "ResString" в элементе конфигурационного поля "TCfg" значения не имеет, а именно — падение наблюдается при прямом хранении "ResString" в "TCfg", а так-же при прямом обращении к объекту "string" внутри "ResString", в случае с "id()".
(*) Проверка при отключении охвата ресурсом — проблемы не решает.
(*) Сборка нового окружения с помощью "PTXDist", и запуск его через "chroot" — при запуске EABI окружения, для TionPro270 из под chroot, происходит ошибка "Illegal instruction!". Не запускается EABI ядро от TionPro270 c похожей ошибкой. Собранный ToolChain из профиля "arm-xscale_hardfloat-linux-gnu_gcc-4.0.4_glibc-2.3.6_binutils-2.17_kernel-2.6.18.ptxconfig" в "OSELAS.Toolchain-2011.11.0" падает с ошибкой сегментации, при запуска OpenSCADA собранной под исходное окружение.
(*) Сборка OpenSCADA с включением всех нужных модулей в библиотеку ядра OpenSCADA проблему так-же не решает.
(*) Осуществлена проверка той же конфигурации на другом PXA270-устройстве (TionPro270) для окончательного выяснения источника проблемы (аппаратного или программного окружения) — конфигурация проработала беспроблемно двое суток.
(*) Заменить в объекте TCfg "ResString" на обычный "string" с выносом ресурса доступа в объект контейнера TConfig, за одно и уменьшив потребление памяти посредством обобщения ресурса доступа к объекту строки — замена осуществлена, а проблема осталась.
(*) Вычитать сборку с заменой "ResString" на обычный "string" в TCfg и проверить место текущего падения — место падения тоже.
(*) Взять "crosstool" и собрать несколько более свежий toolchain — собран toolchain "gcc-4.0.2-glibc-2.3.6-arm-xscale-linux-gnu", проблема воспроизводится, скорее всего проблема в работе с памятью текущего ядра. В процессе изучения найдены прецеденты с подобными проблемами в glibc-2.2 — 2.7, которые содержат реализацию malloc небезопасную для потоков (nothread-safe).
(*) Замена аллокатора памяти — не удалось найти рабочей и при этом прозрачной реализации стороннего аллокатора, ptmalloc3 просто падает.
(*) Сборка ToolChain и OpenSCADA со всеми возможными параметрами включения thread-safe — во всех вариантах проблема присутствует, а именно на ToolChain с параметрами GLibC: "--with-tls --with-__thread" и OpenSCADA собрана с параметрами: "-pthread -D_REENTERANT".
(!) Перехват обращений аллокации памяти и оборачивание глобальным ресурсом — алгоритм переопределения (HOOKS) обращений к аллокатору запутан и нелинеен, выяснение продолжается.

4. Заключение

В результате была получена сборка OpenSCADA для Linux контроллеров ARM-архитектуры фирмы "ICP DAS". Сборку можно загрузить прямо на любой Linux-ARM контроллер, распаковав её в корне работающей исходной системы. При этом, однако, останутся дубликаты старых базовых библиотек (/lib/*), которые после удачной перегрузки можно удалить.


Для контроллеров семейства LP-5x4x создана прошивка со сборкой OpenSCADA, которую можно загрузить стандартным для данных контроллеров образом, который описан в фирменной документации "ICP DAS". Прошивка для LP-5x4x возможно подойдёт и для LP-5x3x, однако это не проверялось!


Ввиду устаревшей и неоптимальной исходной сборки Linux окружения от "ICP_DAS", что накладывает ограничение на свободу сборки оптимального окружения, по завершению проекта планируется обратиться к фирме "ICP_DAS" с просьбой исправить данное положение.

(*) Обращение осуществлено однако никакой реакции, вплоть до ответа на запрос, не последовало!

Ссылки


Referring pages: Doc/OpenSCADA072
Doc/OpenSCADA080
Errors/KnownBugs
HomePageUk/Doc/OpenSCADA072
HomePageUk/Doc/OpenSCADA080
Using/LP5xxx
Using/NokiaLinux
Using/PLC/firmwareARM


 
There are no files on this page.[Display files/form]
There is no comment on this page. [Display comments/form]