Исполнение OpenSCADA на N800 Многоуровневая подсветка синтаксиса Свойства элементов примитва "Элементарная фигура"
Основной целью данного релиза является реализация коммерческого сервиса на основе OpenSCADA и адаптации к аппаратной платформе ARM. Кроме основных задач в рамках данного релиза проделана большая работа по стабилизации, чистке исходного кода, а также всестороннему расширению возможностей.
OpenSCADA 0.7.1
Введение
Данный релиз является плановым выпуском рабочей версии системы OpenSCADA, которые обычно осуществляются с периодичностью 3-4 месяца. Основной целью данного релиза является реализация коммерческого сервиса на основе OpenSCADA и адаптации к аппаратной платформе ARM. Кроме основных задач в рамках данного релиза проделана большая работа по стабилизации, чистке исходного кода, а также всестороннему расширению возможностей.
Данный документ является обработкой(компиляцией) документа <ChangeLog> системы OpenSCADA версии 0.7.1, который призван вкратце и наглядно осветить новые возможности системы OpenSCADA. Детально ознакомиться с изменениями в системе OpenSCADA можно в файле ChangeLog из дистрибутива системы или здесь: wiki.oscada.org/Works/ChangeLog.
Ключевыми особенностями данной версии являются: - Реализация плановых задач.
- Оптимизация, повышение стабильности, устойчивости и производительности системы.
- Усовершенствование и стабилизация графической подсистемы.
- Формирование и стабилизация API пользовательского программирования.
- Общесистемные расширения.
Новые и обновленные модули: - Archive.FSArch (1.4.5) - Значительная стабилизация.
- DB.MySQL (1.7.0) - Стабилизация. Добавлена возможность указания таймаутов подключения.
- DB.SQLite (1.6.3) - Стабилизация.
- DB.FireBird (0.9.6) - Стабилизация.
- DB.PostgreSQL (0.9.1) - Стабилизация.
- DAQ.DiamondBoards (1.2.2) - Стабилизация.
- DAQ.System (1.7.3) - Стабилизация. Зависимость от библиотеки "Libsensors" сделана опциональной.
- DAQ.BlockCalc (1.4.1) - Стабилизация. Добавлена подсветка синтаксиса.
- DAQ.JavaLikeCalc (1.9.0) - Стабилизация. Добавлена подсветка синтаксиса. Выполнена адаптация к аппаратной архитектуре ARM. Добавлена реализация регулярных выражений и ряда расширений API пользователя. Добавлена возможность записи символов строки с помощью восьмеричного "\041" и шестнадцатеричного "\x21" числа.
- DAQ.LogicLev (1.1.3) - Стабилизация. Некоторое расширение.
- DAQ.SNMP (0.6.0) - Стабилизация. Реализация полной поддержки клиентской части протокола. Добавлена поддержка всех типов значений. Добавлена поддержка записи значений. Улучшена обработка ошибок. Добавлены дополнительные параметры конфигурации подключения.
- DAQ.Siemens (1.2.4) - Стабилизация.
- DAQ.ModBus (1.1.2) - Стабилизация. Добавлена подсветка синтаксиса списка атрибутов. Некоторые улучшения.
- DAQ.DCON (0.5.0) - Модуль полностью переписан на предмет поддержки смешанных модулей, посредством выбора команд запроса.
- DAQ.ICP_DAS (0.7.3) - Стабилизация.
- DAQ.DAQGate (0.9.2) - Стабилизация. Добавлен кеш параметров для их инициализации при автономной работе.
- DAQ.SoundCard (0.6.2) - Стабилизация.
- DAQ.OPC_UA (0.6.1) - Стабилизация. Добавлена подсветка синтаксиса списка атрибутов.
- DAQ.BFN (0.5.0) - Новый модуль.
- Transport.Sockets (1.4.6) - Стабилизация.
- Transport.SSL (0.9.6) - Стабилизация.
- Transport.Serial (0.7.2) - Стабилизация. При инициализации порта использованы предыдущие настройки и реализована возможность опускать указание некоторых настроек.
- Protocol.ModBus (0.6.2) - Стабилизация. Некоторые улучшения.
- Protocol.OPC_UA (0.6.1) - Стабилизация.
- Protocol.HTTP (1.5.1) - Стабилизация. Добавлена поддержка переменной HTTP "Transfer-Encoding=chunked" в исходящем транспорте.
- Protocol.SelfSystem (0.9.4) - Стабилизация.
- Protocol.UserProtocol (0.6.1) - Добавлена подсветка синтаксиса.
- Special.SystemTests (1.5.1) - Небольшие улучшения.
- UI.QTStarter (1.6.1) - Стабилизация. Адаптация для ARM.
- UI.QTCfg (2.0.0) - Стабилизация. Использован групповой запрос к интерфейсу управления с целью оптимизации удалённого доступа к OpenSCADA станциям. Адаптация для ARM. Добавлена функция ручного изменения высоты для элементов текста и таблиц (схватил за нижний край и потащил). Добавлена многоуровневая подсветка синтаксиса.
- UI.WebCfg (1.5.5) - Стабилизация.
- UI.WebCfgD (0.6.6) - Стабилизация.
- UI.VCAEngine (1.1.0) - Стабилизация. Добавлена контекстная подсказка к атрибутам примитивов виджетов. Добавлена подсветка синтаксиса к текстовым атрибутам примитивов виджета.
- UI.Vision (1.1.0) - Значительная стабилизация. Заметные улучшения. Адаптация для ARM. Добавлено отображение и восстановление потери связи при удалённом исполнении сеанса. Добавлен отдельный полнотекстовый редактор для текстовых атрибутов. Добавлена контекстная подсказка к атрибутам примитивов виджетов. Добавлена подсветка синтаксиса к текстовым атрибутам примитивов виджетов. Добавлен диалог установки свойств отдельно выбранных фигур.
- UI.WebVision (0.9.1) - Значительная стабилизация. Небольшие улучшения.
- UI.WebUser (0.6.1) - Стабилизация. Добавлена подсветка синтаксиса процедур.
1 Реализация плановых задач
В соответствии с планом релиза были выполнены следующие задачи: - Формирование предоставления коммерческих услуг на основе OpenSCADA. - Выстроена концепция и созданы механизмы предоставления коммерческих услуг разработчиками на основе OpenSCADA (oscada.org/ru/uslugi ).
- Адаптация системы OpenSCADA для работы на аппаратной платформе ARM. - Осуществлена сборка, адаптация и полномасштабное тестирование OpenSCADA к архитектуре ARM; на интернет планшете фирмы Nokia - N800(wiki.oscada.org/Works/Tests/ARM ). А также частные мероприятия по адаптации:
- SYS: Прототипы функций TMess::put(), TMess::get(), TCntrNode::grpSize(), TCntrNode::grpId(), TCntrNode::grpAt() изменены для исправления использования беззнакового типа "char" на ARM как знакового.
- SYS.TVariant, DAQ.AMRDevs, DAQ.OPC_UA: Исправлен невыравненный доступ к данным.
- SYS.TCntrNode: Исправлено использование беззнакового "char" в ARM как знакового.
- Archive: Прототипы функций TArchiveS::messPut() и TArchiveS::messGet() изменены для исправления переменной уровня сообщения как знакового числа.
- DAQ.JavaLikeCalc: Виртуальная машина переписана для прямого использования структур команд, с целью исключения проблемы выравнивания, а также для некоторого повышения производительности.
- DAQ.Siemens: Исправлена проблема библиотеки NoDave на предмет глобального вызова команды упаковки структур "#pragma pack(1)".
- UI.QTCfg: Добавлено кратковременное засыпание после закрытия всех окон в функции отключения. С целью предоставить время окончательно разрушиться объектам всех окон и предотвратить падение.
2 Оптимизация, повышение стабильности, устойчивости и производительности системы
В процессе работ над данной версией, а также её практической адаптации, было обнаружено и исправлено в общей сложности около 90 ошибок. В целом была проделана работа по чистке кода от предупреждающих сообщений компилятора, с флагом "-Wall": - удаление неиспользованных переменных;
- добавление возврата во всех функциях;
- инициализация переменных с возможностью их использования неопределёнными;
- исключение неполной обработки перечислимых типов в операции выбора;
- сравнение знакового с беззнаковым целым.
Перечислим наиболее существенные ошибки, исправление которых значительно отразилось на повышении стабильности: - Общесистемные:
- Команда сборочной системы "$ make dist" исправлена и адаптирована для корректного создания дистрибутивов OpenSCADA.
- Функция TSYS::cron(), для вызова по расписанию, неоднократно исправлена.
- Тип переменной для хранения результата функции find(), строки, везде изменён на корректный "size_t".
- Function: Исключена возможность утечки памяти в случае попытки установить объект в необъектный параметр функции.
- Базы данных:
- DB.PostgreSQL: Исправлена обработка адреса БД на предмет определения пустых полей.
- Транспорты и протоколы:
- Transport: Исправлена загрузка всех транспортов из БД, в случае наличия записей про транспорт, модуль которого отсутствует.
- Transport.Serial: Установлен флаг O_NONBLOCK для функции open() последовательного устройства с целью предотвращения блокирования открытия порта на некоторых USB->RS485 преобразователях.
- Transport.Sockets, Transport.SSL: Добавлена очистка входного буфера для предотвращения повторного использования на высоколатентных каналах, после таймаута.
- Transport.Sockets: Исправлено закрытие клиентского соединения по таймауту времени жизни, для подключений при отсутствии данных.
- Transport.Sockets: Unix-сокет установлен в неблокирующий режим посредством флага O_NONBLOCK. Исправлено формирование сообщений об ошибках для исходящих транспортов.
- Protocol.HTTP, UI.WebCfg, UI.WebCfgD, UI.WebVision, UI.WebUser: Исправлен разбор элементов POST-запроса на предмет разбора всех атрибутов каждого элемента.
- Сбор данных и архивы:
- Archive: Исправлено использование буфера мягкой сетки с низким и высоким разрешением времени в архивах значений.
- Archive.FSArch: Исправлено создание файлов архива сообщений при помещении множества старых сообщений. Добавлен параметр предотвращения дубликатов.
- Archive.FSArch: Результат функции fgetc() записан в целочисленную переменную, вместо символьной, что исправило обнаружение "EOF".
- DAQ.System: Исправлено падение при выходе для источника "Hddtemp".
- DAQ.ModBus: Режим установки значений атрибутов параметров изменён на активный и улучшена обработка ошибок.
- DAQ.JavaLikeCalc: Добавлена проверка индекса при доступе к символу строки по индексу, с целью предотвращения выхода за диапазон.
- Интерфейсы визуализации:
- UI.VCAEngine: Исправлено блокирование сеанса для динамически активных проектов при динамическом доступе к собственным атрибутам виджета.
- UI.Vision: Исправлено падение сеанса для проектов с периодом исполнения более 500 мс.
- UI.Vision: Реализована доводка координат фигур примитива "Элементарная фигура" к остатку положения виджета.
- UI.Vision: Масштабирование текста примитива "Текст" изменено на изменение размера шрифта вместо масштабирования конечного изображения, что повысило общее качество отображения шрифта.
- UI.Vision, UI.WebVision: Повышено разрешение координат всех виджетов до трёх знаков после запятой, с целью обеспечения нормального позиционирования на больших масштабах.
- UI.WebVision, UI.Vision: Исправлено обновление изображения примитива "Элементарная фигура" при изменении масштаба.
- UI.WebVision: Удалена проверка попадания точек фигур в область отображения примитива "Элементарная фигура". Данная функция переложена на библиотеку GD.
- UI.WebVision: Исключена возможность падения для примитивов "Diagram" или "ElFigure", в случае передачи некорректных значений атрибутов изображения "xSc" или "ySc" из Web-браузера.
Оптимизация и повышение производительности: - UI.WebCfgD: Добавлено изменение размера иконок на стороне сервера с целью снижения трафика.
- UI.QTCfg: Использован групповой запрос к интерфейсу управления для повышения производительности на медленных и высоколатентных соединениях.
- UI.QTCfg: Исключён многократный запрос элементов выборных колонок таблиц.
3 Усовершенствование и стабилизация графической подсистемы
Заметная работа была выполнена в рамках графической подсистемы, а именно в модулях движка СВУ UI.VCAEngine, визуализаторов UI.Vision и UI.WebVision, а также конфигураторах. Внесённые изменения были направленны на стабилизацию, оптимизацию потребления памяти и улучшение пользовательских свойств.
Улучшения графической подсистемы: - SYS, DAQ.JavaLikeCalc, UI.QTCfg, UI.VCAEngine, UI.Vision: Добавлено API подсветки синтаксиса. На основе данного API подсветка синтаксиса добавлена:
- DAQ.BlockCalc: подсветка синтаксиса в описании атрибутов параметров.
- DAQ.JavaLikeCalc: подсветка синтаксиса к компилятору языка JavaLikeCalc.JavaScript, а также ко всем текстовым полям, использующим этот язык внутри модуля.
- DAQ.ModBus, DAQ.OPC_UA: подсветка синтаксиса списка атрибутов.
- Protocol.UserProtocol: подсветка синтаксиса к текстам процедур протокола.
- UI.QTCfg: отображение многоуровневой подсветки синтаксиса, передаваемой из модели данных в виде правил регулярных выражений.
- UI.VCAEngine: подсветка синтаксиса к текстовым атрибутам примитивов виджета, для которых это нужно.
- UI.Vision: подсветка синтаксиса к текстовым атрибутам примитивов виджета, а также текстам программ виджетов.
- UI.WebUser: подсветка синтаксиса процедур формирования Web-интерфейса.
- UI.QTCfg:
- Добавлена возможность ручного изменения высоты текстовых и табличных полей. Изменение осуществляется схватыванием и перетаскиванием нижнего края поля.
- Групповой запрос "CntrReqs" использован для запроса контекста страницы.
- UI.VCAEngine: Добавлены специфические свойства к атрибутам примитивов, вроде помощи и подсветки синтаксиса.
- UI.Vision:
- Добавлено отображение помощи по атрибутам виджета.
- Добавлена индикация сообщения о потери соединения с сервером визуализации, а также восстановление при удалённой визуализации.
- Для примитива "Элементарная фигура" добавлен диалог установки свойств отдельно выбранных фигур.
- Добавлен отдельный полнотекстовый редактор для текстовых атрибутов.
- UI:WebVision: Добавлена поддержка gif и jpg изображений в элементах примитива "Элементарная фигура".
4 Формирование и стабилизация API пользовательского программирования
Было продолжено формирование объектного API пользовательского программирования, которое предусматривает интеграцию пользовательских функций в дерево объектов системы OpenSCADA. Кроме этого, был внесен ряд изменений в существующие библиотеки функций пользовательского API.
В частности были осуществлены следующие изменения: - SYS: Пользовательское API для объекта TArrayObj расширено на предмет возможности использования объектных свойств, если свойства не числа.
- SYS: В дерево объектов OpenSCADA пользовательского API добавлена функция SYS.Security.access() для контроля доступа пользователя OpenSCADA к ресурсам с нужными правами.
- SYS, DAQ.JavaLikeCalc: Добавлена реализация поддержки пользовательского API регулярных выражений, основанной на PCRE, посредством объекта TRegExp. Реализован интерфейс функций RegExp.exec() и RegExp.test() в стандарте для языка JavaScript. Для DAQ.JavaLikeCalc реализована "new RegExp()" инициализация для объекта TRegExp. Для DAQ.JavaLikeCalc реализованы дополнительные функции с использованием RegExp: int search(); Array match(); Array split(RegExp pat, int limit); string replace(string substr, string str); string replace(RegExp pat, string str).
- TFunction, DAQ.JavaLikeCalc: Добавлен объект пользовательского API "TFuncArgObj" для получения аргументов функции.
- DB: Добавлены функции пользовательского API fieldStruct(), fieldSeek(), fieldGet(), fieldSet() и fieldDel() для объекта таблицы, с целью предоставить пользовательский доступ к БД посредством интерфейса БД OpenSCADA.
- DAQ.JavaLikeCalc: Добавлена встроенная функция typeof() для проверки типа значения.
5 Общесистемные расширения
В общесистемное API системы OpenSCADA были внесены значительные изменения и расширения с целью общей стабилизации и ввиду общих мероприятий по чистке кода, а также реорганизации дерева исходных текстов: - SYS:
- Реализована новая структура дерева исходных текстов.
- Все ресурсы проекта перемещены в отдельный архив.
- Для создания архивов исходных текстов и ресурсов можно использовать команды "$ make dist-lzma" и "$ make dist-reslzma".
- Документация выполнена статичной для модулей и поделена по языкам. Для каждого языка документации формируется отдельный пакет. В документации каждого языка создан индексный файл по всему перечню локальной и сетевой документации. Общий перечень локальной документации значительно расширен новыми документами, а также вспомогательной сетевой документацией.
- Добавлены пакеты библиотечных БД *-LibDB.Main и *-LibDB.VCA, помещены в data/LibsDB.
- Вместо DemoDB пакета добавлены пакеты моделей "AGLKS" и "Boiler", помещены в data/ModelsDB.
- Конфигурационные файлы для построения RPM и DEB пакетов обновлены.
- Зависимость на библиотеку PCRECPP глобально заменена на PCRE.
- Добавлена новая функция TSYS::time2str() для преобразования интервалов времени в строку вроде "1час 23мин 10сек". Эта функция использована везде.
- Добавлена реализация собственного XML-парсера, вместо Expat. Собственный XML-парсер решает проблему поддержки различных кодировок, отличных от UTF, а также безопасной обработки ситуации наличия недопустимых для текущей кодировки символов.
- SYS.TMess: Общие сообщения интерфейса управления перемещены в одну функцию TMess::lab*.
- Transport, Transport.*: Добавлена функция TTransportS::traf2str() для преобразования значения счётчика трафика в строку вроде "12.5КиБ"
Заключение
Система OpenSCADA получила толчок для осуществления реальной аппаратной многоплатформенности, посредством чего код проекта был в значительной степени вычищен и сделан многоплатформенным. Эти наработки позволят продолжить движение проекта в сторону аппаратной многоплатформенности, а также реализации программной, что запланировано после следующего LTS релиза 0.8.0.
Также продолжена работа по улучшению общей функциональности, простоты и удобству использования с общим повышением качества предоставления услуг на основе системы OpenSCADA.
|
|