Описательная часть проекта OpenSCADA

(приложение к проекту на языке UML)

Роман Савоченко

на 83 страницах

от 11. сен. 2005

Оглавление

Введение	4

Описание функций системы	6

1.Модульность	6

2.Подсистемы	7

3.PLC и другие источники динамических данных. Подсистема «Контроллеры»	7

4.Базы данных. Подсистема «Базы данных»	8

5.Архивы. Подсистема «Архивы»	9

6.Коммуникации. Подсистемы «Транспорты» и «Протоколы»	9

7.Интерфейсы пользователя. Подсистема «Интерфейсы пользователя»	11

8.Параметры динамических данных. Подсистема «Параметры»	11

9.Безопасность системы. Подсистема «Безопасность»	11

10.Пользовательские функции. Подсистема «Функции»	12

11.Управление библиотеками модулей и модулями. Подсистема «Управление модулями»	13

12.Непредусмотренные возможности. Подсистема «Специальные»	13

SCADA системы и их структура	14

Варианты конфигурирования и использования системы OpenSCADA	16

1.Простое серверное подключение.	16

2.Дублированное серверное подключение.	16

3.Дублированное серверное подключение на одном сервере.	17

4.Клиентский доступ посредством Web-интерфейса. Место руководителя.	17

5.Автоматизированное рабочее место (место руководителя/оператора)	18

6.АРМ с сервером сбора и архивирования на одной машине (место оператора, модель ...)	19

7.Простейшее смешанное подключение (модель, демонстрация, конфигуратор ...)	20

8.Устойчивая, распределённая конфигурация	21

Внутренняя структура системы. API системы OpenSCADA.	23

9.Общая структура системы. Модульность (TSubSYS, TModule)	24

9.1.Корневой объект системы (TSYS)	24

9.2.Объект сообщений системы (TMess).	25

9.3.Объект подсистемы (TSubSYS)	26

9.4.Объект модуля (TModule)	27

10.Подсистема “Базы Данных” (TBDS)	29

10.1.Объект подсистемы «Базы Данных» (TBDS)	29

10.2.Модульный объект типов баз данных (TTtipBD)	29

10.3.Объект базы данных (TBD)	30

10.4.Объект таблицы (TTable)	30

11.Подсистема “Контроллеры” (TControllerS)	31

11.1.Объект подсистемы «Контроллеры» (TControllerS)	31

11.2.Модульный объект типа контроллера (TTipController)	31

11.3.Объект контроллера (TController)	32

11.4.Объект типа параметров (TTipParam)	33

11.5.Объект параметра физического уровня (TParamContr)	33

11.6.Объект значения (TValue)	34

11.7.Объект атрибута (TVal)	34

12.Подсистема “Архивы” (TArchiveS)	36

12.1.Объект подсистемы «Архивы» (TArchiveS)	36

12.2.Модульный объект типа архива (TTipArchive)	36

12.3.Объект архива сообщений (TArchiveMess)	37

12.4.Объект архива значений (TArchiveVal)	37

13.Подсистема “Транспорты” (TTransportS)	39

13.1.Объект подсистемы «Транспорты» (TTransportS)	39

13.2.Модульный объект типа транспортов (TTipTransport)	39

13.3.Объект входящих транспортов (TTransportIn)	40

13.4.Объект исходящих транспортов (TTransportOut)	40

14.Подсистема “Протоколы коммуникационных интерфейсов” (TProtocolS)	42

14.1.Объект подсистемы «Протоколы коммуникационных интерфейсов» (TProtocolS)	42

14.2.Модульный объект протокола (TProtocol)	42

14.3.Объект сеанса входящего протокола (TProtocolIn)	42

15.Подсистема “Пользовательские интерфейсы” (TUIS)	44

15.1.Объект подсистемы «Пользовательские интерфейсы» (TUIS)	44

15.2.Модульный объект пользовательского интерфейса (TUI)	44

16.Подсистема “Специальные” (TSpecialS)	45

16.1.Объект подсистемы «Специальные» (TSpecialS)	45

16.2.Модульный объект специальных (TSpecial)	45

17.Подсистема “Безопасность” (TSeсurity)	46

17.1.Объект подсистемы «Безопасность» (TSeсurity)	46

17.2.Объект пользователя (TUser)	46

17.3.Объект группы пользователей (TGroup)	47

18.Подсистема “Управление модулями” (TModSchedul)	48

18.1.Объект подсистемы «Управление модулями» (TModSchedul)	48

19.Подсистема “Параметры” (TParamS)	49

19.1.Объект подсистемы «Параметры» (TParamS)	49

19.2.Объект параметра логического уровня (TParam)	49

20.Подсистема “Функции” (TFunctionS)	50

20.1.Объект подсистемы «Функции» (TFunctionS)	50

20.2.Объект библиотеки функций (TLibFunc)	50

20.3.Объект функции (TFunction)	51

20.4.Объект параметра функции (IO)	51

20.5.Объект значения функции (TValFunc).	52

21.Данные в системе OpenSCADA и их хранение в БД (TConfig)	54

21.1.Объект данных (TConfig)	54

21.2.Ячейка данных (TCfg)	55

21.3.Объект структуры данных (TElem)	55

21.4.Ячейка структуры данных (TFld)	56

21.5.Объект упреждения про смену структуры (TValElem)	57

22.Язык управления системой и сеть узлов системы (TCntrNode)	58

22.1.Основные элементы языка управления	59

22.2.Иерархические зависимости всех элементов языка управления	64

22.3.Объект узла сети (TCntrNode)	67

23.XML в системе OpenSCADA (XMLNode)	70

23.1.XML-тег (XMLNode)	70

24.Ресурсы в системе OpenSCADA (ResAlloc, AutoHD)	71

24.1.Объект ресурса (ResAlloc)	71

24.2.Шаблон (AutoHD)	71

Организация и структуры баз данных	73

1.Таблицы подсистемы «Контроллеры»	73

1.1.Структура корневой таблицы	73

1.2.Структура таблиц контроллеров	73

1.3.Структура таблиц параметров	73

2.Таблицы подсистемы “Транспорты”	74

2.1.Таблица входящих транспортов	74

2.2.Таблица исходящих транспортов	74

3.Таблицы подсистемы “Архивы”	74

3.1.Таблица архивов сообщений	74

3.2.Таблица архивов значений	74

4.Структура БД модулей	74

API модулей модульных подсистем	75

Список программ доноров и других источников	79

Часто задаваемые вопросы и ответы на них (FAQ)	80

Отладка и тестирование проекта OpenSCADA	82

Правила оформления и комментирования исходных текстов OpenSCADA и его модулей	82

Условные обозначения по тексту и в исходниках	82

Известные ошибки и проблемы	83

Введение

Данный документ является описанием, спецификацией, технической документацией “open source” проекта системы именуемой “OpenSCADA”. OpenSCADA представляет собой открытую SCADA систему построенную по принципам модульности, кроссплатформенности и масштабируемости.

В качестве политики разработки данной системы выбраны “open source” принципы. Выбор данной политики определяется необходимостью создания открытой, надёжной и общедоступной SCADA системы. Данная политика позволяет привлечь к разработке, тестированию, развитию, распространению и использованию продукта значительное количество разработчиков, энтузиастов и других заинтересованных лиц при минимальных финансовых затратах.

Система OpenSCADA предназначена для сбора, архивирования, визуализации информации, выдачи управляющих воздействий, а также других родственных операций характерных для полнофункциональной SCADA системы.

Система OpenSCADA может применяться:

на промышленных объектах в качестве полнофункциональной SCADA системы;

внутри PLC (программируемых логических контроллерах) в качестве среды исполнения;

во встраиваемых (embeded) системах;

для построения различных моделей (технологических, химических, физических, электрических процессов);

на персональных компьютерах, серверах и кластерах для сбора, обработки, представления и архивации информации о системе и её окружении.

В качестве базовой (хостовой) операционной системы для разработки и использования выбрана ОС Linux, которая является оптимальным компромиссом в вопросах:

надёжности (большая доля серверов и кластеров работает на GNU/Linux);

гибкости/масштабируемости (ввиду своей открытости и модульности позволяет строить системы под любые требования);

доступности (благодаря лицензии GPL является полностью свободной системой, а при высокой квалификации пользователя и бесплатной);

популярности, развитости, поддержке, распространённости (система активно развивается множеством энтузиастов, фирм и государственными учреждениями со всего мира, получает всё большую поддержку на пользовательском и корпоративном рынке, активно внедряется в государственные структуры различных стран).

Поскольку проект разрабатывается и реализуется по принципам кроссплатформенности, то не составляет проблемы портировать его на другую ОС. Что в дальнейшем планируется.

Сердцем системы является модульное ядро. И в зависимости от того какие модули подключены система может выступать как в роли различных серверов, так и в роли разнообразных клиентов, а также совмещать эти функции в одной программе. Это позволяет реализовывать клиент-серверную архитектуру SCADA системы на базе одних и тех же компонентов/модулей, экономя при этом: машинную память, дисковое пространство, а также ценное время программистов.

Серверные конфигурации системы предназначены для сбора, обработки, выдачи воздействий, архивирования, протоколирования информации от различных источников, а также предоставления этой информации клиентам (UI, GUI, TUI ...). Модульная архитектура позволяет расширять функциональность сервера, даже без его перегрузки.

Клиентские конфигурации могут строиться на основе различных графических библиотек (GUI/TUI ToolKits), как используя ядро программы и его модули (путём добавления к нему UI-(user interface) модуля) так и в качестве самостоятельного приложения подключая ядро OpenSCADA как библиотеку.

Возможность гибкой конфигурации системы позволяет строить системы под конкретные требования надёжности, функциональности и размеры системы.

Рисунок 1: Блочная структура системы OpenSCADA

Описание функций системы

Модульность

Для придания гибкости и высокой степени масштабируемости, система OpenSCADA построена по модульному принципу. Тесная интеграция модулей с ядром системы накладывает большую ответственность на процесс написания модулей и вводит элемент нестабильности в систему однако, благодаря возможности создания распределённых конфигурация эта опасность сглаживается с сохранением высокой степени гибкости.

Модули системы OpenSCADA хранятся в динамических библиотеках. Каждая динамическая библиотека может содержать множество модулей различного типа. Наполнение динамических библиотек модулями определяется функциональной связностью самих модулей. Динамические библиотеки допускают горячую замену, что позволяет в процессе функционирования производить обновление отдельных частей системы. Метод хранения кода модулей в динамических библиотеках является основным для системы OpenSCADA, поскольку поддерживается практически всеми современными ОС. Это не исключает возможности разработки других методов хранения кода модулей.

На основе модулей реализованы следующие функциональные части системы OpenSCADA:

базы данных;

архивы (сообщений и значений);

протоколы коммуникационных интерфейсов;

коммуникационные интерфейсы, транспорты;

контроллеры (PLC) и другие источники динамических данных;

интерфейсы пользователя (GUI,TUI,WebGUI, speach, signal ... .).

дополнительные модули, специальные.

Управление модулями осуществляется подсистемой «Управление модулями». Функциями подсистемы является: подключение, отключение обновление модулей, а также другие операции связанные с модулями и библиотеками модулей;

Подсистемы

Архитектурно система OpenSCADA делится на подсистемы. Подсистемы могут быть двух типов модульные и не модульные. Модульные подсистемы обладают свойством расширения посредством модулей. Каждая модульная подсистема может содержать множество модульных объектов. Например модульная подсистема «Базы данных» содержит модульные объекты типов баз данных.

Всего, система OpenSCADA содержит 11 подсистем из них 7 подсистем являются модульными. 11 подсистем системы OpenSCADA являются базовыми и присутствуют в любой конфигурации. К этому списку 11 подсистем могут добавляться новые посредством модулей. Подсистемы системы OpenSCADA:

Архивы (модульная).

Базы данных (модульная).

Безопасность.

Интерфейсы пользователей (модульная).

Управление модулями.

Контролеры (модульная).

Параметры.

Протоколы (модульная).

Специальные (модульная).

Транспорты (модульная).

Функции.

PLC и другие источники динамических данных. Подсистема «Контроллеры»

Для поддержки источников динамических данных, будь то PLC-контроллеры, платы УСО, виртуальные источники и т.д., предназначена подсистема «Контроллеры». В функции этой подсистемы входит предоставление полученных данных в структурированном виде и обеспечение управления этими данными, например модификация данных.

Подсистема «Контроллеры» является модульной и как следствие содержит модульные объекты типов источников динамических данных (типов контроллеров). Например, на август 2005г, система OpenSCADA поддерживает следующие типы источников динамических данных:

Diamond платы сбора данных.

Сбор данных ОС.

Виртуальный блочный создатель данных.

Каждый тип источника выполнен в виде отдельного модуля который может быть подключен/отключен. Каждый тип источника может содержать отдельные источники (контроллеры).

Отдельно взятый контроллер может содержать параметры, определённых модулем, типов. Например параметр аналогового типа, основной информацией которую он предоставляет является значение целого или вещественного типа. Структурно, параметр представляет собой список атрибутов которые и содержат данные. Атрибуты могут быть четырёх базовых типов: символьная строка(текст), целое, вещественное и логический тип.

Структуры контроллеров параметров и их типов содержатся в подсистеме «Контроллеры» а объекты модулей выполняют их заполнение в соответствии с собственной спецификой.

Источник динамических данных может быть удалённым, т.е. быть подключен на удалённой системе OpenSCADA. Для связи с таким источником данных можно использовать транспортный тип контроллеров. Функцией данного типа источника данных является отражение удалённого источника динамических данных в локальной системе.

Базы данных. Подсистема «Базы данных»

Для хранения данных системы повсеместно используются базы данных (БД). В целях централизации доступа и управления БД в системе OpenSCADA предусмотрена подсистема «Базы данных». Для обеспечения поддержки различных БД/СУБД подсистема выполнена модульной.

В роли модульных объектов содержащихся в подсистеме выступает тип БД/СУБД, т.е. модуль подсистемы «Базы данных», практически, содержит реализацию доступа к определённому типу БД. Например модули: DBF, MySQL, SQLite.

Объект типа БД/СУБД, в свою очередь, содержит список объектов отдельных БД данного типа. А объект БД содержит список объектов таблиц которые и содержат данные в табличной форме.

Практически все данные системы хранятся в той или иной БД. Инструментарий системы позволяет легко переносить данные с одного типа БД на другой и как следствие оптимально подбирать тип БД под конкретную область применения системы OpenSCADA.

Для организации централизованного доступа распределённой системы к одной БД существует два способа. Первый это использование сетевых СУБД, например MySQL. Второй способ это использование транспортного типа БД на локальный системах для доступа к одной центральной БД. Функцией транспортной БД является пересылка запросов к БД на удалённой OpenSCADA системе.

Архивы. Подсистема «Архивы»

Характерной задачей для систем подобного класса является архивирование потоков информации системы. Потоки информации системы OpenSCADA можно разделить на два класса, это сообщения и значения.

Для решения задач архивирования потоков данных в системе OpenSCADA предусмотрена подсистема «Архивы». Подсистема «Архивы» позволяет вести как архивы сообщений так и архивы значений. Подсистема «Архивы» является модульной. Модульным объектом, содержащимся в подсистеме «Архивы», выступает тип архива. Тип архива определяет способ хранения данных. Каждый модуль подсистемы «Архивы» может реализовывать как архивирование сообщений так и архивирование значений. Подсистема «Архивы» может содержать множество архивов обслуживаемых различными модулями подсистемы.

Сообщения это любое текстовое уведомление системы. Сообщение в системе OpenSCADA характеризуется: датой, уровнем важности, категорией и текстом сообщения. Дата сообщения указывает на время создания сообщения. Уровень важности указывает на степень важности сообщения. Категория определяет адрес или условный идентификатор источника сообщения. Обычно категория содержит полный путь к источнику сообщения в системе. Текст сообщения собственно и несёт смысловую нагрузку сообщения.

