Классы менеджеров API

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

IconПРИМЕЧАНИЕ

  1. Если вы используете менеджер API или драйвер, в котором применяются библиотеки DLL вместе с новой версией «КАСКАД Цифра», его необходимо перекомпоновать.
  2. При запуске такого менеджера, библиотеки DLL должны находиться в каталоге, указанном в пути поиска библиотек DLL.

ВНИМАНИЕ

Длина имени менеджера в консоли «КАСКАД Цифра» ограничена 19 символами.

IconПРИМЕЧАНИЕ

Начиная с версии 3.9 программы «КАСКАД Цифра», функция dpQueryDisconnect() имеет только два параметра вместо обычных трех, параметр «del» был удален. Для обеспечения совместимости, значение третьего параметра (например, PVSS_FALSE) необходимо стереть из исходных данных.

Примечание для пути поиска библиотек DLL

Программа производит поиск библиотек DLL в следующих каталогах в таком порядке:

  • каталог, в котором находится исполняемый файл
  • системные каталоги Windows
  • все каталоги в переменной среды PATH (ПУТЬ)

Для примера см. DemoManager.

Инициализация, managerState, dispatch()

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

Состояние переменной managerState необходимо принимать во внимание во всех случаях. Например, соединение с менеджером событий должно быть установлено только тогда, когда managerState имеет значение STATE_ADJUST. Дальнейшая обработка может происходить только при значении STATE_RUNNING. Эти состояния регулируются автоматически, и, при любых обстоятельствах, должны только считываться.

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

Использование псевдонимов в менеджере API

Если вы хотите использовать псевдонимы для точек данных(далее ТД) в менеджере API, то вы можете получить идентификаторы ТД или имена ТД для псевдонимов и наоборот, используя для этого следующие функции:

Alias —> Name:

Manager::getDpIdentificationPtr()->getName(const char> *alias, char *&name)
   //получает имя точки данных с помощью DPIdentifier

Alias —> DpIdentifier:

Manager::getId(const char *alias, DpIdentifier
&dpId)

//получает идентификатор точки данных (в таком случае псевдонимы должны начинаться с "@")

Name —> Alias:

Manager::getDpIdentificationPtr()->getDpAlias(const char *dp, CharString &alias)
//получает псевдоним с помощью DpIdentifier

DpIdentifier —> Alias:

Manager::getDpIdentificationPtr()->getDpAlias(
const DpIdentifier &dp, CharString &alias)
//получает псевдоним с помощью DpIdentifier

Обработка ошибок

В программе «КАСКАД Цифра». существует общий класс обработчиков ошибок. В этом классе представлены обработчики ошибок, используемые в каждом менеджере. В зависимости от флажков -log, заданных при запуске менеджера, сообщения об ошибках записываются в файле PVSS_II.log и/или в stderr. Также ошибки могут записываться в базу данных, с помощью ExternErrHdl-Plug-in можно реализовать расширение, которое производит запись.

Если ErrHdl найдет совместно используемую библиотеку /dll с именем «ExternErrHdl» и одним из расширений «.so», «.shlib», «.dll» или «libExternErrHdl» (.dll — только для Windows, .so или .shlib — для других операционных систем) в каталоге bin текущего проекта, то она загрузит ее при запуске, вызовет extern «C» { ExternErrHdl *createExternErrHdl(); } для создания экземпляра класса ExternErrHdl, и вызовет его метод handleError(const ErrClass &errorClass) перед тем, как сделать запись в целевых объектах (лог-файл или stderr), указанных посредством опции -log.

Если вы захотите, например, записать ошибки в базу данных (в дополнение к лог-файлу PVSS_II), то можете использовать ExternErrHdl. Для этого нужно вывести класс из ExternErrHdl, скомпилировать его как shared libb/ и сохранить в каталоге bin как ExternErrHdl shared lib.

Примере получения класса из ExternErrHdl.

/* Пример внешнего обработчика ошибок, загруженного в качестве совместно используемой библиотеки/библиотеки dll посредством стандартного обработчика ошибок программы "КАСКАД Цифра" /*

/* При работе с LINUX данный класс записывает ошибки в syslog, а при работе с Windows - распечатывает ошибки в stderr/*
#ifdef OS_LINUX
#include <syslog.h>
#endif
#include <ExternErrHdl.hxx>
#include <Resources.hxx>
CharString name;
class MyExternErrHdl : public ExternErrHdl
{
    public:
       MyExternErrHdl()
       {
#ifdef OS_LINUX
     name = Resources::getProgName() + "(" +  CharString(Resources::getManNum()) + ")";
     openlog((const char*)name, 0, LOG_USER);
#else
     cerr << "Construct ExternErrHdl" << endl;
#endif
     }
   virtual ~MyExternErrHdl()
   {
#ifdef OS_LINUX
     closelog();
#else
     cerr << "Destruct ExternErrHdl" << endl;
#endif
   }
   virtual void handleError(const ErrClass &errorClass)
   {
#ifdef OS_LINUX
     int level = 0;
     switch ( errorClass.getPriority() )
     {
       case ErrClass::PRIO_FATAL:   level = LOG_CRIT;    break;
       case ErrClass::PRIO_SEVERE:  level = LOG_ERR;     break;
       case ErrClass::PRIO_FATAL: level = LOG_WARNING; break;
       case ErrClass::PRIO_INFO:    level = LOG_INFO;    break;
     }
     syslog(LOG_USER + level, "%s", (const char*)(errorClass.getErrorText()));
#else
     cerr << "ExternErrHdl: ";
     errorClass.outStream(cerr);
#endif
   }
};
//Данная функция создает объект ExternErrHdl
extern "C"
{
 __declspec(dllexport) ExternErrHdl *createExternErrHdl()
 {
   return new MyExternErrHdl();
 }
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *