Открытая SCADA система OpenSCADA принадлежит к классу SCADA(Supervisory Control and Data Aquisition) систем. Системы данного класса используются как элемент систем автоматизации технологических процессов(АСУ-ТП).
Система OpenSCADA строится как модульная и высокомасштабируемая система. Следовательно внутренняя структура системы должна удовлетворять высоким требованиям гибкости.
Любая SCADA система предоставляет возможность архивирования собранных данных, т.е. формирование истории изменения (динамики) процессов. Архивы, условно, можно разделить на два типа: архивы сообщений и архивы значений.
Особенностью архивов сообщений является то, что архивируются, так называемые, события. Характерным признаком события является время возникновения этого события. Архивы сообщений, обычно, используются для архивирования сообщений в системе, т.е. ведение логов и протоколов. В зависимости от источника сообщения могут классифицироваться по различным критериям. Например, это могут быть протоколы аварийных ситуаций, протоколы действий операторов, протоколы сбоев связи и др.
Особенностью архивов значений является их периодичность, определяемая промежутком времени между двумя смежными значениями. Архивы значений применяются для архивирования истории непрерывных процессов. Поскольку процесс непрерывный, то и архивировать его можно только путём введения понятия квантования опроса значений, поскольку иначе мы получаем архивы бесконечных размеров ввиду непрерывности самой природы процесса. Кроме этого, практически, мы можем получать значения с периодом ограниченным самими источниками данных. Например, довольно качественные источники данных, в промышленности, редко позволяют получать данные с частотой более 1кГц. И это без учёта самих датчиков, имеющих ещё менее качественные характеристики.
Для ведения архивов, в системе OpenSCADA, предусмотрена подсистема 'Архивы'. Данная подсистема, в соответствии с типами архивов, состоит из двух частей: архив сообщений и архивы значений. Подсистема, в целом, является модульной, что позволяет создавать архивы, основанные на различной природе и способах хранения данных.
Механизм архивирования сообщений уже разработан и функционирует в системе OpenSCADA, в то время как механизм архивирования значений всё ещё отсутствует. Основной целью данного, дочернего проекта, и является разработка механизма архивирования значений (непрерывных процессов). В процессе реализации данного проекта может претерпеть изменений, также, и механизм архивирования сообщений, в направлении унификации механизмов доступа к архивам сообщений.
2 Назначение
Функционально, разработка предназначена для предоставления в системе OpenSCADA механизма архивирования данных непрерывных процессов, которые могут быть получены из различных источников данных.
Эксплуатационным назначением разработки является:
расширение сферы применения системы OpenSCADA, за счёт предоставления механизма архивирования данных;
возможность хранения истории непрерывных процессов.
3 Требования
Архитектурно, архивирование значений непрерывных процессов должно удовлетворять следующим требованиям:
реализоваться в рамках подсистемы архивирования, вместе с архивированием сообщений;
предоставлять объект буфера значений как для хранения, так и для операций над кадрами значений;
содержать механизм связывания с атрибутами параметров;
выносить в модуль реализацию физической основы архива (файловая система, СУБД, сеть и т.д.).
Исходя из архитектурных требований можно сформулировать следующие требования к отдельным компонентам.
Требования к подсистеме архивирования:
содержать архивы значений, с возможностью архивирования на разных 'архиваторах' (распределение одного, общего архива по нескольким архиваторам);
предоставлять возможность установки следующих параметров архиватора: период архивирования, период получения значений из буфера;
предоставлять возможность установки следующих параметров архива: источник данных, используемые архиваторы и параметры буфера;
предоставление интерфейса для реализации физического сброса буферов в различные хранилища (на уровне модуля);
предоставление интерфейса доступа к архивным данным непосредственно через архив значений.
Требования к объекту буфера значений:
хранение значений четырёх типов: целое, вещественное, логическое и строка;
поддержка режимов буфера: жесткая привязка к квантовой сетке, мягкая привязки к квантовой сетке и режим точных меток времени (микросекунды);
предоставление механизма связывание архиваторов в цепочку (для формирования одного, результирующего архива);
предоставление методов для: получения значений из буфера, вставки из одного буфера в другой.
Требование к механизму связывания с атрибутами:
атрибуты параметров должны поддерживать связывание с архивом значений;
при наличие связи с архивом значений, атрибуты параметров должны перенаправлять запросы к истории параметра на связанный архив значений, включая запросы на вставку новых значений или групп значений в виде сформированного кадра/буфера значений.
Модульная часть архива значений должна обеспечить:
сохранение значений буфера на физический носитель (файлы архивов, СУБД и т.д.);
обслуживание запросов на доступ к значениям на физическом носителе.
4 Проектирование
4.1 Буфер значений непрерывных процессов
Ключевым компонентом архивирования значений непрерывных процессов является объект буфера значений. Буфер значений предназначен для хранения массива значений, полученных с определённой периодичностью опроса(квантом времени). Буфер значений может использоваться как для непосредственного хранения больших массивов значений в архивах значений, перед непосредственным 'сбросом' на физические носители, так и для манипуляций с кадрами значений, т.е. в функциях покадрового запроса значений и их помещения в буфера архивов.
Учитывая природу внутренних данных системы OpenSCADA, наделим буфер значений возможностью хранить данные четырёх типов: целые, вещественные, логические и строковые. Кроме того, с целью оптимизации хранения, предоставим поддержку следующих режимов буфера:
Жесткая привязка к квантовой сетке - значения полученые в пределах кванта времени сохраняются в ближайшем узле кванта, т.е. их время округляется к времени ближайшего узла квантовой сетки. В данном режиме хранятся только значения, без метки времени.
Мягкая привязка к квантовой сетке - значения полученые в пределах кванта времени сохраняются в единственном числе, вместе с точкой времени. Поскольку в этом режиме хранится и точка времени, то допускается опускание дубликатов (близких к предыдущему значению) значений.
Режим меток времени высокой точности - данный режим подразумевает хранение меток высокой точности, содержащих микросекунды.
Рис. 1. Структура архивирования значений динамических параметров.
Как видно на рис.1, полученные данные предварительно сохраняются в буфере архива. Далее, данные выбираются архиваторами в соответствии с собственными критериями и помещаются в хранилища. В момент запроса данных из истории, в начале, проверяется буфер на наличие запрошенных данных, а затем опрашиваются архивы в последовательности уменьшения качества архива. Физические архивы выстраиваются в цепочку для обеспечения последовательного опроса в соответствии с качеством архиваторов.
Буфер значений содержит только кольцевой массив значений, без каких либо механизмов работы с физическим хранилищем. Это связанно с тем, что функцию физического хранилища могут выполнять различные средства, от файлов на файловой системе до таблиц на СУБД. Для связи с физическим хранилищем используется модули. Модуль предоставляет реализацию механизма связи с физическим хранилищем, объект которого включается в цепочку физических архивов данного архива. Таким образом, результирующий архив складывается из промежуточного буфера и объектов различных архиваторов. Доступ к полученому слоёному архиву производится централизовано, в последовательности соответствующей качеству его составляющих.
Архив значений создаётся как независимый компонент, который включает буфер обрабатываемый архиваторами. Основным параметром архива значения является источник данных. В роли источника данных могут выступать атрибуты параметров системы OpenSCADA, а также другие внешние источники данных (пассивный режим). Другими источниками данных могут быть: сетевые архиваторы удалённых OpenSCADA систем, среда программирования системы OpenSCADA и др. Не менее важными параметрами архива являются параметры буфера. От этих параметров зависит возможность работы архиваторов. Так, периодичность значений в буфере должна быть не больше периодичности самого быстрого архиватора, а размер буфера не менее двойного размера для содержания значений для самого медленного архиватора. В противном случае возможны потери данных!
4.2 Архитектура
Исходя из вышеизложенных размышлений, можно сформировать архитектуру механизма архивирования значений. Представим эту архитектуру в виде статической диаграммы классов (рис.2). На рис.2 представлена статическая диаграмма классов подсистемы архивирования в целом, включая и архивирование сообщений. В таблице 1 представлено описание классов диаграммы классов.
Рис. 2. Статическая диаграмма классов.
Таблица 1. Классы архивирования значений непрерывных процессов
Класс
Ответственность
Связи
TParam
Класс параметра логического уровня. Содержит атрибуты (объект TValue). Используется для формирования параметров необходимой структуры.
Наследует объект значений TValue, который содержит атрибуты.
TParamContr
Класс параметра физического уровня. Содержит атрибуты (объект TValue). Предоставляется источником данных 'DAQ'. Имеет, предопределённую источником данных, структуру.
Наследует объект значений TValue, который содержит атрибуты.
TValue
Класс атрибутов параметров. Непосредственно содержит атрибуты TVal. Практически, выполняет функцию контейнера атрибутов параметров TVal.
Класс атрибута параметра. Содержит атрибут и интерфейс доступа к нему. Хранит последнее значение атрибута (вместе с точкой времени).
Содержится в контейнере атрибутов TValue. Может связываться с архивом для хранения истории.
TValBuf
Класс буфера значений. Содержит, в кольцевом буфере указанного типа, историю изменения значений. Предоставляет механизмы размещения значения или кадра значений, а также механизмы запроса значения и кадра значений. Может также использоваться для временного хранения кадров значений, с целью запроса или размещения в буферах этого же типа.
Наследуется архивом TVArchive.
TVArchEl
Класс элемента архива архиватора. Содержит интерфейс для обработки буфера архива и для доступа к значениям физического архива.
Содержится в архиваторе TVArchivator. Ссылки на него хранятся в списке хранилищ архива TVArchive. Наследуется классом связывания с хранилищем ModVArchEl.
TVArchivator
Класс архиватора значений. Содержит классы элементов архива архиватора TVArchEl.
Содержится в контейнере типа архива TTypeArchivator. Наследуется модульным объектом связи с хранилищем ModVArch
TMArchivator
Класс архиватора сообщений. Обслуживает запросы к сообщениям в архиве.
Содержится в контейнере типа архива TTypeArchivator. Наследуется модульным объектом связи с хранилищем ModMArch
TTypeArchivator
Класс типа архиватора. Тип архиватора - один для архиваторов сообщений и значений.
Содержит архиваторы сообщений и значений данного типа. Содержится в подсистеме 'Архивы'. Наследуется корневым объектом модуля подсистемы 'Архивы' ModArch.
TVArchive
Класс архива. Содержит описание источника данных, буфер и список целевых архиваторов, используемых для архивирования значений TVArchEl.
Содержится в объекте подсистемы архивирования TArchiveS. Наследует объект буфера TValBuf. Содержит список элементов физических архивов TVArchEl. Используется атрибутом значений TVal для ассоциации его с архивом.
TArchiveS
Класс подсистемы 'Архивы'. Содержит архивы значений TVArchive. Содержит промежуточный буфер архива сообщений. Предоставляет механизм централизованого доступа к архивированным сообщениям.
Содержит модули архиваторов TTypeArchivator. Содержит архивы значений и буфер архива сообщений.
ModArch
Корневой объект модуля связи с хранилищем.
Наследует объект типа архиватора TTypeArchivator.
ModVArch
Модульный объект реализации связи с хранилищем значений.
Наследует объект архиватора значений TVArchivator.
ModMArch
Модульный объект реализации связи с хранилищем сообщений.
Наследует объект архиватора сообщений TMArchivator.
ModVArchEl
Модульный объект элемента архива значений.
Наследует объект элемента архива значений TVArchEl.
Из числа этих классов нужно разработать:
TValBuf — Буфер значений.
TVArchEl — Елемент архива располагающийся в архиваторе.
ModVArchEl — Объект доступа элемента архива к хранилищу.
TVArchive — Объект архива значений.
А также доработать классы:
TVal — Атрибут параметра системы OpenSCADA.
TVArchivator — Архиватор значений.
TMArchivator — Архиватор сообщений.
ModVArch — Объект хранилища архиватора.
TArchiveS — Объект подсистемы архивирования.
4.3 Динамика
На рис. 3 представлена динамика процесса записи сообщений генерируемых объектами системы OpenSCADA в архив сообщений. Динамика представлена в виде UML диаграммы кооперации. Рассмотрим данный процесс:
Объект системы OpenSCADA (ClientObj) генерирует сообщение и направляет его объекту обслуживания сообщений (TMess) посредством метода put().
Получив сообщение, TMess напрявляет их различным потребителям. В нашем случае это подсистема 'Архивы' (TArchiveS). Данная операция выполняется методом putMess().
Полученые сообщения TArchiveS помещает в промежуточный кольцевой буфер предопределённого размера. Данная операция может производиться как с помощью функции putMesToBuf(), так и напрямую. На этом операция вставки сообщения завершается.
Далее, в отдельном потоке, периодически производится выборка новых сообщений из буфера и раздача их архиваторам. Выборка производится методом getMesBuf() или напрямую. Выбранные сообщения раздаются архиваторам методом messAt().put().
Выбранные из буфера сообщения попадают в объект хранилища (Secure:ModMArch) посредством виртуального метода put() класса Secure:TMArchivator.
Рис. 3. Диаграмма кооперации: Запись сообщений, объектом системы, в архив сообщений.
На рис. 4 представлена динамика процесса запроса сообщений, объектами системы OpenSCADA, из архива сообщений. Динамика представлена в виде UML диаграммы кооперации.
Рассмотрим данный процесс:
Объект системы OpenSCADA обращается за значениями к объекту обслуживания сообщений (TMess) или непосредственно к архиву сообщений (TArchiveS). В случае обращения к TMess - запрос выполняется посредством метода get(), с последующим вызовом метода getMess() подсистемы 'Архивы' (TArchiveS).
Получив запрос, подсистема 'Архивы' выполняет проверку промежуточного буфера на наличие требуемых сообщений (посредством метода getMesBuf() или напрямую). В случае отсутствия требуемых сообщений в буфере, выполняется запрос значений у архиваторов, посредством метода messAt().get().
Посредством виртуального метода get() архива сообщений Secure:TMArchivator, производится запрос к хранилищу сообщений ModMArch.
Получив запрос, объект хранилища сообщений ModMArch производит поиск сообщений в доступных ему хранилищах и формирует ответ.
Рис. 4. Диаграмма кооперации: Запрос сообщений, объектом системы, из архива сообщений.
На рис. 5 представлена динамика процесса пассивного архивирования значений. Динамика представлена в виде UML диаграммы кооперации. Режим пассивного архивирования подразумевает функционирование архива значения в режиме ожидания входных значений. Источником входных значений могут быть как атрибуты параметров так и другие внешние источники данных. Например, другими внешними источниками данных могут выступать: среда программирования системы OpenSCADA, сетевые источники данных (сетевой архиватор удалённой OpenSCADA станции) и др.
Рассмотрим процесс пассивного архивирования значений:
Данные передаются архиву источником данных. Так, атрибут параметра (TVal) передаёт значение связанному с ним архиву (TVArchive) посредством функции(й) setS(). Внешний источник (SrcVal) выполняет туже операцию, только через подсистему 'Архивы' (TArchiveS).
Получив значения, архив значений (TVArchive) направляет его в буфер. На этом процесс размещение значения заканчивается.
Далее, в отдельных потоках (вызовом метода archData), архиваторы выбирают нужные им значения из буфера (метод getS()) и размещают их в физических архивах, посредством объекта элемента архиватора (TVArchEl).
Таким образом производится архивирование значений в архиваторах с различными параметрами. При этом реальное размещение значений в хранилищах буферизировано, и может выполняться независимо, тем самым не препятствуя процессу размещения значений в буферах.
Процесс пассивного архивирования кадров значений аналогичен, только вместо размещения одного значения выполняется размещения кадра и вместо функций типа setS(), setI() используется функция setVal().
На рис. 6 представлена динамика процесса активного архивирования значений. Динамика представлена в виде UML диаграммы кооперации. Режим активного архивирования подразумевает непосредственный опрос архивом источника значений, с целью получения значений. На настоящий момент закладывается поддержка только атрибутов параметров в качестве таких источников.
Рассмотрим процесс активного архивирования значений:
Архив (TVArchive) настроенный как 'Активный' инициирует запрос текущего значения у атрибута параметра, посредством метода getS() через парметр (TValue).
Полученое значение, архив направляет в буфер (TValBuf). На чём процесс опроса и оканчивается.
Далее в отдельных потоках (вызовом метода archData() ), архиваторы выбирают нужные им значения из буфера (метод getS()) и размещают их в физических архивах, посредством объекта элемента архиватора (TVArchEl).
Особенностью активного архивирования является переодический опрос, активными архивами, источников значений. Для этих целей будет предусмотрен отдельный поток. Минимальная периодичность опроса активных архивов предусматривается на уровне 1 сек. Более высокая частота опроса должна достигаться в пассивном режиме архивирования, путём загрузки значений кадрами.
Рис. 6. Диаграмма кооперации: Активное архивирование значений.
На рис. 7 представлена динамика процесса запроса значений из архива. Динамика представлена в виде UML диаграммы кооперации. Запросить значение из архива можно несколькими способами. Первый способ это прозрачный запрос значения параметра с указанием метки времени. В этом случае запрос перенаправляется ассоциированому с атрибутом архиву. Второй способ это непосредственное обращение к архиву. Вторым способом можно запрашивать как отдельные значения так и кадры значений.
Рассмотрим процесс запроса значений из архива:
Объект системы запрашивает значение из архива. Сделать это он может как непосредственно запросив архив (TVArchive), так и прозрачно запросив значение у атрибута параметра (TVal).
Получив запрос, архив (TVArchive) проверяет буфер (TValBuf) на наличие данного значения. В случае отсутствия значения в буфере выполняется приоритетный запрос значений у физических архивов (TVArchEl) посредством той-же функции getS().
Полученое таким образом значение возвращается запросившему объекту.
Рис. 7. Диаграмма кооперации: Запрос значений из архива.
Отдельные реализации хранилищ могут поддерживать инициативу по созданию архивов, которые в хранилище есть, а в системе отсутствуют. Такая ситуация возможна для хранилищ на файловой системе. Например, при переносе архивов с одной станции на другую. В таких случаях, модуль может самостоятельно добавлять архивы в систему, при загрузке.
5 Реализация
В соответствии с размышлениями выше, реализуем архивирование значений. Для целевой реализации составим план реализации:
Перенос буфера сообщений в подсистему 'Архивы' - Выполнено.
Сведение запросов к архивам сообщений в одно целое. При запросе сперва проверяется буфер, а затем архиваторы - Выполнено.
5.2 Реализация объекта буфера значений (TValBuf) — Выполнено
Цели приследуемые реализацией:
Предварительное накопление.
Независимое и беспрепятственное наполнение буфера.
Независимое и беспрепятственное чтение буфера как в пользовательских целях, так и в целях сброса в хранилище.
Создан буфер с поддержкой следующих режимов:
Жесткая сетка времени. Структура постоянная на основе кольцевого буфера. Заполнение только последовательное (снизу вверх). Память под буфер выделяется по мере наполнения, тем самым экономя память на пассивных буферах.
Мягкая сетка времени. В буфере содержаться метки времени (обычной или высокой точности). Заполнение только последовательное (снизу вверх). В процессе заполнения выполняется сворачивание одинаковых значений идущих последовательно, что приводит к экономии памяти на стабильных процессах. Кроме того, буфер выделяется по мере наполнения, что также экономит память на пассивных буферах.
Свободный буфер. заполняется как угодно, не привязан к сетке времени. Может ограничиваться только по размеру. Хранит метки времени обычной или высокой точности. При установленном ограничении на размер, в процессе наполнения, старые значения вытесняются, т.е подпёрт снизу. Предназначен для использования в качестве промежуточного буфера в процессе запроса из буферов предыдущих типов. Опускает дублирующие значения.
Буфером поддерживается, также, возможность копирование из одного буфера в другой, что может быть использовано для покадрового запроса или загрузки. В процессе копирования можно указывать границы копируемых значений.
Запросом отдельных значений поддерживается режим притягивания как к большему так и к меньшему значению в архиве. Это позволяет выполнять обход буфера как сверху так и снизу по методу увеличения или уменьшения полученого времени на единицу.
5.3 Реализация Архивов (TVArchive) значений и их элементов (TVArchEl) в составе архиватора (TVArchivator) — Выполнено
В процессе реализации созданы: объект архива (TVArchive), объект архиватора значений (TVArchivator) и элемент архива TVArchEl.
TVArchive содержится непосредственно в подсистеме архивирования. Объект выполняет сбор данных от источников и накопление их в промежуточном буфере. Далее данные накопленные в буфере могут выбираться архиваторами в соответствии с их характеристиками. TVArchive также служит для централизованного доступа к данным архива. Причём как к данным в буфере, так и к данным архиваторов. Поддерживаются режимы общего и индивидуального доступа к архиву. В режиме общего доступа данные собираются как с буфера так и со всех архиваторов. В режиме индивидуального доступа можно получить данные только из указанного архиватора или буфера. Доступ к архивам производится через вкладку 'Архивы значений' подсистемы 'Архивы' (рис. 8). В этой вкладке можно выполнять основные действия над архивами: создание, удаление и переход. Кроме этого, вкладка содержит поле установки периодичности активного сбора данных. Значение указывается в миллисекундах и должно быть меньше самого быстрого активного архива.
Для управления архивом значений создана конфигурационная страница (на языке сценариев интерфейса управления). Страница содержит три вкладки: 'Архив', 'Архиваторы' и 'Значения'. Вкладка 'Архив' содержит основные данные архива (рис. 9). Здесь можно определить такие параметры:
состояние;
идентификатор;
имя;
описание;
признак 'Запускать';
тип значения в архиве;
источник архива;
периодичность буфера;
размер буфера;
признак 'Жёсткая сетка буфера';
признак 'Высокое разрешение времени буфера'.
Архив может быть в двух состояниях: 'Исполняется' и 'Остановлен'. В состоянии 'Остановлен' архив не связан ни с архиваторами ни с источником данных. В состоянии 'Исполняется' архив связывается с источником данных (или получает значение от пассивного источника) и подключается к архиваторам. Для указания необходимости запуска предназначен признак 'Запускать'.
Архив может храниться на одной из доступных БД, что указывается в поле 'БД архива (модуль.бд)'.
В соответствии с типами данных поддерживаемых системой 'OpenSCADA' архивом поддерживаются типы значений: Логический, Целый, Вещественный и Строковый.
В качестве источника данных архив поддерживает:
Внешние источники (пассивное архивирование). Любой компонент системы OpenSCADA.
Пассивный атрибут (пассивное архивирование). Атрибут параметра подсистемы 'DAQ' шлёт значение архиву в процессе его опроса.
Активный атрибут (активное архивирование). Архив самостоятельно собирает значения у атрибута параметра подсистемы 'DAQ'.
Периодичность буфера должна устанавливаться в минимальное значение периодичности архиваторов.
Размер буфера должен согласовываться с периодичностью обращения архиваторов к буферу. Рекомендуется устанавливать размер архива с целью хранения значений в течении времени в два раза большего периодичности обращения к буферу(архивирования) самого медленного архиватора.
Признак 'Жёсткая сетка буфера' указывает на применение механизма жёсткого квантования с привязкой значений к сетке кванта, без хранения времени отдельно взятого значения. В противном случае используется мягкая сетка, т.е. вместе с значение хранится и время.
Признак 'Высокое разрешение времени буфера' указывает на хранение значений с точностью 1 мкс. Иначе точность составляет 1 сек. Используется при архивировании быстрых процессов.
Рис. 9. Вкладка 'Архив' архива значений.
Вкладка 'Архиваторы' содержит информацию по архиваторам обслуживающим данный архив (рис. 10). Здесь можно легко подключить или отключить архив к нужным архиваторам, а также получить информацию о размере архива на различных архиваторах.
Рис. 10. Вкладка 'Архиваторы' архива значений.
Вкладка 'Значения' содержит форму для просмотра значений в архиве (рис. 11). С помощью этой формы можно просматривать значения за любой промежуток времени как для всех архиваторов вместе, так и для каждого архиватора отдельно.
Рис. 11. Вкладка 'Значения' архива значений.
TVArchivator является модульным объектом подсистемы 'Архивы', содержащем реализацию архиватора значений отдельно взятого модуля. Объект содержит реализацию доступа к физическому архиву. Общей задачей данного объекта является сбор данных по буферам архивов, архивирование и предоставление доступа к значениям в архиве. Архиватор содержит элементы архивов (TVArchEl), которые он и обрабатывает.
Доступ к архиваторам значений, как и к архиваторам сообщений, производится через вкладку 'Архиваторы' страницы модуля, подсистемы 'Архивы' (рис.12). На этой странице представлены списки архиваторов сообщений и значений.
Для управления архиватором значений создана конфигурационная страница (на языке сценариев). Страница содержит две вкладки: 'Архиватор' и 'Архивы'. Вкладка 'Архиватор' содержит основные данные (рис. 13). Здесь можно определить такие параметры:
состояние;
идентификатор;
имя;
описание;
период значений;
длина архива;
период архивирования;
адрес архива;
признак 'Запускать'.
Архиватор может быть в состоянии 'Остановлен' и 'Выполняется'. В состоянии 'Остановлен' архиватор не обрабатывает архивы и вообще с ними никак не связывается. В состоянии 'Выполняется' архиватор содержит элементы архивов (TVArchEl) и выполняет периодическую обработку буферов архивов. Период обработки буферов определяется периодом архивирования. Для указания необходимости запуска предназначен признак 'Запускать'.
Архиватор может храниться на одной из доступных БД, что указывается в поле 'БД архиватора (модуль.бд)'.
Каждый архиватор содержит значения с указанным периодом. Если периодичность значений архиватора больше чем в буфере архива, то производится усреднение или другая операция объединения значений. Операция объединения реализуется в модуле архиватора.
Для физической адресации архивов предусмотрено поле адреса. В зависимости от реализации модуля архиватора это поле может иметь различное значение. Так, для архиватора на файловую систему (ФС), это поле содержит путь к директории с архивами.
С целью оценки нагрузки на архивирование, на данной странице содержится параметр времени архивирования. Реальное время архивирования должно быть меньше периода архивирования!
Рис. 13. Вкладка 'Архиватор' страницы архиватора.
В зависимости от модуля реализующего доступ к хранилищу, на данной странице могут содержаться вкладки со специализированными для модуля настройками. Так, модуль архивирования на файловую систему содержит вкладку 'Дополнительные опции' (рис. 14). Здесь содержаться следующие параметры:
'Размер файла (часов)' - определяет размер одного файла архива.
'Максимальное количество файлов' - определяет в скольких файлах будут хранится данные одного архива.
'Округление числовых значений (%)' - указывает величину различия между смежными данными для восприятия значений как различные (используется при упаковке).
'Таймаут упаковки файлов (мин)' - время через которое, по отсутствию активности, файлы архивов будут вторично упаковываться стандартным архиватором (в данном случае это gzip).
'Период проверки архивов (мин)' - указывает период, через который будет выполняться проверка директории архиватора на содержащиеся архивы (подключение новых архивов, удаление старых файлов и т.д.).
Для принудительного выполнения проверки директории архиватора на вкладке предусмотрена кнопка 'Проверить директорию архиватора сейчас'.
Вкладка 'Архивы' содержит перечень архивов, обслуживаемых архиватором (рис. 15). Модули архиваторов могут добавлять свою информацию в эту вкладку. Так, архиватор на файловую систему добавляет сюда информацию по размерам файлов на файловой системе по каждому архиву.
Рис. 15. Вкладка 'Архивы' страницы архиватора.
С целью упрощения задачи назначения архивов для атрибутов параметров на странице конфигурации параметра была добавлена вкладка 'Архивирование' (рис.16). На этой вкладке содержится список атрибутов с перечнем архиваторов в колонках. Простым выбором архиваторов можно назначать архивы для атрибутов.
5.4 Реализация хранилища на файловой системе (ModVArch, ModVArchEl). Модуль BaseArh — Выполнено
Для реализации архивирования на файловую систему предъявляются следующие требования:
быстрый (простой) доступ на добавление в архив и чтение из архива;
возможность изменения значений в существующем архиве (с целью заполнения дыр в дублированных системах);
цикличность (ограниченные размеры);
возможность сжатия методом упаковки последовательности одинаковых значений, сохраняющем возможность быстрого доступа (последовательная упаковка);
возможность упаковки устаревших данных стандартными архиваторами (gzip, bzip2 ...), с возможностью распаковки при обращении.
В соответствии с вышеизложенными требованиями, принято решение организации архивирования методом множественности файлов (для каждого источника). Цикличность архива производится на уровне файлов, т.е. создается новый файл а самый старый удаляется. Для быстрого сжатия используется метод притягивания к последнему одинаковому значению. Для этих целей в файле архива предусматривается битовая таблица упаковки размером один в один с количеством хранимых данных. Т.е. каждый бит соответствует одному значению в архиве. Значение бита указывает на наличие значения. Для потока одинаковых значений биты будут обнулены. В случае с архивом строк, таблица является не битовой а байтовой и содержит длину указанного значения. В случае поступления потока одинаковых значений длина будет нулевой и читаться будет первое одинаковое значение. Поскольку таблица байтовая, то архив сможет хранить строки длиной не более 255 символов. Таким образом, методики хранения, как и данные, можно разделить на данные фиксированного и не фиксированного размера. Общая структура файла архива приведена на рис. 17.
Рис. 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. Как можно видеть из рисунка, признак упаковки содержит длину (не фиксированные типы) или признак упаковки (фиксированные типы) отдельно взятого значения. Это значит, что для получения смещения нужного значения необходимо сложить длины всех предыдущих действительных значений. Выполнение данной операции каждый раз и для каждого значения является крайне накладной операцией. Поэтому, был внедрён механизм кеширования смещений значений. Механизм кеширует смещения значений через предопределённое их количество, а также кеширует смещение последнего значения к которому производился доступ (отдельно на запись и чтение).
Рис. 18. Механизм последовательной упаковки значений.
Изменения значений существующего архива заложено, и представляет собой вставку кадра значений в середину файла. За счёт оптимизации процесса вставки, путём использования пакетного механизма, данный процесс не является накладным для системы.
Наиболее устаревшие файлы архива пакуются стандартным архиватором gzip. При доступе к значениям такого архива, выполняется предварительная распаковка.
6 Тестирование архивирования значений.
Учитывая высокую распределённость разработки, в целом, и значительную сложность реализации отдельных узлов, требуется выполнение тестирования с написанием группы тестов для критических узлов.
Наиболее сложными, в реализации и проверке, узлами являются объект буфера значений (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 ошибок. Все обнаруженные ошибки были локализованы и устранены.