В процессе архивирования, сообщения пропускаются через фильтр. Фильтр работает по уровню важности и категории сообщения. Уровень сообщения в фильтре указывает что нужно пропускать сообщения с указанным или более высоким уровнем важности. Для фильтрования по категории применяется шаблоны, которые определяют какие сообщения пропускать. Каждый архив содержит собственные настройки фильтра. Следовательно можно легко создавать различные специализированные архивы сообщений. Например архивы сообщений можно специализировать на:

логи, для хранения отладочной информации и другой рабочей информации сервера;

различные протоколы (протокол действий клиентов, протокол нарушений и исключений, протокол событий ... ).

Для организации выделенных архивов распределённых систем можно использовать транспортный тип архива. Функцией транспортного типа архива является отражение удалённого центрального архива на локальной системе. Как следствие, архивы транспортного типа выполняют передачу сообщений между локальной системой и архивом удалённой системы скрывая от подсистем локальной системы реальную природу архива.

Коммуникации. Подсистемы «Транспорты» и «Протоколы»

Поскольку система OpenSCADA закладывается как высоко-масштабируемая система то, поддержка коммуникаций должна быть достаточно гибкой. Для удовлетворения высокой степени гибкости, коммуникации в системе OpenSCADA реализованы в подсистемах «Транспорты» и «Протоколы» которые являются модульными.

Подсистема «Транспорты» предназначена для обмена неструктурированными данными между системой OpenSCADA и внешними системами. В роли внешних систем могут выступать и удалённые OpenSCADA системы. Под неструктурированными данными понимается массив символов определённой длины. Модульным объектом, содержащимся в подсистеме «Транспорты», выступает тип транспорта. Тип транспорта определяет механизм передачи неструктурированных данных. Например это может быть:

сокеты (TCP/UDP/UNIX);

почта (smtp/pop/imap);

каналы;

разделяемая память.

Подсистема «Транспорты» включает поддержку входящих и исходящих транспортов. Входящий транспорт предназначен для обслуживания внешних запросов и отправки ответов. Исходящий транспорт, наоборот, предназначен для отправки сообщений и ожидания ответа. Следовательно, входящий транспорт содержит конфигурацию данного сервера, а исходящий транспорт содержит конфигурацию удалённого сервера. Модуль подсистемы «Транспорты» должен реализовывать поддержку как входящего так и исходящего транспортов.

Подсистема «Протоколы» предназначена для структуризации данных полученных от подсистемы «Транспорты». По сути, подсистема «Протоколы» является продолжением подсистемы «Транспорты» и выполняет функции проверки структуры и целостности полученных данных. Так, для указания протокола в связке с которым должен работать транспорт предусмотрено специальное конфигурационное поле. Модульным объектом, содержащимся в подсистеме «Протоколы» является сам протокол. Например это могут быть:

HTTP (Hyper Text Transfer Protocol);

SelfSystem (OpenSCADA системный протокол).

Полную цепочку связи можно записать следующим образом:

сообщение передаётся в транспорт;

транспорт передаёт сообщение, связанному с ним, протоколу путём создания нового объекта;

протокол проверяет целостность данных;

если пришли все данные то сообщить транспорту о прекращении ожидания данных и передать ему ответ иначе сообщить что нужно ожидать ещё;

транспорт получив подтверждение отсылает ответ и удаляет объект протокола;

если подтверждения нет то транспорт продолжает ожидать данных и в случае их поступления передаёт их сохранённому объекту протокола.

Для исходящих транспортов протокол не используется. Точнее, он реализуется в подсистеме желающей отправлять данные.

Благодаря стандартному API-доступа к транспортам системы OpenSCADA, можно легко менять способ обмена данными не затрагивая самих обменивающихся систем. Например в случае локального обмена можно использовать более быстрый транспорт на основе разделяемой памяти, а в случае обмена через интернет использовать TCP или UDP сокеты.

Интерфейсы пользователя. Подсистема «Интерфейсы пользователя»

SCADA-системы, как класс, предполагают наличие интерфейсов пользователя. В OpenSCADA для предоставления пользовательских интерфейсов предусмотрена подсистема «Пользовательские интерфейсы». Под пользовательским интерфейсом системы OpenSCADA понимается не только среда визуализации, с которой должен работать пользователь, но и всё что, имеет отношение к пользователю, например:

среды визуализации;

конфигураторы;

сигнализаторы.

Подсистема «Пользовательские интерфейсы» является модульной. Модульным объектом подсистемы выступает, собственно, конкретный интерфейс пользователя. Модульность подсистемы позволяет создавать различные интерфейсы пользователей на различных GUI/TUI библиотеках и использовать наиболее оптимальное из решений в конкретно взятом случае, например для сред исполнения контроллеров можно использовать конфигураторы и визуализаторы на основе Web-технологий (WebCfg, WebUI), а в случае стационарных рабочих станций использовать теже конфигураторы и визуализаторы но на основе библиотек типа QT, GTK.

Параметры динамических данных. Подсистема «Параметры»

Для предоставления доступа к динамическим данным в системе OpenSCADA предусмотрены объекты Параметры. Параметры содержат атрибуты с динамическими данными. А атрибутах могут храниться данные четырёх типов: целые, вещественные, логические и строковые(текстовые). Для хранения быстроменяющихся значений в атрибутах можно использовать буфер. Буфер атрибутов может быть асинхронного и синхронного типов. Буфер асинхронного типа предназначен для временного хранения быстроменяющихся неравномерно поступающих данных. Буфер синхронного типа предназначен для данных поступающих равномерными блоками.

Параметры, по источнику, делятся на два уровня: физический и логический. Параметры физического уровня содержатся и предоставляются подсистемой «Контроллеры». Параметры логического уровня содержатся и предоставляются подсистемой «Параметры». Физический уровень может предоставлять параметры только предопределённой, типом контроллера, структуры. Логический уровень, в противоположность физическому, может предоставлять параметры различной структуры. Причём структура и конфигурация наполнения атрибутов определяется пользователем. Логический уровень также поддерживает возможность организации резервирования параметров и атрибутов.

Безопасность системы. Подсистема «Безопасность»

Система OpenSCADA является разветвлённой системой которая состоит из десятка подсистем и может включать множество модулей. Следовательно, предоставлять всем неограниченный доступ к этим ресурсам есть по крайней мере небезопасно. Поэтому для разграничения доступа в системе OpenSCADA предусмотрена подсистема «Безопасности». Основными функциями подсистемы «Безопасности» являются:

хранение учётных записей пользователей и групп пользователей;

аутентификация пользователей;

проверка прав доступа пользователя к тому или иному ресурсу.

Пользовательские функции. Подсистема «Функции»

Любая серьёзная SCADA система должна содержать механизмы предоставляющие возможность программировать на пользовательском уровне, т.е. содержать среду пользовательского программирования. Среда программирования системы OpenSCADA предназначена для создания:

Алгоритмов управления технологическим процессом.

Крупных моделей технологических, химических, физических и других процессов. А также реализации адаптивных механизмов управления по моделям.

Пользовательских программ управления внутренними функциями системы её подсистемами и модулями.

Гибкого формирования структур параметров на уровне пользователя. Для создания параметров с нестандартной структурой и заполнения её по алгоритму пользователя.

Вспомогательных вычислений.

Среда программирования системы OpenSCADA представляет собой комплекс средств предоставляющих вычислительное окружение пользователя. В состав комплекса средств входят:

подсистема «Функции»;

модули библиотек функций;

вычислительные контроллеры подсистемы «Контроллеры».

Модули библиотек функций содержат множество библиотек функций различной направленности. Библиотеки могут быть реализованы как набором функций фиксированного типа так и функциями допускающими свободную модификацию и пополнение.

Библиотеки функций фиксированного типа могут поставляться совместно со стандартными модулями системы. Функции таких библиотек будут представлять собой интерфейсы доступа к средствам модуля на уровне пользователя. Например «Среда визуального представления данных» может предоставлять функции для выдачи различных сообщений. Используя эти функции пользователь сможет закладывать интерактивные алгоритмы взаимодействия с системой.

Библиотеки функций свободного типа могут предоставлять среду написания пользовательских функций на одном из языков программирования. В рамках модуля библиотек функций могут предоставляться механизмы создания библиотек функций. Так, можно создавать библиотеки аппаратов технологических процессов, а в последствии использовать их путём связывания. Различные модули библиотек функций могут предоставлять реализации различных языков программирования.

Все функции регистрируются в подсистеме «Функции» системы OpenSCADA и становятся доступными всей системе.

На основе функций доступных в подсистеме «Функции» строятся вычислительные контроллеры. Вычислительные контроллеры выполняют связывание функций с параметрами системы и механизмом вычисления.

Управление библиотеками модулей и модулями. Подсистема «Управление модулями»

Система OpenSCADA построена по модульному принципу, что подразумевает наличие множества модулей которыми необходимо управлять. Для выполнения функций управления модулями системы OpenSCADA предусмотрена подсистема «Управление модулями». Все модули, на настоящий момент, поставляются в систему посредством разделяемых библиотек(контейнеров). Каждый контейнер может содержать множество модулей различного типа.

Подсистема «Управление модулями» реализует контроль за состоянием контейнеров и позволяет выполнять горячее добавление, удаление и обновление контейнеров и содержащихся в них модулей.

Непредусмотренные возможности. Подсистема «Специальные»

Разумеется, предусмотреть всех возможных функций невозможно, поэтому в системе OpenSACAD предусмотрена подсистема «Специальные». Подсистема «Специальные» является модульной и предназначена для добавления в систему OpenSCADA непредусмотренных функций путём модульного расширения. Например, с помощью подсистемы «Специальные» могут быть реализованы:

тесты системы OpenSCADA и её модулей;

библиотеки функций.

SCADA системы и их структура

Рисунок 2 SCADA-система. SCADA (Supervisory Control And Data Acquisition), в общем виде, имеют распределённую архитектуру изображённую на рисунке 2. Элементы SCADA систем, в смысле программного обеспечения, выполняют следующие функции:

Сервер сбора: представляет собой задачу или группу задач занимающихся сбором данных из источников данных, или же сами выступают в роли источником данных. В задачи сервера входит:

получение а также формирование данных;

обработка данных;

обслуживание запросов на доступ к данным;

обслуживание запросов на модификацию данных.

Сервер архивирования: представляет собой задачу или группу задач занимающихся архивированием данных. В задачи сервера входит:

архивирование данных SCADA-системы;

обслуживание запросов на доступ к архивным данным;

импорт/экспорт архивов.

Сервер протоколирования: представляет собой задачу или группу задач занимающиеся архивированием сообщений. В задачи сервера входит:

архивирование сообщений узлов SCADA-системы;

обслуживание запросов на доступ к архивным сообщениям;

импорт/экспорт архивов.

Сервер сигнализации: представляет собой задачу или группу задач выполняющие функции сервера протоколирования в отношении узкой категории сообщений сигнализации.

Рабочее место оператора: представляет собой постоянно функционирующее GUI(Grafical User Interface) приложение функционирующее в одномониторном, многомониторном или панельном режиме и выполняющее функции:

предоставление пользовательского интерфейса для контроля за состоянием технологического процесса;

предоставление возможности формирования управляющих воздействий;

предоставление возможности изучения и анализа истории технологического процесса;

предоставление инструментария для генерации отчётной документации.

Рабочее место инженера: представляет собой GUI приложение используемое для конфигурации SCADA системы. В задачи приложения входит:

предоставление инструментария для конфигурации системных функций систем;

предоставление инструментария рабочего места оператора;

предоставление инструментария для манипуляции архитектурой SCADA системы в целом (распределение функций между станциями, создание удаление станций ... ).

Рабочее место руководителя: представляет собой GUI приложение, как правило, функционирующее в одномониторном режиме и выполняющее функции:

предоставление пользовательского интерфейса для контроля за состоянием технологического процесса;

предоставление инструментария для изучения и анализа истории технологического процесса, как непосредственно с активного сервера, так и на основе отдельных архивов;

предоставление инструментария для генерации отчётной документации.

Рабочее место технолога: полностью включает в себя функции рабочего места оператора плюс модель технологического процесса (без непосредственной связи с технологическим процессом).

Рабочее место технолога-программиста: полностью включает в себя функции рабочего места технолога плюс инструментарий для создания моделей технологических процессов.

Варианты конфигурирования и использования системы OpenSCADA

Простое серверное подключение.

Рисунок 3 Простое серверное подключение. В простейшем случае систему OpenSCADA можно сконфигурировать в серверном режиме для сбора и архивирования данных. Данная конфигурация позволяет выполнять следующие функции:

опрос контроллеров;

архивирование значений параметров;

обслуживание клиентских запросов;

предоставление конфигурационного WEB интерфейса;

вторичное регулирование (регулирование в вычислительных контроллерах);

моделирующие, корректирующие и дополняющие вычисления в вычислительных контроллерах.

Дублированное серверное подключение.

Рисунок 4 Дублированное серверное подключение.

Для повышения надёжности и производительности система OpenSСADA допускает множественное резервирование, при котором контроллеры одного экземпляра отражаются в другом. При использовании подобной конфигурации возможно распределение нагрузки опроса/вычисления на различных станциях. Данная конфигурация позволяет выполнять функции:

резервирование параметров;

резервирование архивов;

распределение нагрузки опроса по серверам;

предоставление конфигурационного WEB интерфейса;

вторичное регулирование (регулирование в вычислительных контроллерах);

моделирующие, корректирующие и дополняющие вычисления в вычислительных контроллерах с возможностью распределения нагрузки по серверам.

Дублированное серверное подключение на одном сервере.

Рисунок 5 Дублированное серверное подключение в рамках одного сервера.

Частным случаем дублированного соединения является дублированное соединение в рамках одного сервера, т. е запуск нескольких станций на одной машине с перекрещиванием параметров. Целью данной конфигурации является повышение надёжности и отказоустойчивости системы путём резервирования ПО.

Клиентский доступ посредством Web-интерфейса. Место руководителя.

Рисунок 6 Клиентский доступ посредством WEB-интерфейса.

Для визуализации данных содержащихся на сервере хорошим решением является использование пользовательского WEB-интерфейса. Данное решение позволяет использовать стандартный WEB-браузер у клиента и следовательно является наиболее гибким поскольку не привязано к одной платформе, т.е. является кроссплатформенным Однако это решение имеет существенные недостатки – это невысокая производительность и надёжность. В связи с этим рекомендуется использовать данный метод для визуализации некритичных данных или данных имеющих резервный высоконадёжный способ визуализации. Например хорошим решением будет использование этого метода у начальства промышленных установок, где всегда существует операторская с надёжным способом визуализации. Данная конфигурация позволяет выполнять следующие функции:

опрос сервера на предмет получения данных;

визуализация данных в доступном для понимания виде;

формирование протоколов, отчётов;

манипуляция параметрами допускающими изменение.

Автоматизированное рабочее место (место руководителя/оператора)

Рисунок 7 Автоматизированное рабочее место.

Для визуализации критических данных, а также в случае если требуется высокое качество и производительность можно использовать визуализацию на основе системы OpenSCADA сконфигурированной с GUI модулем. Данная конфигурация позволяет выполнять следующие функции:

опрос сервера на предмет обновления текущих значений;

визуализация опрошенных данных в доступной для понимания форме;

формирование протоколов и отчётов;

манипуляция параметрами допускающими изменения.

АРМ с сервером сбора и архивирования на одной машине (место оператора, модель ...)

Рисунок 8 АРМ с сервером сбора и архивирования на одной машине.

