Автор: /RomanSavochenko
Открытая SCADA система OpenSCADA принадлежит к классу SCADA(Supervisory Control and Data Aquisition) систем. Системы данного класса используются как элемент систем автоматизации технологических процессов(АСУ-ТП).
Система OpenSCADA строится как модульная и высокомасштабируемая система. Следовательно внутренняя структура системы должна удовлетворять высоким требованиям гибкости.
Любая SCADA система предоставляет возможность архивирования собранных данных, т.е. формирование истории изменения (динамики) процессов. Архивы, условно, можно разделить на два типа: архивы сообщений и архивы значений.
Особенностью архивов сообщений является то, что архивируются, так называемые, события. Характерным признаком события является время возникновения этого события. Архивы сообщений, обычно, используются для архивирования сообщений в системе, т.е. ведение логов и протоколов. В зависимости от источника, сообщения могут классифицироваться по различным критериям. Например, это могут быть протоколы аварийных ситуаций, протоколы действий операторов, протоколы сбоев связи и др.
Особенностью архивов значений является их периодичность определяемая промежутком времени между двумя смежными значениями. Архивы значений применяются для архивирования истории непрерывных процессов. Поскольку процесс непрерывный, то и архивировать его можно только путём введения понятия квантования опроса значений, поскольку иначе мы получаем архивы бесконечных размеров ввиду непрерывности самой природы процесса. Кроме этого, практически, мы можем получать значения с периодом ограниченным самими источниками данных. Например, довольно качественными источниками данных, в промышленности, редко позволяют получать данные с частотой более 1кГц. И это без учёта самих датчиков имеющих ещё менее качественные характеристики.
Для ведения архивов, в системе OpenSCADA, предусмотрена подсистема "Архивы". Данная подсистема, в соответствии с типами архивов, состоит из двух частей: архив сообщений и архивы значений. Подсистема, в целом, является модульной, что позволяет создавать архивы основанные на различной природе и способах хранения данных.
Механизм архивирования сообщений уже разработан и функционирует в системе OpenSCADA, в то время как механизм архивирования значений всё ещё отсутствует. Основной целью данного, дочернего проекта и является разработка механизма архивирования значений (непрерывных процессов). В процессе реализации данного проекта может претерпеть изменений, также, и механизм архивирования сообщений, а также систематизироваться механизмы доступа к архивам сообщений.
Функционально, разработка предназначена для предоставления в системе OpenSCADA механизма архивирования данных непрерывных процессов, которые могут быть получены из различных источников данных.
Эксплуатационным назначением разработки является:
Архитектурно, архивирование значений непрерывных процессов должно удовлетворять следующим требованиям:
Исходя из архитектурных требований можно сформулировать следующие требования к отдельным компонентам.
Требования к подсистеме архивирования:
Требования к объекту буфера значений:
Требование к механизму связывания с атрибутами:
Модульная часть архива значений должна обеспечить:
Ключевым компонентом архивирования значений непрерывных процессов является объект буфера значений. Буфер значений предназначен для хранения массива значений полученных с определённой периодичностью опроса(квантом времени). Буфер значений может использоваться как для непосредственного хранения больших массивов значений в архивах значений, перед непосредственным "сбросом" на физические носители, так и для манипуляций с кадрами значений, т.е. в функциях покадрового запроса значений и их помещения в буфера архивов.
Учитывая природу внутренних данных системы OpenSCADA, наделим буфер значений возможностью хранить данные четырёх типов: целые, вещественные, логические и строковые. Кроме того, с целью оптимизации хранения, предоставим поддержку следующих режимов буфера:
Как видно на рис.1, полученные данные предварительно сохраняются в буфере архива. Далее, данные выбираются архиваторами в соответствии с собственными критериями и помещаются в хранилища. В момент запроса данных из истории, в начале, проверяется буфер на наличие запрошенных данных, а затем опрашиваются архивы в последовательности уменьшения качества архива. Физические архивы выстраиваются в цепочку для обеспечения последовательного опроса в соответствии с качеством архиваторов.
Буфер значений содержит только кольцевой массив значений, без каких либо механизмов работы с физическим хранилищем. Это связанно с тем, что функцию физического хранилища могут выполнять различные средства, от файлов на файловой системе до таблиц на СУБД. Для связи с физическим хранилищем используется модули. Модуль предоставляет реализацию механизма связи с физическим хранилищем, объект которого включается в цепочку физических архивов данного архива. Таким образом, результирующий архив складывается из промежуточного буфера и объектов различных архиваторов. Доступ к полученому слоёному архиву производится централизовано в последовательности соответствующей качеству его составляющих.
Архив значений создаётся как независимый компонент который включает буфер обрабатываемый архиваторами. Основным параметром архива значения является источник данных. В роли источника данных могут выступать атрибуты параметров системы OpenSCADA, а также другие внешние источники данных (пассивный режим). Другими источниками данных могут быть: сетевые архиваторы удалённых OpenSCADA систем, среда программирования системы OpenSCADA и др. Не менее важными параметрами архива являются параметры буфера. От этих параметров зависит возможность работы архиваторов. Так, периодичность значений в буфере должна быть не больше периодичности самого быстрого архиватора, а размер буфера не менее двойного размера для содержания значений для самого медленного архиватора. В противном случае возможны потери данных!
Исходя из вышеизложенных размышлений, можно сформировать архитектуру архивирования значений. Представим эту архитектуру в виде статической диаграммы классов (рис.2). На рис.2 представлена статическая диаграмма классов подсистемы архивирования в целом, включая и архивирование сообщений. В таблице 1 представлено описание классов диаграммы классов.
Таблица 1. Классы архивирования значений непрерывных процессов
Класс | Ответственность | Связи |
TParam | Класс параметра логического уровня. Содержит атрибуты (объект TValue). Используется для формирования параметров необходимой структуры. | Наследует объект значений TValue, который содержит атрибуты. |
TParamContr | Класс параметра физического уровня. Содержит атрибуты (объект TValue). Предоставляется источником данных DAQ. Имеет, предопределённую источником данных структуру. | Наследует объект значений TValue, который содержит атрибуты. |
TValue | Класс атрибутов параметров. Непосредственно содержит атрибуты (TVal). Практически, выполняет функцию контейнера атрибутов параметров (TVal). | Является контейнером атрибутов значений. Наследуется классами реализующими параметр (физический, логический уровни). |
TVal | Класс атрибута параметра. Содержит атрибут и интерфейс доступа к нему. Хранит последнее значение атрибута (вместе с точкой времени). | Содержиться в контейнере атрибутов (TValue). Может связываться с архивом для хранения истории. |
TValBuf | Класс буфера значений. Содержит, в кольцевом буфере указанного типа, историю изменения значений. Предоставляет механизмы размещения значения или кадра значений, а также механизмы запроса значения и кадра значений. Может, также, использоваться для временного хранения кадров значений, с целью запроса или размещения в буферах этого же типа. | Наследуется архивом (TVArchive). |
TVArchEl | Класс элемента архива архиватора. Содержит интерфейс для обработки буфера архива и для доступа к значениям физического архива. | Содержится в архиваторе (TVArchivator). Ссылки на него хранятся в списке хранилищ архива (TVArchive). Наследуется классом связывания с хранилищем (ModVArchEl). |
TVArchivator | Класс архиватора значений. Содержит классы элементов архива архиватора (TVArchEl). | Содержится в контейнере типа архива (TTipArchivator). Наследуется модульным объектом связи с хранилищем (ModVArch) |
TMArchivator | Класс архиватора сообщений. Обслуживает запросы к сообщениям в архиве. | Содержится в контейнере типа архива (TTipArchivator). Наследуется модульным объектом связи с хранилищем (ModMArch) |
TTipArchivator | Класс типа архиватора. Тип архиватора - один для архиваторов сообщений и значений. | Содержит архиваторы сообщений и значений данного типа. Содержиться в подсистеме "Архивы". Наследуется корневым объектом модуля подсистемы "Архивы" (ModArch). |
TVArchive | Класс архива. Содержит описание источника данных, буфер и список целевых архиваторов используемых для архивирования значений (TVArchEl). | Содержиться в объекте подсистемы архивирования (TArchiveS). Наследует объект буфера (TValBuf). Содержит список элементов физических архивов (TVArchEl). Используется атрибутом значений (TVal) для ассоциации его с архивом. |
TArchiveS | Класс подсистемы "Архивы". Содержит архивы значений (TVArchive). Содержит промежуточный буфер архива сообщений. Предоставляет механизм централизованого доступа к заархивированным сообщениям. | Содержит модули архиваторов (TTipArchivator). Содержит архивы значений и буфер архива сообщений. |
ModArch | Корневой объект модуля связи с хранилищем. | Наследует объект типа архиватора (TTipArchivator). |
ModVArch | Модульный объект реализации связи с хранилищем значений. | Наследует объект архиватора значений (TVArchivator). |
ModMArch | Модульный объект реализации связи с хранилищем сообщений. | Наследует объект архиватора сообщений (TMArchivator). |
ModVArchEl | Модульный объект элемента архива значений. | Наследует объект элемента архива значений (TVArchEl). |
Из числа этих классов нужно разработать классы:
А также доработать классы:
На рис. 3 представлена динамика процесса записи сообщений генерируемых объектами системы OpenSCADA в архив сообщений. Динамика представлена в виде UML диаграммы кооперации. Рассмотрим данный процесс:
На рис. 4 представлена динамика процесса запроса сообщений, объектами системы OpenSCADA, из архива сообщений. Динамика представлена в виде UML диаграммы кооперации.
Рассмотрим данный процесс:
На рис. 5 представлена динамика процесса пассивного архивирования значений. Динамика представлена в виде UML диаграммы кооперации. Режим пассивного архивирования подразумевает функционирование архива значения в режиме ожидания входных значений. Источником входных значений могут быть как атрибуты параметров так и другие внешние источники данных. Например другими внешними источниками данных могут выступать: среда программирования системы OpenSCADA, сетевые источники данных (сетевой архиватор удалённой OpenSCADA станции) и др.
Рассмотрим процесс пассивного архивирования значений:
Таким образом производится архивирование значений в архиваторах с различными параметрами. При этом, реальное размещение значений в хранилищах буферизировано и может выполняться независимо, тем самым не препятствуя процессу размещения значений в буферах.
Процесс пассивного архивирования кадров значений аналогичен, только вместо размещения одного значения выполняется размещения кадра и вместо функций типа setS(), setI() используется функция setVal().
На рис. 6 представлена динамика процесса активного архивирования значений. Динамика представлена в виде UML диаграммы кооперации. Режим активного архивирования подразумевает непосредственный опрос архивом источника значений, с целью получения значений. На настоящий момент закладывается поддержка только атрибутов параметров в качестве таких источников.
Рассмотрим процесс активного архивирования значений:
Особенностью активного архивирования является переодический опрос, активными архивами, источников значений. Для этих целей будет предусмотрен отдельный поток. Минимальная периодичность опроса активных архивов предусматривается на уровне 1 сек. Более высокая частота опроса должна достигаться в пассивном режиме архивирования путём загрузки значений кадрами.
На рис. 7 представлена динамика процесса запроса значений из архива. Динамика представлена в виде UML диаграммы кооперации. Запросить значение из архива можно несколькими способами. Первый способ это прозрачный запрос значения параметра с указанием метки времени. В этом случае запрос перенаправляется ассоциированому с атрибутом архиву. Второй способ это непосредственное обращение к архиву. Вторым способом можно запрашивать как отдельные значения так и кадры значений.
Рассмотрим процесс запроса значений из архива:
Отдельные реализации хранилищ могут поддерживать инициативу по созданию архивов, которые в хранилище есть, а в системе отсутствуют. Такая ситуация возможна для хранилищ на файловой системе. Например, при переносе архивов с одной станции на другую. В таких случаях, модуль может самостоятельно добавлять архивы в систему, при загрузке.
В соответствии с размышлениями выше, реализуем архивирование значений. Для целевой реализации составим план реализации:
Цели приследуемые реализацией:
Создан буфер с поддержкой следующих режимов:
Буфером поддерживается, также, возможность копирование из одного буфера в другой, что может быть использовано для покадрового запроса или загрузки. В процессе копирования можно указывать границы копируемых значений.
Запросом отдельных значений поддерживается режим притягивания как к большему так и к меньшему значению в архиве. Это позволяет выполнять обход буфера как сверху так и снизу по методу увеличения или уменьшения полученого времени на единицу.
В процессе реализации созданы: объект архива (TVArchive), объект архиватора значений (TVArchivator) и элемент архива TVArchEl.
TVArchive содержится непосредственно в подсистеме архивирования. Объект выполняет сбор данных от источников и накопление их в промежуточном буфере. Далее, данные накопленные в буфере могут выбираться архиваторами в соответствии с их характеристиками. TVArchive, также, служит для централизованного доступа к данным архива. Причём как к данным в буфере, так и к данным архиваторов. Поддерживаются режимы общего и индивидуального доступа к архиву. В режиме общего доступа данные собираются как с буфера так и со всех архиваторов. В режиме индивидуального доступа можно получить данные только из указанного архиватора или буфера. Доступ к архивам производится через вкладку "Архивы значений" подсистемы "Архивы" (рис. 8). В этой вкладке можно выполнять основные действия над архивами: создание, удаление и переход. Кроме этого, вкладка содержит поле установки периодичности активного сбора данных. Значение указывается в милисекундах и должно быть меньше самого быстрого активного архива.
Для управления архивом значений создана конфигурационная страница (на языке сценариев). Страница содержит три вкладки: "Архив", "Архиваторы" и "Значения". Вкладка "Архив" содержит основные данные архива (рис. 9). Здесь можно определить такие параметры:
Архив может быть в двух состояниях "Исполняется" и "Остановлен". В состоянии "Остановлен" архив не связан ни с архиваторами ни с источником данных. В состоянии "Исполняется" архив связывается с источником данных (или получает значение от пассивного источника) и подключается к архиваторам. Для указания необходимости запуска предназначен признак "Запускать".
Архив может храниться на одной из доступных БД что указывается в поле "БД архива (модуль.бд)".
В соответствии с типами данных поддерживаемых системой "OpenSCADA" архивом поддерживаются типы значений: Логический, Целый, Вещественный и Строковый.
В качестве источника данных архив поддерживает:
Периодичность буфера должна устанавливаться в минимальное значение периодичности архиваторов.
Размер буфера должен согласовываться с периодичностью обращения архиваторов к буферу. Рекомендуется устанавливать размер архива с целью хранения значений в течении времени в два раза большего периодичности обращения к буферу(архивирования) самого медленного архиватора.
Признак "Жёсткая сетка буфера" указывает на применение механизма жёсткого квантования с привязкой значений к сетке кванта, без хранения времени отдельно взятого значения. В противном случае используется мягкая сетка, т.е. вместе с значение хранится и время.
Признак "Высокое разрешение времени буфера" указывает на хранение значений с точностью 1 мкс. Иначе точность составляет 1 сек. Используется при архивировании быстрых процессов.
Вкладка "Архиваторы" содержит информацию по архиваторам обслуживающим данный архив (рис. 10). Здесь можно легко подключить или отключить архив к нужным архиваторам, а также получить информацию о размере архива на различных архиваторах.
Вкладка "Значения" содержит форму для просмотра значений в архиве (рис. 11). С помощью этой формы можно просматривать значения за любой промежуток времени как для всех архиваторов вместе так и для каждого архиватора отдельно.
TVArchivator является модульным объектом подсистемы "Архивы" содержащем реализацию архиватора значений отдельно взятого модуля. Объект содержит реализацию доступа к физическому архиву. Общей задачей данного объекта является сбор данных по буферам архивов, архивирование и предоставление доступа к значениям в архиве. Архиватор содержит элементы архивов (TVArchEl) которые он и обрабатывает.
Доступ к архиваторам значений, как и к архиваторам сообщений, производится через вкладку "Архиваторы" страницы модуля, подсистемы "Архивы" (рис.12). На этой странице представлены списки архиваторов сообщений и значений.
Для управления архиватором значений создана конфигурационная страница (на языке сценариев). Страница содержит две вкладки: "Архиватор" и "Архивы". Вкладка "Архиватор" содержит основные данные (рис. 13). Здесь можно определить такие параметры:
Архиватор может быть в состоянии "Остановлен" и "Выполняется". В состоянии "Остановлен" архиватор не обрабатывает архивы и вообще с ними никак не связывается. В состоянии "Выполняется" архиватор содержит элементы архивов (TVArchEl) и выполняет периодическую обработку буферов архивов. Период обработки буферов определяется периодом архивирования. Для указания необходимости запуска предназначен признак "Запускать".
Архиватор может храниться на одной из доступных БД что указывается в поле "БД архиватора (модуль.бд)".
Каждый архиватор содержит значения с указынным периодом. Если период значений архиватора больше чем в буфере архива, то производится усреднение или другая операция объединения значений. Операция объединения реализуется в модуле архиватора.
Для физической адресации архивов предусмотрено поле адреса. В зависимости от реализации модуля архиватора это поле может иметь различное значение. Так, для архиватора на файловую систему (ФС), это поле содержит путь к директории с архивами.
С целью оценки нагрузки на архивирование, на данной странице содержится параметр времени архивирования. Реальное время архивирования должно быть меньше периода архивирования!
В зависимости от модуля реализующего доступ к хранилищу, на данной странице могут содержаться вкладки со специализированными для модулями настройками. Так, модуль архивирования на файловую систему содержит вкладку "Дополнительные опции" (рис. 14). Здесь содержаться следующие параметры:
Для принудительного выполнения проверки директории архиватора на вкладке предусмотрена кнопка "Проверить директорию архиватора сейчас".
Вкладка "Архивы" содержит перечень архивов обслуживаемых архиватором (рис. 15). Модули архиваторов могут добавлять свою информацию в эту вкладку. Так, архиватор на файловую систему добавляет сюда информацию по размерам файлов на файловой системе по каждому архиву.
С целью упрощения задачи назначения архивов для атрибутов параметров, на странице конфигурации параметра была добавлена вкладка "Архивирование" (рис.16). На этой вкладке содержится список атрибутов с перечнем архиваторов в колонках. Простым выбором архиваторов можно назначать архивы для атрибутов.
Для реализации архивирования на файловую систему предъявляются следующие требования:
В соответстви с вышеизложенными требованиями принято решение организации архивирования методом множественности файлов (для каждого источника). Цикличность архива производится на уровне файлов, т.е. создается новый файл а самый старый удаляется. Для быстрого сжатия используется метод притягивания к последнему одинаковому значению. Для этих целей в файле архива предусматривается битовая таблица упаковки размером один в один с количеством хранимых данных. Т.е. каждый бит соответствует одному значению в архиве. Значение бита указвает на наличие значения. Для потока одинаковых значений биты будут обнулены. В случае с архивом строк таблица является не битовой а байтовой и содержит длину указанного значения. В случае поступления потока одинаковых значений длина будет нулевой и читаться будет первое одинаковое значение. Поскольку таблица байтовая, то архив сможет хранить строки длиной не более 255 символов. Таким образом методики хранения, как и данные, можно разделить на данные фиксированного и нефиксированного размера. Общая структура файла архива приведена на рис. 17.
При создании нового файла архива формируется заголовок (структрура заголовка в таблице 2), нулевая битовая таблица упаковки архива и первое недоставерное значение. Таким образом получится архив инициализированный недоставерными значениями. В дальнейшем, новые значения будут вставляться в область значений с корректировкой индексной таблицы упаковки. Из этого следует что, пассивные архивы будут вырождаться в файлы размером в заголовок и битовую таблицу.
Таблица 2. Структура заголовка файла архива
Поле | Описание | Размер байт(бит) |
f_tp | Системное имя архива ("OpenSCADA Val Arch.") | 20 |
archive | Имя архива которому принадлежит файл. | 20 |
beg | Время начала архивных данных (мкс) | 8 |
end | Время конца архивных данных (мкс) | 8 |
period | Периодичность архива (мкс) | 8 |
vtp | Тип значения в архиве (Логический, Целый, Вещественный, Строка) | (3) |
hgrid | Признак использования жёсткой сетки в буфере архива | (1) |
hres | Признак использования времени высокого разрешения (мкс) в буфере архива | (1) |
reserve | Резерв | 14 |
term | Символ окончания заголовка архива (0x55) | 1 |
Разъяснение механизма последовательной упаковки приведено на рис. 18. Как можно видеть из рисунка, признак упаковки содержит длину (нефиксированные типы) или признак упаковки (фиксированные типы) отдельно взятого значения. Это значит, что для получения смещения нужного значения необходимо сложить длины всех предыдущих действительных значений. Выполнение данной операции каждый раз и для каждого значения является крайне накладной операцией. Поэтому был внедрён механизм кеширования смещений значений. Механизм кеширует смещения значений через предопределённое их количество, а также кеширует смещение последнего значения к которому производился доступ.
Изменения значений существующего архива заложено, хотя и будет значительно медленее добавления, поскольку может потребовать вставки значений в середину файла. С целью оптимизации процесса вставки, в дальнейшем, планируется реализация буферироваться с последующей вставкой блока значений.
Наиболее устаревшие файлы архива пакуются стандартным архиватором gzip. При доступе к значениям такого архива, выполняется предварительная распаковка.
Учитывая высокую распределённость разработки в целом и значительную сложность реализации отдельных узлов требуется выполнение тестирования с написанием группы тестов для критических узлов.
Наиболее сложными, в реализации и проверке, узлами являются объект буфера значений (TValBuf) и физическое хранилище значений на файловую систему (модуль BaseArh). Это связанно с тем, что в данных объектах, непосредственно, реализуются механизмы хранения данных различных типов. Для написания тестов вибрана стратегия чёрного ящика и метод покрытия функциональных возможностей. Описания тестов буфера значений приведено в таблице 3. Описание тестов архивирования значений на файловую систему приведено в таблице 4.
Таблица 3. Тесты буфера значений
Номер | Описание |
1 | Создание буфера с предопределёнными параметрами (Тип: строка; Размер: 10; Период: 1c; Жесткая сетка; Низкое разрешение времени) |
2 | Изменение параметров буфера (Мягкая сетка; Высокое разрешение времени; Размер: 2000; Период: 0) |
3 | Удаление буфера |
4 | Заполнение и проверка строкового буфера с жёсткой сеткой |
5 | Заполнение и проверка целочисленного буфера с жёсткой сеткой |
6 | Заполнение и проверка строкового буфера с мягкой сеткой и высоким разрешением времени |
7 | Заполнение и проверка целочисленнного буфера с мягкой сеткой и высоким разрешением времени |
8 | Заполнение и проверка строкового буфера с мягкой сеткой и низким разрешением времени |
9 | Заполнение и проверка целочисленнного буфера с мягкой сеткой и низким разрешением времени |
10 | Заполнение и проверка свободного строкового буфера с высоким разрешением времени |
11 | Заполнение и проверка свободного целочисленнного буфера с высоким разрешением времени |
12 | Заполнение и проверка свободного строкового буфера с низким разрешением времени |
13 | Заполнение и проверка свободного целочисленнного буфера с низким разрешением времени |
Таблица 4. Тесты архивирования значений на файловую систему
Номер | Описание |
1 | Простое заполнение и проверка архива |
2 | Вставка всередину значения дублирующего по низу |
3 | Вставка всередину значения дублирующего по верху с наличием ранее дублирующего снизу |
4 | Вставка всередину значения повторно дублирующего по низу с наличием ранее дублирующего сверху |
5 | Вставка всередину недублирующего значения |
6 | Вставка всередину дублирующего значения с наличием ранее такогоже дублирования сверху |
7 | Вставка недублирующего значения с наличием ранее дублирования снизу |
8 | Вставка в конец архивного файла трёх значений, два в текущий и одно в новый. Проверка чёткости границ. |
Все вышеперечисленные тесты реализованы в модуле тестирования ядра системы OpenSCADA SystemTests.
В процессе тестирования было обнаружено более 10 ошибок. Все обнаруженые ошибки были локализованы и устранены.