Автор: Роман Савоченко
Данный документ является руководством программы с открытыми исходными текстами именуемую "OpenSCADA". OpenSCADA представляет собой открытую SCADA систему, построенную по принципам модульности, многоплатформенности и масштабируемости.
В качестве политики разработки данной программы выбраны "open source" принципы. Выбор данной политики определяется необходимостью создания открытой, надёжной и общедоступной SCADA системы. Данная политика позволяет привлечь к разработке, тестированию, развитию, распространению и использованию программы значительное количество разработчиков, энтузиастов и других заинтересованных лиц с минимизацией и распределением усилий и финансовых затрат.
OpenSCADA предназначена для сбора, архивирования, визуализации информации, выдачи управляющих воздействий, а также других родственных операций, характерных для полнофункциональных SCADA систем. Благодаря высокому уровню абстракции и модульности программа может использоваться во многих смежных отраслях.
OpenSCADA может и применяться на/в:
В качестве основной операционной системы (программной платформы) для разработки и использования выбрана ОС Linux, которая является оптимальным решением в вопросах:
Поскольку проект разрабатывается и реализуется по принципам многоплатформенности то не составляет особой проблемы портировать его на другие операционные системы (программные платформы) и аппаратные платформы. Что запланировано на будущее и в значительной степени уже осуществлено для некоторых платформ.
Сердцем программы является модульное ядро. И в зависимости от того, какие модули подключены, программа может выступать как в роли различных серверов, так и в роли разнообразных клиентов, а также совмещать эти функции в одной программе. Это позволяет реализовывать клиент-серверную архитектуру на базе одних и тех же компонентов/модулей, экономя при этом машинную память, дисковое пространство, а также ценное время программистов.
Серверные конфигурации программы предназначены для выдачи управляющих воздействий, сбора, обработки, архивирования, протоколирования информации от различных источников, а также предоставления этой информации клиентам (UI, GUI, TUI ...). Модульная архитектура позволяет расширять функциональность сервера без его перегрузки.
Клиентские конфигурации могут строиться на основе различных графических библиотек (GUI/TUI ToolKits), как используя ядро программы и его модули (путём добавления к нему модуля пользовательского интерфейса), так и в качестве самостоятельного приложения, подключая ядро OpenSCADA как библиотеку.
Возможность гибкой конфигурации программы позволяет строить решения под конкретные требования надёжности, функциональности и размеры-сложность программы.
Для придания гибкости и высокой степени масштабируемости OpenSCADA построена по модульному принципу. Тесная интеграция модулей с ядром улучшает стабильность програми в целом, благодаря повторному использованию отлаженного кода. Однако сам процесс разработки собственного кода модулей OpenSCADA накладывает большую ответственность — возможные ошибки вводят элемент нестабильности в программу. Возможность создания распределённых конфигураций сглаживает эту опасность.
Модули OpenSCADA хранятся в динамических библиотеках. Каждая динамическая библиотека может содержать множество модулей различного типа. Наполнение динамических библиотек модулями определяется функциональной связностью самих модулей. Динамические библиотеки допускают горячую замену, что позволяет производить обновление отдельных частей программы в процессе функционирования. Метод хранения кода модулей в динамических библиотеках является основным для OpenSCADA, поскольку поддерживается практически всеми современными операционными системами(ОС). Однако это не исключает возможности разработки других методов хранения кода модулей.
На основе модулей реализованы следующие функциональные части OpenSCADA:
Управление модулями осуществляется подсистемой "Планировщик модулей". Функциями подсистемы является: подключение, отключение, обновление и другие операции, связанные с модулями и библиотеками модулей.
Архитектурно OpenSCADA делится на подсистемы. Подсистемы могут быть двух типов: обычные и модульные. Модульные подсистемы обладают свойством расширения посредством модулей. Каждая модульная подсистема может содержать множество модульных объектов. Например, модульная подсистема "Базы данных" содержит модульные объекты типов баз данных. Модульный объект является корнем внутри модуля.
Всего OpenSCADA содержит девять подсистем, из них семь являются модульными. Эти девять подсистем OpenSCADA являются базовыми и присутствуют в любой конфигурации. К списку девяти подсистем могут добавляться новые, посредством самих модулей. Подсистемы OpenSCADA:
Подсистема "Сбор данных" (Рис. 1.3) предусмотрена для предоставления поддержки источников динамических данных, будь то: ПЛК, платы УСО, виртуальные источники и другое. В функции этой подсистемы входит предоставление полученных данных в структурированном виде и обеспечение управления этими данными, например — модификация данных.
Подсистема "Сбор данных" является модульной и, как следствие, содержит модульные объекты типов источников динамических данных. Например, OpenSCADA сейчас предоставляет более чем двадцать модулей и библиотечных элементов источников логических типов. Наиболее значимые и проработанные с которых:
Каждый тип источника нелогического типа реализуется в отдельном модуле, который может содержать множество источников (объектов контроллеров) и каждый этот источник обычно выполняется в отдельном потоке-задаче.
Отдельно взятый объект контроллера может содержать параметры определённых модулем типов. Например, параметры аналогового типа, основной информацией которых являются значения целого или реального типа. Структурно параметр представляет собой перечень атрибутов, которые и содержат данные. Атрибуты могут быть пяти базовых типов: логический, целый, реальный, символьная строка(текст) и объект. Структуры объектов контроллеров, параметров и их типов содержатся в подсистеме "Сбор данных", а объекты модулей осуществляют их наполнение согласно собственной специфики.
Отдельные типы источников данных сами могут продуцировать данные как полностью их генерируя, так и обрабатывая физические данные и даже полностью реализуя получение этих данных в окружении OpenSCADA и на её внутреннем языке. Такие источники данных называются логическими. Полностью логические источники данных представлены модулями: LogicLev и BlockCalc. Существует ряд модулей, которые объединяют в себе логические данные как результат непосредственной обработки физических: ModBus и Siemens.
Источники динамических данных могут быть удалёнными, т.е. формироваться или получаться на удалённой станции OpenSCADA. Для связи с такими источниками данных используется модуль шлюзования DAQGate. Функцией этого типа источников данных является отражение источников данных удалённой OpenSCADA станции на локальную.
Детально ознакомиться с ключевой подсистемой "Сбор данных" и её функциями Вы можете в отдельном документе "Сбор данных в OpenSCADA".
Для хранения данных программы повсеместно используются базы данных (БД). С целью унификации доступа и управления базами данных в OpenSCADA предусмотрена подсистема "Базы данных" (Рис. 1.4). Для обеспечения поддержки различных БД/СУБД подсистема выполнена модульной.
В роли модульного объекта, который содержится в подсистеме, выступает тип БД/СУБД, т.е. модуль подсистемы "Базы данных" практически содержит реализацию доступа к определённому типу БД. OpenSCADA предоставляет следующие наиболее значительные и проработанные модули: SQLite, MySQL, PostgreSQL, FireBird.
Тип БД/СУБД в свою очередь содержит перечень объектов отдельных БД этого типа, а объект БД содержит перечень объектов таблиц, которые и содержат данные в табличном виде.
Практически все данные OpenSCADA хранятся в той или иной БД. Инструментарий программы позволяет легко переносить данные из одного типа БД в другой, и, как следствие, оптимально подбирать тип БД под конкретную область применения OpenSCADA. Перенос информации с одной БД в другую может быть выполнен двумя способами. Первый — это изменение адреса рабочей БД и сохранение всей конфигурации программы на неё, второй — это прямое копирование информации между БД. Кроме копирования поддерживается и функция прямого редактирования содержимого таблиц БД.
Для организации централизованного доступа распределённой программы к единой БД предусматривается два способа. Первый это использование сетевых СУБД, например — MySQL. Второй способ это использование транспортного типа БД на локальных станциях, для доступа к единой центральной БД другой OpenSCADA станции, через пересылку запросов к БД на этой удалённой станции — не реализовано ещё в OpenSCADA.
Данные могут храниться также в конфигурационном файле программы. Реализован механизм полного отражения структуры БД на структуру конфигурационного файла. Т.е. стандартную конфигурацию можно размещать в конфигурационном файле. Смысл такого механизма состоит в том, что типовые (по умолчанию) данные программы можно описывать в конфигурационном файле, например — при старте без БД. Далее эти данные могут переопределяться в БД. Кроме того, для случаев невозможности запуска какой нибудь БД вообще, можно все данные хранить в конфигурационном файле.
Для доступа к базам данных используется механизм регистрации БД. Зарегистрированные в программе БД доступны всем подсистемам OpenSCADA и могут использоваться в их работе. Благодаря этому механизму можно обеспечить разделение хранения данных. Например, различные библиотеки могут храниться и распространяться независимо, а подключения библиотеки будет заключаться в простой регистрации нужной БД.
Любая SCADA система должна предоставлять возможность архивации собранных данных, т.е. формирование истории изменения (динамики) процесса. Архивы условно можно разделить на два типа: архивы сообщений и архивы значений.
Особенностью архивов сообщений является архивация так называемых сообщений программы, а именно — ведение логов и протоколов. Характерной особенностью сообщения является время его возникновения. В зависимости от источника сообщения могут классифицироваться по различным критериям. Например, это могут быть протоколы аварийных ситуаций, протоколы действий операторов, протоколы отказов связи и другое.
Особенностью архивов значений является их периодичность, которая определяется промежутком времени между двумя смежными значениями. Архивы значений применяются для архивирования истории непрерывных процессов. Поскольку процесс непрерывный то и архивировать его можно только путём введения понятия квантования опроса значений, иначе мы получим архивы бесконечных размеров, в соответствии с непрерывностью самой природы процесса. Кроме того, практически мы можем получить значения с периодом ограниченным самими источниками данных. Например, довольно качественные источники данных в промышленности редко позволяют получать данные с частотой более 1 кГц, и это без учёта самих датчиков которые имеют менее качественные частотные характеристики.
Для решения задач архивирования потоков данных в OpenSCADA предусмотрена подсистема "Архивы-История" (Рис. 1.5), которая является модульной и позволяет вести архивы сообщений и значений. Модульным объектом, который содержится в подсистеме "Архивы-История", выступает тип архиватора. Тип архиватора определяет способ хранения данных т.е. хранилище — файловая система, СУБД. Каждый модуль подсистемы "Архивы-История" соответственно может реализовывать архивирование сообщений и значений, а сама подсистема может содержать множество архивов, которые обслуживаются различными модулями.
Сообщения в OpenSCADA характеризуются датой, уровнем важности, категорией и непосредственно текстом сообщения. Дата сообщения соответственно указывает на дату и время его создания. Уровень важности указывает на степень важности сообщения. Категория определяет адрес или условный идентификатор-ключ источника сообщения. Часто категория содержит полный путь к источнику сообщения в программе. Текст сообщения соответственно и несет главную смысловую нагрузку сообщения.
В процессе архивирования сообщения пропускаются через фильтр, который работает по уровню важности и категории сообщений. Уровень сообщений в фильтре указывает на то, что нужно пропускать сообщения с указанным или высшим уровнем важности. Для фильтрации по категории применяются шаблоны или регулярные выражения, которые определяют какие сообщения пропускать. Каждый архиватор содержит собственные настройки фильтра, соответственно можно легко создавать различные специализированные архиваторы для архива сообщений. Например, архиваторы сообщений можно направить на:
Ввиду схожести природы сообщений и нарушений подсистема "Архивы-История" содержит буфер текущий нарушений, который содержит активные на текущее время нарушения с категорией сообщения в роли ключа-идентификатора нарушения. Доступ к перечню-буферу текущих нарушений осуществляется путём указания отрицательного значения уровня сообщений. Так, формирование сообщений с отрицательным уровнем -2 вызывает помещение этого сообщений в буфер активных нарушений с уровнем 2, а также дублирование его непосредственно в архиве сообщений (буфере общих сообщений). При формировании сообщения в такой-же категории, но с положительным уровнем — скажем 1, будет осуществлено удаление указанного нарушения из буфера нарушений, а само сообщений также попадёт в архив сообщений (буфер общих сообщений). Такой механизм позволяет одновременной вести учёт активных нарушений и протоколировать их прохождение в архиве сообщений. При запросе к архиву сообщений, указание положительного уровня осуществляет запрос к архиву сообщений (через общий буфер сообщений), а отрицательного к буферу-перечню текущих нарушений.
Архивы значений в OpenSCADA выступают как независимые компоненты, которые включают буферы, обрабатываемые архиваторами. Основным параметром архивов значений является источник данных, в роли которого могут выступать атрибуты параметров подсистемы "Сбор Данных", а также другие внешние источники данных (пассивный режим). Другими источниками данных могут быть сетевые архиваторы удалённых станций OpenSCADA, среда программирования OpenSCADA и другое.
Ключевым компонентом архивирования значений непрерывных процессов является буфер значений, который предназначен для промежуточного хранения массива значений, полученного с указанной периодичностью (квантом времени). Буфер значений используется для непосредственного хранения больших массивов значений в архивах значений как перед непосредственным "сбросом" на физический носитель, так и для манипуляций с кадрами значений, т.е. в функциях покадрового запроса значений и их помещения в буфере архивов.
Для организации удалённых архиваторов в распределённых конфигурациях используется транспортный тип архиватора, на данный момент не реализовано в OpenSCADA. Функцией транспортного типа архиваторов является отражение удалённого центрального архиватора OpenSCADA в локальной конфигурации. Как следствие, архиваторы транспортного типа выполняют передачу данных между локальной конфигурацией и архиватором удаленной конфигурации программы, скрывая от подсистем локальной конфигурации реальную природу архиватора.
Поскольку OpenSCADA является высоко-масштабируемой то поддержка коммуникаций должна быть достаточно гибкой, для чего она реализована в подсистемах "Транспорты" и "Транспортные протоколы" (Рис. 1.6), которые являются модульными.
Подсистема "Транспорты" предназначена для обеспечения обмена неструктурированными данными между OpenSCADA и внешними системами, в роли которых также могут выступать удалённые станции OpenSCADA. Под неструктурированными данными подразумевается поток символов определённой длины. Модульным объектом, который содержится в подсистеме "Транспорты", выступает тип транспорта, который и определяет механизм передачи неструктурированных данных. Например, это могут быть и есть:
Подсистема "Транспорты" включает поддержку входных и выходных транспортов. Входные транспорты предназначены для обслуживания внешних запросов и отправки ответов. Выходные транспорты наоборот предназначены для отправки сообщений и ожидания ответов. Соответственно входные транспорты содержат конфигурацию локальной станции как сервера, а выходные транспорты содержат конфигурацию удалённого сервера. Такая специализация характерна для типового механизма "запрос-ответ", однако на данное время входные и выходные транспорты поддерживают независимую передачу и приём данных. Модули подсистемы "Транспорты" реализуют поддержку как входных, так и выходных транспортов.
Подсистема "Транспортные протоколы" предназначена для структуризации данных, полученных от подсистемы "Транспорты", является продолжением подсистемы "Транспорты" и осуществляет функции проверки структуры и целостности полученных данных. Для указания протокола вмести с которым должен работать транспорт предусмотрено специальное конфигурационное поле. Модульным объектом, который содержится в подсистеме "Протоколы", является сам протокол. Например, транспортными протоколами могут быть и есть:
Полную последовательность сеанса входной связи для типовых протоколов режима "запрос-ответ" можно записать следующим образом:
Протоколы также поддерживаются для выходных транспортов и берут на себя функцию общения с транспортом и реализацию особенностей этих протоколов, при подготовке данных к передаче и разборе ответов. Внешний интерфейс доступа к протоколам, из кода других модулей и окружения программирования OpenSCADA, реализуется в XML дереве с собственной структурой для каждого протокольного модуля. Такой механизм позволяет выполнять прозрачный доступ к внешним системам, посредством транспортов, просто указывая имя протокола с помощью которого обслуживать передачу.
Благодаря стандартному доступу (API) к транспортам в OpenSCADA можно легко менять способ обмена данными не затрагивая самих программ, которые обмениваются. Например, в случае локального обмена можно использовать более быстрый транспорт на основе UNIX-сокетов или разделяемой памяти, а в случае обмена через интернет и локальную сеть использовать TCP или UDP сокеты.
SCADA-системы, как класс, предусматривают наличие интерфейсов пользователя. В OpenSCADA для предоставления пользовательских интерфейсов предусмотрена подсистема "Пользовательские интерфейсы" под которой предусматривается не только среда визуализации, с которой должен работать конечный пользователя, но и всё, что имеет отношение к пользователю, например:
Подсистема "Пользовательские интерфейсы" является модульной и её модульным объектом выступает собственно конкретный интерфейс пользователя. Модульность подсистемы позволяет создавать различные интерфейсы пользователя на разных GUI/TUI библиотеках и использовать наиболее оптимальное решения в конкретно взятом случае, например, для среды исполнения программируемых логических контроллеров можно использовать конфигураторы и визуализаторы на основе Web-технологий (WebCfg, WebCfgD, WebVision, WebUser), а в случае стационарных рабочих станций использовать те-же конфигураторы и визуализаторы, но на основе библиотек вроде Qt (QTCfg, Vision).
OpenSCADA является разветвлённой программой, которая состоит из десятка подсистем и может включать множество модулей. Следовательно предоставление всем неограниченного доступа к этим ресурсам является как минимум неосторожным. Для разграничения доступа в OpenSCADA предусмотрена подсистема "Безопасность" основными функциями которой является:
OpenSCADA построена по модульному принципу, что предусматривает наличие множества модулей, которые нужно контролировать и планировать доступность, для чего предусмотрена подсистема "Планировщик модулей". Все модули на данное время предоставляются в программу посредством разделяемых библиотек(контейнеров) или встраиваются прямо в библиотеку ядра OpenSCADA. Каждый контейнер может содержать множество модулей различного типа согласно их логической связности.
Подсистема "Планировщик модулей" реализует контроль за состоянием контейнеров и позволяет осуществлять "горячее" добавление, удаление и обновление контейнеров и модулей, которые он содержит.
Очевидно, что невозможно предусмотреть все нужные функции и функции, которые могут понадобиться в будущем, поэтому в OpenSCADA предусмотрена подсистема "Специальные", которая является модульной и предназначена для добавления непредусмотренных функций путём модульного расширения. Например, с помощью этой подсистемы могут быть и реализованы:
Современная SCADA система должна содержать механизмы которые предоставляют возможность программирования на пользовательском уровне, т.е. — среду программирования пользователя. OpenSCADA содержит такое окружение и с его помощью можно реализовывать:
Среда программирования представляет собой комплекс средств, которые организуют вычислительное окружение пользователя в состав которого входят:
Модули библиотек функций предоставляют статические функции определённой направленности, которые расширяют объектную модель программы и представляют собой интерфейс доступа к средствам модуля на уровне пользователя. Например, "Среда Визуализации и Управления" может предоставлять функции для выдачи различных сообщений, используя которые пользователь может реализовывать интерактивные алгоритмы взаимодействия с программой. Библиотеки функций в целом могут реализовываться как набором функций фиксированного типа — статические, так и функциями, которые допускают свободную модификацию и дополнение — динамические.
Библиотеки функций свободного типа (динамические) предоставляют среду написания пользовательских функций на одном из языков программирования, на данный момент это язык похожий на Java, который реализуется модулем DAQ.JavaLikeCalc. Таким образом можно создавать библиотеки аппаратов технологических процессов и многих других, а далее использовать их путём связывания.
На основе функций, которые предоставляются объектной моделью, строятся объекты вычислительных контроллеров, которые осуществляют связывание функций с параметрами программы и механизмом вычисления. Также пишутся процедуры и протоколы сбора данных уровня пользователя, процедуры виджетов "Среды Визуализации и Управления" и много другого.
SCADA (Supervisory Control And Data Acquisition) в общем виде имеют распределённую архитектуру вроде изображённой на рисунке 2. Элементы SCADA систем, в смысле программного обеспечения, выполняют следующие функции:
Сервер сбора: представляет собой задачу или группу задач, занимающихся сбором данных из источников данных, или же сам выступает в роли источника данных. В задачи сервера входит:
Сервер архивирования-истории: представляет собой задачу или группу задач, занимающихся архивированием данных или ведением их истории. В задачи сервера входит:
Сервер протоколирования: представляет собой задачу или группу задач, занимающихся архивированием сообщений или ведением их истории. В задачи сервера входит:
Сервер сигнализации: представляет собой задачу или группу задач, выполняющих функции сервера протоколирования в отношении узкой категории сообщений сигнализации.
Рабочее место оператора: представляет собой постоянно функционирующее GUI(Grafical User Interface) приложение, выполненное в одномониторном, многомониторном или панельном режиме и выполняющее функции:
Рабочее место инженера: представляет собой GUI приложение, используемое для конфигурации SCADA систем. В задачи приложения входит:
Рабочее место руководителя: представляет собой GUI приложение, как правило выполненное в одномониторном режиме, выполняющее функции:
Рабочее место технолога: полностью включает в себя функции рабочего места оператора плюс модели технологических процессов (без непосредственной связи с технологическим процессом).
Рабочее место технолога-программиста: полностью включает в себя функции рабочего места технолога плюс инструментарий для создания моделей технологических процессов.
В простейшем случае OpenSCADA можно сконфигурировать в серверном режиме (рис. 3.1) для сбора и архивирования данных. Данная конфигурация позволяет выполнять следующие функции:
Для повышения надёжности и производительности OpenSСADA допускает множественное резервирование (рис. 3.2), при котором источники данных (контроллеры) и архивы-история одного экземпляра отражаются в другом. При использовании подобной конфигурации возможно распределение нагрузки опроса/вычисления по различным станциям. Данная конфигурация позволяет выполнять функции:
Частным случаем дублированного подключения является дублирование в рамках одного сервера (рис. 3.3), т.е. запуск нескольких станций на одной машине с перекрещиванием параметров. Целью данной конфигурации является повышение надёжности и отказоустойчивости конфигурации, путём резервирования ПО.
Для визуализации данных, содержащихся на сервере, хорошим решением является использование пользовательского WEB-интерфейса (рис. 3.4). Данное решение позволяет использовать стандартный WEB-браузер у клиента и следовательно является наиболее гибким, поскольку не привязано к одной платформе, т.е. является многоплатформенным. Однако это решение имеет существенные недостатки – это невысокая производительность и надёжность. В связи с этим рекомендуется использовать данный метод для визуализации некритичных данных или данных, имеющих резервный высоконадёжный способ визуализации. Например, хорошим решением будет использование этого метода у начальства промышленных установок, где всегда существует операторская с надёжным способом визуализации. Данная конфигурация позволяет выполнять следующие функции:
Для визуализации критических данных, а также в случае если требуется высокое качество и производительность, можно использовать визуализацию на основе OpenSCADA, сконфигурированной с GUI модулем (рис. 3.5). Данная конфигурация позволяет выполнять следующие функции:
Полнофункциональная клиент-серверная конфигурация на одной машине (рис. 3.6) может использоваться для повышения надёжности конфигурации в целом путём запуска клиента и сервера в разных процессах. Данная конфигурация позволяет без последствий для сервера останавливать клиент и выполнять с ним различные профилактические работы. Рекомендуется для использования на станциях оператора путём установки двух машин, совмещающих в себе станции оператора и резервированный сервер. Данная конфигурация позволяет выполнять следующие функции:
Смешанное подключение совмещает функции сервера и клиента (рис. 3.7). Может использоваться для тестовых, демонстрационных функций, а также для предоставления моделей и тренажёров технологических процессов как единое целое. В этом режиме могут выполняться следующие функции:
Данная конфигурация является одним из вариантов устойчивого-надёжного соединения (рис. 3.8). Устойчивость достигается путём распределения функций по:
Сервер опроса конфигурируется на основе OpenSCADA и представляет собой задачу или группу задач, занимающихся сбором данных — опросом контроллера или группы контроллеров одного типа. Полученные значения доступны центральному серверу через любой транспорт поддержка которого добавляется путём подключения соответствующего модуля транспорта. Для снижения частоты опроса и величины сетевого трафика, сервер опроса может оснащаться небольшим архивом значений. Конфигурация сервера опроса хранится в одной из доступных БД.
Центральный сервер архивирования и обслуживания клиентских запросов выполняет функцию централизованного сбора и обработки параметров серверов опроса и их значений. Доступ к серверам опроса выполняется посредством одного из доступных в OpenSCADA транспортов+протоколов (на примере это Sockets). Для предоставления единого интерфейса доступа к параметрам и контроллерам используется модуль DAQGate, который отражает данные серверов опроса на структуру локальных параметров сбора данных.
Для выполнения внутренних вычислений и дополнительного анализа параметров используются объекты вычислительных контроллеров.
Для разностороннего и глубокого архивирования используются различные модули архивов-истории.
Для доступа клиентов к серверу используются доступные у OpenSCADA сетевые транспорты, на примере — Sockets; и транспортные протоколы, на примере — протокол OpenSCADA "SelfSystem".
Конфигурация центрального сервера хранится в одной из доступных БД (на примере это сетевая СУБД MySQL).
Для предоставления пользовательского WEB-интерфейса используется модуль WebCfgD посредством транспортного протокола "HTTP".
Различные клиенты, в их числе АРМ и WEB-клиенты, выполняются на отдельных машинах в необходимом количестве. АРМ реализуется на основе OpenSCADA. В его функции входит опрос значений параметров из центрального сервера и их визуализация на GUI интерфейсе(ах). Для получения параметров сбора данных в АРМ также используется модуль отражения удалённых параметров DAQGate. Для предоставления доступа к архивам-истории может использоваться модуль архива сетевого типа. Конфигурация АРМ может храниться в одной из доступных БД (в примере это сетевая СУБД MySQL, расположенная на машине центрального сервера архивирования).
Как можно видеть в разделе выше, OpenSCADA предоставляет возможность конфигурации для исполнения в различных ролях. Поддержка этой возможности обеспечивается развитыми механизмами конфигурации и хранения конфигурационных данных. Данный раздел содержит описание этих механизмов, призванное дать представление о гибкости и разнообразии, позволив тем самым использовать OpenSCADA на 100%.
При описании механизмов конфигурации и способов её хранения в этом разделе будет делаться упор на общесистемные механизмы. Особенности конфигурации и использования модулей подсистем OpenSCADA предоставляются в собственной документации этих модулей.
В OpenSCADA используется формализованный подход к описанию конфигурационных интерфейсов, основанный на языке XML. Фактически особенности конфигурации компонента программы предоставляется самим компонентом, пронизывая тем самым всю программу, как нервная система организма. В терминах OpenSCADA это называется интерфейсом контроля OpenSCADA (Control interface). На основе интерфейса контроля формируются графические интерфейсы конфигурации пользователя посредством модулей OpenSCADA. Такой подход имеет следующие важные преимущества:
В OpenSCADA уже предоставляется три модуля конфигурации на разной основе визуализации. Отметим их и их возможности конфигурации:
Значения конфигурации, изменённые в конфигураторах, а также большинство данных сохраняются в базах данных (БД). Учитывая модульность подсистемы "БД", ими могут быть различные БД. Причём предоставляется возможность хранения различных частей OpenSCADA как в разных БД одного типа, так и в БД разных типов.
Кроме БД данные о конфигурации могут содержаться в конфигурационном файле OpenSCADA, а также передаваться посредством параметров командной строки при вызове OpenSCADA. Сохранение конфигурации в конфигурационном файле осуществляется наравне с БД. Типовым именем конфигурационного файла OpenSCADA является /etc/oscada.xml. Формат конфигурационного файла и параметры командной строки рассмотрим в отдельном разделе.
Изменение конфигурации того или иного узла устанавливает флаг модификации соответствующего узла, а также активирует кнопки "Загрузить из БД", для загрузки первоначальной конфигурации, и "Сохранить в БД" для сохранения изменений. Признак модификации также поднимается к родительскому узлу, что позволяет осуществлять восстановление-сохранение от корневого узла, хотя реально, при операциях с БД, будут участвовать только модифицированные узлы.
Удаление узла приводит к непосредственному удалению его из хранилища-БД и механизм модификации на эту операцию не распространяется.
Многие настройки и конфигурация объектов OpenSCADA, которые исполняются или уже включены, не применяются сразу-же по внесению изменений, поскольку конфигурация читается/применяется обычно только при включении или запуске. Следовательно для применения изменений, в таких случаях, достаточно включить/выключить включенный объект или перезапустить исполняющийся — остановить/запустить. На данный момент большинство настроек, не предусматривающих непосредственного применения, просто недоступны для редактирования.
Дальнейшее рассмотрение конфигурации OpenSCADA будет производиться на основе интерфейса конфигуратора UI.QTCfg, однако принципы работы будут полностью соответствовать и остальным конфигураторам, благодаря общности в используемом интерфейсе контроля OpenSCADA.
Рассмотрение начнём с конфигурации системных параметров OpenSCADA, которая размещается в шести вкладках корневой страницы станции:
Для модификации полей этой страницы могут потребоваться права привилегированного пользователя. Получить такие права можно, включив вашего пользователя в группу суперпользователя "root", или, войдя на станцию от имени суперпользователя "root".
Нужно отметить ещё один важный момент! Поля идентификаторов всех объектов OpenSCADA недопустимы для прямого редактирования, поскольку являются ключом для хранения данных объектов в БД. Однако поменять идентификатор объекта можно с помощью команды переноса и последующей вставки объекта (Cut->Paste) в конфигураторе.
Задача обслуживания механизма резервирования запускается всегда и исполняется с периодичностью, установленной в соответствующем конфигурационном поле. Реальная работа по осуществлению резервирования осуществляется при наличии хотя бы одной резервной станции в списке станций и предполагает:
Рекомендуется резервирование настраивать таким образом чтобы БД резервных станций сохранялись одинаковыми, что в дальнейшем позволит безболезненно копировать их при восстановлении на любую станцию и соответственно в резервной копии можно хранить только один набор БД. При этом настройки, специфичные для отдельной станции, будут сохраняться в конфигурационном файле и можно будет легко конфигурировать и менять нужную станцию выбором соответствующего конфигурационного файла.
Настройка резервирования начинается с добавления резервных станций в список станций OpenSCADA на вкладке "Подсистема" подсистемы "Транспорты" (рис.4.3b). Причём добавлять тут нужно не только резервные станции к текущей, но и саму эту текущую станцию с её внешним адресом, т.е. своеобразная петля. В дальнейшем эти настройки будут сохранены в общую БД резервированной системы, а сама БД с этого момента будет использоваться при создании всех резервных станций. Соответственно важно на этом этапе внести все нужные изменения в общую БД вокруг проекта в целом!
Далее на конкретной станции, с копией общей БД, настраиваем её специфические параметры во вкладке "Резервирование" главной страницы (рис.4c), которые будут сохранены в конфигурационном файле.
После этого вся конфигурация резервирования осуществляется во вкладке "Резервирование" соответствующей подсистемы, "Сбор данных" (рис.4.5b) или "Архивы" (рис.4.6b). Если установить параметр "Передача локальных первичных команд" (рис.4c) то эта конфигурация, как и любая другая конфигурация общего характера, может осуществляться на одной из станций, а внесённые изменения попадут и на все резервные, конечно если они будут доступны.
Для отладки различных особенностей работы OpenSCADA может потребоваться включение генерации дополнительных-отладочных сообщений, что осуществляется установкой минимального уровня сообщений, на вкладке "Станция", в "Отладка (0)". В результате этого появится вкладке "Отладка" (рис.4e) где доступны счётчики объектов для контроля за утечками, а также таблица с перечнем категорий поступающий отладочных сообщений. В таблице категорий можно выбрать только те источники отладочных сообщений, которые нужны, тем самым не перегружая подсистему вывода и архивирования сообщений, а так-же не понижая производительность системы в целом. Можно выбирать категории и высших уровней, вплоть до корневой категории системы, что выключит детальный выбор и включит генерацию всех сообщений по уровню или системе. Для изучения отладочных сообщений нужно перейти в подсистему "Архивы" (рис. 4.6c), для чего предусмотрена кнопка "Просмотр сообщений". Выбранный режим отладки и перечень категорий отладки может быть сохранён в конфигурационном файле стандартным образом и при следующем старте режим отладки активируется сразу, что важно в первую очередь для счётчиков объектов.
При рассмотрении страниц конфигурации модульных подсистем будут описаны общие для всех модулей свойства. Однако нужно отметить, что каждый модуль может предоставлять как дополнительные вкладки, так и отдельные поля для конфигурации собственных особенностей функционирования для страниц, объекты которых наследуются модулями. С особенностями и дополнениями модулей можно ознакомиться в отдельной документации на них.
Подсистема является модульной и содержит иерархию объектов, изображённую на рисунке 1.4. Для конфигурации подсистемы предусмотрена корневая страница подсистемы "БД", содержащая вкладку "Модули". Вкладка "Модули" (рис.4.1a) содержит список модулей подсистемы "БД", доступных на станции.
Для модификации полей страниц этой подсистемы могут потребоваться права привилегированного пользователя или включение вашего пользователя в группу "БД".
Каждый модуль подсистемы "БД" предоставляет конфигурационную страницу с вкладками "БД" и "Модуль". Вкладка "БД" (рис.4.1b) содержит список БД, зарегистрированных в модуле и флажок признака полного удаления БД при выполнении команды удаления. В контекстном меню списка БД предоставляется пользователю возможность добавления, удаления и перехода к нужной БД. Во вкладке "Модуль" содержится информация о модуле подсистемы "БД" (рис.4.1c):
Каждая БД содержит собственную страницу конфигурации с вкладками "База данных", "Таблицы" и "SQL", в случае поддержки SQL-запросов. Кроме основных операций можно выполнять копирование содержимого БД стандартной функцией копирования объектов в конфигураторе. Операция копирования содержимого БД подразумевает копирование исходной БД в БД назначения, при этом содержимое БД назначения не очищается перед операцией копирования. Копирование содержимого БД производится при условии включения обоих БД, иначе будет выполняться простое копирование объекта БД.
Вкладка "База данных" (рис.4.1d) содержит основные настройки БД в составе:
Вкладка "Таблицы" (рис.4.1e) содержит список открытых таблиц. При нормальной работе программы эта вкладка пуста, поскольку после завершения работы с таблицами программа их закрывает. Наличие открытых таблиц говорит о том, что программа сейчас с таблицами работает или таблицы открыты пользователем для изучения их содержимого. В контекстном меню перечня открытых таблиц можно открыть таблицу для изучения (команда "Добавить"), закрыть открытую страницу (команда "Удалить") и перейти к изучению содержимого таблицы.
Вкладка "SQL" (рис.4.1f) доступна только для баз данных, поддерживающих SQL-запросы, и содержит поле ввода запроса, кнопку отправки запроса и таблицу с результатом запроса. Для управления контекстом транзакции запроса предусмотрено отдельное конфигурационное поле.
Страница изучения содержимого таблицы содержит только одну вкладку "Таблица". Вкладка "Таблица" (рис.4.1g) содержит поле имени таблицы и таблицу с содержимым. Таблицей содержимого предоставляются функции:
Подсистема не является модульной. Для конфигурации подсистемы предусмотрена корневая страница подсистемы "Безопасность", содержащая вкладку "Пользователи и группы пользователей". Вкладка "Пользователи и группы пользователей" (рис.4.2a) содержит списки пользователей и групп пользователей. Пользователь в группе "Security" и с правами привилегированного пользователя может добавить, удалить пользователя или группу пользователей. Все остальные пользователи могут перейти к странице пользователя или группы пользователя.
Для конфигурации пользователя предоставляется страница, содержащая только вкладку "Пользователь" (рис.4.2b). Вкладка содержит конфигурационные данные профиля пользователя, которые может изменять сам пользователь, пользователь в группе "Security" или привилегированный пользователь:
Для конфигурации группы пользователей предоставляется страница, содержащая только вкладку "Группа" (рис.4.2c). Вкладка содержит конфигурационные данные профиля группы пользователей, которые может изменять только привилегированный пользователь:
Подсистема является модульной и содержит иерархию объектов, изображённую на рисунке 1.6. Для конфигурации подсистемы предусмотрена корневая страница подсистемы "Транспорты", содержащая вкладки "Подсистема" и "Модули".
Вкладка "Подсистема" (рис.4.3a) содержит таблицу конфигурации внешних, для данной, OpenSCADA станций. Внешние станции могут быть системными, пользовательскими или одновременно, что выбирается в соответствующей колонке. Системные внешние станции доступны только привилегированному пользователю и используются компонентами системного назначения, например, механизмом горизонтального резервирования и модулем DAQ.DAQGate. Пользовательские внешние станции привязаны к пользователю, который их создавал, а значит список пользовательских внешних станций индивидуален для каждого пользователя. Пользовательские внешние станции используются компонентами графического интерфейса, например: UI.QTCfg, UI.WebCfgD и UI.Vision. В таблице внешних станций возможно добавление и удаление записей про станцию, а также их модификация. Каждая запись содержит поля:
Вкладка "Модули" (рис.4.1b) содержит список модулей подсистемы "Транспорты" и идентична для всех модульных подсистем.
Каждый модуль подсистемы "Транспорты" предоставляет конфигурационную страницу с вкладками "Транспорты" и "Модуль". Вкладка "Транспорты" (рис.4.3b) содержит список входящих и исходящих транспортов, зарегистрированных в модуле. В контекстном меню списков транспортов пользователю предоставляется возможность добавления, удаления и перехода к нужному транспорту. Во вкладке "Модуль" содержится информация о модуле подсистемы "Транспорты" (рис.4.1c), состав которой идентичен для всех модулей.
Каждый транспорт содержит собственную страницу конфигурации с одной вкладкой "Транспорт". Эта вкладка содержит основные настройки транспорта. Входящий транспорт (рис.4.3c) содержит:
Исходящий транспорт (рис.4.3d) содержит:
Исходящий транспорт, в дополнение, предоставляет вкладку формирования пользовательского запроса через данный транспорт (рис.4.3e). Вкладка предназначена для наладки связи, а также для отладки протоколов и содержит:
Входной и выходной транспорты также содержат вкладку "Лог ВВ" (Рис.4.3f). Вкладка предоставляется для общего контроля, наблюдения и изучения трафика через транспорты и включает поле длины лога и саму текстовую область лога. Для отключения лога Вы можете поле длины лога установить в нуль.
Подсистема является модульной. Для конфигурации подсистемы предусмотрена корневая страница подсистемы "Транспортные протоколы", содержащая вкладку "Модули". Вкладка "Модули" (рис.4.1b) содержит список модулей подсистемы "Транспортные протоколы" и идентична для всех модульных подсистем.
Каждый модуль подсистемы "Транспортные протоколы" предоставляет конфигурационную страницу с одной вкладкой "Модуль". Во вкладке "Модуль" содержится информация о модуле подсистемы "Транспортные протоколы" (рис.4.1d), состав которой идентичен для всех модулей.
Подсистема является модульной и содержит иерархию объектов, изображённую на рисунке 1.3. Для конфигурации подсистемы предусмотрена корневая страница подсистемы "Сбор данных", содержащая вкладки "Резервирование", "Библиотеки шаблонов" и "Модули".
Для получения доступа на модификацию объектов этой подсистемы необходимы права пользователя в группе "DAQ" или права привилегированного пользователя.
Объектом резервирования подсистемы "Сбор Данных" выступает объект контроллера в рамках которого резервирование данных выполняет функции:
Вкладка "Резервирование" (рис.4.5a) доступна только если в резерве указана хотя-бы одна станция и содержит конфигурацию резервирования источников данных подсистемы "Сбор данных", в составе настроек:
Вкладка "Библиотеки шаблонов" (рис.4.5b) содержит список библиотек шаблонов для параметров этой подсистемы. В контекстном меню списка библиотек шаблонов пользователю предоставляется возможность добавления, удаления и перехода к нужной библиотеке. Вкладка "Модули" (рис.4.1b) содержит список модулей подсистемы "Транспорты" и идентична для всех модульных подсистем.
Каждая библиотека шаблонов подсистемы "Сбор данных" предоставляет конфигурационную страницу с вкладками "Библиотека" и "Шаблоны параметров". Вкладка "Библиотека" (рис.4.5d) содержит основные настройки библиотеки в составе:
Вкладка "Шаблоны параметров" (рис.4.5d) содержит список шаблонов в библиотеке. В контекстном меню списка пользователю предоставляется возможность добавления, удаления и перехода к нужному шаблону.
Каждый шаблон библиотеки шаблонов предоставляет конфигурационную страницу с вкладками "Шаблон" и "IO". Вкладка "Шаблон" (рис.4.5e) содержит основные настройки шаблона в составе:
Вкладка "IO" (рис.4.5f) содержит конфигурацию атрибутов (IO) шаблонов и программу шаблона на одном из языков пользовательского программирования OpenSCADA, например, DAQ.JavaLikeCalc.JavaScript. В таблицу атрибутов шаблона пользователь может, посредством контекстного меню, добавить, вставить, удалить, передвинуть вверх или вниз запись атрибута, а также отредактировать поля атрибута:
С синтаксисом языка программы шаблона можно ознакомиться в документации модуля, предоставляющего интерпретатор выбранного языка. Например, типичным языком пользовательского программирования OpenSCADA является DAQ.JavaLikeCalc.JavaScript.
Каждый модуль подсистемы "Сбор данных" предоставляет конфигурационную страницу с вкладками "Контроллеры" и "Модуль". Вкладка "Контроллеры" (рис.4.5g) содержит список контроллеров, зарегистрированных в модуле. В контекстном меню списка пользователю предоставляется возможность добавления, удаления и перехода к нужному контроллеру. Во вкладке "Модуль" содержится информация о модуле подсистемы "Сбор данных" (рис.4.1d), состав которой идентичен для всех модулей.
Каждый контроллер содержит собственную страницу конфигурации с вкладками "Контроллер", "Параметры" и "Диагностика".
Вкладка "Контроллер" (рис.4.5h) содержит основные настройки. Состав этих настроек может несколько отличаться от одного модуля этой подсистемы к другому, о чём можно узнать в собственной документации модулей. В качестве примера рассмотрим настройки контроллера у модуля контроллера логического уровня DAQ.LogicLev:
Вкладка "Параметры" (рис.4.5i) содержит список параметров в контроллере, выбор типа параметров, создаваемых по умолчанию, а также информацию об общем количестве и количестве включенных параметров. В контекстном меню, списка параметров, пользователю предоставляется возможность добавления, удаления и перехода к нужному параметру.
Вкладка "Диагностика" (рис.4.5j) содержит форму диагностических сообщений источника данных. Поскольку многие источники данных представляют собой внешние устройства с доступом к данным посредством сетевого обмена или системной шины то возможны различные нештатные ситуации при доступе к данным. Вывод всех их в поле "Статус", объекта контроллера, невозможен поскольку он отображает только текущее состояние доступа к данным. С помощью диагностики можно проследить все нештатные ситуации в виде сообщений, сформированных данным объектом контроллера за указанный промежуток времени и с выбранным уровнем сообщения. Кроме непосредственно рабочей диагностической информации ряд модулей источников данных могут предоставлять здесь различные отладочные дампы обмена, на уровне сообщений "Отладка (0)".
Параметры контроллеров подсистемы "Сбор данных" предоставляют конфигурационную страницу с вкладками "Параметр", "Атрибуты", "Архивация" и "Конфигурация шаблона". Вкладка "Конфигурация шаблона" не является стандартной, а присутствует только в параметрах модулей подсистемы "Сбор данных", которые реализуют механизмы работы по шаблону в контексте источника данных, ими обслуживаемого, для логического типа. В данный обзор эта вкладка включена для обеспечения логической завершённости обзора конфигурации шаблонов параметров подсистемы "Сбор данных" как финальный этап — использования.
Вкладка "Параметр" (рис.4.5k) содержит основные настройки в составе:
Вкладка "Атрибуты" (рис.4.5l) содержит атрибуты параметра и их значения в соответствии с конфигурацией используемого шаблона и вычисления его программы.
Вкладка "Архивация" (рис.4.5m) содержит таблицу с атрибутами параметра в колонках, и архиваторами в строках. Пользователь имеет возможность установить архивацию нужного атрибута требуемым архиватором просто изменив ячейку на пересечении.
Вкладка "Конфигурация шаблона" (рис.4.5n) содержит конфигурационные поля в соответствии с шаблоном. В примере это групповая связь на внешний параметр. Эту связь можно установить, просто указав путь к параметру, если флаг "Показывать только атрибуты" не установлен, или же установить адреса атрибутов по отдельности, если флаг установлен. Знак "(+)", в конце адреса, сигнализирует об успешной линковке и присутствии целевого объекта.
Подсистема является модульной и содержит иерархию объектов, изображённую на рисунке 1.5. Для конфигурации подсистемы предусмотрена корневая страница подсистемы "Архивы", содержащая вкладки "Резервирование", "Архив сообщений", "Архивы значений" и "Модули".
Для получения доступа на модификацию объектов этой подсистемы необходимы права пользователя в группе "Archive" или права привилегированного пользователя.
Объектом резервирования подсистемы "Архивы" выступает объект архиватора сообщений в рамках которого резервирование данных выполняет функции:
Резервирование архиваторов значений не предоставляется прямо ввиду осуществления этого процесса через источники данных и подсистему сбора данных.
Вкладка "Резервирование" (рис.4.6a) доступна только если в резерве указана хотя-бы одна станция и содержит конфигурацию резервирования архиваторов сообщений подсистемы "Архивы", в составе настроек:
Вкладка "Архив сообщений" (рис.4.6b) содержит конфигурацию архива сообщений и форму запроса сообщений из архива.
Конфигурация архива сообщений представлена полями:
Форма запроса сообщений содержит конфигурационные поля запроса и таблицу результата. Конфигурационные поля запроса:
Таблица результата содержит строки сообщений с колонками:
Вкладка "Архивы значений" (рис.4.6c) содержит общую конфигурацию архивирования значений и список архивов значений. В контекстном меню списка значений пользователю предоставляется возможность добавления, удаления и перехода к нужному архиву. Общая конфигурация архивирования представлена полями:
Вкладка "Модули" (рис.4.1b) содержит список модулей подсистемы "Архивы" и идентична для всех модульных подсистем.
Архив значений подсистемы "Архивы" предоставляет конфигурационную страницу с вкладками "Архив", "Архиваторы" и "Значения".
Вкладка "Архив" (рис.4.6d) содержит основные настройки архива в составе:
Вкладка "Архиваторы" (рис.4.6e) содержит таблицу с конфигурацией процесса обработки данного архива доступными архиваторами. В строках расположены доступные архиваторы, а в колонках параметры:
Вкладка "Значения" (рис.4.6f) содержит запрос значений в архиве и результат в виде таблицы значений или изображения тренда. Запрос значений содержит поля:
Каждый модуль подсистемы "Архивы" предоставляет конфигурационную страницу с вкладками "Архиваторы" и "Модуль". Вкладка "Архиваторы" (рис.4.6g) содержит списки архиваторов сообщений и значений, зарегистрированных в модуле. В контекстном меню списков пользователю предоставляется возможность добавления, удаления и перехода к нужному контроллеру. Во вкладке "Модуль" содержится информация о модуле подсистемы "Архивы" (рис.4.1d), состав которой идентичен для всех модулей.
Архиваторы сообщений содержат собственную страницу конфигурации с вкладками "Архиватор" и "Сообщения".
Вкладка "Архиватор" (рис.4.6h) содержит основные настройки. Состав этих настроек может несколько отличаться от одного модуля этой подсистемы к другому о чём можно узнать в собственной документации модулей. В качестве примера рассмотрим настройки архиватора сообщений у модуля архива на файловую систему Arch.FSArch:
Вкладка "Сообщения" (рис.4.6i) содержит форму запроса сообщений из архива данного архиватора:
Таблица результата содержит строки сообщений с колонками:
Архиваторы значений содержат собственную страницу конфигурации с вкладками "Архиватор" и "Архивы".
Вкладка "Архиватор" (рис.4.6j) содержит основные настройки. Состав этих настроек может несколько отличаться от одного модуля этой подсистемы к другому, о чём можно узнать в собственной документации модулей. В качестве примера рассмотрим настройки архиватора значений у модуля архива на файловую систему Arch.FSArch:
Вкладка "Архивы" (рис.4.6k) содержит таблицу с информацией об архивах, обрабатываемых архиватором. В строках таблица содержит архивы, а в колонках информацию:
В случае с модулем Arch.FSArch в этой вкладке ещё содержится форма экспорта данных архиватора.
Подсистема является модульной. Для конфигурации подсистемы предусмотрена корневая страница подсистемы "Пользовательские интерфейсы", содержащая вкладку "Модули". Вкладка "Модули" (рис.4.1b) содержит список модулей подсистемы и идентична для всех модульных подсистем.
Каждый модуль подсистемы "Пользовательские интерфейсы" предоставляет конфигурационную страницу с вкладками "Пользовательский интерфейс" и "Модуль". Вкладка "Пользовательский интерфейс" (рис.4.7a) предоставляет параметр для контроля за состоянием "Выполняется" модуля, а также разделы конфигурации специализированные для модулей этой подсистемы. Во вкладке "Модуль" содержится информация о модуле подсистемы "Пользовательские интерфейсы" (рис.4.1d), состав которой идентичен для всех модулей.
Подсистема является модульной. Для конфигурации подсистемы предусмотрена корневая страница подсистемы "Специальные", содержащая вкладку "Модули". Вкладка "Модули" (рис.4.1b) содержит список модулей подсистемы и идентична для всех модульных подсистем.
Каждый модуль подсистемы "Специальные" предоставляет конфигурационную страницу с вкладками "Специальный модуль" и "Модуль". Вкладка "Специальный модуль" (рис.4.8a) предоставляет параметр для контроля за состоянием "Выполняется" модуля, а также разделы конфигурации специализированные для модулей этой подсистемы. Во вкладке "Модуль" содержится информация о модуле подсистемы "Специальные" (рис.4.1d), состав которой идентичен для всех модулей.
Подсистема не является модульной. Для конфигурации подсистемы предусмотрена страница подсистемы "Управление модулями", содержащая вкладку "Подсистема". Вкладка "Подсистема" (рис.4.9a) содержит основные настройки подсистемы. Состав вкладки "Подсистема":
Конфигурационный файл OpenSCADA предназначен для хранения системной и общей конфигурации OpenSCADA-станции. Только в конфигурационном файле и через параметры командной строки можно указать часть ключевых системных параметров станции, поэтому знакомство со структурой конфигурационного файла необходимо для специалистов развёртывающих решения на основе OpenSCADA.
Называться конфигурационный файл OpenSCADA может по разному, однако принято название oscada.xml и производные от него. Конфигурационный файл обычно указывается, при запуске станции, параметром командной строки "--config=/home/roman/roman/work/OScadaD/etc/oscada_demo.xml". Для удобства вызова создаются скрипты запуска станции с нужным конфигурационным файлом или используется менеджер проектов при запуске скрипта openscada_start. Например скрипт (openscada_demo) используется для вызова демонстрационной станции:
#!/bin/sh openscada --config=/etc/oscada_demo.xml $@
Если конфигурационный файл не указан то используется стандартный: /etc/oscada.xml.
Структурно конфигурационный файл организован на расширяемом языке разметки текста XML. Следовательно требуется жёсткое соблюдение правил синтаксиса XML. Пример образца типового конфигурационного файла OpenSCADA, с узлами конфигурации большинства компонентов OpenASCADA, приведен ниже:
<?xml version="1.0" encoding="UTF-8" ?>
<OpenSCADA>
<!--
This is the OpenSCADA configuration file.
-->
<station id="AGLKS">
<!--
Describe internal parameters for station.
The station is OpenSCADA program.
-->
<prm id="StName">AGLKS</prm>
<prm id="StName_ru">АГЛКС</prm>
<prm id="StName_uk">АГЛКС</prm>
<prm id="WorkDB">SQLite.GenDB</prm>
<prm id="LogTarget">10</prm>
<prm id="Lang2CodeBase">en</prm>
<prm id="SaveAtExit">0</prm>
<prm id="SavePeriod">0</prm>
<node id="sub_BD">
<prm id="SYSStPref">0</prm>
<tbl id="DB">
<fld ID="GenDB" TYPE="SQLite" NAME="Generic DB" NAME_ru="Основная БД" NAME_uk="Основна БД" ADDR="St.db" CODEPAGE="UTF-8"/>
</tbl>
</node>
<node id="sub_Security">
<!--
<tbl id="Security_user">
<fld
NAME="root"
DESCR="Super user"
DESCR_ru="Супер пользователь"
DESCR_uk="Супер користувач"
PASS="openscada"/>
<fld
NAME="user"
DESCR="System user"
DESCR_ru="Системный пользователь"
DESCR_uk="Системний користувач"
PASS=""/>
</tbl>
<tbl id="Security_grp">
<fld
NAME="root"
DESCR="Super users groups"
DESCR_ru="Группа суперпользователей"
DESCR_uk="Група суперкористувачів"
USERS="root;user"/>
</tbl>-->
</node>
<node id="sub_ModSched">
<prm id="ModAllow">*</prm>
<prm id="ModDeny"></prm>
<prm id="ChkPer">0</prm>
</node>
<node id="sub_Transport">
<!--
<tbl id="Transport_in">
<fld
ID="WEB_1"
MODULE="Sockets"
NAME="Generic WEB interface"
NAME_ru="Основной WEB интерфейс"
NAME_uk="Основний WEB інтерфейс"
DESCRIPT="Generic transport for WEB interface."
DESCRIPT_ru="Основной транспорт для WEB интерфейса."
DESCRIPT_uk="Основний транспорт для WEB інтерфейсу."
ADDR="TCP::10002:0"
PROT="HTTP"
START="1"/>
<fld
ID="WEB_2"
MODULE="Sockets"
NAME="Reserve WEB interface"
NAME_ru="Резервный WEB интерфейс"
NAME_uk="Резервний WEB інтерфейс"
DESCRIPT="Reserve transport for WEB interface."
DESCRIPT_ru="Резервный транспорт для WEB интерфейса."
DESCRIPT_uk="Резервний транспорт для WEB інтерфейсу."
ADDR="TCP::10004:0"
PROT="HTTP"
START="1"/>
</tbl>
<tbl id="Transport_out">
<fld
ID="testModBus"
MODULE="Sockets"
NAME="Test ModBus"
NAME_ru="Тест ModBus"
NAME_uk="Тест ModBus"
DESCRIPT="Data exchange by protocol ModBus test."
DESCRIPT_ru="Тест обмена по протоколу ModBus."
DESCRIPT_uk="Тест обміну за протоколом ModBus."
ADDR="TCP:localhost:10502"
START="1"/>
</tbl>-->
</node>
<node id="sub_DAQ">
<!--
<tbl id="tmplib">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" DB="tmplib_test2"/>
</tbl>
<tbl id="tmplib_test2">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk=""
PROGRAM="JavaLikeCalc.JavaScript
cnt=5*i;"/>
</tbl>
<tbl id="tmplib_test2_io">
<fld TMPL_ID="test2" ID="i" NAME="I" NAME_ru="I" NAME_uk="I" TYPE="4" FLAGS="160" VALUE="" POS="0"/>
<fld TMPL_ID="test2" ID="cnt" NAME="Cnt" NAME_ru="Cnt" NAME_uk="Cnt" TYPE="4" FLAGS="32" VALUE="" POS="0"/>
</tbl>-->
<node id="mod_LogicLev">
<!--
<tbl id="DAQ">
<fld
ID="test2"
NAME="Test 2"
NAME_ru="Тест 2"
NAME_uk="Тест 2"
DESCR=""
DESCR_ru=""
DESCR_uk=""
ENABLE="1"
START="1"
PRM_BD="test2prm"
PERIOD="1000"
PRIOR="0"/>
</tbl>
<tbl id="test2prm">
<fld SHIFR="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk=""
EN="1" MODE="2" PRM="test2.test2"/>
</tbl>-->
</node>
<node id="mod_System">
<!--
<tbl id="DAQ">
<fld
ID="DataOS"
NAME="Data OS"
NAME_ru="Даные ОС"
NAME_uk="Дані ОС"
DESCR="Data of services and subsystems OS."
DESCR_ru="Данные сервисов и подсистем ОС."
DESCR_uk="Дані сервісів та підсистем ОС."
ENABLE="1"
START="1"
AUTO_FILL="0"
PRM_BD="DataOSprm"
PERIOD="1000"
PRIOR="0"/>
</tbl>
<tbl id="DataOSprm">
<fld SHIFR="CPU" NAME="CPU load" NAME_ru="Нагрузка CPU" NAME_uk="Навантаження CPU" DESCR="" DESCR_ru="" DESCR_uk=""
EN="1" TYPE="CPU" SUBT="gen"/>
<fld SHIFR="MEM" NAME="Memory" NAME_ru="Память" NAME_uk="Пам'ять" DESCR="" DESCR_ru="" DESCR_uk="" EN="1" TYPE="MEM"/>
</tbl>
-->
</node>
<node id="mod_DiamondBoards">
<!--
<tbl id="DAQ">
<fld ID="Athena" NAME="Athena board" NAME_ru="Плата Athena" NAME_uk="Плата Athena" DESCR="" DESCR_ru="" DESCR_uk=""
ENABLE="1" START="0" BOARD="25" PRM_BD_A="AthenaAnPrm" PRM_BD_D="AthenaDigPrm" ADDR="640" INT="5"
DIO_CFG="0" ADMODE="0" ADRANGE="0" ADPOLAR="0" ADGAIN="0" ADCONVRATE="1000"/>
</tbl>
<tbl id="AthenaAnPrm">
<fld SHIFR="ai0" NAME="AI 0" NAME_ru="AI 0" NAME_uk="AI 0" DESCR="" DESCR_ru="" DESCR_uk="" EN="0" TYPE="0" CNL="0" GAIN="0"/>
</tbl>
<tbl id="AthenaDigPrm">
<fld SHIFR="di0" NAME="DI 0" NAME_ru="DI 0" NAME_uk="DI 0" DESCR="" DESCR_ru="" DESCR_uk="" EN="0" TYPE="0" PORT="0" CNL="0"/>
</tbl>
-->
</node>
<node id="mod_BlockCalc">
<!--
<tbl id="DAQ">
<fld ID="Model" NAME="Model" NAME_ru="Модель" NAME_uk="Модель" DESCR="" DESCR_ru="" DESCR_uk=""
ENABLE="1" START="1" PRM_BD="Model_prm" BLOCK_SH="Model_blcks" PERIOD="1000" PRIOR="0" PER_DB="0" ITER="1"/>
</tbl>
<tbl id="Model_blcks">
<fld ID="Klap" NAME="Klapan" NAME_ru="Клапан" NAME_uk="Клапан" DESCR="" DESCR_ru="" DESCR_uk=""
FUNC="DAQ.JavaLikeCalc.lib_techApp.klap" EN="1" PROC="1"/>
</tbl>
<tbl id="Model_blcks_io">
<fld BLK_ID="Klap" ID="l_kl1" TLNK="0" LNK="" VAL="50"/>
<fld BLK_ID="Klap" ID="l_kl2" TLNK="0" LNK="" VAL="20"/>
</tbl>
<tbl id="Model_prm">
<fld SHIFR="l_kl" NAME="Klap lev" NAME_ru="Полож. клапана" NAME_uk="Полож. клапана" DESCR="" DESCR_ru="" DESCR_uk=""
EN="1" IO="Klap.l_kl1"/>
</tbl>
-->
</node>
<node id="mod_JavaLikeCalc">
<!--
<tbl id="DAQ">
<fld ID="CalcTest" NAME="Calc Test" NAME_ru="Тест вычисл." NAME_uk="Тест обчисл." DESCR="" DESCR_ru="" DESCR_uk=""
ENABLE="1" START="1" PRM_BD="CalcTest_prm" FUNC="TemplFunc.d_alarm" SCHEDULE="1" PRIOR="0" ITER="1"/>
</tbl>
<tbl id="CalcTest_val">
<fld ID="in" VAL="0"/>
<fld ID="alrm" VAL=""/>
<fld ID="alrm_md" VAL="1"/>
<fld ID="alrm_mess" VAL="Error present."/>
</tbl>
<tbl id="CalcTest_prm">
<fld SHIFR="alrm" NAME="Alarm" NAME_ru="Авария" NAME_uk="Аварія" DESCR="" DESCR_ru="" DESCR_uk="" EN="1" FLD="alrm"/>
</tbl>
<tbl id="lib">
<fld ID="TemplFunc" NAME="" NAME_ru="" NAME_uk="" DESCR="" ESCR_ru="" DESCR_uk="" DB="lib_TemplFunc"/>
</tbl>
<tbl id="lib_TemplFunc">
<fld ID="d_alarm" NAME="Digit alarm" NAME_ru="Авария по дискр." NAME_uk="Аварія за дискр" DESCR=""
FORMULA="alrm=(in==alrm_md)?"1:"+alrm_mess:"0";"/>
</tbl>
<tbl id="lib_TemplFunc_io">
<fld F_ID="d_alarm" ID="in" NAME="Input" NAME_ru="Вход" NAME_uk="Вхід" TYPE="3" MODE="0" DEF="" HIDE="0" POS="0"/>
<fld F_ID="d_alarm" ID="alrm" NAME="Alarm" NAME_ru="Авария" NAME_uk="Аварія" TYPE="0" MODE="1" DEF="" HIDE="0" POS="1"/>
<fld F_ID="d_alarm" ID="alrm_md" NAME="Alarm mode" NAME_ru="Режим аварии" NAME_uk="Режим аварії"
TYPE="3" MODE="0" DEF="" HIDE="0" POS="2"/>
<fld F_ID="d_alarm" ID="alrm_mess" NAME="Alarm message" NAME_ru="Сообщ. аварии" NAME_uk="Повід. аварії"
TYPE="0" MODE="0" DEF="" HIDE="0" POS="3"/>
</tbl>-->
</node>
<node id="mod_Siemens">
<!--
<tbl id="DAQ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" ENABLE="1" START="1"
PRM_BD="test2prm" PERIOD="1000" PRIOR="0" CIF_DEV="0" ADDR="5" ASINC_WR="0"/>
</tbl>
<tbl id="test2prm">
<fld SHIFR="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" EN="1" TMPL="S7.ai_man"/>
</tbl>-->
</node>
<node id="mod_SNMP">
<!--
<tbl id="DAQ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk=""
ENABLE="1" START="1" PRM_BD="test2prm" PERIOD="1000" PRIOR="0" ADDR="localhost" COMM="public" PATTR_LIM="20"/>
</tbl>
<tbl id="test2prm">
<fld SHIFR="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" EN="1" OID_LS="system"/>
</tbl>-->
</node>
<node id="mod_ModBus">
<!--
<tbl id="DAQ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" ENABLE="1" START="1"
PRM_BD="test2prm" PERIOD="1000" PRIOR="0" TRANSP="Sockets" ADDR="exlar.diya.org" NODE="1"/>
</tbl>
<tbl id="test2prm">
<fld SHIFR="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" EN="1"
ATTR_LS="321:0:tst:Test"/>
</tbl>-->
</node>
<node id="mod_DAQGate">
<!--
<tbl id="DAQ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" ENABLE="1" START="1"
PRM_BD="test2prm" PERIOD="1000" PRIOR="0" SYNCPER="60" STATIONS="loop" CNTRPRM="System.AutoDA"/>
</tbl>-->
</node>
<node id="mod_DCON">
<!--<tbl id="DAQ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" ENABLE="1" START="1"
PRM_BD="test2prm" PERIOD="1" PRIOR="0" ADDR="" REQ_TRY="1"/>
</tbl>
<tbl id="test2prm">
<fld SHIFR="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" EN="1" MOD_TP="0"
MOD_ADDR="1" CRC_CTRL="1"/>
</tbl>-->
</node>
<node id="mod_ICP_DAS">
<!--<tbl id="DAQ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" ENABLE="1" START="1"
PRM_BD="test2prm" PERIOD="1" PRIOR="0" BUS="1" BAUD="115200" LP_PRMS="" REQ_TRY="3"/>
</tbl>
<tbl id="test2prm">
<fld SHIFR="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" EN="1"
MOD_TP="552985" MOD_ADDR="0" MOD_SLOT="1" MOD_PRMS="0"/>
</tbl>-->
</node>
<node id="mod_OPC_UA">
<!--<tbl id="DAQ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" ENABLE="1" START="1"
PRM_BD="test2prm" SCHEDULE="1" PRIOR="0" SYNCPER="60" ADDR="" EndPoint="opc.tcp://localhost:4841" SecPolicy="None"
SecMessMode="1" Cert="" PvKey="" AttrsLimit="100"/>
</tbl>
<tbl id="test2prm">
<fld SHIFR="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" EN="1" ND_LS=""/>
</tbl>-->
</node>
<node id="mod_SoundCard">
<!--<tbl id="DAQ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" ENABLE="1" START="1"
PRM_BD="test2prm" CARD="" SMPL_RATE="8000" SMPL_TYPE="1"/>
</tbl>
<tbl id="test2prm">
<fld SHIFR="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" EN="1" CHANNEL="0"/>
</tbl>-->
</node>
</node>
<node id="sub_Archive">
<prm id="MessBufSize">1000</prm>
<prm id="MessPeriod">5</prm>
<prm id="ValPeriod">1000</prm>
<prm id="ValPriority">10</prm>
<!--
<tbl id="Archive_mess_proc">
<fld
ID="StatErrors"
MODUL="FSArch"
NAME="Errors"
NAME_ru="Ошибки"
NAME_uk="Помилки"
DESCR="Local errors' archive"
DESCR_ru="Архив локальных ощибок"
DESCR_uk="Архів локальних помилок"
START="1"
CATEG="/DemoStation*"
LEVEL="4"
ADDR="ARCHIVES/MESS/stError/"/>
<fld
ID="NetRequsts"
MODUL="FSArch"
NAME="Net requests"
NAME_ru="Сетевые запросы"
NAME_uk="Мережеві запити"
DESCR="Requests to server through transport Sockets."
DESCR_ru="Запросы к серверу через транспорт Sockets."
DESCR_uk="Запити до сервера через транспорт Sockets."
START="1"
CATEG="/DemoStation/Transport/Sockets*"
LEVEL="1"
ADDR="ARCHIVES/MESS/Net/"/>
</tbl>
<tbl id="Archive_val_proc">
<fld
ID="1h"
MODUL="FSArch"
NAME="1hour"
NAME_ru="1час"
NAME_uk="1год"
DESCR="Averaging for hour"
DESCR_ru="Усреднение за час"
DESCR_uk="Усереднення за годину"
START="1"
ADDR="ARCHIVES/VAL/1h/"
V_PER="360"
A_PER="60"/>
</tbl>
<tbl id="Archive_val">
<fld
ID="test1"
NAME="Test 1"
NAME_ru="Тест 1"
NAME_uk="Тест 1"
DESCR="Test 1"
DESCR_ru="Тест 1"
DESCR_uk="Тест 1"
START="1"
VTYPE="1"
BPER="1"
BSIZE="200"
BHGRD="1"
BHRES="0"
SrcMode="0"
Source=""
ArchS=""/>
</tbl>-->
</node>
<node id="sub_Protocol">
</node>
<node id="sub_UI">
<node id="mod_QTStarter">
<prm id="StartMod">QTCfg</prm>
</node>
<node id="mod_WebCfg">
<prm id="SessTimeLife">20</prm>
</node>
<node id="mod_VCAEngine">
<!--
<tbl id="LIB">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk=""
DB_TBL="wlib_test2" ICO="" USER="root" GRP="UI" PERMIT="436"/>
</tbl>
<tbl id="wlib_test2">
<fld ID="test2" ICO="" PARENT="/wlb_originals/wdg_Box" PROC="" PROC_ru="" PROC_uk="" PROC_PER="-1"
USER="root" GRP="UI" PERMIT="436"/>
</tbl>
<tbl id="wlib_test2_io">
<fld IDW="test2" ID="name" IO_VAL="Test 2" IO_VAL_ru="Тест 2" IO_VAL_uk="Тест 2" SELF_FLG=""
CFG_TMPL="" CFG_TMPL_ru="" CFG_TMPL_uk="" CFG_VAL=""/>
<fld IDW="test2" ID="dscr" IO_VAL="Test module 2" IO_VAL_ru="Тест модуля 2" IO_VAL_uk="Тест модуля 2" SELF_FLG=""
CFG_TMPL="" CFG_TMPL_ru="" CFG_TMPL_uk="" CFG_VAL=""/>
</tbl>
<tbl id="PRJ">
<fld ID="test2" NAME="Test 2" NAME_ru="Тест 2" NAME_uk="Тест 2" DESCR="" DESCR_ru="" DESCR_uk="" DB_TBL="prj_test2"
ICO="" USER="root" GRP="UI" PERMIT="436"/>
</tbl>
<tbl id="prj_test2">
<fld OWNER="/test2" ID="pg1" ICO="" PARENT="/wlb_originals/wdg_Box" PROC="" PROC_ru="" PROC_uk="" PROC_PER="-1"
USER="root" GRP="UI" PERMIT="436" FLGS="1"/>
<fld OWNER="/test2/pg1" ID="pg2" ICO="" PARENT="/wlb_originals/wdg_Box" PROC="" PROC_ru="" PROC_uk="" PROC_PER="-1"
USER="root" GRP="UI" PERMIT="436" FLGS="0"/>
</tbl>
<tbl id="prj_test2_incl">
<fld IDW="/prj_test2/pg_pg1" ID="wdg1" PARENT="/wlb_originals/wdg_Box"/>
</tbl>-->
</node>
</node>
<node id="sub_Special">
<node id="mod_SystemTests">
<prm id="Param" on="0" per="5" name="LogicLev.experiment.F3"/>
<prm id="XML" on="0" per="10" file="/etc/oscada.xml"/>
<prm id="Mess" on="0" per="10" categ="" arhtor="DBArch.test3" depth="10"/>
<prm id="SOAttach" on="0" per="20" name="../../lib/openscada/daq_LogicLev.so" mode="0" full="1"/>
<prm id="Val" on="0" per="1" name="LogicLev.experiment.F3.var" arch_len="5" arch_per="1000000"/>
<prm id="Val" on="0" per="1" name="System.AutoDA.CPULoad.load" arch_len="10" arch_per="1000000"/>
<prm id="DB" on="0" per="10" type="MySQL" addr="server.diya.org;roman;123456;oscadaTest" table="test" size="1000"/>
<prm id="DB" on="0" per="10" type="DBF" addr="./DATA/DBF" table="test.dbf" size="1000"/>
<prm id="DB" on="0" per="10" type="SQLite" addr="./DATA/test.db" table="test" size="1000"/>
<prm id="DB" on="0" per="10" type="FireBird" addr="server.diya.org:/var/tmp/test.fdb;roman;123456" table="test" size="1000"/>
<prm id="TrOut" on="0" per="1" addr="TCP:127.0.0.1:10001" type="Sockets" req="time"/>
<prm id="TrOut" on="0" per="1" addr="UDP:127.0.0.1:10001" type="Sockets" req="time"/>
<prm id="TrOut" on="0" per="1" addr="UNIX:./oscada" type="Sockets" req="time"/>
<prm id="TrOut" on="0" per="1" addr="UDP:127.0.0.1:daytime" type="Sockets" req="time"/>
<prm id="SysContrLang" on="0" per="10" path="/Archive/FSArch/mess_StatErrors/%2fprm%2fst"/>
<prm id="ValBuf" on="0" per="5"/>
<prm id="Archive" on="0" per="30" arch="test1" period="1000000"/>
<prm id="Base64Code" on="0" per="10"/>
</node>
</node>
</station>
</OpenSCADA>
Рассмотрим детальнее структуру конфигурационного файла. Один конфигурационный файл может содержать конфигурацию нескольких станций в секциях <station id="AGLKS"/>. Атрибутом указывается идентификатор станции. Использование той или иной секции станции, при вызове, указывается параметром командной строки --station=AGLKS. Секция станции непосредственно содержит параметры станции и секции подсистем. Параметры конфигурации секции записываются в виде <prm id="StName">AGLKS</prm>. Где в атрибуте <id> указывается идентификатор атрибута, а в теле тега указывается значение параметра "AGLKS". Перечень доступных параметров и их описание для станции и всех остальных секций можно получить в консоли, посредством вызова OpenSCADA с параметром --help.
Секции подсистем (<node id="sub_DAQ" />) содержат параметры подсистемы, секции модулей и секции таблиц отражения данных баз данных в конфигурационном файле. Секции модулей (<node id="mod_DiamondBoards" />) содержат индивидуальные параметры модулей и секции таблиц отражения данных баз данных в конфигурационном файле.
Секции таблиц отражения данных баз данных предназначены для размещения в конфигурационном файле записей таблиц БД для компонентов OpenSCADA. Рассмотрим таблицу входящих транспортов "Transport_in" подсистемы транспорты (<node id="sub_Transport">) из примера конфигурационного файла выше. Таблица содержит две записи с полями: ID, MODULE, NAME, DESCRIPT, ADDR, PROT, START. После загрузки с такой секцией и вообще без БД в подсистеме "Транспорты" модуля "Sockets" появятся два входных транспорта. Форматы структур таблиц основных компонентов включены в демонстрационные конфигурационные файлы. За деталями структуры БД нужно обращаться к документации соответствующих модулей или просто сохранить объект в конфигурационном файле.
Результат вызова команды: # ./openscada_AGLKS --help
***************************************************************************
********** OpenSCADA 0.9 (Linux-3.2.0-4-amd64). *********
***************************************************************************
===========================================================================
======================= Основные опции ====================================
===========================================================================
-h, --help Информация по опциям системы.
--config=<файл> Конфигурационный файл станции.
--station=<ид> Идентификатор станции.
--statName=<имя> Имя станции.
--demon, --daemon Запуск в режиме демона.
--pidFile=<файл> файл для помещения ID процесса программы сюда.
--coreDumpAllow Установить ограничения для разрешения генерации дампа памяти при крушении программы.
--messLev=<уров> Обрабатываемый уровень сообщений (0-7).
--log=<направл.> Направление сообщений в, по битовому полю:
0x1 - системный логер (syslogd);
0x2 - стандартный выход (stdout);
0x4 - стандартный выход ошибок (stderr);
0x8 - архив сообщений.
-------------- Параметры станции '/' в конфигурационном файле ------------
StName <имя> Имя станции.
WorkDB <Тип.Имя> Рабочая БД (тип и имя).
WorkDir <path> Рабочая директория.
ModDir <path> Директория модулей.
IcoDir <path> Директория с иконками.
DocDir <path> Директория с документами.
MessLev <уровень> Обрабатываемый <уровень> сообщений (0-7).
SelDebCats <список> Список категорий отладки (разделены ';').
LogTarget <направл.> Направление сообщений в, по битовому полю:
0x1 - системный логер (syslogd);
0x2 - стандартный выход (stdout);
0x4 - стандартный выход ошибок (stderr);
0x8 - архив сообщений.
Lang <язык> Рабочий-внутренний язык, вроде "ru_RU.UTF-8".
Lang2CodeBase <язык> Базовый язык для перевода текстовых переменных, два символа.
MainCPUs <список> Основной перечень используемых процессоров (разделены ':').
ClockRT <false> Установить для использования REALTIME (иначе MONOTONIC) часов, несколько проблематичное при модификации системных часов.
SaveAtExit <true> Сохранять систему при выходе.
SavePeriod <сек> Период сохранения системы.
RdStLevel <уров> Уровень текущей станции в схеме резервирования.
RdTaskPer <c> Периодичность вызова задачи обслуживания резервирования.
RdRestConnTm <c> Интервал времени восстановления соединения с "мёртвой" резервной станцией.
RdStList <список> Список резервных станций, разделённых символом ';' (st1;st2).
RdPrimCmdTr <0|1> Включение транзита первичных команд на резервные станции.
=================== Подсистема "Управление модулями" ====================
--ModPath=<путь> Путь к модулям (/var/os/modules/).
--------- Параметры секции '/sub_ModSched/' в конфигурационном файле ---------
ModPath <путь> Путь к разделяемым библиотекам (модулям).
ModAllow <список> Список разделяемых библиотек допустимых для автоматической загрузки, подключения и запуска (bd_DBF.so;daq_JavaLikeCalc.so).
Использовать значение '*' для разрешения всех модулей.
ModDeny <список> Список разделяемых библиотек запрещённых для автоматической загрузки, подключения и запуска (bd_DBF.so;daq_JavaLikeCalc.so).
ChkPer <сек> Период поиска новых разделяемых библиотек (модулей).
========================= Опции подсистемы "БД" =========================
-------------- Параметры станции '/sub_BD/' в конфигурационном файле ------------
SYSStPref <1> Использовать идентификатор станции в общей (SYS) таблице.
==================== Опции подсистемы "Безопасности" ====================
====================== Опции подсистемы "Транспорты" ====================
============== Опции подсистемы "Транспортные протоколы" ================
======================= Опции модуля <Protocol:HTTP> =============================
------- Параметры модульной секции '/sub_Protocol/mod_HTTP/' в конфигурационном файле ---------
AuthTime <мин> Время жизни аутентификации, минут (по умолчанию 10).
=================== Опции подсистемы "Сбор данных" ======================
--------------- Параметры секции '/sub_DAQ/' в конфигурационном файле --------------
RdRestDtTm <час> Глубина восстановления данных архива из резервной станции, при включении.
==================== Опции подсистемы "Архивы" ======================
---------- Параметры секции '/sub_Archive/' в конфигурационном файле --------
MessBufSize <ед.> Размер буфера сообщений.
MessPeriod <сек> Период архивирования сообщений.
ValPeriod <мсек> Период архивирования значений.
ValPriority <уровень> Уровень приоритета задачи значений.
RdRestDtOverTm <часы> Глубина принудительной перезагрузки истории резерва при запуске, в часах.
======================= Опции модуля <Archive:FSArch> =============================
--noArchLimit Отключить лимит на количество файлов.
Используйте для режима просмотра архивов, не для работы.
===================== Опции подсистемы "Специальные" ====================
========================== Опции модуля <Special:SystemTests> ==========================
-------- Параметры модульной секции '/sub_Special/mod_SystemTests/' в конфигурационном файле --------
Общие опции всех тестов:
id идентификатор теста;
on флаг включения теста;
per период повторения (сек).
*** Опции тестов ***
1) Param Тест DAQ параметров. Вычитывает атрибуты и конфигурационные поля параметра.
1:name Адрес DAQ параметра
2) XML Тест разбора файла XML. Разбирает и отображает структуру указанного файла.
1:file XML файл
3) Mess Тест архива сообщений. Периодически вычитывает новые сообщения из архива, для указанного архиватора.
1:arhtor Архиватор
2:categ Шаблон категории сообщения
3:depth Глубина сообщения (с)
4) SOAttach Тест подключения/отключения модулей.
1:name Путь к модулю
2:mode Режим (1-подключение;-1-отключение;0-изменение)
3:full Полное подключение(при старте)
5) Val Тест значений атрибута параметра.
Выполняет периодический опрос последнего значения указанного атрибута, а также опрос архива на указанную глубину.
1:name Путь к атрибуту параметра
2:arch_len Глубина запроса к архиву значений (с)
3:arch_per Период запроса к архиву значений (мкс)
6) DB Полный тест БД. Выполняет:
- создание/открытие БД;
- создание/открытие таблицы;
- создание множества записей (строк) предопределённой структуры;
- модификация множества записей;
- получение и проверка значений множества записей;
- модификация структуры записи и таблицы;
- удаление записей;
- закрытие/удаление таблицы;
- закрытие/удаление БД.
1:type Тип БД
2:addr Адрес БД
3:table Таблица БД
4:size Количество записей
7) TrOut Тест выходных и/или входных транспортов.
Выполняет тестирование исходящего транспорта путём отправления запроса к указанному входящему транспорту.
1:addr Адрес
2:type Модуль транспорта
3:req Текст запроса
8) SysContrLang Тест языка управления системой.
Производит запрос элементов языка посредством полного пути.
Полный путь к элементу языка имеет вид </Archive/%2fbd%2fm_per>.
Полный путь состоит из двух вложенных путей.
Первый </d_Archive/> это путь к узлу дерева контроля.
Второй </bd/m_per> это путь к конкретному элементу узла.
1:path Путь к элементу языка
9) ValBuf Тесты буфера значений. Содержит 13 тестов всех аспектов буфера значений (подсистема "Архивы").
10) Archive Тесты размещения в архиве значений.
Содержит 7(8) тестов архиватора значений на проверку корректности функционирования последовательного механизма упаковки.
1:arch Архив значений
2:period Период значений (мкс)
3:archtor Архиватор
11) Base64Code Тесты кодирования Mime Base64 алгоритмом.
============= Опции подсистемы "Пользовательские интерфейсы" ============
======================== Опции модуля <UI:QTStarter> ============================
------ Отладочные параметры Qt, командной строки --
--noX11 Предотвращать запуск Qt, в основном для чистой консоли.
--sync Переключение в синхронный режим X11 для отладки.
--widgetcount Печать отладочных сообщений при выходе, о количеcтве
виджетов оставшихся неудалёнными и максимальном их количестве.
------ Параметры Qt, командной строки -------------
--qws Делает данное приложение сервером с Qt для встраиваемого Linux.
--style=<имя> Установить GUI стиль в имя (windows, platinum, plastique, ...).
--stylesheet=<путь> Установить таблицу стилей из файла по пути.
--session=<имя> Восстановить из предыдущего сеанса с указанным именем.
--reverse Установить направление размещения в Qt::RightToLeft.
--graphicssystem=<имя> Установить механизм рендеринга для экранных виджетов и QPixmaps (raster, opengl).
--display=<имя> Установить X экран (типично в $DISPLAY).
--geometry=<геом> Установить клиентскую геометрию первого отображаемого окна.
------- Параметры модульной секции '/sub_UI/mod_QTStarter/' в конфигурационном файле ---------
StartMod <модули> Список запускаемых модулей (разделитель - ';');
======================= Опции модуля <UI:QTCfg> =============================
------- Параметры модульной секции '/sub_UI/mod_QTCfg/' в конфигурационном файле ---------
StartPath <path> Стартовый путь конфигуратора.
StartUser <user> Стартовый, беспарольный, пользователь.
======================== Опции модуля <UI:Vision> ============================
------- Параметры модульной секции '/sub_UI/mod_Vision/' в конфигурационном файле ---------
StartUser <польз> Стартовый, беcпарольный, пользователь.
UserPass <пароль> Пароль пользователя для нелокального запуска.
RunPrjs <список> Перечень запускаемых при старте проектов.
ExitLstRunPrjCls {0;1}Выход при закрытии последнего исполняющегося проекта (по умолчанию = 1).
CachePgLife <часы> Время жизни страниц в кеше.
VCAstation <id> Станция с движком СВУ ('.' - локальная).
RestoreTime <секунды> Время восстановления подключения.
======================== Опции модуля <UI:WebVision> ============================
------- Параметры модульной секции '/sub_UI/mod_WebVision/' в конфигурационном файле ---------
SessTimeLife <время> Время жизни сессии, минуты (по умолчанию 10).