Полнофункциональная клиент-серверная конфигурация на одной машине используется для повышения надёжности системы в целом путём запуска клиента и сервера в разных процессах. Данная конфигурация позволяет, без последствий для сервера, останавливать клиент и выполнять с ним различные профилактические работы. Рекомендуется для использования на станциях оператора путём установки двух машин совмещающих в себе станции оператора и резервированный сервер. Данная конфигурация позволяет выполнять следующие функции:

опрос контроллеров;

обслуживание клиентских запросов;

визуализация;

выдача управляющих воздействий;

генерация протоколов и отчётов;

вторичное регулирование;

моделирующие, корректирующие и дополнительные вычисления в вычислительных контроллерах;

сбор и визуализация информации о персональном компьютере, сервере ... .

Простейшее смешанное подключение (модель, демонстрация, конфигуратор ...)

Рисунок 9 Простейшее смешанное подключение Смешанное подключение совмещает функции сервера и клиента. Может использоваться для тестовых, демонстрационных функций, а также для предоставления моделей технологических процессов как единое целое. В этом режиме могут выполняться следующие функции:

опрос контроллеров;

обслуживание клиентских запросов;

визуализация;

выдача управляющих воздействий;

генерация протоколов и отчётов;

вторичное регулирование;

моделирующие, корректирующие и дополняющие вычисления в вычислительных контроллерах;

сбор и визуализация текущей информации о персональном компьютере, сервере ... ;

конфигурация баз данных, подключений и др.

Устойчивая, распределённая конфигурация

Рисунок 10 Устойчивая-распределённая конфигурация.

Данная конфигурация является одним из вариантов устойчивого/надёжного соединения. Устойчивость достигается путём распределения функций на:

сервера опроса;

центральный сервер архивирования и обслуживания клиентских запросов;

клиенты: АРМы и WEB-браузеры.

Сервер опроса, конфигурируется на основе системы OpenSCADA и представляет собой задачу (группу задач) занимающихся опросом контроллера (группы контроллеров одного типа). Полученные значения доступны центральному серверу через любой транспорт, поддержка которого добавляется путём подключения соответствующего модуля транспорта. Для снижения частоты опроса и величины сетевого трафика, сервер опроса может оснащаться небольшим архивом значений. Конфигурация сервера опроса хранится в одной из доступных БД.

Центральный сервер архивирования и обслуживания клиентских запросов выполняет функцию централизованного сбора и обработки параметров серверов опроса и их значений. Доступ к серверам опроса выполняется посредством одного из доступных в OpenSCADA транспортов+протоколов (на примере это SGA). Для предоставления единого интерфейса доступа к параметрам и контроллерам используется модуль NetCntr который отражает данные серверов опроса на структуру локальных параметров.

Для выполнения внутренних вычислений и дополнительного анализа параметров используются вычислительные контроллеры.

Для разностороннего и глубокого архивирования используются различные модули архивов.

Для доступа клиентов к серверу используются доступные для OpenSCADA сетевые транспорты (на примере это Sockets).

Конфигурация Центрального сервера хранится в одной из доступных БД (на примере это сетевая СУБД MySQL).

Для предоставления пользовательского WEB-интерфейса используется модуль WebCfg.

Различные клиенты, в их числе АРМ и WEB-браузеры, выполняются на отдельных машинах в необходимом количестве. АРМ реализуется на основе системы OpenSCADA. В его функции входит опрос значений параметров из Центрального сервера и их визуализация на GUI интерфейсе(ах). Для получения параметров в АРМ, также, используется модуль отражения удалённых параметров NetCntr. Для предоставления доступа к архивам может использоваться модуль архива сетевого типа. Конфигурация АРМ может храниться в одной из доступных БД (в примере это сетевая СУБД MySQL расположенная на машине Центрального сервера архивирования).

Внутренняя структура системы. API системы OpenSCADA.

Рисунок 11 Статическая диаграмма классов

Общая структура системы. Модульность (TSubSYS, TModule)

Корнем системы является объект TSYS от которого строится всё дерево системы. Корень системы содержит подсистемы TSubSYS. Подсистемы могут быть модульными и не модульными. Отличие модульных подсистем четко отслеживается на рисунке 11. Так, модульные подсистемы обязательно содержат список модульных объектов (TModule), например подсистема архивы TArchiveS содержит модульные объекты TTipArchive. В тоже время не модульная подсистема таких объектов не содержит. Например подсистема безопасности TSeсurity.

Продолжением объекта системы выполняющего функции обслуживания потока системных сообщений выступает объект TMess который их концентрирует во внутреннем буфере и раздаёт по запросу элементам системы.

Корневой объект системы (TSYS)

Наследован от:	TCntrNode.
Наследуется:	

Данные:

Способы кодирования (enum - IO::Code):

Path	- путь (символы '/' в ':');

PathEl	- элемент пути (символы: '/', ':' и '%' к виду '%2f');

HttpURL – адрес браузера (http url);

Html	- спец символов для использования в html;

JavaSc	- символов конца строки для JavaScript.

Публичные методы:

TSYS( int argi, char ** argb, char **env );

Инициирующий конструктор.

void load( );

Загрузка системы.

void save( );

Сохранение системы.

int start( );

Запуск системы.

string station();

Имя станции/системы.

string user();

Системный пользователь от имени которого запущена система.

void list( vector<string> &list );

Список подсистем зарегистрированных в системе.

bool present( const string &name );

Проверка на наличия указанной подсистемы.

void add( TSubSYS *sub );

Добавление/регистрация подсистемы.

void del( const string &name );

Удаление подсистемы.

AutoHD<TSubSYS> at( const string &name );

Подключение к указанной подсистеме.

AutoHD<TUIS> ui();

Прямой доступ к подсистеме «Пользовательские интерфейсы».

AutoHD<TArchiveS> archive();

Прямой доступ к подсистеме «Архивы».

AutoHD<TBDS> db();

Прямой доступ к подсистеме «Базы данных».

AutoHD<TControllerS> controller();

Прямой доступ к подсистеме «Контроллеры».

AutoHD<TProtocolS> protocol();

Прямой доступ к подсистеме «Протоколы».

AutoHD<TTransportS> transport();

Прямой доступ к подсистеме «Транспорты».

AutoHD<TSpecialS> special();

Прямой доступ к подсистеме «Специальные».

AutoHD<TParamS> param();

Прямой доступ к подсистеме «Параметры».

AutoHD<TModSchedul> modSchedul();

Прямой доступ к подсистеме «Управление модулями».

AutoHD<TSeсurity> seсurity();

Прямой доступ к подсистеме «Безопасность».

AutoHD<TFunctionS> func();

Прямой доступ к подсистеме «Функции».

string cfgFile();

Имя конфигурационного файла системы.

XMLNode &cfgRoot();

Спарсеная структура конфигурационного файла.

bool genDB( );

Признак использования общей БД для всей системы.

TBDS::SName nameDBPrep( const TBDS::SName &nbd, bool full = false );

Формирование полного имени БД с учётом признака общности БД, а также значения типа и имени БД по умолчанию.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

static void sighandler( int signal );

Функция стандартного обработчика сигналов. Может использоваться элементами системы для обработки специфических сигналов.

unsigned long long sysClk( );

Расчётная частота процессора на котором функционирует система.

void clkCalc( );

Расчёт частоты процессора на котором работает система.

unsigned long long shrtCnt( );

Функция замера малых интервалов времени. Возвращает значение счетчика тактов процессора.

static long TZ();

Время системного тика процессора.

static bool eventWait( bool &m_mess_r_stat, bool exempl, const string &loc, time_t time = 0 );

Функция системного ожидания события <exempl > для переменной <m_mess_r_stat> в течении указанного интервала времени <time> для источника <loc>.

static string int2str( int val, char view = C_INT_DEC );

Функция преобразования целого в строку.

static string real2str( double val );

Функция преобразования вещественного в строку.

static string fNameFix( const string &fname );

Преобразование относительных имён файлов к абсолютным.

static bool strEmpty( const string &val );

Проверка строки на пустоту, с учётом пробелов и других незначащих символов в строке.

static string strSepParse( const string &path, int level, char sep );

Разбор строки <path> на составляющие отделённые разделителем <sep>.

static string pathLev( const string &path, int level, bool encode = true );

Выделение элементов пути <path> с возможнось их декодирования.

static string strCode( const string &in, Code tp );

Кодирование строки.

static string strEncode( const string &in, Code tp );

Декодирование строки.

Объект сообщений системы (TMess).

Наследован от:	
Наследуется:	

Данные:

Типы/уровни сообщений (enum - TMess::Type):

Debug	- отладка;

Info	- информация;

Notice	– замечание;

Warning - предупреждение;

Error	- ошибка;

Crit	- критическая ситуация;

Allert	- сигнализация;

Emerg	- авария;

Структура сообщений (struct - TMess::SRec):

time_t time;	- время сообщения;

string categ;	- категория сообщения (обычно путь внутри системы);

Type level;	- уровень сообщения;

string mess;	- сообщение.

Публичные методы:

void load();

Загрузка.

string codeConv( const string &fromCH, const string &toCH, const string &mess);

Конвертация кодировки сообщения.

string codeConvIn( const string &fromCH, const string &mess);

Конвертация кодировки сообщения в кодировку системы.

string codeConvOut( const string &toCH, const string &mess);

Конвертация кодировки сообщения из системной кодировку.

static const char *I18N( const char *mess, const char *d_name = NULL );

Локализация сообщений.

static string I18Ns( const string &mess, const char *d_name = NULL );

Локализация сообщений.

static bool chkPattern( const string &val, const string &patern );

Проверка принадлежности строки по шаблону.

string lang( );

Язык системы.

string &charset( );

Системная кодировка.

int logDirect( );

Направление ведения логов (stdout, stderr, syslog);

int messBufLen( );

Размер буфера сообщений.

int messLevel( );

Уровень пропускаемых сообщений.

void lang( const string &lang );

Установка языка системы.

void logDirect(int dir);

Установка направления ведения логов.

void messBufLen(int len);

Установка размера буфера сообщений.

void messLevel(int level);

Установка уровня пропускаемых сообщений.

void put( const char *categ, Type level, const char *fmt, ... );

Поместить сообщение в буфер.

void get( time_t b_tm, time_t e_tm, vector<TMess::SRec> & recs, const string &category = "", Type level = Debug );

Запросить сообщение из буфера.

Объект подсистемы (TSubSYS)

Наследован от:	TCntrNode.
Наследуется:	TArchiveS, TProtocolS, TBDS, TFunctionS, TSeсurity, TModShedul, TTransportS, TUIS, TSpecialS, TControllerS, TParamS.

Публичные методы:

TSubSYS( TSYS *app, char *id, char *name, bool modi = false );

Инициирующий конструктор. Признак <modi> указывает на модульность подсистемы.

string subId();

Идентификатор подсистемы.

string subName();

Локализованное имя подсистемы.

bool subModule();

Признак модульности подсистемы.

virtual int subVer( );

Версия подсистемы.

virtual void subLoad( );

Загрузка подсистемы.

virtual void subSave( );

Сохранение подсистемы.

virtual void subStart( );

Запуск подсистемы.

virtual void subStop( );

Останов подсистемы.

void modList( vector<string> &list );

Для модульной подсистемы.

bool modPresent( const string &name );

Проверка на наличие указанного модуля.

void modAdd( TModule *modul );

Добавление/регистрация модуля.

void modDel( const string &name );

Удаление модуля.

AutoHD<TModule> modAt( const string &name );

Подключение к модулю.

TSYS &owner();

Система - владелец подсистемы.

Защищённые методы:

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

AutoHD<TCntrNode> ctrAt( const string &br );

Подключение к ветви языка управления.

Объект модуля (TModule)

Наследован от:	TCntrNode.
Наследуется:	TProtocol, TTipBD, TTipArchive, TTipTransport, TUI, TSpecial,TTipController.

Данные:

Структура данных про подключаемые модули (struct - TModule::SAt):

string id;	- идентификатор модуля;

string type;	- тип модуля (подсистема);

int t_ver;	- версия типа модуля (подсистемы).

Структура экспортируемой функции (class - TModule::ExpFunc):

string prot;	- прототип функции;

string dscr;	- локализованное описание функции;

void (TModule::*ptr)();	- относительный адрес функции.

Публичные методы:

const string &modId();

Идентификатор модуля.

string modName();

Локализованное имя модуля.

virtual void modLoad( );

Загрузка модуля.

virtual void modSave( );

Сохранение модуля.

virtual void modStart( );

Запуск модуля.

virtual void modStop( );

Останов модуля.

virtual void modInfo( vector<string> &list );

Список информационных элементов модуля.

virtual string modInfo( const string &name );

Получение содержимого указанного информационного элемента.

void modFuncList( vector<string> &list );

Список экспортируемых функций модуля.

ExpFunc &modFunc( const string &prot );

Получить информацию о экспортируемой функции модуля.

void modFunc( const string &prot, void (TModule::**offptr)() );

Вызов экспортируем функции модуля.

const char *I18N( const char *mess );

Функция локализации модульных сообщений.

string I18Ns( const string &mess );

Функция локализации модульных сообщений.

TSubSYS &owner();

Подсистема - владелец модуля.

Защищённые методы:

void postEnable();

Вызывается после подключение модуля к динамическому дереву.

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

AutoHD<TCntrNode> ctrAt( const string &br );

Подключение к ветви языка управления.

void modFuncReg( ExpFunc *func );

Регистрация экспортируемых функций модулем.

Подсистема “Базы Данных” (TBDS)

Подсистема «Базы Данных» представлена объектом TBDS который содержит модульные объекты типов БД TTipBD. Каждый тип базы данных содержит объекты отдельно взятых баз данных данного типа TBD. Каждая БД, в свою очередь, содержит объекты своих таблиц TTable.

Объект подсистемы «Базы Данных» (TBDS)

Наследован от:	TSubSYS.
Наследуется:	

Данные:

Структура полного имени БД (class - TBDS::SName):

string tp;	- тип БД;

string bd;	- имя БД;

istring tbl;	- имя таблицы.

Публичные методы:

TBDS( TSYS *app );

Инициализирующий конструктор.

int subVer( );

Версия подсистемы.

void subLoad( );

Загрузка подсистемы.

AutoHD<TTable> open( const TBDS::SName &bd_t, bool create = false );

Открытие БД по её полному пути. Полный путь включает: тип БД, имя БД и имя таблицы.

void close( const TBDS::SName &bd_t );

Закрытие БД по её полному пути.

bool dataSeek( AutoHD<TTable> &tbl, const string &path, int lev, TConfig &cfg );

Общее сканирование источника данных. В качестве источника выступает конфигурационный файл или БД. Если БД доступна то она и используется иначе используется конфигурационный файл.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

Модульный объект типов баз данных (TTtipBD)

Наследован от:	TModule.
Наследуется:	Корневыми объектами модулей подсистемы «БД».

Публичные методы:

void list( vector<string> &list );

Список подключенных БД.

bool openStat( const string &db );

Признак указывающий на то что запрошенная БД открыта.

void open( const string &name, bool create );

Открытие БД. Если установлен признак <create> то, в случае отсутствия БД будет создана.

void close( const string &name );

Закрытие БД.

void del( const string &name );

Удаление БД.

AutoHD<TBD> at( const string &name );

Подключение к открытой БД.

Объект базы данных (TBD)

Наследован от:	TCntrNode.
Наследуется:	Объектами баз данных модулей подсистемы «БД».

Публичные методы:

TBD( const string &name, TTipBD *iown = NULL );

Инициализирующий конструктор.

string &name();

Имя БД.

void list( vector<string> &list );

Список подключенных таблиц.

bool openStat( const string &table );

Признак указывающий на то что запрошенная таблица открыта.

void open( const string &table, bool create );

