Данный релиз является плановым выпуском рабочей версии системы OpenSCADA, которые обычно осуществляются с периодичностью 3-4 месяца. Основной целью данного релиза является реализация коммерческого сервиса на основе OpenSCADA и адаптации к аппаратной платформе ARM. Кроме основных задач в рамках данного релиза проделана большая работа по стабилизации, чистке исходного кода, а также всестороннему расширению возможностей.
Данный документ является обработкой(компиляцией) документа <ChangeLog> системы OpenSCADA версии 0.7.1, который призван вкратце и наглядно осветить новые возможности системы OpenSCADA. Детально ознакомиться с изменениями в системе OpenSCADA можно в файле ChangeLog из дистрибутива системы или здесь: http://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.JavaLikeCalc (1.9.0) - Стабилизация. Добавлена подсветка синтаксиса. Выполнена адаптация к аппаратной архитектуре ARM. Добавлена реализация регулярных выражений и ряда расширений API пользователя. Добавлена возможность записи символов строки с помощью восьмеричного "\041" и шестнадцатеричного "\x21" числа.
DAQ.LogicLev (1.1.3) - Стабилизация. Некоторое расширение.
DAQ.SNMP (0.6.0) - Стабилизация. Реализация полной поддержки клиентской части протокола. Добавлена поддержка всех типов значений. Добавлена поддержка записи значений. Улучшена обработка ошибок. Добавлены дополнительные параметры конфигурации подключения.
Protocol.ModBus (0.6.2) - Стабилизация. Некоторые улучшения.
Protocol.OPC_UA (0.6.1) - Стабилизация.
Transport.Sockets (1.4.6) - Стабилизация.
Transport.SSL (0.9.6) - Стабилизация.
Transport.Serial (0.7.2) - Стабилизация. При инициализации порта использованы предыдущие настройки и реализована возможность опускать указание некоторых настроек.
Protocol.HTTP (1.5.1) - Стабилизация. Добавлена поддержка переменной HTTP "Transfer-Encoding=chunked" в исходящем транспорте.
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) - Значительная стабилизация. Небольшие улучшения.
В соответствии с планом релиза были выполнены следующие задачи:
Формирование предоставления коммерческих услуг на основе OpenSCADA. - Выстроена концепция и созданы механизмы предоставления коммерческих услуг разработчиками на основе OpenSCADA (http://oscada.org/ru/uslugi ).
Адаптация системы OpenSCADA для работы на аппаратной платформе ARM. - Осуществлена сборка, адаптация и полномасштабное тестирование OpenSCADA к архитектуре ARM; на интернет планшете фирмы Nokia - N800 (http://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, а также ко всем текстовым полям, использующим этот язык внутри модуля.
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.