УкраїнськаEnglishmRussian
Вход/Новый

Релиз OpenSCADA 0.7.1

13.04.2011 20:00 Давность: 13 yrs

Автор: Роман Савоченко


Исполнение 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.


6227