Открытие таблицы. Если установлен признак <create> то, в случае отсутствия таблица будет создана.

void close( const string &table );

Закрытие таблицы.

void del( const string &table );

Удаление таблицы.

AutoHD<TTable> at( const string &name );

Подключение к таблице.

TTipBD &owner();

Тип базы данных – владелец данной БД.

Объект таблицы (TTable)

Наследован от:	TCntrNode.
Наследуется:	Объектами таблиц модулей подсистемы «БД».

Публичные методы:

TTable( const string &name, TBD *iown = NULL );

Инициализирующий конструктор.

string &name();

Имя таблицы.

virtual bool fieldSeek( int row, TConfig &cfg );

Сканирование записей таблицы.

virtual void fieldGet( TConfig &cfg );

Запрос указанной записи.

virtual void fieldSet( TConfig &cfg )

Установка значений указанной записи. В случае отсутствия запись будет создана.

virtual void fieldDel( TConfig &cfg );

Удаление указанной записи.

TBD &owner();

БД – владелец данной таблицы.

Подсистема “Контроллеры” (TControllerS)

Подсистема “Контроллеры” представлена объектом TControllerS который содержит модульные объекты типов контроллеров TTipController. Объект типов контроллеров содержит объекты контроллеров TController и объекты типов параметров TTipParam. Объекты типов параметров предоставляются модулем контроллера и содержат структуру БД отдельных типов параметров (аналоговые, дискретные ...). Объекты контроллеров содержат объекты параметров TParamContr. Каждый параметр ассоциируется с одним из типов параметров. Для хранения атрибутов, параметр наследуется от объекта значений TValue, который и содержит значения атрибутов TVal.

Объект подсистемы «Контроллеры» (TControllerS)

Наследован от:	TSubSYS, TElem.
Наследуется:	

Данные:

Структура полного имени контроллера физического уровня (class - TControllerS::SName):

string tp;	- тип контроллера;

string obj;	- имя контроллера.

Публичные методы:

TControllerS( TSYS *app );

Инициализирующий конструктор.

int subVer( );

Версия подсистемы.

void subLoad( );

Загрузка подсистемы.

void subSave( );

Загрузка подсистемы.

virtual void subStart( );

Запуск подсистемы.

virtual void subStop( );

Останов подсистемы.

TBDS::SName BD();

Полное имя БД содержащей конфигурацию контроллеров.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

Модульный объект типа контроллера (TTipController)

Наследован от:	TModule, TElem.
Наследуется:	Корневыми объектами модулей подсистемы «Контроллеры».

Публичные методы:

void list( vector<string> &list );

Список контроллеров.

bool present( const string &name );

Проверка на наличие указанного контроллера.

void add( const string &name, const TBDS::SName &bd );

Добавить контроллер.

void del( const string &name );

Удалить контроллер.

AutoHD<TController> at( const string &name, const string &who = "" );

Подключиться к контроллеру.

unsigned tpPrmToId( const string &name_t );

Получение индекса типа параметров по имени.

unsigned tpPrmSize( );

Количество типов параметров.

TTipParam &tpPrmAt( unsigned id );

Получить объект типа параметров.

int tpParmAdd( const char *id, const char *n_db, const char *name );

Добавление/регистрация типа параметров.

Защищённые методы:

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

AutoHD<TCntrNode> ctrAt( const string &br );

Подключение к ветви языка управления.

Объект контроллера (TController)

Наследован от:	TModule, TConfig.
Наследуется:	Объектами контроллеров модулей подсистемы «Контроллеры».

Публичные методы:

TController( const string &name_c, const TBDS::SName &bd, TTipController *tcntr, TElem *cfgelem );

Инициализирующий конструктор контроллера.

string &name();

Имя контроллера.

string &lName();

Описание контроллера.

bool &toEnable();

Признак «Включать контроллер».

bool &toStart();

Признак «Запускать контроллер».

bool enableStat();

Состояние «Включен».

bool startStat();

Состояние «Запущен».

void load( );

Загрузка контроллера.

void save( );

Сохранение контроллера.

void start( );

Запуск контроллера.

void stop( );

Останов контроллера.

void enable( );

Включение контроллера.

void disable( );

Отключение контроллера.

void list( vector<string> &list );

Список параметров в контроллере.

bool present( const string &name );

Проверка на наличие параметра.

void add( const string &name, unsigned type, int pos = -1);

Добавление параметра.

void del( const string &name );

Удаление параметра.

AutoHD<TParamContr> at( const string &name, const string &who = "th_contr" );

Подключение к параметру.

TBDS::SName BD();

Полное имя БД содержащей конфигурацию контроллера.

TTipController &owner();

Тип контроллера/модуль - владелец данным контроллером.

Защищённые методы:

virtual void load_( );

Загрузка контроллера.

virtual void save_( );

Сохранение контроллера.

virtual void start_( );

Запуск контроллера.

virtual void stop_( );

Останов контроллера.

virtual void enable_( );

Включение контроллера.

virtual void disable_( );

Отключение контроллера.

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

AutoHD<TCntrNode> ctrAt( const string &br );

Подключение к ветви языка управления.

void preDisable(int flag);

Вызывается перед отключением от динамического дерева.

void postDisable(int flag);

Вызывается после отключением от динамического дерева.

Объект типа параметров (TTipParam)

Наследован от:	TElem.
Наследуется:	

Публичные методы:

TTipParam( const char *id, const char *name, const char *db );

Инициализирующий конструктор.

string name();

Имя типа параметра.

string lName();

Описание типа параметра.

string BD();

БД типа параметра.

Объект параметра физического уровня (TParamContr)

Наследован от:	TConfig, TValue.
Наследуется:	Объектами параметров модулей подсистемы «Контроллеры».

Публичные методы:

TParamContr( const string &name, TTipParam *tpprm );

Инициализирующий конструктор.

string &name();

Имя параметра.

string &lName();

Описание параметра.

TTipParam &type();

Тип параметра.

bool toEnable();

Признак «Включать параметр».

bool toExport();

Признак «Экспортировать параметр на логический уровень».

bool enableStat();

Состояние «Включен».

bool exportStat();

Состояние «Экспортирован»

virtual void enable();

Включить параметр.

virtual void disable();

Отключить параметр.

void load( );

Загрузить параметр.

void save( );

Сохранить параметр.

void exportPrm( );

Экспортировать параметр на логический уровень.

void unExportPrm( );

Снять экспорт параметра с логического уровня.

bool operator==( TParamContr & PrmCntr );

Сравнение параметров.

TParamContr &operator=( TParamContr & PrmCntr );

Копирование параметра.

TController &owner();

Контроллер – владелец параметра.

Защищённые методы:

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

void preDisable(int flag);

Вызывается перед отключением от динамического дерева.

void postDisable(int flag);

Вызывается после отключением от динамического дерева.

Объект значения (TValue)

Наследован от:	TValElem, TCntrNode.
Наследуется:	TParamContr.

Публичные методы:

TValue( );

Инициализация как хранилище динамических данных.

TValue( TConfig *cfg );

Инициализация отражения статических данных (БД).

void vlList( vector<string> &list );

Список атрибутов.

bool vlPresent( const string &name );

Проверка на наличия указанного атрибута.

AutoHD<TVal> vlAt( const string &name );

Подключение к атрибуту.

Защищённые методы:

void vlAttElem( TElem *ValEl );

Подключение структуры данных.

void vlDetElem( TElem *ValEl );

Отключение структуры данных.

TElem &vlElem( const string &name );

Получить структуру данных по её имени.

virtual void vlSet( TVal &val );

Упреждающая функция установки значения. Используется для прямой записи.

virtual void vlGet( TVal &val );

Упреждающая функция получения значения. Используется для прямого чтения.

void cntrMake( XMLNode *fld, const char *req, const char *path, int pos );

Генератор формы структуры значения на языке контроля.

void cntrCmd( const string &elem, XMLNode *fld, TCntrNode::Command cmd );

Обработка команд языка контроля для формы значений.

Объект атрибута (TVal)

Наследован от:	TCntrNode.
Наследуется:	

Данные:

Дополнительные флаги к объекту TFld (define):

FLD_DRD	- флаг прямого чтения значения;

FLD_DWR	- флаг прямой записи значения.

Структура времени (struct - STime):

time_t s;	- время в секундах от 01.01.1970;

long us;	- микросекунд в секунде.

Публичные методы:

TVal(TFld &fld, TValue *owner);

Инициализация как хранилище динамических данных.

TVal(TCfg &cfg, TValue *owner);

Инициализация как отражение статических данных (БД).

const string &name();

Имя атрибута.

TFld &fld();

Описатель структуры атрибута.

bool valid();

Признак «Атрибут валиден».

void valid( bool val );

Установка признака валидности.

string getSEL( STime *tm = NULL );

Запрос значения выборочного типа на указанное время. Если NULL то последнее значение.

string getS( STime *tm = NULL );

Запрос значения строкового типа на указанное время. Если NULL то последнее значение.

double getR( STime *tm = NULL );

Запрос значения вещественного типа на указанное время. Если NULL то последнее значение.

int getI( STime *tm = NULL );

Запрос значения целого типа на указанное время. Если NULL то последнее значение.

bool getB( STime *tm = NULL );

Запрос значения логического типа на указанное время. Если NULL то последнее значение.

void setSEL( const string &value, STime *tm = NULL, bool sys = false );

Установка значения выборочного типа.

void setS( const string &value, STime *tm = NULL, bool sys = false );

Установка значения строкового типа.

void setR( double value, STime *tm = NULL, bool sys = false );

Установка значения вещественного типа.

void setI( int value, STime *tm = NULL, bool sys = false );

Установка значения целого типа.

void setB( bool value, STime *tm = NULL, bool sys = false );

Установка значения логического типа.

Защищённые методы:

string nodeName();

Имя узла (для TCntrNode);

void vlSet( );

Упреждающая функция установки значения. Используется для прямой записи.

void vlGet( );

Упреждающая функция получения значения. Используется для прямого чтения.

Подсистема “Архивы” (TArchiveS)

Подсистема «Архивы» представлена объектом TArchiveS который содержит, на уровне подсистемы, модульные объекты типов архивов TTipArchive. Каждый объект типа архива содержит объекты архивов сообщений TArchiveMess и архивов значений TArchiveVal. API архивов значений ещё находится в стадии разработки!

Объект подсистемы «Архивы» (TArchiveS)

Наследован от:	TSubSYS.
Наследуется:	

Публичные методы:

TArchiveS( TSYS *app );

Инициализирующий конструктор.

int subVer( );

Версия подсистемы.

void subLoad( );

Загрузка подсистемы.

void subSave( );

Сохранение подсистемы.

void subStart( );

Запуск подсистемы.

void subStop( );

Останов подсистемы.

TBDS::SName messB();

Полное имя БД содержащей конфигурацию архивов сообщений.

TBDS::SName valB();

Полное имя БД содержащей конфигурацию архивов значений.

TElem &messE();

Структура БД архивов сообщений.

TElem &valE();

Структура БД архивов значений.

Модульный объект типа архива (TTipArchive)

Наследован от:	TModule.
Наследуется:	Корневыми объектами модулей подсистемы «Архивы».

Публичные методы:

void messList( vector<string> &list );

Список архивов сообщений.

bool messPresent( const string &name );

Проверка на наличие указанного архива сообщений.

void messAdd( const string &name );

Добавление архива сообщений.

void messDel( const string &name );

Удаление архива сообщений.

AutoHD<TArchiveMess> messAt( const string &name );

Подключение к архиву сообщений.

void valList( vector<string> &list );

Список архивов значений.

bool valPresent( const string &name );

Проверка на наличие указанного архива значений.

void valAdd( const string &name );

Добавление архива значений.

void valDel( const string &name );

Удаление архива значений.

AutoHD<TArchiveVal> valAt( const string &name );

Подключение к архиву значений.

Защищённые методы:

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

AutoHD<TCntrNode> ctrAt( const string &br );

Подключение к ветви языка управления.

Объект архива сообщений (TArchiveMess)

Наследован от:	TCntrNode, TConfig
Наследуется:	Объектами архивов сообщений модулей подсистемы «Архивы».

Публичные методы:

TArchiveMess(const string &name, TTipArchive *owner );

Инициализирующий конструктор.

string &name();

Имя архива.

string &lName();

Описание архива.

bool toStart();

Признак «Запускать архив».

bool startStat();

Состояние признака «Запускать архив».

void load( );

Загрузить архив.

void save( );

Сохранить архив.

virtual void start();

Запустить архив.

virtual void stop();

Остановить архив.

string &addr();

Адрес архива.

int &level();

Уровень сообщений для фильтра архивирования по уровню.

void categ( vector<string> &list );

Список шаблонов для фильтра архивирования по категории.

virtual void put( vector<TMess::SRec> &mess );

Поместить сообщения в архив.

virtual void get( time_t b_tm, time_t e_tm, vector<TMess::SRec> &mess, const string &category = "", char level = 0 );

Получить сообщения из архива для указанных настроек фильтров.

TTipArchive &owner();

Тип архива – владелец архивом сообщений.

Защищённые методы:

string nodePref();

Префикс узла (для TCntrNode).

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

void postDisable(int flag);

Вызывается после отключением от динамического дерева.

Объект архива значений (TArchiveVal)

Наследован от:	TCntrNode, TConfig
Наследуется:	Объектами архивов значений модулей подсистемы «Архивы».

Публичные методы:

TArchiveVal( const string &name, TTipArchive *owner );

Инициализирующий конструктор.

string &name();

Имя архива.

TTipArchive &owner();

Тип архива – владелец архивом значений.

Защищённые методы:

string nodePref();

Префикс узла (для TCntrNode).

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

Подсистема “Транспорты” (TTransportS)

Подсистема «Транспорты» представлена объектом TTransportS который содержит, на уровне подсистемы, модульные объекты типов транспортов TTipTransport. Каждый тип транспорта содержит объекты входящих TTransportIn и исходящих TTransportOut транспортов.

Объект подсистемы «Транспорты» (TTransportS)

Наследован от:	TSubSYS.
Наследуется:	

Публичные методы:

TTransportS( TSYS *app );

Инициализирующий конструктор.

int subVer( );

Версия подсистемы.

void subLoad( );

Загрузка подсистемы.

void subSave( );

Сохранение подсистемы.

void subStart( );

Запуск подсистемы.

void subStop( );

Останов подсистемы.

TBDS::SName inBD();

Полное имя БД содержащей конфигурацию входящих транспортов.

TBDS::SName outBD();

Полное имя БД содержащей конфигурацию исходящих транспортов.

TElem &inEl();

Структура БД входящих транспортов.

TElem &outEl();

Структура БД исходящих транспортов.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

Модульный объект типа транспортов (TTipTransport)

Наследован от:	TModule.
Наследуется:	Корневыми объектами модулей подсистемы «Транспорты».

Публичные методы:

void inList( vector<string> &list );

Список входящих транспортов.

bool inPresent( const string &name );

Проверка на наличие входящего транспорта.

void inAdd( const string &name );

Добавление входящего транспорта.

void inDel( const string &name );

Удаление входящего транспорта.

AutoHD<TTransportIn> inAt( const string &name );

Подключение к входящему транспорту.

void outList( vector<string> &list );

Список исходящих транспортов.

bool outPresent( const string &name );

Проверка на наличие исходящего транспорта.

void outAdd( const string &name );

Добавление исходящего транспорта.

void outDel( const string &name );

Удаление исходящего транспорта.

AutoHD<TTransportOut> outAt( const string &name );

Подключение к исходящему транспорту.

Защищённые методы:

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

AutoHD<TCntrNode> ctrAt( const string &br );

Подключение к ветви языка управления.

Объект входящих транспортов (TTransportIn)

Наследован от:	TCntrNode, TConfig.
Наследуется:	Объектами входящих транспортов модулей подсистемы «Транспорты».

Публичные методы:

TTransportIn( const string &name, TTipTransport *owner );

Инициализирующий конструктор.

string &name();

Имя транспорта.

string &lName();

Описание транспорта.

bool toStart();

Признак «Запускать транспорт».

bool startStat();

Состояние «Транспорт запущен».

virtual void start();

Запуск транспорта.

virtual void stop();

Останов транспорта.

void load( );

Загрузка транспорта.

void save( );

Сохранение транспорта.

TTipTransport &owner();

Тип транспорта – владелец входящим транспортом.

Защищённые методы:

string nodePref();

Префикс узла (для TCntrNode).

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

void preEnable();

Вызывается перед включением узла в динамическое дерево.

void postDisable(int flag);

Вызывается после отключением от динамического дерева.

Объект исходящих транспортов (TTransportOut)

Наследован от:	TCntrNode, TConfig.
Наследуется:	Объектами исходящих транспортов модулей подсистемы «Транспорты».

Публичные методы:

TTransportOut( const string &name, TTipTransport *owner );

Инициализирующий конструктор.

string &name();

Имя транспорта.

string &lName();

Описание транспорта.

string &address();

Адрес транспорта.

void address( const string &addr );

Установка адреса транспорта.

bool toStart();

Признак «Запускать транспорт».

bool startStat();

Состояние «Транспорт запущен».

virtual void start();

Запуск транспорта.

virtual void stop();

Останов транспорта.

void load( );

Загрузка транспорта.

void save( );

Сохранить транспорт.

virtual int messIO(char *obuf, int len_ob, char *ibuf = NULL, int len_ib = 0, int time = 0 );

Отправка данных через транспорт.

TTipTransport &owner();

Тип транспорта – владелец исходящим транспортом.

Защищённые методы:

string nodePref();

Префикс узла (для TCntrNode).

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

void preEnable();

Вызывается перед включением узла в динамическое дерево.

void postDisable(int flag);

Вызывается после отключением от динамического дерева.

Подсистема “Протоколы коммуникационных интерфейсов” (TProtocolS)

Подсистема «Протоколы коммуникационных интерфейсов» представлена объектом TProtocolS который содержит, на уровне подсистемы, модульные объекты отдельных протоколов TProtocol. Каждый протокол содержит объекты открытых сеансов входящих протоколов TProtocolIn.

Объект подсистемы «Протоколы коммуникационных интерфейсов» (TProtocolS)

Наследован от:	TSubSYS.
Наследуется:	

Публичные методы:

TProtocolS( TSYS *app );

Инициализирующий конструктор.

int subVer( );

Версия подсистемы.

void subLoad( );

Загрузка подсистемы.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

Модульный объект протокола (TProtocol)

Наследован от:	TModule.
Наследуется:	Корневыми объектами модулей подсистемы «Протоколы».

Публичные методы:

void list( vector<string> &list );

Список открытых входящих сеансов.

bool openStat( const string &name );

Проверка на открытость входящего сеанса с указанным именем.

void open( const string &name );

Открытие входящего сеанса.

void close( const string &name );

Закрытие входящего сеанса.

AutoHD<TProtocolIn> at( const string &name );

Подключение к открытому входящему сеансу.

Объект сеанса входящего протокола (TProtocolIn)

Наследован от:	TCntrNode.
Наследуется:	Объектами сеанса входящего протокола модулей подсистемы «Протоколы».

Публичные методы:

TProtocolIn( const string &name, TProtocol *owner );

Инициализирующий конструктор.

string &name();

Имя входящего сеанса.

virtual bool mess( const string &request, string &answer, const string &sender );

Передача неструктурированных данных на обработку протоколу.

TProtocol &owner();

Протокол – владелец входящим сеансом.

Защищённые методы:

string nodeName();

Имя узла (для TCntrNode);

Подсистема “Пользовательские интерфейсы” (TUIS)

Подсистема «Пользовательские интерфейсы» представлена объектом TUIS который содержит, на уровне подсистемы, модульные объекты пользовательских интерфейсов TUI.

Объект подсистемы «Пользовательские интерфейсы» (TUIS)

Наследован от:	TSubSYS.
Наследуется:	

Публичные методы:

TUIS( TSYS *app );

Инициализирующий конструктор.

int subVer( );

Версия подсистемы.

void subLoad( );

Загрузка подсистемы.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

Модульный объект пользовательского интерфейса (TUI)

Наследован от:	TModule.
Наследуется:	Корневыми объектами модулей подсистемы «Пользовательские интерфейсы».

Защищённые методы:

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

Подсистема “Специальные” (TSpecialS)

Подсистема «Системные» представлена объектом TSpecialS который содержит, на уровне подсистемы, модульные объекты специальных TSpecial.

Объект подсистемы «Специальные» (TSpecialS)

Наследован от:	TSubSYS.
Наследуется:	

Публичные методы:

TSpecialS( TSYS *app );

Инициализирующий конструктор.

int subVer( );

Версия подсистемы.

void subLoad( );

Загрузка подсистемы.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

Модульный объект специальных (TSpecial)

Наследован от:	TModule.
Наследуется:	Корневыми объектами модулей подсистемы «Специальные».

Защищённые методы:

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

Подсистема “Безопасность” (TSeсurity)

Подсистема безопасности представлена объектом TSeсurity который содержит объекты групп TGroup и пользователей TUser.

Объект подсистемы «Безопасность» (TSeсurity)

Наследован от:	TSubSYS.
Наследуется:	

Публичные методы:

TSeсurity( TSYS *app );

Инициализирующий конструктор.

void subLoad( );

Загрузка подсистемы.

void subSave( );

Сохранение подсистемы.

bool access( const string &user, char mode, int owner, int group, int access );

Проверка доступа для пользователя <user> с правами <mode> к ресурсу с владельцем <owner> и группой <access>.

string usr( int id );

Получить имя пользователя по идентификатору.

void usrList( vector<string> &list );

Список пользователей.

bool usrPresent( const string &name );

Проверка на наличие указанного пользователя.

void usrAdd( const string &name );

Добавление пользователя.

void usrDel( const string &name );

Удаление пользователя.

AutoHD<TUser> usrAt( const string &name );

Подключение к пользователю.

string grp( int id );

Получить имя группы пользователей по идентификатору.

void grpList( vector<string> &list );

Список групп пользователей.

bool grpPresent( const string &name );

Проверка на наличие указанной группы пользователей.

void grpAdd( const string &name );

Добавление группы пользователей.

void grpDel( const string &name );

Удаление группы пользователей.

AutoHD<TGroup> grpAt( const string &name );

Подключение к группе пользователей.

TBDS::SName userBD();

Полное имя БД содержащей конфигурацию пользователей.

TBDS::SName grpBD();

Полное имя БД содержащей конфигурацию групп пользователей.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

Объект пользователя (TUser)

Наследован от:	TCntrNode, TConfig.
Наследуется:	

Публичные методы:

TUser( TSeсurity *owner, const string &name, unsigned id, TElem *el );

Инициализирующий конструктор.

string &name();

Имя пользователя.

string &lName();

Полное имя пользователя.

int &id();

Идентификатор пользователя.

string &grp();

Основная группа пользователя.

bool auth( const string &n_pass );

Аутентификация пользователя по паролю.

void name( const string &nm );

Установка имени пользователя.

void lName( const string &nm );

Установка полного имени пользователя.

void id( unsigned n_id );

Установка идентификатора пользователя.

void pass( const string &n_pass );

Установка пароля пользователя.

void grp( const string &nm_grp );

Установка основной группы пользователя.

void load();

Загрузка пользователя.

void save();

Сохранение пользователя.

TSeсurity &owner();

Подсистема «Безопасность» - владелец пользователя.

Объект группы пользователей (TGroup)

Наследован от:	TCntrNode, TConfig.
Наследуется:	

Публичные методы:

TGroup( TSeсurity *owner, const string &name, unsigned id, TElem *el );

Инициализирующий конструктор.

string &name();

Имя группы пользователей.

string &lName();

Полное имя группы пользователей.

int &id();

Идентификатор группы пользователей.

void name( const string &nm );

Установка имени группы пользователей.

void lName( const string &nm );

Установка полного имени группы пользователей.

void id( unsigned n_id );

Установка идентификатора группы пользователей.

bool user( const string &name );

Проверка на принадлежность пользователя к группе.

void load();

Загрузка пользователя.

void save();

Сохранение пользователя.

TSeсurity &owner();

Подсистема «Безопасность» - владелец группой пользователей.

Подсистема “Управление модулями” (TModSchedul)

Подсистема «Управление модулями» представлена объектом TModSchedul.

Объект подсистемы «Управление модулями» (TModSchedul)

Наследован от:	TSubSYS.
Наследуется:	

Данные:

Структура информации о разделяемой библиотеке (struct – TModSchedul::SHD):

void *hd;	- недер разделяемой библиотеки (если NULL то библиотека присутствует но не подключена);

vector<SUse> use;	- список подключенных модулей;

time_t m_tm;	- время модификации библиотеки;

string name;	- полное имя/путь разделяемой библиотеки.

Структура информации о модуле (struct – TModSchedul::SUse):

string mod_sub;	- имя модульной подсистемы;

string n_mod;	- имя модуля.

Публичные методы:

TModSchedul( TSYS *app );

Инициализирующий конструктор.

void subLoad( );

Загрузка подсистемы.

void subStart( );

Запуск подсистемы.

void subStop( );

Останов подсистемы.

void loadLibS( );

Загрузка разделяемых библиотек и инициализация модулей,

SHD &lib( const string &name );

Получение объекта разделяемой библиотеки.

void libList( vector<string> &list );

Список разделяемых библиотек.

void libLoad( const string &path, bool full );

Загрузка разделяемых библиотек по указанному пути.

void libAtt( const string &name, bool full = false);

Подключение указанной разделяемой библиотеки.

void libDet( const string &name );

Отключение разделяемой библиотеки.

string optDescr( );

Локализованная помощь по опциям командной строки и параметрам конфигурационного файла.

Подсистема “Параметры” (TParamS)

Подсистема «Параметры» представлена объектом TParamS который содержит объекты параметров логического уровня TParam.

Объект подсистемы «Параметры» (TParamS)

Наследован от:	TSubSYS, TConfig.
Наследуется:	

Публичные методы:

TParamS( TSYS *app );

Инициализирующий конструктор.

void list( vector<string> &list );

Список параметров логического уровня.

bool present( const string &param );

Проверка на наличие указанного параметра.

void add( TControllerS::SName cntr, const string &param );

Добавить/зарегистрировать параметр физического уровня.

void del( TControllerS::SName cntr, const string &param );

Удалить/снять регистрацию параметра логического уровня.

AutoHD<TParam> at( const string &name, const string &who = "" );

Подключиться к параметру логического уровня.

Объект параметра логического уровня (TParam)

Наследован от:	TCntrNode.
Наследуется:	

Публичные методы:

TParam( TControllerS::SName cntr, const string &name, TParamS *prms );

Инициализирующий конструктор.

string &name();

Имя параметра логического уровня.

int reg( TControllerS::SName cntr, const string &name );

Регистрация параметра физического уровня.

int unreg( TControllerS::SName cntr, const string &name );

Снятие регистрации параметра физического уровня.

TParamContr &at();

Активный параметр физического уровня.

TParamS &owner();

Подсистема параметры – владелец параметром логического уровня.

Подсистема “Функции” (TFunctionS)

Подсистема «Функции» представлена объектом TFunctionS который содержит объекты библиотек функций TLibFunc. Каждая библиотека содержит объекты функций TFunction. В свою очередь функция включает атрибуты IO. Для хранения значений параметров функций предназначен объект TValFunc.

Объект подсистемы «Функции» (TFunctionS)

Наследован от:	TSubSYS.
Наследуется:	

Публичные методы:

TFunctionS(TSYS *app);

Инициализирующий конструктор.

void subStart( );

Запуск подсистемы.

void subStop( );

Останов подсистемы.

void list( vector<string> &ls );

Список зарегистрированных библиотек.

bool present( const string &id );

Проверка на наличие указанной библиотеки.

void reg( TLibFunc *lib );

Регистрация библиотеки функций.

void unreg( const string &id );

Снятие регистрации библиотеки функций.

AutoHD<TLibFunc> at( const string &id );

Подключение к библиотеке функций.

Объект библиотеки функций (TLibFunc)

Наследован от:	TCntrNode.
Наследуется:	Наследуется модулями и узлами системы содержащими библиотеки функций.

Публичные методы:

TLibFunc( const string &iid );

Инициализирующий конструктор.

string &id();

Идентификатор библиотеки.

virtual string name() = 0;

Локализованное имя библиотеки.

virtual string descr() = 0;

Описание библиотеки.

bool startStat( );

Признак «Библиотека запущена».

virtual void start( bool val );

Запуск/останов библиотеки.

void list( vector<string> &ls );

Список функций в библиотеке.

bool present( const string &id );

Проверка на наличие функции.

AutoHD<TFunction> at( const string &id );

Подключение к функции.

Защищённые методы:

void reg( TFunction *fnc );

Регистрация/добавление функции в библиотеку.

void unreg( const string &id );

Снятие регистрации/удаление функции из библиотеки.

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

AutoHD<TCntrNode> ctrAt( const string &br );

Подключение к ветви языка управления.

Объект функции (TFunction)

Наследован от:	TCntrNode.
Наследуется:	Наследуется модулями и узлами системы содержащими функции.

Публичные методы:

TFunction( const string &iid );

Инициализирующий конструктор.

string &id();

Идентификатор функции.

virtual string name() = 0;

Локализованное имя функции.

virtual string descr() = 0;

Описание функции.

bool startStat();

Состояние «Функция запущена».

virtual void start( bool val );

Запуск/останов функции.

void ioList( vector<string> &list );

Список параметров функции.

int ioId( const string &id );

Получение идентификатора параметра.

int ioSize();

Количество параметров.

IO *io( int id );

Получение параметра по идентификатору.

virtual void calc( TValFunc *val ) = 0;

Вычисление алгоритма функции над указанными значениями.

void valAtt( TValFunc *vfnc );

Вызывается объектом значений в случае связывания с функцией.

void valDet( TValFunc *vfnc );

Вызывается объектом значений в случае развязывания от функции.

virtual void preIOCfgChange();

Вызывается перед изменением конфигурации.

virtual void postIOCfgChange();

Вызывается после изменения конфигурации.

Защищённые методы:

string nodeName();

Имя узла (для TCntrNode);

void cntrCmd_( const string &a_path, XMLNode *opt, TCntrNode::Command cmd );

Обслуживание команд языка управления.

void ioAdd( IO *io );

Добавить параметр.

void ioIns( IO *io, int pos );

Вставить параметр.

void ioDel( int pos );

Удалить параметр.

void ioMove( int pos, int to );

Переместить параметр.

Объект параметра функции (IO)

Наследован от:	
Наследуется:	

Данные:

Типы параметров (enum - IO::Type):

IO::String	- строка/текст;

IO::Integer	- целое;

IO::Real	- вещественное;

IO::Boolean	- логический;

IO::Vector	- вектор (не используется).

Режимы параметра (enum - IO::Mode):

IO::Input	- вход;

IO::Output	- выход;

IO::Return	- возврат.

Публичные методы:

IO( const char *iid, const char *iname, IO::Type itype, IO::Mode imode, const char *idef = "", bool ihide = false, const char *ivect = "" );

Инициализирующий конструктор.

const string &id();

Идентификатор параметра функции.

const string &name();

Локализованное имя параметра функции.

const Type &type();

Тип параметра функции.

const Mode &mode();

Режим доступа к параметру функции.

const string &def();

Значение по умолчанию.

