11. Центр обработки данных
Центр обработки данных является набором библиотек динамической компоновки (DLL-библиотек), которые предназначены для размещения и хранения всех данных, связанных с работой стратегии под управлением исполнительной среды GENIE. Центр обработки данных поддерживает три способа взаимодействия пакета GENIE с другими приложениями Windows: интерфейс прикладного программирования C API, интерфейс динамического обмена данными DDE и интерфейс связывания и внедрения (встраивания) объектов OLE Automation. Интерфейс прикладного программирования C API представляет наиболее эффективное средство взаимодействия между GENIE и другими приложениями, поскольку посредством указанного интерфейса осуществляется взаимодействие между программными компонентами GENIE. Интерфейс связывания и внедрения объектов OLE Automation предназначен для организации взаимодействия между GENIE и другими приложениями Windows, поддерживающими механизм OLE. Данный интерфейс будет использоваться в будущих версиях пакета для обмена данными между GENIE и серверами OPC (OLE for Process Control — механизм связывания и внедрения объектов для управления и сбора данных в системах промышленной автоматизации).
Таким образом, центр обработки данных является основным информационным хранилищем в GENIE. Результаты выполнения всех функциональных блоков и данные, вводимые пользователем с помощью элементов управления в экранных формах, передаются в центр обработки данных. Центр обработки данных располагается в физической (не виртуальной) оперативной памяти для обеспечения наиболее быстрого сохранения и извлечения данных. Имя тэга является ключом для поиска информационного объекта в центре обработки данных. Для увеличения скорости доступа к информации в центре обработки данных могут быть использованы различные эффективные алгоритмы, реализация которых имеется в стандартных библиотеках Microsoft Foundation Classes (MFC). Каждый объект в центре обработки данных имеет имя тэга, идентификатор функционального блока, период обновления информации, счетчик доступа и значение, связанное с объектом. Другие приложения Windows могут использовать имя тэга для получения идентификатора функционального блока из центра обработки данных. Идентификатор функционального блока также может применяться в качестве ключа для поиска объекта в центре обработки данных.
11.1 Архитектура GENIE

