16. Ресурсы в системе OpenSCADA (Res, ResAlloc, AutoHD)
Большинство узлов и подсистем системы OpenSCADA являются динамическими, т.е. допускают создание/удаление/конфигурацию в процессе функционирования системы. Учитывая многопоточность системы, данная функциональность накладывает жесткие требования к синхронизации потоков. Для синхронизации в системе используются ресурсы, функции которых локализованы в объектах <Res> и <ResAlloc>. Объект <Res> предоставляет хранилище ресурса, предусматривающего функции захвата/освобождения на чтение и запись. В объекте <ResAlloc> реализованы функции автоматического освобождения ресурса. Автоматический ресурс подразумевает создание локального объекта ресурса с автоматическим его освобождением при разрушении (в деструкторе). Использование автоматических ресурсов значительно упрощает работу с ресурсами при использовании исключений.
Любой динамический объект системы наследуется от объекта TCntrNode, который содержит механизм подключения через шаблон AutoHD. Основной функцией шаблона является хранение ссылки на объект и захват ресурса, исключающего удаление объекта на момент использования. Шаблон поддерживает копирование ресурса и автоматическое его освобождение в случае разрушения объекта шаблона. Для наглядности доступа к объектам порождённым от TCntrNode шаблон AutoHD поддерживает приведение типов, основанное на динамическом приведении.
16.1. Объект ресурса (Res)
Публичные методы:
- Res( ); -- Инициализация ресурса.
- static void resRequestW( long tm = 0 ); -- Запрос ресурса на запись/модификацию.
- static void resRequestR( long tm = 0 ); -- Запрос ресурса на чтение.
- static void resRelease( ); -- Освобождение ресурса.
16.2. Объект ресурса (ResAlloc)
Публичные методы:
- ResAlloc( Res &rid ); -- Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора <rid>.
- ResAlloc( Res &rid, bool write, long tm = 0 ); -- Инициализация автоматически освобождающегося ресурса для ранее выделенного идентификатора <rid>. С указанием типа ресурса <write> (чтение/запись).
- void request( bool write = false, long tm = 0 ); -- Запрос ресурса в указанном режиме <write> (чтение/запись).
- void release( ); -- Освобождение ресурса.
16.3. Шаблон (AutoHD)
Публичные методы:
- AutoHD( ); -- Инициализация без привязки к объекту.
- AutoHD( ORes *node, const string &who = "" ); -- Инициализация с привязкой к объекту <node>. Объект должен содержать функцию AHDConnect() и AHDDisConnect().
- AutoHD( const AutoHD &hd ); -- Копирующий конструктор.
- template <class ORes1> AutoHD( const AutoHD<ORes1> &hd_s, bool nosafe = false ); -- Конструктор приведения типов в безопасном или прямом режиме приведения <nosafe>.
- ORes &at( ) const; -- Получение объекта за ресурсом.
- void operator=( const AutoHD &hd ); -- Копирование ресурсов.
- void free( ); -- Освобождение ресурса.
- bool freeStat( ) const; -- Признак «Ресурс свободен».
16.4. Объект строки с доступом, разделённым ресурсом (ResString)
Публичные методы:
- ResString( const string &vl = "" ); -- Инициализация строки с указанным значением <vl>.
- void setVal( const string &vl ); -- Установка значения строки в <vl>.
- const string &getVal( ); -- Получение значения строки.
Публичные атрибуты:
- res -- Ресурс строки.
- str -- Строка.