const string &vector();

Вектор которому принадлежит параметр функции.

bool hide();

Признак «Скрыто».

void id( const string &val );

Установить идентификатор.

void name( const string &val );

Установить имя.

void type( Type val );

Установить тип.

void mode( Mode val );

Установить режим.

void def( const string &val );

Установить значение по умолчанию.

void vector( const string &val );

Установит вектор.

void hide( bool val );

Установить/снять признак «Скрыто».

Объект значения функции (TValFunc).

Наследован от:	
Наследуется:	

Публичные методы:

TValFunc( TFunction *ifunc = NULL );

Инициализирующий конструктор.

void ioList( vector<string> &list );

Список параметров функции.

int ioId( const string &id );

Получение идентификатор параметра.

IO::Type ioType( unsigned id );

Тип параметра.

IO::Mode ioMode( unsigned id );

Режим параметра.

bool ioHide( unsigned id );

Признак параметра «Скрыт».

string getS( unsigned id );

Получить значение (строка).

int getI( unsigned id );

Получить значение (целое).

double getR( unsigned id );

Получить значение (вещественное).

bool getB( unsigned id );

Получить значение (логическое).

void setS( unsigned id, const string &val );

Установить значение (строка).

void setI( unsigned id, int val );

Установить значение (целое).

void setR( unsigned id, double val );

Установить значение (вещественное).

void setB( unsigned id, bool val );

Установить значение (логическое).

bool dimens();

Признак «Измерять время вычисления».

void dimens( bool set );

Установка/сброс признака «Измерять время вычисления».

virtual void calc( );

Вычислить.

double calcTm( );

Время вычисления.

TFunction *func( );

Связанная функция.

void func( TFunction *ifunc );

Связать с указанной функцией.

virtual void preIOCfgChange();

Вызывается перед изменением конфигурации.

virtual void postIOCfgChange();

Вызывается после изменения конфигурации.

Данные в системе OpenSCADA и их хранение в БД (TConfig)

Хранение конфигурационных данных системы построено на объектах TConfig и TElem. Эти объекты хранят структуру и значения полей БД, что позволяет выполнят прямую загрузку и сохранение конфигурации через подсистему «БД».

Объект TElem содержит структуру записи БД. Структура записи содержит исчерпывающую информацию о элементах их типах размерах и остальных параметрах. Информации в данной структуре достаточно для создания, контроля и управления реальной структурой БД. Элементарной единицей записи является поле Tfld.

Объект TСonfig является наследником от TElem и содержит реальные значения элементов. TConfig используется в качестве параметры в функциях манипуляции с записями таблиц в подсистеме «БД». Элементарной единицей записи является поле TCfg.

Для предоставления возможности предупреждения хранилища данных о смене структуры предусмотрен объект TValElem от которого наследуется хранилище TConfig и список которых содержится в структуре TElem.

Объект данных (TConfig)

Наследован от:	TValElem
Наследуется:	TParamContr, TController, TArchiveMess, TArchiveVal, TTransportIn, TTransportOut, TUser, TGroup, TParamS, а также модульные объекты хранящие свои данные в БД.

Публичные методы:

TConfig( TElem *Elements = NULL );

Инициализирующий конструктор.

TConfig &operator=(TConfig &cfg);

Копирование.

void cfgList( vector<string> &list );

Список элементов.

TCfg &cfg( const string &n_val );

Получение элемента.

void elem(TElem *Elements);

Установка структуры.

TElem &elem();

Структура.

Защищённые методы:

virtual bool cfgChange( TCfg &cfg );

Вызывается в случае изменения содержимого ячейки.

void cntrMake( XMLNode *fld, const char *req, const char *path, int pos );

Генерация формы данных на языке управления.

void cntrCmd( const string &elem, XMLNode *fld, TCntrNode::Command cmd );

Обработка команд языка управления для формы данных.

Ячейка данных (TCfg)

Наследован от:	
Наследуется:	

Данные:

Дополнительные флаги к TFld (define):

FLD_NOVAL	- не отражать на значения (TValue);

FLD_KEY	- ключевое поле.

Публичные методы:

TCfg( TFld &fld, TConfig &owner );

Инициализирующий конструктор.

const string &name();

Имя элемента.

bool operator==(TCfg & cfg);

Сравнение элементов.

TCfg &operator=(TCfg & cfg);

Копирование элементов.

bool view( );

Признак «Элемент видим».

void view( bool vw );

Установка/сброс признака «Элемент видим».

TFld &fld();

Конфигурация поля.

string getSEL( );

Получить значение выборочного типа.

string getS( );

Получить значение строкового типа.

double getR( );

Получить значение вещественного типа.

int getI( );

Получить значение целого типа.

bool getB( );

Получить значение логического типа.

string &getSd( );

Получить прямой доступ к значению строкового типа.

double &getRd( );

Получить прямой доступ к значению вещественного типа.

int &getId( );

Получить прямой доступ к значению целого типа.

bool &getBd( );

Получить прямой доступ к значению логического типа.

void setSEL( const string &val );

Установить значение выборочного типа.

void setS( const string &val );

Установить значение строкового типа.

void setR( double val );

Установить значение вещественного типа.

void setI( int val );

Установить значение целого типа.

void setB( bool val );

Установить значение логического типа.

Объект структуры данных (TElem)

Наследован от:	
Наследуется:	TTipParam, TControllerS, TTipController, а также модульные объекты совмещающие функции хранения структуры.

Публичные методы:

TElem( const string &name = "" );

Инициализация структуры с указанным именем.

string &elName( );

Имя структуры.

void fldList( vector<string> &list );

Список элементов структуры.

unsigned fldSize();

Количество элементов.

unsigned fldId( const string &name);

Получение идентификатора элемента.

bool fldPresent( const string &name );

Проверка на наличие указанного элемента.

int fldAdd( TFld *fld, int id = -1 );

Добавление/Вставка элемента.

void fldDel(unsigned int id);

Удаление элемента.

TFld &fldAt( unsigned int id );

Получение элемента.

void valAtt( TValElem *cnt );

Вызывается автоматически в случае подключения структуры к хранилищу.

void valDet( TValElem *cnt );

Вызывается автоматически в случае отключения структуры от хранилища.

Ячейка структуры данных (TFld)

Наследован от:	
Наследуется:	

Данные:

Тип ячейки (enum – TFld::Type):

TFld::Bool	- логический тип;

TFld::Dec	- десятичный тип;

TFld::Hex	- шестнадцатеричный тип;

TFld::Oct	- восьмеричный тип;

TFld::Real	- вещественный тип;

TFld::String	- строковый тип.

Флаги ячейки (define):

FLD_NOFLG	- флаги отсутствуют;

FLD_SELECT	- режим выборки из доступных значений;

FLD_SELF	- создавать собственную копию этой ячейки;

FLD_NWR	- не доступна для записи;

FLD_PREV	- предупреждать про смену ячейки.

Публичные методы:

TFld( );

Инициализация по умолчанию.

TFld( const char *name, const char *descr, Type tp, unsigned char type, const char *valLen = "", const char *valDef = "", const char *vals = "", const char *nSel = "" );

Инициализация с указанной конфигурацией.

TFld &operator=( TFld &fld );

Копирование ячейки.

const string &name();

Имя ячейки.

string &descr();

Описание ячейки.

int len();

Размер значения ячейки (символов в символьном представлении).

int dec();

Размер дробной части для вещественного (символов в символьном представлении).

Type type();

Тип ячейки.

unsigned char flg();

Флаги ячейки.

const string &def();

Значение по умолчанию.

vector<string> &selValS();

Список вариантов значений для строкового типа.

vector<int> &selValI();

Список вариантов значений для целого типа.

vector<double> &selValR();

Список вариантов значений для вещественного типа.

vector<bool> &selValB();

Список вариантов значений для логического типа.

vector<string> &selNm();

Список имён вариантов значений.

string selVl2Nm( const string &val );

Получить выбранное имя по значению строкового типа.

string selVl2Nm( int val );

Получить выбранное имя по значению целого типа.

string selVl2Nm( double val );

Получить выбранное имя по значению вещественного типа.

string selVl2Nm( bool val );

Получить выбранное имя по значению логического типа.

string &selNm2VlS( const string &name );

Получит значение строкового типа по выбранному имени.

int selNm2VlI( const string &name );

Получит значение целого типа по выбранному имени.

double selNm2VlR( const string &name );

Получит значение вещественного типа по выбранному имени.

bool selNm2VlB( const string &name );

Получит значение логического типа по выбранному имени.

void cntrMake( XMLNode *fld, const char *req, const char *path, int pos );

Создать форму в соответствии с конфигурацией.

Объект упреждения про смену структуры (TValElem)

Наследован от:	
Наследуется:	TValue, TConfig.

Язык управления системой и сеть узлов системы (TCntrNode)

Для централизованного покрытия ключевых элементов системы сетью объектов единой структуры предназначен объект узла сети TCntrNode. На этот объект возлагаются функции:

единообразного ресурсного доступа к узлам системы;

охвата узлами распределённой системы контроля.

Любой объект предполагающий динамический доступ к себе или своим компонента должен наследоваться от объекта узла TCntrNode. Данное родство автоматически включает узел в сеть объектов охваченную как прямой так и обратной связью, а также предоставляет возможность создания контейнеров под собственные дочерние узлы. Также, узел получает возможность предупреждения про включение и исключение/удаление узла из сети с возможностью отказа от исключения/удаления.

Язык управления охватывает все узлы системы и позволяет однообразно управлять системой в не зависимости от используемого инструмента. Язык управления выполнен на основе языка XML. Можно придумать множество способов использования языка управления, в качестве примера можно привести три наиболее ярких способа:

Web интерфейс конфигурирования;

GUI интерфейс конфигурирования (QT, GTK+, ...);

отражение через сеть;

LDAP.

Язык управления имеет место в описании структуры конфигурирования узла. При этом узлы объединяются в древовидную структуру. На основе языка конфигурирования в узле, конечные клиенты могут строить иерархические диалоги конфигурирования. Язык управления позволяет выполнять многоуровневое дополнение узловой конфигурации путём наследования узла в дальних предках которого числится объект TCntrNode. Пример дерева управления приведен на рисунке 12.

Рисунок 12 Дерево узлов языка управления системой

Узлы системы, содержащие данные, которыми необходимо управлять, должны подключаться к дереву управления. Подключение узла к дереву производится следующим образом:

наследование объекта TCntrNode или его потомка;

формирование информационной структуры;

обработка запросов динамических данных.

Основные элементы языка управления

Тег области <area>

Область описываются тегом <area> и предназначены для группировки, сортировки элементов по различным признакам. Область может содержать элементы а также другие области.

<area id='base' dscr='Base information'>

<fld id='host' dscr='Host name' acs='0444' tp='str'/>

<fld id='user' dscr='Operated user' acs='0444' tp='str'/>

<fld id='sys' dscr='Station system' acs='0444' tp='str'/>

<area id='other' dscr='Other options'>

<fld id='val' dscr='Value' acs='0664' tp='real'/>

</area>

</area>

Теги данных

Теги описывающие данные:

Тег	Описание
<fld>	Описывает данные строкового, целого, вещественного и логического типов.
<list>	Описывает списки с данными строкового, целого, вещественного и логического типов.
<table>	Описывает таблицы с данными в ячейках строкового, целого, вещественного и логического типов.

Таблица 1 Теги данных

Опрос и модификация элементов построен на основе XML-ветвей (XMLNode). Так, для опроса текущего значения передаётся ветка тега которая и заполняется текущим значением. Модификация производится подобным образом, но с предварительной установкой значения ветви тега. В случае ошибки генерируются исключения.

Тег <fld>

<fld id='host' dscr='Host name' acs='0444' tp='str'/>

<fld id='user' dscr='Operated user' acs='0444' tp='str'/>

<fld id='sys' dscr='Station system' acs='0444' tp='str'/>

Тип элемента описываемого тегом <fld> указывается атрибутом <tp>. Атрибут <tp> может принимать следующие значения:

Тег <tp>	Описание
str	Строковый тип; <fld id='host' dscr='Host name' acs='0444' tp='str'> server </fld>
dec	Целое число в десятичном представлении; <fld id='debug' dscr='Debug level' acs='0660' com='1' cfg='1' tp='dec' min='0' max='8'> 7 </fld>
oct	Целое число в восьмеричном представлении; <fld id='cr_file_perm' dscr='Make files permissions(default 0644)' acs='0660' cfg='1' tp='oct' len='3'/> 0600 </fld>
hex	Целое число в шестнадцатеричном представлении;
real	Вещественное число;
bool	Логический признак ("false"|"true"); <fld id='log_sysl' dscr='Direct messages to syslog' acs='0660' com='1' cfg='1' tp='bool'> true </fld>
time	Время в секундах (от 01/01/1970); <fld id='v_beg' tp='time'>FF4556DA</fld>

Таблица 2 Значения атрибута <tp> тега <fld>.

Операция	Действие
Опрос	Запрос: запрос содержимого, команда «Get». Результат: значение в тексте тега.
Модификация	Запрос: инициализация тега: <set>value</set>; отправка запроса, команда «Set».

Таблица 3 Действия над элементом описанным тегом <fld>

Тег <list>

<list id='mod_auto' dscr='List of shared libs(modules)' tp='str' dest='file'>

<el id='0'>./MODULES/arh_base.o</el>

<el id='1'>./MODULES/cntr_sys.o</el>

</list>

Тип элементов в списке указывается атрибутом <tp>. Значения атрибута <tp> приведены в таблице 2.

Операция	Действие
Опрос	Запрос: запрос содержимого, команда «Get». Результат: строки в тегах <el>.
Добавление строки	Запрос: инициализация тега: <add id='tst'>Test</add> Означает: добавить строку с индексом «tst» и значением «Test». Если список неиндексированный то атрибут id отсутствует. отправка запроса, команда «Set».
Вставка строки	Запрос: инициализация тега: <ins pos='3' p_id='tst1' id='tst' >Test</ins> Означает: вставить строку с индексом «tst» и значением «Test» в позицию 3 со строкой «tst1». В случае индексного списка атрибут p_id содержит индекс иначе текст строки. Если список неиндексированный то атрибут id отсутствует. отправка запроса, команда «Set».
Удаление строки	Запрос: инициализация тега: <del pos='3' id='tst'>Test</del> Означает: удалить строку с индексом «tst» и значением «Test» в позиции 3. Если список неиндексированный то атрибут id отсутствует. отправка запроса, команда «Set».
Изменение строки	Запрос: инициализация тега: <edit pos='3' p_id='tst1' id='tst' >Test</edit> Означает: заменить строку в позиции 3 на строку с индексом «tst» и значением «Test». В случае индексного списка атрибут p_id содержит индекс иначе текст строки. Если список неиндексированный то атрибут id отсутствует. отправка запроса, команда «Set».
Перемещение строки	Запрос: инициализация тега: <move pos='3' to='5'/> Означает: переместить строку с позиции 3 в позицию 5. отправка запроса, команда «Set».

Таблица 4 Действия над списком

Тег <table>

<table id='a_mess' >

<list id='0' tp='str'>

<el id='0'>Sat Feb 21 18:04:16 2004</el>

</list>

<list id='1' tp='str'>

<el id='0'>SYS</el>

</list>

<list id='2' tp='str'>

<el id='0'>*:(TSYS)Broken PIPE signal allow!</el>

</list>

</table>