Рис. 11_1. Архитектура GENIE
Архитектура GENIE представлена на рис. 11-1. Новая архитектура системы обеспечивает наибольшую гибкость и эффективность GENIE версии 3.xx. Описание элементов архитектуры приведено ниже.
Исполнительная среда GENIE
Исполнительная среда GENIE версии 3.xx в отличие от предыдущих версий пакета обеспечивает возможность переключения нескольких задач в процессе исполнения, а также позволяет осуществлять однократный вызов задач. Этим объясняется способность GENIE одновременно исполнять несколько задач.
Поскольку один вызов задачи является наименьшей единицей исполнения, пользователи получают возможность разрабатывать стратегию таким образом, что логически и функционально связанные блоки группируются в одной и той же задаче. Использование основного сценария для управления исполнением задач позволяет вызывать те или иные задачи только при выполнении определенных условий. В результате появляется возможность разработки сложных систем путем объединения простых задач. Простая стратегия, содержащая одну задачу, может исполняться без использования сценарных процедур.
Ядро системы исполнения сценарных процедур
Ядро подсистемы программирования и исполнения сценарных процедур пакета GENIE представляет собой набор библиотек динамической компоновки, с помощью которых выполняется предварительная компиляция сценарных процедур на этапе разработки, и исполнение сценариев в процессе исполнения всей стратегии. Бейсик-сценарий обеспечивает возможность не только манипуляции задачами, входящими в стратегию, но и взаимодействия с DOS, Windows и другими приложениями посредством механизмов DDE, OLE и ODBC (SQL). Синтаксис Бейсик-сценария совместим с Microsoft VBA (Visual Basic for Application, используемым в Excel, Word, Access и т. п.) и Microsoft Visual Basic. Бейсик-сценарий и VBA имеют ряд несовместимых функций, но более 95% функций и процедур абсолютно идентичны. При использовании в Бейсик-сценарии базовых функций имеется возможность компиляции и исполнения программ, написанных на Visual Basic, без каких - либо изменений. Номера ошибок и сообщения об ошибках в Бейсик-сценарии также совместимы с имеющимися в Visual Basic. В состав Бейсик-сценария входит редактор диалоговых панелей, позволяющий разрабатывать собственные средства взаимодействия с оператором. Средство программирования сценарных процедур делает пакет GENIE одним из наиболее удобных и современных инструментов для разработки программного обеспечения верхнего уровня систем сбора данных и оперативного диспетчерского управления (SCADA).
Драйверы в виде библиотек динамической компоновки (DLL)
В GENIE версии 3.xx, как и в предыдущих версиях пакета, используются загружаемые драйверы в виде библиотек динамической компоновки. Для обмена информацией с исполнительной средой GENIE в драйверах используется интерфейс прикладного программирования C API. Драйверы устройств могут непосредственно обмениваться данными с центром обработки данных GENIE посредством вызовов функций Си. Таким же способом может осуществляться информационный обмен между GENIE и другими приложениями Windows. Кроме того, полный доступ к информации в центре обработки данных может быть получен из Бейсик-сценариев. Поскольку интерфейс динамического обмена данными (DDE) имеет довольно невысокое быстродействие, он является дополнением к интерфейсу прикладного программирования C API, ориентированным на применение пользователями, которые не обладают навыками программирования в среде Windows, а также для обмена информацией с такими приложениями, как Excel, ADAM DDE Server и др. Функциональные блоки ввода-вывода, имеющие одинаковые имена тэгов, не могут существовать в рамках одной задачи, однако допускается их наличие в различных задачах. Блоки ввода-вывода не принадлежат какой-либо задаче стратегии. Центр обработки данных создает глобальные переменные для хранения всех функциональных блоков ввода-вывода.
Редактор отчетов
Редактор отчетов является отдельным приложением, которое полностью независимо от исполнительной среды GENIE. Редактор отчетов обеспечивает пользователю возможность формирования отчетов и вывода их на экран монитора или печатающее устройство.
11.2 Интерфейс прикладного программирования
Центр обработки данных поддерживает три способа взаимодействия пакета GENIE с другими приложениями Windows: интерфейс прикладного программирования C API, интерфейс динамического обмена данными DDE и интерфейс связывания и внедрения объектов OLE Automation. Интерфейс прикладного программирования C API представляет наиболее эффективное средство взаимодействия между GENIE и другими приложениями, поскольку посредством указанного интерфейса осуществляется взаимодействие между программными компонентами GENIE. Интерфейс связывания и внедрения объектов OLE Automation предназначен для организации взаимодействия между GENIE и другими приложениями Windows, поддерживающими механизм OLE. Данный интерфейс будет использоваться в будущих версиях пакета для обмена данными между GENIE и серверами OPC (OLE for Process Control — механизм связывания и внедрения объектов для управления и сбора данных в системах промышленной автоматизации).
11.2.1 Интерфейс прикладного программирования C API
Перечень функций, составляющих интерфейс прикладного программирования C API, приведен ниже.
GetTagID | Возврат идентификатора блока по имени задачи и имени тэга |
SetData | Установка значения для заданного объекта в центре обработки данных |
GetData | Возврат значения, связанного с заданным объектом в центре обработки данных |
SetDataExp | Ускоренная установка значения для заданного объекта в центре обработки данных по идентификатору функционального блока |
GetDataExp | Ускоренный возврат значения, связанного с заданным объектом в центре обработки данных по идентификатору функционального блока |
GetTagList | Возврат списка тэгов в задаче, имя которой передано функции |
GetTaskList | Возврат списка задач в GENIE |
ReleaseTagList | Освободить память, отведенную для списка тэгов |
ReleaseTaskList | Освободить память, отведенную для списка задач |
Прототипы данных функций приведены в заголовочном файле DBEXPORT. H
#ifndef DBEXPORT_H
#define DBEXPORT_H
#include "dbdata. h"
#ifdef __cplusplus
extern "C"
{
#endif
typedef struct
{
/*******/
//DB_INT 0x0000
//DB_INT_A 0x1000
//DB_LONG 0x0001
//DB_LONG_A 0x1001
//DB_FLOAT 0x0002
//DB_FLOAT_A 0x1002
//DB_LPSTR 0x0004
//DB_LPSTR_A 0x1004
/*******/
WORD wDataType;
WORD wFrom;//данный атрибут используется только если pData является массивом
WORD wSize;//данный атрибут используется только если pData является массивом
//и только в функции установки этих данных
DWORD dwTime;//период обновления возвращаемых данных
MIXDATA Data;
}DB_PARAM;
typedef DB_PARAM far * LPDB_PARAM;
typedef struct T_LIST_RECORD
{
LPCSTR lpTaskName;
LPCSTR lpTagName;
T_LIST_RECORD * Next;
}LIST_RECORD;
typedef LIST_RECORD far * LPLIST_RECORD;
extern DWORD CALLBACK GetTagID(LPCSTR lpTaskName, LPCSTR lpTagName);
extern BOOL CALLBACK SetData
(
LPCSTR lpTaskName,
LPCSTR lpTagName,
LPDB_PARAM pParam
);
extern BOOL CALLBACK SetDataX(DWORD dwTagID, LPDB_PARAM pParam);
extern BOOL CALLBACK GetData
(
LPCSTR lpTaskName,
LPCSTR lpTagName,
LPDB_PARAM pParam
);
extern BOOL CALLBACK GetDataX(DWORD dwTagID, LPDB_PARAM pParam);
extern LPLIST_RECORD CALLBACK GetTagList(LPCSTR lpTaskName);
extern LPLIST_RECORD CALLBACK GetTaskList();
extern void CALLBACK ReleaseTagList(LPLIST_RECORD lpList);
extern void CALLBACK ReleaseTaskList(LPLIST_RECORD lpList);
#ifdef __cplusplus
}
#endif
#endif
11.2.2 Интерфейс связывания и внедрения объектов OLE Automation
Перечень функций, составляющих интерфейс связывания и внедрения объектов OLE Automation, приведен ниже.
GetTagDataLong | Возврат целого значения двойной точности для заданного тэга из центра обработки данных |
GetTagDataFloat | Возврат значения с плавающей точкой (типа single) для заданного тэга из центра обработки данных |
GetTagDataSTR | Возврат строки для заданного тэга из центра обработки данных |
SetTagDataLong | Установка целого значения двойной точности для заданного тэга в центре обработки данных |
SetTagDataFloat | Установка значения с плавающей точкой (типа single) для заданного тэга в центре обработки данных. |
SetTagDataSTR | Установка строки для заданного тэга в центре обработки данных |
Прототипы данных функций приведены в заголовочном файле OLEDB. H
// oledb. h : header file
//
///////////////////////////////////////////////////////////////////////////
// COLEDB command target
class COLEDB : public CCmdTarget
{
DECLARE_DYNCREATE(COLEDB)
protected:
COLEDB();//защищенный конструктор, используемый для динамического создания объекта
// Атрибуты
public:
// Операции
public:
// Переопределяемые методы
virtual void OnFinalRelease();
// Реализация
protected:
virtual ~COLEDB();
// Сгенерированные функции для таблицы сообщений
//{{AFX_MSG(COLEDB)
// ВНИМАНИЕ y ClassWizard будет добавлять и удалять функцииyметоды в этом блоке
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
DECLARE_OLECREATE(COLEDB)
// Сгенерированные функции для таблицы диспетчеризации сообщений OLE
//{{AFX_DISPATCH(COLEDB)
afx_msg long GetTagDataLong(LPCTSTR szTaskName, LPCTSTR szTagName, short Index);
afx_msg float GetTagDataFloat(LPCTSTR szTaskName, LPCTSTR szTagName, short Index);
afx_msg BSTR GetTagDataSTR(LPCTSTR szTaskName, LPCTSTR szTagName, short Index);
afx_msg BOOL SetTagDataLong(LPCTSTR szTaskName, LPCTSTR szTagName, short Index, long Data);
afx_msg BOOL SetTagDataFloat(LPCTSTR szTaskName, LPCTSTR szTagName, short Index, float Data);
afx_msg BOOL SetTagDataSTR(LPCTSTR szTaskName, LPCTSTR szTagName, short Index, LPCTSTR Data);
afx_msg long AddTag(LPCTSTR szTaskName, LPCTSTR szTagName, short wType);
afx_msg long AddTask(LPCTSTR szTaskName);
afx_msg void DeleteTask(LPCTSTR szTaskName);
afx_msg void DeleteTag(LPCTSTR szTaskName, LPCTSTR szTagName);
afx_msg long ChangeTaskName(LPCTSTR szOldTask, LPCTSTR szNewTask);
afx_msg long ChangeTagName(LPCTSTR szTaskName, LPCTSTR szOldTag, LPCTSTR szNewTag);
//}}AFX_DISPATCH
DECLARE_DISPATCH_MAP()
};
/////////////////////////////////////////////////////////////////////////////
Перечень функций для работы со списком тэгов в OLE Automation приведен ниже.
SelectTask | Выбор требуемой задачи для работы со списком тэгов |
GoTop | Переход на первую запись в списке тэгов |
EndofList | Проверка нахождения на последней записи списка тэгов |
GoBottom | Переход на последнюю запись в списке тэгов |
GetTaskName | Возврат имени задачи, указанной в качестве параметра |
GetTagName | Возврат имени тэга, указанного в качестве параметра |
GoNext | Переход к следующей записи в списке тэгов |
Прототипы данных функций приведены в заголовочном файле TAGLIST. H
// taglist. h : header file
//
#include "dbexport. h"
/////////////////////////////////////////////////////////////////////////////
// CTAGLIST command target
class CTAGLIST : public CCmdTarget
{
DECLARE_DYNCREATE(CTAGLIST)
protected:
CTAGLIST();// защищенный конструктор, используемый для динамического создания объекта
// Атрибуты
public:
// Атрибуты
protected:
LPLIST_RECORD lpListH;
LPLIST_RECORD lpListCur;
LPLIST_RECORD lpListT;
// Операции
public:
// Переопределяемые методы
virtual void OnFinalRelease();
// Реализция
protected:
virtual ~CTAGLIST();
// Функции карты сообщений
//{{AFX_MSG(CTAGLIST)
// ВНИМАНИЕ y ClassWizard будет добавлять и удалять функцииyметоды в этом блоке.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
DECLARE_OLECREATE(CTAGLIST)
// Сгенерированные функции для таблицы диспетчеризации сообщений OLE
//{{AFX_DISPATCH(CTAGLIST)
afx_msg BOOL SelectTask(LPCTSTR szTaskName);
afx_msg void GoTop();
afx_msg BOOL EndofList();
afx_msg void GoBottom();
afx_msg BSTR GetTaskName();
afx_msg BSTR GetTagName();
afx_msg void GoNext();
//}}AFX_DISPATCH
DECLARE_DISPATCH_MAP()
};
/////////////////////////////////////////////////////////////////////////////
Перечень функций для работы со списком задач в OLE Automation приведен ниже.
GoTop | Переход на первую запись в списке задач |
EndofList | Проверка нахождения на последней записи списка задач |
GoBottom | Переход на последнюю запись в списке задач |
GoNext | Переход на следующую запись в списке задач |
Get | Возврат идентификатора текущей задачи |
Прототипы данных функций приведены в заголовочном файле TASKLIST. H
// tasklist. h : header file
//
#include "dbexport. h"
/////////////////////////////////////////////////////////////////////////////
// CTASKLIST command target
class CTASKLIST : public CCmdTarget
{
DECLARE_DYNCREATE(CTASKLIST)
protected:
CTASKLIST();// protected constructor used by dynamic creation
// Attributes
public:
// Attributes
protected:
LPLIST_RECORD lpListH;
LPLIST_RECORD lpListCur;
LPLIST_RECORD lpListT;
// Operations
public:
// Overrides
virtual void OnFinalRelease();
// Implementation
protected:
virtual ~CTASKLIST();
// Generated message map functions
//{{AFX_MSG(CTASKLIST)
// NOTE y the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
DECLARE_OLECREATE(CTASKLIST)
// Generated OLE dispatch map functions
//{{AFX_DISPATCH(CTASKLIST)
afx_msg void GoTop();
afx_msg void GoBottom();
afx_msg BSTR Get();
afx_msg void GoNext();
afx_msg BOOL EndofList();
//}}AFX_DISPATCH
DECLARE_DISPATCH_MAP()
};
/////////////////////////////////////////////////////////////////////////////