Операция	Действие
Опрос	Запрос: запрос содержимого, команда «Get». Результат: группа списков <list> с строками в тегах <el>.
Добавление строки	Запрос: инициализация тега: <add/> Означает: добавить строку. отправка запроса, команда «Set».
Вставка строки	Запрос: инициализация тега: <ins row='3'/> Означает: вставить строку в позицию 3. отправка запроса, команда «Set».
Удаление строки	Запрос: инициализация тега: <del row='3'/> Означает: удалить строку в позиции 3. отправка запроса, команда «Set».
Перемещение строки	Запрос: инициализация тега: <move row='3' to='5'/> Означает: переместить строку с позиции 3 в позицию 5. отправка запроса, команда «Set».
Изменить ячейку	Запрос: инициализация тега: <set row='3' col='5'>Test</set> Означает: установить значение ячейки (3,5) в «Test». отправка запроса, команда «Set».

Таблица 5 Действия над таблицей

Команды с параметрами. Тег <comm>

<comm id='add'>

<fld id='tm' tp='time'/>

<fld id='cat' tp='str'/>

<fld id='lvl' tp='dec' min='0' max='7'/>

<fld id='mess' tp='str'/>

</comm>

Предназначен для передачи команд и действий узлу. Команды могут включать параметры. Параметры описываются тегом <fld>.

Команда инициализируется запросом на модификацию. В качестве аргументов запроса выступают путь к тегу <comm> и ветка этого тега с инициализированными параметрами в тегах <fld>.

Ветки (дочерние узлы)

<list id='k_br' dscr='Kernel branches' tp='br' mode='att'>

<el id='0'>kern1<el/>

<el id='1'>kern2<el/>

</list>

Ветки описываются обычным списком <list> со специальными атрибутами tp='br' и mode='att|at'.

Методика запроса и модификации веток полностью совпадает с методикой работы со списком <list>. Переходы по веткам выполняются посредством функций класса TCntrNode:

virtual TContr &ctrAt( const string &br ); - для прямого доступа (mode='at');

virtual AutoHD<TContr> ctrAt1( const string &br ); - для режима через подключения (mode='att')

Иерархические зависимости всех элементов языка управления

Пример языка управления:

<oscada_cntr>

<area id='a_gen' dscr='Generic control' acs='0440'>

<fld id='config' dscr='Config file' acs='0660' com='1' tp='str' dest='file'/>

<fld id='cr_file_perm' dscr='Files' acs='0660' cfg='1' tp='oct' len='3'/>

<fld id='cr_dir_perm' dscr='Directories' acs='0660' cfg='1' tp='oct' len='3'/>

<comm id='upd_opt' dscr='Update options(from config)'/>

<comm id='quit' dscr='Quit'/>

</area>

<area id='a_kern' dscr='Kernels'>

<list id='k_br' dscr='Kernels' tp='br' mode='att'>

<el id='0'>kern1<el/>

</list>

</area>

</oscada_cntr>

Иерархические зависимости элементов языка:

Тег	Описание	Атрибуты	Содержимое
oscada_cntr	Корневой элемент узла. Является единственным для узла и служит для идентификации принадлежности к языку управления.		(area)
area	Группировка стандартных тегов.	id – идентификатор; dscr – описание; acs – права доступа; own – id владельца; grp – id группы;	(area, fld, list, table, comm)
comm	Команды узлу.	id – идентификатор; dscr – описание; acs – права доступа; own – id владельца; grp – id группы;	(fld)
fld	Описание данных стандартных типов.	Общие: id – идентификатор; dscr – описание; acs – права доступа; own – id владельца; grp – id группы; tp – тип элемента: str(len, dest, cols, rows) – строковый элемент; dec(len, max, min, dest) – целое число в десятичном представлении; oct(len, max, min, dest) – целое число в восьмеричном представлении; hex(len, max, min, dest) – целое число в шестнадцатеричном; real(len, max, min, dest) – вещественное число; bool – логический признак (true|false); time – время/дата в секундах (от 01/01/1970); Связные: len – длина значения (симв.); min – минимум значения; max – максимум значения; cols – количество колонок; rows – количество строк; dest – способ ввода: file – полное имя файла; dir – полное имя директории; select(select) – выборный тип; select – путь к скрытому списку;	Значение элемента.
list	Список данных стандартных типов.	Общие: id – идентификатор; dscr – описание; acs – права доступа; own – id владельца; grp – id группы; tp – как в <fld> кроме: br(mode) – дочерние узлы; idm – индексированный список (0|1); hide – скрытый список (0|1); s_com – способы модификации списка [add][,ins][,edit][,del]: add – добавлять строки; ins – вставлять строки; edit – модифицировать строки; del – удалять строки; Связные: mode – способ перехода к дочернему узлу (at|att); dest – как в <fld>;	(el)
table	Таблица данных стандартных типов.	id – идентификатор; dscr – описание; acs – права доступа; own – id владельца; grp – id группы;	(list)
el	Тег строки для списка <list>	id – номер строки;	Значение строки

Объект узла сети (TCntrNode)

Наследован от:	
Наследуется:	Все динамические и управляемые объекты прямо или через потомков.

Данные:

Команды языка управления (enum – TCntrNode::Command):

TCntrNode::Info	- запрос информации о элементе/элементах;

TCntrNode::Get	- запрос на получение значения элемента;

TCntrNode::Set	- запрос на модификацию значения элемента.

Состояния динамического узла (enum TCntrNode::Mode):

TCntrNode::MkDisable	- отключение;

TCntrNode::Disable	- отключен;

TCntrNode::MkEnable	- включение;

TCntrNode::Enable	- включен.

Публичные методы:

TCntrNode( TCntrNode *prev = NULL );

Инициализация с указанным предыдущим узлом.

void cntrCmd( const string &path, XMLNode *opt, TCntrNode::Command cmd, int lev = 0 );

Команда работа с языком управления. Поддерживаются транспортные переходы по полному пути типа: </d_Seсurity/d_usr_root/:gen> где :gen путь к конкретному полю.

static XMLNode *ctrId( XMLNode *inf, const string &n_id );

Получение элемента по пути из имен полей атрибута <id>.

static string ctrChk( XMLNode *fld, bool fix = false );

Проверка валидности значения в полей <fld>.

static XMLNode *ctrMkNode( const char *n_nd, XMLNode *nd, const char *req, const char *path, const string &dscr, int perm=0777, int uid=0, int gid=0, const char *tp="" );

Добавление элемента управления языка.

static XMLNode *ctrInsNode( const char *n_nd, int pos, XMLNode *nd, const char *req, const char *path, const string &dscr, int perm=0777, int uid=0, int gid=0, const char *tp="" );

Вставка элемента управления языка.

static string ctrGetS( XMLNode *fld );

Получение строки из поля.

static int ctrGetI( XMLNode *fld );

Получение целого из поля.

static double ctrGetR( XMLNode *fld );

Получение вещественного из поля.

static bool ctrGetB( XMLNode *fld );

Получение логического признака из поля.

static void ctrSetS( XMLNode *fld, const string &val, const char *id=NULL );

Запись строки в поле.

static void ctrSetI( XMLNode *fld, int val, const char *id=NULL );

Запись целого в поле.

static void ctrSetR( XMLNode *fld, double val, const char *id=NULL );

Запись вещественного в поле.

static void ctrSetB( XMLNode *fld, bool val, const char *id=NULL );

Запись логического признака в поле.

virtual string nodeName();

Имя узла.

virtual string nodePref();

Префикс узла. Используется для формирования имени пути в случае наличия более чем одного контейнера у узла.

Mode nodeMode();

Состояние узла.

unsigned nodeUse( );

Количество подключенных к узлу.

void connect();

Подключение к узлу.

void disConnect();

Отключение от узла.

Защищённые методы:

virtual void cntrCmd_( const string &path, XMLNode *opt, TCntrNode::Command cmd );

Функция обслуживания запросов языка управления. Должна переопределяться у потомка.

virtual TCntrNode &ctrAt( const string &br );

Подключение к ветке узла.

void nodeEn();

Включение узла.

void nodeDis(long tm = 0,int flag = 0);

Отключение узла с передачей флага.

void nodeDelAll( );

Очистка всех контейнеров с дочерними узлами.

void nodePrev( TCntrNode *prev );

Установка узла – владельца данным узлом.

unsigned grpSize();

Количество контейнеров с дочерними узлами.

unsigned grpAdd( );

Добавить контейнер дочерних узлов. Возвращает идентификатор нового контейнера.

void chldList( unsigned igr, vector<string> &list );

Список дочерних узлов в указанном контейнере.

bool chldPresent( unsigned igr, const string &name );

Проверка на присутствие указанного дочернего узла в отдельном контейнере.

void chldAdd( unsigned igr, TCntrNode *node, int pos = -1 );

Добавление дочернего узла в указанный контейнер.

void chldDel( unsigned igr, const string &name, long tm = -1, int flag = 0 );

Удаление дочернего узла из указанного контейнера.

AutoHD<TCntrNode> chldAt( unsigned igr, const string &name, const string &user = "" );

Подключение к дочернему узлу указанного контейнера.

virtual void preEnable();

Предупреждение про подключение. Вызывается перед реальным подключением.

virtual void postEnable();

Предупреждение про подключение. Вызывается после реальным подключением.

virtual void preDisable(int flag);

Предупреждение про отключение. Вызывается перед реальным отключением.

virtual void postDisable(int flag);

Предупреждение про отключение. Вызывается после реальным отключения (перед удалением).

XML в системе OpenSCADA (XMLNode)

XML в системе OpenSACDA представлен объектом XML-тега XMLNode.

XML-тег (XMLNode)

Наследован от:	
Наследуется:	

Данные:

Опции функции генерации XML-файла(define):

XML_BR_OPEN_PREV - вставлять конец строки перед тегом открытия;

XML_BR_OPEN_PAST - вставлять конец строки после тега открытия;

XML_BR_CLOSE_PAST - вставлять конец строки после тега закрытия;

XML_BR_TEXT_PAST - вставлять конец строки после текста тега;

Публичные методы:

XMLNode( const string &name = "" );

Инициализация тега с указанным именем.

XMLNode &operator=(XMLNode &prm);

Копирование ветки XML-дерева.

string name() const;

Имя тега.

void name( const string &s );

Установка имени тега.

string text();

Текст тега.

void text( const string &s );

Установка текста тега.

void attrList( vector<string> & list ) const;

Список атрибутов тега.

string attr( const string &name );

Получение атрибута.

XMLNode* attr( const string &name, const string &val );

Установка/создание атрибута.

XMLNode* attr_( const char *name, const char *val );

Установка/создание атрибута.

void load( const string & );

Загрузка/парсинг XML текста файла.

string save( unsigned char flgs = 0 );

Сохранение/создание XML-файла.

void clear();

Очистка тега. Включая вложенные.

int childSize() const;

Количество вложенных тегов.

void childAdd( XMLNode * );

Добавление вложенного тега.

XMLNode* childAdd( const string &name = "" );

Добавление вложенного тега.

int childIns( unsigned id, XMLNode * );

Вставка вложенного тега.

XMLNode* childIns( unsigned id, const string &name = "" );

Вставка вложенного тега.

void childDel( const unsigned id );

Удаление вложенного тега.

void childClean( const string &name = "" );

Очистка вложенного тега.

XMLNode* childGet( const int ) const;

Получение вложенного тега по порядковому номеру.

XMLNode* childGet( const string &name, const int numb = 0 ) const;

Получение <numb> по порядку вложенного тега по имени тега.

XMLNode* childGet( const string &attr, const string &name ) const;

Получение <numb> по порядку вложенного тега по атрибуту тега тега.

Ресурсы в системе OpenSCADA (ResAlloc, AutoHD)

Большенство узлов и подсистем системы OpenSCADA являются динамическими, т.е. допускают создание/удаление/конфигурацию в процессы функционирования системы. Учитывая многопоточность системы данная функциональность накладывает жесткие требование к синхронизации потоков. Для синхронизации в системе используются ресурсы, функции которых локализованы в объекте <ResAlloc>. В объекте <ResAlloc> реализованы функции как классического захвата/освобождения ресурса так и функции с автоматическим освобождением ресурса. Автоматический ресурс подразумевает создание локального объекта ресурса с автоматическим его освобождением при разрушении (в деструкторе). Использование автоматических ресурсов значительно упрощает работу с ресурсами при использовании исключений.

Любой динамический объект системы наследуется от объекта TCntrNode который содержит механизм подключения через шаблон AutoHD. Основной функцией шаблона является хранение ссылки на объект и захват ресурса исключающего удаление объекта на момент использования. Шаблон поддерживает копирование ресурса и автоматическое его освобождение в случае разрушения объекта шаблона. Для наглядности доступа к объектам порождённым от TCntrNode шаблон AutoHD поддерживает приведения типов.

Объект ресурса (ResAlloc)

Наследован от:	
Наследуется:	

Публичные методы:

ResAlloc( unsigned id );

Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора.

ResAlloc( unsigned id, bool write );

Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора. С указанием типа ресурса (чтение/запись).

void request( bool write = false, long tm = 0 );

Запрос ресурса с указанным режимом (чтение/запись).

void release();

Освобождение ресурса.

static unsigned resCreate( unsigned val = 1 );

Создание ресурса.

static void resRequestW( unsigned res, long tm = 0 );

Запрос ресурса для записи/модификации.

static void resReleaseW( unsigned res );

Освобождение ресурса на запись/модификацию.

static void resRequestR( unsigned res, long tm = 0 );

Запрос ресурса для чтения.

static void resReleaseR( unsigned res );

Освобождение ресурса на чтение.

Шаблон (AutoHD)

Наследован от:	
Наследуется:	

Публичные методы:

AutoHD( );

Инициализация без привязки к объекту.

AutoHD( ORes *node, const string &who = "" );

Инициализация с привязкой к объекту <node>. Объект должен содержать функцию connect() и disConnect().

AutoHD( const AutoHD &hd );

Копирующий конструктор.

template <class ORes1> AutoHD( const AutoHD<ORes1> &hd_s );

Конструктор приведения типов.

ORes &at();

Получение объекта.

void operator=( const AutoHD &hd );

Копирование ресурсов.

void free();

Освобождение ресурса.

bool freeStat();

Признак «Ресурс свободен».

Организация и структуры баз данных

Узлы и подсистемы системы OpenSCADA могут иметь собственные таблицы для хранения своих данных. При этом структура таблиц может быть индивидуальной определяясь объектом <TConfig>. Узлы и подсистемы должны создавать и конфигурировать объект <TConfig> под свои требования.

Таблицы подсистемы «Контроллеры»

Структура корневой таблицы

Таблица предназначена для хранения имени БД (тип, контроллер, таблица). Имя БД указывает на таблицу где хранятся данные контроллеров конкретного типа. Не рекомендуется размещать данные контроллеров различных типов в одну таблицу в связи с различной структурой БД.

Имя контроллера <NAME>	Имя модуля контроллера <MODUL>	Тип БД <BDTYPE>	БД <BDNAME>	Таблица <TABLE>
DataOS	OperationSystem	SQLite	./DATA/DemoSt.db	cntrOS
Model	BlockCalc	SQLite	./DATA/DemoSt.db	cntrBlckCalc

Структура таблиц контроллеров

Таблица контроллеров хранит данные контроллеров одного типа. Структура таблиц контроллеров различных типов может значительно отличаться, однако существуют стандартные поля которые присутствуют во всех таблицах контроллеров.

Имя <NAME>	Полное имя <LNAME>	Включать <ENABLE>	Запускать <START>	Индивидуальные параметры <......>
Contr1				
Contr2				
.........				
Contr[n]				

Структура таблиц параметров

Хранит данные параметров конкретного контроллера. Структура таблиц параметров у различных типов контроллеров может значительно отличаться.

Имя параметра <SHIFR>	Полное имя <NAME>	Экспортировать <EXPORT>	Индивидуальные параметры <......>
Param1			
Param2			
<.......>			
Param[n]			

Таблицы подсистемы “Транспорты”

Подсистема “Транспорты” делится на входящие и исходящие транспорты. Для каждого типа транспортов существует своя таблица с собственной структурой.

Таблица входящих транспортов

Имя <NAME>	Описание <DESCRIPT>	Тип <MODULE>	Адрес <ADDR>	Протокол <PROT>	Запускать <START>
web	Work web transport for proced http requests.	Sockets	TCP::10002:0	HTTP	1
tcp1	Test TCP input socket!	Sockets	TCP::10001:1	SelfSystem	1

Таблица исходящих транспортов

Имя <NAME>	Описание <DESCRIPT>	Тип <MODULE>	Адрес <ADDR>	Запускать <START>
tcp_o1	Test TCP output socket!	Sockets	TCP::10001	1
TCP_o2	Test TCP output socket!	Sockets	TCP:127.0.0.1:10001	1

Таблицы подсистемы “Архивы”

Подсистема “Архивы” содержит “Архивы сообщений” и “Архивы значений”. Каждый тип архива имеет собственную структуру таблицы.

Таблица архивов сообщений

Имя <NAME>	Описание <DESCR>	Тип <MODUL>	Старт <START>	Категория <CATEG>	Уровень <LEVEL>	Адрес <ADDR>
StatErrors	Архив локальных ощибок	BaseArh	1	/DemoStation*	4	ARCHIVES/MESS/stError/
NetRequsts	Запросы к серверу через транспорт Sockets	BaseArh	1	/DemoStation/Transport/Sockets*	1	ARCHIVES/MESS/Net/

Таблица архивов значений

Имя <NAME>	Описание <DESCR>	Тип <MODUL>	Старт <START>	Адрес <ADDR>
test1		BaseArh	1	./ARHIVE/VAL/test
sys1		BaseArh	0	./ARHIVE/VAL/sys

Структура БД модулей

Каждый модуль может иметь собственные БД для хранения своих специфических данных. Структура БД для модулей может формироваться свободно с учетом внутренних потребностей.

API модулей модульных подсистем

Первым шагом при подключении разделяемых (SO - shared object) библиотек является подключение функции инициализации.

Функции инициализации используются в процессе подключении SO библиотек к ядру системы. Эти функции должны быть определены как обычные “С” функции, для исключения искажения имен функций. Обычно это делается следующим образом:

//================== CUT =========================

extern "C"

{

TModule::SAt module( int n_mod )

{

//Формирование описателя модуля из списка

//доступных в библиотеке модулей

}

TModule *attach( const TModule::SAt &AtMod, const string &source )

{

//Подключить указанный модуль

}

}

//================== CUT =========================

Функции для работы с SO библиотекой:

TModule::SAt module( int n_mod );

Функция предназначена для последовательного опроса информации о модулях содержащихся в SO библиотеке. Параметр <n_mod> указывает на порядковый номер опрашиваемого модуля и должен перебираться начиная с нуля. В случае отсутствия модуля с данным идентификатором функция возвращать структуру с именем модуля нулевой длины.

TModule *attach( const TModule::SAt &AtMod, const string &source );

Подключение к указанному модулю.

Практически все функции и данные системы сведены в API-системы приведенного выше. Однако, для упрощения и ускорения процесса написания модулей, основные функции переопределяемые в модулях приведены в таблице 6.

Общее API модулей (TModule)
virtual void modLoad( ); Загрузка модуля. virtual void modSave( ); Сохранение модуля. virtual void modStart( ); Запуск модуля. virtual void modStop( ); Останов модуля. virtual void modInfo( vector<string> &list ); Список доступных элементов информации о модуле. Предусмотрены следующие информационные элементы: Modul - идентификатор модуля; Name - локализованное имя модуля; Type - тип модуля; Source - источник модуля (контейнер); Version - версия модуля; Autors - автора модуля; Descript - описание модуля; License - лицензия модуля. virtual string modInfo( const string &name ); Запрос указанного элемента информации. void void postEnable(); Подключение модуля в динамическое дерево. void modFuncReg( ExpFunc *func ); Регистрация экспортируемой функции.
API модулей подсистемы “БД”.
Тип БД (потомок от TTipBD):
virtual TBD *openBD( const string &name, bool create ); Открыть/создать БД. virtual void delBD( const string &name ); Удалить БД.
БД (потомок от TBD):
virtual TTable *openTable( const string &table, bool create ); Открыть/создать таблицу. virtual void delTable( const string &table ); Удалить таблицу.
Таблица (потомок от TTable):
virtual bool fieldSeek( int row, TConfig &cfg ); Последовательное сканирование записей таблицы. virtual void fieldGet( TConfig &cfg ); Получение указанной записи. virtual void fieldSet( TConfig &cfg ); Установка указанной записи. virtual void fieldDel( TConfig &cfg ); Удаление указанной записи.
API модулей подсистемы “Контроллеры”.
Тип контроллера (потомок от TTipController):
virtual TController *ContrAttach( const string &name, const TBDS::SName &bd ); Открытие/подключение контроллера.
Контроллер (потомок от TController):
virtual void load_( ); Загрузка контроллера. virtual void save_( ); Сохранение контроллера. virtual void start_( ); Запуск контроллера. virtual void stop_( ); Останов контроллера. virtual void enable_( ); Включение контроллера. virtual void disable_( ); Отключение контроллера. virtual TParamContr *ParamAttach( const string &name, int type ); Создание/открытие нового параметра.
Параметр контроллера (потомок от TParamContr):
virtual void enable(); Включить параметр. virtual void disable(); Отключить параметр.
API модулей подсистемы "Архивы".
Тип архива (потомок от TTipArсhive):
virtual TArchiveMess *AMess(const string &name ); Создание архива сообщений. virtual TArchiveVal *AVal(const string &name ); Создание архива значений.
Архив сообщений (потомок от TArсhiveMess):
virtual void start(); Запуск архива. virtual void stop(); Остановка архива. virtual void put( vector<TMess::SRec> &mess ); Поместить сообщение в архив. virtual void get( time_t b_tm, time_t e_tm, vector<TMess::SRec> &mess, const string &category = "", char level = 0 ); Запросить сообщение из архива.
Архив значений (потомок от TArchiveVal):
API архива значений находится в разработке!
API модулей подсистемы "Протоколы";
Протокол (потомок от TProtocol):
virtual TProtocolIn *in_open( const string &name ); Открыть/создать входной протокол.
Входной протокол (потомок от TProtocolIn):
virtual bool mess( const string &request, string &answer, const string &sender ); Послать неструктурированное сообщение в протокол.
API модулей подсистемы "Транспорты";
Тип транспорта (потомок от TTipTransport):
virtual TTransportIn *In( const string &name ); Создать/открыть новый «входящий» транспорт. virtual TTransportOut *Out( const string &name ); Создать/открыть новый «исходящий» транспорт.
Входящий транспорт (потомок от TTransportIn):
virtual void start(); Запуск транспорта. virtual void stop(); Останов транспорта.
Исходящий транспорт (потомок от TTransportOut):
virtual void start(); Запуск транспорта. virtual void stop(); Останов транспорта. virtual int messIO(char *obuf, int len_ob, char *ibuf = NULL, int len_ib = 0, int time = 0 ); Передать запрос через транспорт. Возможно указание таймаута.
API модулей подсистемы "Пользовательские интерфейсы";
Пользовательский интерфейс (потомок от TUI):
Не содержит специфических функций!
API модулей подсистемы "Специальные”;
Специальные (потомок от TSpecial):
Не содержит специфических функций!

Таблица 6 Основные функции использующиеся при создании модулей

Список программ доноров и других источников

Программа	Описание заимствования
Visual 0.0.19 (http://visual.sourceforge.net)	Планируется изучение опыта создания WEB GUI на основе JAVA-аплетов.
--//--	Проверено понимание правильности работы с модулями(плагинами).
--//--	Заимствован опыт использование automake, autoconf.
GkrellM (http://gkrellm.net)	Заимствована методика и некоторые методы сбора информации о ОС.

Часто задаваемые вопросы и ответы на них (FAQ)

Q:	Каким образом определяется цикличность архивирования значений.

Re:	Архивирование является независимой от контроллеров и параметров задачей и выполняется она модульной подсистемой “Архивы”. Что и как архивировать определяется индивидуально для каждого атрибута параметра.

Q:	Каким образом реализуется многоязычность системы?

Re:	Многоязыковая поддержка реализована на основе стандарта интернационализации I18n. Причём файлы интернационализации модулей отделены от файла интернационализации системы. Это обеспечивает полноценную поддержку независимого распространения и разработки модулей к системе OpenSCADA.

Q:	Каким образом осуществляется речевая сигнализация?

Re:	Речевая сигнализация, как и иные методы сигнализации, является элементом подсистемы “Пользовательские интерфейсы” и будет организовываться как модуль обрабатывающий состояния атрибутов параметров.

Q:	Где и как выполнять дополнительную логическую обработку атрибутов параметров?

Re:	Любая математическая обработка атрибутов параметров может производится в контроллере содержащем скриптовый язык, например в виртуальном контроллере.

Q:	Как организовывается разделение доступа?

Re:	Планируется использовать схему безопасности подобно UNIX OC. Так, каждый контроллер и параметр будут иметь владельца, принадлежать группе и содержать триаду доступа “rwxrwxrwx”.

Q:	Можно ли управлять системой OpenSCADA посредством обычного браузера?

Re:	Да можно! Для конфигурирования системы OpenSCADA из браузера создан модуль “Интерфейса пользователя” <web_cfg>, функции которого вызываются модулем “Протокола” <http>.

Q:	Можно ли и каким образом реализуется резервирование параметров?

Re:	Планируется реализация следующих схем резервирования:

резервирование датчиков: предусматривает возможность в одном параметре описывать несколько однотипных датчиков которые будут иметь собственные атрибуты значений. Результирующее значение датчиков будет помещаться в результирующий атрибут значения;

резервирование каналов: предусматривает возможность объединения параметров с одним шифром, но от разных станций/контроллеров в одном сводном параметре <TParam>. В процессе доступа выбирается активный параметр(контроллера) или же предпочтительный в случае активности более одного параметра(контроллера). Данная схема позволяет, также, осуществлять распределение нагрузки на коммуникационные интерфейсы различных станций/контроллеров.

Q:	Где проверяются шкалы параметров и различные уставки сигнализаций?

Re:	Проверка шкал и уставок будет реализовываться самим модулем контроллера с сигнализацией через соответствующие атрибуты параметров.

Q:	Допускает ли система добавление/удаление/обновление модулей на ходу (без остановки)?

Re:	Данная возможность заложена в систему и обеспечивается она подсистемой “Управление модулями”. На текущий момент более половины подсистем и их модулей могут корректно выполнять данные операции. Работы над остальными подсистемами и их модулями продолжаются.

Q:	Возможна ли работа с потоковыми данными в системе?

Re:	Для потоковых и пакетных данных предусматриваются буфера в атрибутах параметров. Буфер может быть:

синхронным (блочные элементы);

асинхронный (элементы высокой отчётности с беспорядочным поступлением значений);

Q:	Могу ли я создать свой собственный модуль для какой либо подсистемы?

Re:	Да, конечно! Для этого создан документ где практически полностью описана архитектура ядра, его функции и API модулей различных подсистем.

Q:	Каким образом можно реализовывать межмодульные связи?

Re:	Межмодульные связи делится на два типа:

стандартный интерфейс доступа. Производятся посредством интерфейса модульных подсистем.

Расширенный интерфейс доступа. Предусматривает экспорт функций внешнего интерфейса модулем экспортёром и последующее подключение модуля импортёра к этим функциям с помощью функций объекта <TGRPModule>.

Отладка и тестирование проекта OpenSCADA

Для контроля за качеством кода и проверки работоспособности различных участков системы пишутся специальные модули выполняющие процедуру тестирования с выдачей протокола тестирования. Данные модуле необходимо выполнять после завершения работы над любым участком проекта.

Правила оформления и комментирования исходных текстов OpenSCADA и его модулей

При написании и оформлении исходных текстов системы OpenSCADA и его модулей необходимо придерживаться следующих правил:

Отступ между уровнями вложений: 4 символа;

Фигурные скобки открытия и закрытия должны располагаться в отдельных строках на уровне предыдущего текста;

Возможно написание вложений на одной строке с предыдущим уровнем вложения, в случае повышения читабельности кода;

Растояние между описаниями функций не менее одного символа;

Растояние между определением переменных и текстом программы не менее одного символа;

Допускается определение переменных в тексте при сохранении читабельности;

Избегать длины строки более 100 символов;

Команды препроцессора располагать на первом уровне вне зависимости от текущего уровня текста;

Для форматирования исходного текста наследованного у других свободных приложений, примеров .... рекомендуется использовать утилиту: indent -bli0 -i4 -l100 -npsl -npcs -prs -nsaf -nsai -ts8 <filename>.

Правила комментирования исходных текстов OpenSCADA:

Обязательному комментированию и тщательному описания подлежат объявления классов;

Объявления публичных методов классов должны быть тщательно описаны с индивидуальным описанием каждого параметра;

Объявления публичных атрибутов также необходимо тщательно комментировать;

Текст функций не нуждаются в тщательном комментировании, однако тонкие и неявные места желательно комментировать.

Условные обозначения по тексту и в исходниках

????	- сомнение в целесообразности данного участка;

?!?!	- участок не полностью реализован;

!!!!	- тонкое место, участок требует переосмысления;

Известные ошибки и проблемы

№	Описание	Решение
1	int TMessage::Sconv(const char *fromCH, const char *toCH, string & buf) – Преобразование кодировки строки производится в буфере размером 100байт, что может вызвать проблемы при преобразование более длинных строк!	FIXED!
2	int TDirectDB::SetCellN( int hdi, int row, int line, double val) – Для преобразования числа в строку выделяется буфер размером 200 байт, что: медленно, расточительно и могут быть проблемы при преобразовании чисел с длиной более 200!	FIXED! Размер буфера увеличен и определяется централизованно в tsys.h, для исключения переполнений используется функции с контролем за размером
3	int TVirtual::init( void *param ) - Загрузка элементов БД для типа контроллера и типов параметров производится путём передачи статически скомпилированного массива элементов функции загрузки. Может вызывать падение программы при неправильном формировании элементов или неправильном определении их числа!	FIXED! Процедура изменена.
4	При компиляции рабочей программы из *.o файлов и библиотеки собранной из этих .o файлов получается различный результат. В случае сборки через *.o все связки с модулями работают. В случае библиотеки получаются проблемы с классами созданными в модулях на основе базовых классов ядра. Проблема в том что теряются символы, только, класса TСontroller. Переименование его файла и его самого проблемы не решает. Возможно проблема в структуре класса!!!	FIXED! Проблема оказалась в том, что при линковке со статической библиотекой линкер может некоторые файлы из библиотеки не подключать. Для принудительного подключения всех файлов из библиотеки использовать ключ линкера: --whole-archive (в gcc - -Wl,-whole-archive)
5	В процессе работы выполняется горячая подмена разделяемой библиотеки. При замене старой разделяемой библиотеки на новую (копированием поверх) OpenScada падает при попытке уничтожить модули обновленной разделяемой библиотеки, а также при других операциях с модулями этой разделяемой библиотеки. Однако при замене через предварительное удаление, удаление старых и создание новых модулей проходит нормально!	NOFIXED!
6	При использовании в качестве модуля SO библиотек наследующих qtlib происходят сбои в различных местам при различном наборе модулей. Библиотека QtLib тянет за собой массу других библиотек!!!	FIXED! Проблема замечена только на ASPLinux9.0 с неродным ядром 2.4.23 (без NPTL), тогда как библиотеки с NPTL. На других дистрибутивах проблема не выявлена!
7	Случайное разрастание BD DBF после расширения/модификации структуры.	NOFIXED!

58

2002-11-19T10:06:02