12. Разработка функциональных блоков пользователя

12.1 Введение

Имеется возможность создания функционального блока пользователя, оформляемого в виде библиотеки динамической компоновки (DLL) и подключаемого к GENIE с добавлением соответствующей пиктограммы в набор инструментов Редактора задач. Передача информации между GENIE и пользовательской библиотекой динамической компоновки осуществляется путем применения различных функций и параметров, включенных в программу, разработка которой выполняется на языке программирования Си или Си++.

В настоящем разделе предполагается, что пользователь имеет навыки работы с интегрированными средами разработки приложений Microsoft Visual C++ или Borland C++, а также знаком с комплектом разработки программного обеспечения для Windows 3.1x Microsoft SDK. Кроме того, для изучения материала, приведенного в настоящем разделе, требуется наличие у пользователя опыта разработки 16-разрядных библиотек динамической компоновки (DLL).

Настоятельно рекомендуется не приступать к разработке пользовательской библиотеки динамической компоновки для GENIE до получения перечисленных выше навыков и знаний.

ПРИМЕЧАНИЕ. В качестве учебного материала можно использовать следующую литературу: , Фролов система Microsoft Windows 3.1 для программиста: В 3 ч. М.: Диалог_МИФИ, 1994. (Библиотека системного программиста - Т. 11_13).

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

НЕ нашли? Не то? Что вы ищете?

Редактор задач GENIE в сочетании с библиотеками динамической компоновки пользователя представляет мощную объектно-ориентированную среду, которая позволяет существенно сократить затраты на разработку программного обеспечения верхнего уровня АСУТП.

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

Минимальные требования к средствам разработки

Для разработки библиотек динамической компоновки пользователя требуется любой компилятор, позволяющий транслировать 16-разрядные DLL-библиотеки для Windows. Возможно применение таких интегрированных сред разработки приложений, как Borland C++ 4.5, Borland C++ 5.xx, Microsoft Visual C++ 1.5

и др.

Установка

Установка комплекта разработки библиотек динамической компоновки пользователя происходит в процессе установки пакета GENIE 3.xx. Данный комплект, поставляемый с пакетом, имеет четыре подкаталога: \USERDLL\INCLUDE, \USERDLL\PLC, \USERDLL\SQWAVE и \USERDLL\STRTABLE.

Каталог \USERDLL \INCLUDE содержит файл заголовка GENDATA. H, который требуется для трансляции и компоновки разрабатываемых DLL-библиотек.

Каталоги \USERDLL\PLC, \USERDLL\SQWAVE и \USERDLL\STRTABLE содержат примеры функциональных блоков пользователя со всеми исходными текстами. В подкаталоге \USERDLL\PLC находится пример функционального блока пользователя, позволяющего передавать другим функциональным блокам стратегии информацию о состоянии каналов дискретного ввода контроллеров с программируемой логикой фирмы OMRON. В подкаталоге \USERDLL\SQWAVE находится пример функционального блока пользователя, который формирует последовательность импульсов различной амплитуды и длительности. В подкаталоге \USERDLL\ STRTABLE находится пример функционального блока пользователя, который предназначен для передачи другим функциональным блокам символьных строк, расположенных в текстовом файле. Первый столбец текстового файла должен содержать значение, поступление которого на вход блока STRTABLE приведет к появлению на его выходе строки, отделенной от значения в первом столбце символом - разделителем. Путь к текстовому файлу и символ-разделитель устанавливаются в диалоговой панели настройки параметров функционального блока пользователя STRTABLE.

Добавление пиктограммы функционального блока пользователя в набор инструментов Редактора задач

Добавление функционального блока пользователя производится в следующей последовательности:

1. Выберите строку Добавить инструмент… меню Настройка Редактора задач. На экран монитора будет выведена диалоговая панель Подключить функциональный блок пользователя, внешний вид которой приведен на рис. 5-29.

2. С помощью кнопки Обзор… диалоговой панели Подключить функциональный блок пользователя введите путь к файлу библиотеки динамического компоновки (DLL), реализующей функции библиотечного блока пользователя, после чего нажмите кнопку OK. Пиктограмма функционального блока пользователя появится в наборе инструментов Редактора задач.

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

12.2 Общие сведения о комплекте разработки библиотек динамической компоновки пользователя

В состав комплекта разработки библиотек динамической компоновки пользователя входит файл заголовка GENDATA. H, который требуется для трансляции и компоновки разрабатываемых DLL-библиотек и для организации взаимодействия с пакетом GENIE.

В файле GENDATA. H определены типы данных, которые могут использоваться в библиотеке динамической компоновки пользователя:

#define TAGSIZE 9 //Количество символов в поле Тэг диалоговой панели

//настройки параметров функционального блока пользователя

#define DESCSIZE 31 //Количество символов в поле Описание диалоговой панели

//настройки параметров функционального блока пользователя

//Ниже определены типы данных, передаваемых между библиотекой динамической компоновки

//пользователя и основной программой

#define GDT_NULL 0x0000 // Тип данных NULL

#define GDT_LONG 0x0001 // Целое двойной точности

#define GDT_INT 0x0001 // Целое одинарной точности

#define GDT_FLOAT 0x0002 // Действительное (с плавающей точкой)

#define GDT_LPSTR 0x0004 // Строка

#define GDT_USERDEF1 0x1000 // Тип, определяемый пользователем

#define GDT_USERDEF2 0x2000 // Тип, определяемый пользователем

Библиотека динамической компоновки пользователя после подключения становится частью набора инструментов Редактора задач и может взаимодействовать с другими функциональными блоками стратегии во время ее исполнения. При разработке библиотеки динамической компоновки пользователя необходимо создать и экспортировать функции, вызываемые GENIE в процессе разработки стратегии (Редактором задач, GENIE. EXE), а также во время ее исполнения (Исполнительной средой GENIE, GWRUN. EXE). Данные функции предназначены для организации обмена данными между библиотекой динамической компоновки пользователя и основными программными компонентами GENIE.

Программный интерфейс с Редактором задач включает в себя следующие функции:

IsUserDefinedDLL()

Указывает GENIE, что формат подключаемой DLL y библиотеки соответствует формату библиотеки динамической компоновки пользователя GENIE.

GetDataArea()

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

FreeDataArea()

Освобождение памяти, занятой структурами данных USERDATA и RUNDATA

StartClicked()

Действия, выполняемые при начале рисования проводника (связи) от функционального блока пользователя к другому функциональному блоку. Начало рисования связи сопровождается щелчком левой клавишей мыши на пиктограмме функционального блока пользователя.

EndClicked()

Действия, выполняемые при завершении рисования проводника (связи) от другого функционального блока к функциональному блоку пользователя. Завершение рисования связи сопровождается щелчком левой клавишей мыши на пиктограмме функционального блока пользователя

DoubleClicked()

Действия, выполняемые при двойном щелчке левой клавишей мыши на пиктограмме функционального блока пользователя (как правило, вывод на экран монитора диалоговой панели настройки параметров блока).

Программный интерфейс с исполнительной средой GENIE включает в себя следующие функции:

PrepareToRun()

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

Run()

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

StopRunning()

Действия, выполняемые при выборе пользователем строки Стоп меню Запуск перед завершением исполнения стратегии.

Краткое описание функций

IsUserDefinedDLL()

Используется для уведомления вызывающей программы о том, что формат данной DLL-библиотеки соответствует формату библиотеки динамической компоновки пользователя для GENIE. GENIE вызывает данную функцию в момент подключения DLL - библиотеки из диалоговой панели Подключить функциональный блок пользователя. Если данная функция не экспортируется подключаемой DLL - библиотекой, ее подключение не будет произведено и соответствующая ей пиктограмма не появится в наборе инструментов Редактора задач.

GetDataArea()

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

Как правило, данная функция запрашивает и получает память для размещения структур USERDATA и RUNDATA, которые должны быть объявлены пользователем. Кроме того, в конец структуры USERDATA должны быть добавлены описания всех элементов данных, которые необходимы пользователю для должной работы функционального блока пользователя. Ниже приведены примеры объявления структур RUNDATA и USERDATA.

/*******/

/* Тип RUNDATA, определяемый одноименной структурой, предназначен для декларации и */

/* создания переменных, которые используются во время работы стратегии под управлением */

/* исполнительной среды GENIE. Не допускается изменять содержимое данной структуры. */

/*******/

typedef struct _RUNDATA// Структура данных времени исполнения

{

WORD wDataType; //типы данных, определенные в gendata. h

UINT uLabelID;

union {

long l;

float f;

unsigned long u;

int i;

unsigned short w;

char c;

unsigned char b;

LPSTR p;

} data;

} RUNDATA;

typedef RUNDATA FAR* LPRUNDATA;

typedef struct _USERDATA //Структура данных пользователя

{

/*******/

/* Следующие строки должны быть сохранены без изменений во всех */

/* библиотеках динамической компоновки пользователя. Указанные */

/* атрибуты имеют особую важность при организации обмена данными между */

/* DLL пользователя и GENIE. */

/*******/

int cbSize; // размер структуры _USERDATA

HWND hWndParent; // идентификатор окна GenView

char szTagName[TAGSIZE]; // имя тэга функционального блока пользователя

char szDescription[DESCSIZE]; // описание функционального блока пользователя

HGLOBAL hthisData; // идентификатор блока памяти для USERDATA

HGLOBAL hInData; // идентификатор блока памяти для данных, поступающих на входы блока

HGLOBAL hOutData;// идентификатор блока памяти для данных, передаваемых на выходы блока

int outDataCnt; // количество выходов блока

LPRUNDATA outData; // данные, передаваемые на выход блока

int inDataCnt; // количество входов

LPRUNDATA inData; // данные, поступающие на вход блока

HGLOBAL hUserBlock; // идентификатор блока памяти для данных,

// определенных пользователем

LPVOID lpUserBlock; // дальний указатель на блок памяти для данных,

// определенных пользователем

/*/

/* Следующие строки относятся только к данному примеру. */

/* Пользователь имеет возможность определить в этом месте */

/* собственные атрибуты для создаваемого функционального блока */

/* пользователя. */

/*/

float variable1;

float variable2;

int variable3;

// И так далее.

} USERDATA;

typedef USERDATA FAR* LPUSERDATA;

FreeDataArea(LPUSERDATA lpUserData)

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

StartClicked(LPUSERDATA lpUserData)

Вызов данной функции производится приложением (процессом) GENIE, когда пользователь приступает к рисованию связи между пиктограммой подключенного функционального блока пользователя и другим функциональным блоком стратегии и производит щелчок левой клавишей мыши на пиктограмме функционального блока пользователя. Если при этом функциональный блок пользователя имеет выходы, функция должна возвратить значение CLK_OK. Если функциональный блок пользователя не имеет выходов, функция должна вернуть значение CLK_REJECTSTART. Определение указанных возвращаемых значений должно быть произведено в заголовочном файле пользователя, как показано в примере, описание которого приведено ниже.

EndClicked(LPUSERDATA lpUserData, int nType)

Вызов данной функции производится приложением (процессом) GENIE, когда пользователь завершает рисование связи между пиктограммой другого функционального блока стратегии и функциональным блоком пользователя и производит щелчок левой клавишей мыши на пиктограмме функционального блока пользователя. Если при этом функциональный блок пользователя имеет входы, функция должна возвратить значение CLK_OK. Если функциональный блок пользователя не имеет входов, функция должна вернуть значение CLK_REJECTEND. Определение указанных возвращаемых значений должно быть произведено в заголовочном файле пользователя, как показано в примере, описание которого приведено ниже.

DoubleClicked(LPUSERDATA lpUserData)

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

PrepareToRun(LPUSERDATA lpUserData)

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

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

Run(LPUSERDATA lpUserData)

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

StopRunning(LPUSERDATA lpUserData)

В рамках данной функции должны быть реализованы все операции, предшествующие завершению исполнения задачи и связанные с входящим в ее состав соответствующим функциональным блоком пользователя. Вызов данной функции производится перед завершением исполнения стратегии после выбора пользователем строки Стоп меню Запуск построителя стратегий GENIE или после выполнения команды Стоп в исполнительной среде GENIE. Функция возвращает значение, равное нулю. В следующем подразделе рассмотрен пример разработки библиотеки динамической компоновки пользователя. Данный пример носит название SQWAVE. DLL ( подкаталог \USERDLL\SQWAVE). Соответствующий функциональный блок пользователя предназначен для передачи в адрес других функциональных блоков стратегии периодической последовательности импульсов прямоугольной формы.

12.2.1 Компиляция

Для выполнения трансляции и компоновки разрабатываемой библиотеки динамической компоновки пользователя следует воспользоваться средствами используемой интегрированной среды разработки приложений для Windows. При этом необходимо всегда включать в проект заголовочный файл GENDATA. H. Ниже приведен пример командного файла для автоматической трансляции и компоновки примера проекта SQWAVE. DLL для Microsoft Visual C++ V1.5.

#*****

# makefile, sqwave. dll

# Copyright y American Advantech Corp. 1995

#

#*****

PROJ = SQWAVE #имя драйвера

DEBUG = 0 #флаг отладки

DRV_SEG = DRV_MAIN #определение сегмента кода драйвера

DLG_SEG = DRV_DLG #определение сегмента кода диалоговой панели

MODEL =M #модель памяти

WARNING=3 #уровень выдаваемых сообщений

# C compile options

CC = cl

CFLAGS_G = /A$(MODEL) /W$(WARNING) /G2 /Zp /BATCH /NT #general options

CFLAGS_D = /Od /Zi /Gsw #debug options

CFLAGS_R = /O2 /Gsw #nonydebug options

# C++ compile options

CXX = cl

CXXFLAGS_G = /G2 /W$(WARNING) /ASw /Zp /BATCH #general options

CXXFLAGS_D = /Zi /Od /Gsw #debug options

CXXFLAGS_R = /O2 /Gsw #nonydebug options

MAPFILE_D = NUL

MAPFILE_R = NUL

# Linker option

LFLAGS_G = /BATCH /ONERROR:NOEXE #general options

LFLAGS_D = /CO /NOE #debug options

LFLAGS_R = /NOE #nonydebug options

LLIBS_G = LIBW. LIB #general library

LINKER = link

ILINK = ilink

LRF = echo > NUL

ILFLAGS = /a /e

RC = rc

IMPLIB = implib

LLIBS_R = /NOD $(MODEL)DLLCEW

LLIBS_D = /NOD $(MODEL)DLLCEW

FILES = SQWAVE. C SQWAVE. RC SQWAVE. H SQWDLG. H GENDATA. H\

SQWAVE. DEF

#path for header files

HEADERS = ..\INCLUDE\\

INCLUDE = $(INCLUDE);..\INCLUDE

DEF_FILE = SQWAVE. DEF #definition

#object files

OBJS = SQWAVE. obj

RESS = SQWAVE. res

all: $(PROJ).res $(PROJ).dll

.SUFFIXES:

.SUFFIXES: .obj. res. c .rc

SQWAVE. res : SQWAVE. RC sqwave. h sqwdlg. h

$(RC) $(RCFLAGS1) /r /fo $*.res $*.RC

SQWAVE. obj : SQWAVE. C sqwave. h sqwdlg. h $(HEADERS)gendata. h

!IF $(DEBUG)

@$(CC) @<<$(PROJ).rsp

/c $(CFLAGS_G) $(DRV_SEG)

$(CFLAGS_D) /Fo$*.obj $*.C

<< 

!ELSE

@$(CC) @<<$(PROJ).rsp

/c $(CFLAGS_G) $(DRV_SEG)

$(CFLAGS_R) /Fo$*.obj $*.C

<< 

!ENDIF

$(PROJ).dll : $(DEF_FILE) $(OBJS) $(PROJ).res

!IF $(DEBUG)

$(LRF) @<<$(PROJ).lrf

$(RT_OBJS: = +^) $(OBJS: = +^)

$@

$(MAPFILE_D)

$(LIBS: = +^) +

$(LLIBS_G: = +^) +

$(LLIBS_D: = +^)

$(DEF_FILE) $(LFLAGS_G) $(LFLAGS_D);

<< 

!ELSE

$(LRF) @<<$(PROJ).lrf

$(RT_OBJS: = +^) $(OBJS: = +^)

$@

$(MAPFILE_R)

$(LIBS: = +^) +

$(LLIBS_G: = +^) +

$(LLIBS_R: = +^)

$(DEF_FILE) $(LFLAGS_G) $(LFLAGS_R);

<< 

!ENDIF

$(LINKER) @$(PROJ).lrf

$(RC) $(RCFLAGS2) $(RESS) $@

12.3 Заголовочные файлы

gendata. h

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

#ifndef GENDATA_H

#define GENDATA_H

#define TAGSIZE 9

#define DESCSIZE 31

// Константы, определяющие типы данных, которые используются при обмене данными между

// библиотекой динамической компоновки пользователя и основным процессом (GENIE. EXE,

// GWRUN. EXE).

#define GDT_NULL 0x0000

#define GDT_LONG 0x0001

#define GDT_INT 0x0001

#define GDT_FLOAT 0x0002

#define GDT_LPSTR 0x0004

#define GDT_USERDEF1 0x1000

#define GDT_USERDEF2 0x2000

#endif

sqwave. h

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

#include "gendata. h"

#define CLK_REJECTSTART 0

#define CLK_REJECTEND 0

#define CLK_OK 1

#define CLK_REJECTQUIET 2

#define CLK_OKLONG 10

#define CLK_OKFLOAT 11

#define CLK_OKSTRING 12

#define ST_LOW 0

#define ST_HIGH 1

#define INDATACNT 0 // Количество входов блока

#define OUTDATACNT 1 // Количество выходов блока

/*****/

/* Тип RUNDATA, определяемый одноименной структурой, предназначен для декларации и */

/* создания переменных, которые используются во время работы стратегии под управлением */

/* исполнительной среды GENIE. Не допускается изменять содержимое данной структуры. */

/*****/

typedef struct _RUNDATA// Структура данных времени исполнения

{

WORD wDataType; //типы данных, определенные в gendata. h

UINT uLabelID;

union {

long l;

float f;

unsigned long u;

int i;

unsigned short w;

char c;

unsigned char b;

LPSTR p;

} data;

} RUNDATA;

typedef RUNDATA FAR* LPRUNDATA;

typedef struct _USERDATA //Структура данных пользователя

{

/*******/

/* Следующие строки должны быть сохранены без изменений во всех */

/* библиотеках динамической компоновки пользователя. Указанные */

/* атрибуты имеют особую важность при организации обмена данными между */

/* DLL пользователя и GENIE. */

/*******/

int cbSize; // размер структуры _USERDATA

HWND hWndParent; // идентификатор окна GenView

char szTagName[TAGSIZE]; // имя тэга функционального блока пользователя

char szDescription[DESCSIZE]; // описание функционального блока пользователя

HGLOBAL hthisData; // идентификатор блока памяти для USERDATA

HGLOBAL hInData; // идентификатор блока памяти для данных, поступающих на входы блока

HGLOBAL hOutData; // идентификатор блока памяти для данных, передаваемых на

// выходы блока

int outDataCnt; // количество выходов блока

LPRUNDATA outData; // данные, передаваемые на выход блока

int inDataCnt; // количество входов

LPRUNDATA inData; // данные, поступающие на вход блока

HGLOBAL hUserBlock; // идентификатор блока памяти для данных,

// определенных пользователем

LPVOID lpUserBlock; // дальний указатель на блок памяти для данных,

// определенных пользователем

/*/

/* Следующие строки относятся только к данному примеру. */

/* Пользователь имеет возможность определить в этом месте */

/* собственные атрибуты для создаваемого функционального блока */

/* пользователя. */

/*/

float hi_magnitude; // амплитуда положительной полуволны прямоугольного импульса

float lo_magnitude; // амплитуда отрицательной полуволны прямоугольного импульса

int hi_duration; // длительность положительной полуволны прямоугольного импульса

int lo_duration; // длительность отрицательной полуволны прямоугольного импульса

int counter; // счетчик импульсов

int state; // нахождение выходного сигнала в состоянии положительной или

// отрицательной полуволны

} USERDATA;

typedef USERDATA FAR* LPUSERDATA;

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

LPUSERDATA FAR PASCAL __export GetDataArea(void); //выделение памяти

void FAR PASCAL __export FreeDataArea(LPUSERDATA lpUserData); //освобождение памяти

int FAR PASCAL __export StartClicked(LPUSERDATA lpUserData);

//рисование связи от выхода блока

int FAR PASCAL __export EndClicked(LPUSERDATA lpUserData, int nType);

//присоединение связи ко входу блока

void FAR PASCAL __export DoubleClicked(LPUSERDATA lpUserData);

//вызов диалоговой панели настройки параметров блока

DWORD FAR PASCAL __export PrepareToRun(LPUSERDATA lpUserData);

//инициализация перед началом исполнения стратегии

DWORD FAR PASCAL __export Run(LPUSERDATA lpUserData);

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

DWORD FAR PASCAL __export StopRunning(LPUSERDATA lpUserData);

//действия, выполняемые перед

//завершением исполнения стратегии

BOOL FAR PASCAL __export IsUserDefinedDLL(void); //определение соответствия формата

//библиотеки динамической компоновки пользователя GENIE из вызывающего процесса (GENIE. EXE)

sqwdlg. h

Определение идентификаторов ресурсов для органов управления диалоговой панели настройки параметров блока для SQWAVE. DLL.

#define IDD_SQW 200

#define IDC_TAG 202

#define IDC_HIMAG 206

#define IDC_DESC 204

#define IDC_LOMAG 208

#define IDC_HIDUR 210

#define IDC_LODUR 212

12.4 Файл определения модуля

ПРИМЕЧАНИЕ. При использовании стандартных средств разработки библиотек динамической компоновки в интегрированных средах Borland C++ 4.5 и Borland C++ 5.xx данный файл не требуется.

sqwave. def

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

LIBRARY SQWAVE

DESCRIPTION'GEN IE Example Resource DLL'

EXETYPE WINDOWS

STUB 'WINSTUB. EXE'

CODE LOADONCALL MOVEABLE

DATA PRELOAD MOVABLE SINGLE

HEAPSIZE 1024

EXPORTS WEP @1 RESIDENTNAME

GetDataArea @2

FreeDataArea @3

StartClicked @4

EndClicked @5

DoubleClicked @6

PrepareToRun @7

Run @8

StopRunning @9

IsUserDefinedDLL @10

12.5 Файл ресурсов

sqwave. rc

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

#include <windows. h>

#include "sqwdlg. h"

/* Растровые изображения пиктограмм */

up_bmp BITMAP sqw_up. bmp

down_bmp BITMAP sqw_dn. bmp

block_bmp BITMAP sqw_blk. bmp

/* Диалоговая панель настройки параметров блока */

IDD_SQW DIALOG 80, 29, 282, 127

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

CAPTION "Генератор последовательности прямоугольных импульсов"

FONT 8, "MS Sans Serif"

{

CONTROL "Тэг:", y1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 20, 10, 20, 8

CONTROL "", y1, "Static", SS_GRAYFRAME, 43, 7, 45, 15

CONTROL "Описание:", y1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 116, 10, 44, 8

CONTROL "", IDC_DESC, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER |

WS_TABSTOP, 180, 8, 78, 12

CONTROL "Амплитуда положительной полуволны:", y1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE |

WS_GROUP, 26, 37, 140, 10

CONTROL "", IDC_HIMAG, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER |

WS_TABSTOP, 180, 35, 32, 12

CONTROL "Амплитуда отрицательной полуволны:", y1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE |

WS_GROUP, 26, 52, 140, 10

CONTROL "", IDC_LOMAG, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER |

WS_TABSTOP, 180, 50, 32, 12

CONTROL "Длительность положительной полуволны:", y1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE |

WS_GROUP, 26, 67, 148, 10

CONTROL "", IDC_HIDUR, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER |

WS_TABSTOP, 180, 65, 32, 12

CONTROL "Длительность отрицательной полуволны:", y1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE |

WS_GROUP, 26, 83, 144, 10

CONTROL "", IDC_LODUR, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER |

WS_TABSTOP, 180, 80, 32, 12

CONTROL "OK", IDOK, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 73, 102, 55,

15

CONTROL "Отмена", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 153,

102, 55, 15

CONTROL "", IDC_TAG, "EDIT", ES_LEFT | ES_AUTOHSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE |

WS_TABSTOP, 44, 10, 43, 9

CONTROL "", y1, "Static", SS_BLACKFRAME, 5, 26, 272, 1

}

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

sqwave. c

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

#include <windows. h>

#include <stdlib. h>

#include "sqwave. h"

#include "sqwdlg. h"

static HINSTANCE hInst;

BOOL CALLBACK __export DClickedDlgProc(HWND hDlg, UINT msg, WPARAM wParam,

LPARAM lParam); // функция диалоговой панели

int latoi(LPCSTR lszString);

double latof(LPCSTR lszString);

void lftoa(LPCSTR lszString, float fvalue, int d);

/**/

/* SQWAVE. DLL: Функциональный блок пользователя, реализуемый данной DLL, */

/* не имеет входов и имеет 1 выход */

/**/

/* Стандартный инициализирующий вызов DLL */

int FAR PASCAL LibMain

(

HINSTANCE hModule,

WORD wDataSeg,

WORD cbHeapSize,

LPSTR lpszCmdLine

)

{

hInst = hModule;

return (1);

}

/* Стандартный вызов завершения DLL */

int CALLBACK WEP

(

int bSystemExit

)

{

return 0;

}

/* Функции редактирования */

/****/

/* Назначение: Используется для проверки соответствия формата, */

/* принятого в DLL пользователя GENIE. */

/****/

BOOL FAR PASCAL __export IsUserDefinedDLL()

{

return(TRUE);

}

/*******

Назначение: Получение блока памяти для размещение данных.

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

Имеется ряд моментов, требующих пояснения:

1. Получить память для структуры USERDATA.

2. Получить память для входных данных inData, если объект имеет входы

3. Получить память для выходных данных inData, если объект имеет выходы

4. Помнить о необходимости последующего освобождения полученной памяти с помощью функции FreeDataArea.

Рекомендация: Разработчик может оставить большую часть исходного кода данной функции без изменений за исключением определений INDATACNT, OUTDATACNT, указания типа данных, назначения идентификатора объекта и инициализации собственных атрибутов функционального блока

*******/

LPUSERDATA FAR PASCAL __export GetDataArea()

{

/****/

/*Попытайтесь оставить эту часть кода без изменений за исключением определений количества INDATACNT и OUTDATACNT (определено в заголовочном файле.) */

/****/

LPUSERDATA lpUserData;

HGLOBAL hData;

//lpUserData = (LPUSERDATA)LocalAlloc(LMEM_FIXED,(DWORD)sizeof(USERDATA));

hData = GlobalAlloc(GMEM_SHARE, (DWORD)sizeof(USERDATA));

lpUserData = (LPUSERDATA)GlobalLock(hData);

lpUserDatay>hthisData = hData;

lpUserDatay>inDataCnt = INDATACNT;

if (INDATACNT > 0)

{

lpUserDatay>hInData = GlobalAlloc(GMEM_SHARE,

(DWORD)sizeof(RUNDATA)*INDATACNT);

lpUserDatay>inData = (LPRUNDATA)GlobalLock(lpUserDatay>hInData);

}

else

{

lpUserDatay>inData = NULL;

lpUserDatay>hInData = 0;

}

lpUserDatay>outDataCnt = OUTDATACNT;

if (OUTDATACNT > 0)

{

lpUserDatay>hOutData = GlobalAlloc(GMEM_SHARE,

(DWORD)sizeof(RUNDATA)*OUTDATACNT);

lpUserDatay>outData = (LPRUNDATA)GlobalLock(lpUserDatay>hOutData);

}

else

{

lpUserDatay>outData = NULL;

lpUserDatay>hOutData = 0;

}

lpUserDatay>cbSize = sizeof(USERDATA);

lpUserDatay>outData[0].wDataType = GDT_FLOAT;

lpUserDatay>outData[0].uLabelID = 0;

lstrcpy(lpUserDatay>szTagName, "SQWAVE");

/******/

/*Инициализация атрибутов, относящихся к блоку SQWAVE */

/******/

lpUserDatay>hi_magnitude = 5.0f;

lpUserDatay>lo_magnitude = y5.0f;

lpUserDatay>hi_duration = 3;

lpUserDatay>lo_duration = 3;

return lpUserData;

}

/****/

/* Назначение:Освобождение памяти, полученной данной DLL. */

/* ВНИМАНИЕ:Освобождение памяти, полученной при вызове функции GetDataArea,

/* ОБЯЗАТЕЛЬНО! */

/**/

void FAR PASCAL __export freeDataArea

(

LPUSERDATA lpUserData

)

{

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

HGLOBAL hData;

if (lpUserDatay>hInData!= 0)

{

GlobalUnlock(lpUserDatay>hInData);

GlobalFree(lpUserDatay>hInData);

}

if (lpUserDatay>hOutData!= 0)

{

GlobalUnlock(lpUserDatay>hOutData);

GlobalFree(lpUserDatay>hOutData);

}

hData = lpUserDatay>hthisData;

GlobalUnlock(hData);

GlobalFree(hData);

}

/****/

/* Назначение: Вызов данной функции производится приложением (процессом) GENIE, когда пользователь приступает к рисованию связи между пиктограммой подключенного функционального блока пользователя и другим функциональным блоком стратегии и производит щелчок левой клавишей мыши на пиктограмме функционального блока пользователя. */

/****/

int FAR PASCAL __export StartClicked

(

LPUSERDATA lpUserData

)

{

return(CLK_OK);

}

/*****/

/* Назначение: Вызов данной функции производится приложением */

/* (процессом) GENIE, когда пользователь завершает рисование связи */

/* между пиктограммой другого функционального блока стратегии и */

/* функциональным блоком пользователя и производит щелчок левой */

/* клавишей мыши на пиктограмме функционального блока пользователя. */

/*****/

int FAR PASCAL __export EndClicked

(

LPUSERDATA lpUserData,

int nType

)

{

return(CLK_REJECTEND);

//return(CLK_OK);

}

/*****/

/* Назначение: Вызов данной функции производится приложением (процессом) GENIE, когда*/

/*пользователь выполняет двойной щелчок левой клавишей мыши на */

/*пиктограмме функционального блока пользователя. В указанной функции необходимо */создать или загрузить из ресурсов библиотеки динамической компоновки пользователя */

/*диалоговую панель настройки параметров функционального блока пользователя. */

/*****/

void FAR PASCAL __export DoubleClicked

(

LPUSERDATA lpUserData

)

{

DLGPROC pfnDlgProc;

intrc;

pfnDlgProc = (DLGPROC)

MakeProcInstance ((FARPROC) DClickedDlgProc, hInst);

rc = DialogBoxParam (hInst, MAKEINTRESOURCE (IDD_SQW),

lpUserDatay>hWndParent, pfnDlgProc,

(LPARAM) (LPVOID) lpUserData);

FreeProcInstance ((FARPROC) pfnDlgProc);

return;

}

/***/

/* Назначение: Данная функция предназначена для обработки сообщений */

/*от органов управления диалоговой панели. Разработчик должен */

/*создать собственную функцию для соответствующей диалоговой */

/*панели, относящейся к создаваемому функциональному блоку пользователя. */

/***/

BOOL CALLBACK __export DClickedDlgProc

(

HWND hDlg,

UINT msg,

WPARAM wParam,

LPARAM lParam

)

{

char szString[65];

GLOBALHANDLE hPropMem;

LPUSERDATA lpUserData;

LPUSERDATA _far *plpUserData;

hPropMem = GetProp (hDlg, "sqwave");

if (hPropMem)

{

plpUserData = (LPUSERDATA _far *)GlobalLock (hPropMem);

lpUserData = *plpUserData;

GlobalUnlock (hPropMem);

}

switch(msg)

{

case WM_INITDIALOG:

{

lpUserData = (LPUSERDATA) (LPVOID) (lParam);

hPropMem = GlobalAlloc(GHND, (DWORD) sizeof(LPUSERDATA));

plpUserData = (LPUSERDATA _far *)GlobalLock (hPropMem);

*plpUserData = lpUserData;

GlobalUnlock (hPropMem);

SetProp (hDlg, "sqwave", hPropMem);

SetDlgItemText(hDlg, IDC_TAG, lpUserDatay>szTagName);

SetDlgItemText(hDlg, IDC_DESC, lpUserDatay>szDescription);

lftoa((LPCSTR)szString, lpUserDatay>hi_magnitude, 2);

SetDlgItemText(hDlg, IDC_HIMAG, szString);

lftoa((LPCSTR)szString, lpUserDatay>lo_magnitude, 2);

SetDlgItemText(hDlg, IDC_LOMAG, szString);

wsprintf(szString, "%d", lpUserDatay>hi_duration);

SetDlgItemText(hDlg, IDC_HIDUR, szString);

wsprintf(szString, "%d", lpUserDatay>lo_duration);

SetDlgItemText(hDlg, IDC_LODUR, szString);

break;

}

case WM_COMMAND:

switch (wParam)

{

case IDOK:

GetDlgItemText(hDlg, IDC_DESC, lpUserDatay>szDescription, 31);

GetDlgItemText(hDlg, IDC_HIMAG, szString, 10);

lpUserDatay>hi_magnitude = (float)latof((LPCSTR)szString);

GetDlgItemText(hDlg, IDC_LOMAG, szString, 10);

lpUserDatay>lo_magnitude = (float)latof((LPCSTR)szString);

GetDlgItemText(hDlg, IDC_HIDUR, szString, 10);

lpUserDatay>hi_duration = latoi(szString);

GetDlgItemText(hDlg, IDC_LODUR, szString, 10);

lpUserDatay>lo_duration = latoi(szString);

case IDCANCEL:

RemoveProp(hDlg, "sqwave");

GlobalFree(hPropMem);

EndDialog(hDlg, 0);

break;

}

break;

default:

return FALSE;

}

return TRUE;

}

/**/

/* Назначение: Прикладная функция пользователя */

/**/

int latoi

(

LPCSTR lszString

)

{

int len, i, sum;

BOOL negative = FALSE;

len = lstrlen(lszString);

sum = 0;

for (i = 0; i < len; i++)

{

if (lszString[i] != ' ')

break;

}

if (lszString[i] == 'y')

{

negative = TRUE;

i++;

}

for (; i < len; i++)

sum = sum * 10 + lszString[i] y '0';

if (negative)

sum = ysum;

return(sum);

}

/****/

/* Назначение: Прикладная функция пользователя */

/****/

double latof

(

LPCSTR lszString

)

{

int len, i;

double sum, devider;

BOOL negative = FALSE;

len = lstrlen(lszString);

sum = 0.0;

for (i = 0; i < len; i++)

{

if (lszString[i] != ' ')

break;

}

if (lszString[i] == 'y')

{

negative = TRUE;

i++;

}

for (; i < len; i++)

{

if (lszString[i] == '.')

{

i++;

break;

}

sum = sum * 10 + lszString[i] y '0';

}

devider = 10.0;

for (; i < len; i++)

{

sum += (lszString[i] y '0') / devider;

devider *= 10;

}

if (negative)

sum = ysum;

return(sum);

}

//

/* Назначение: Прикладная функция пользователя */

//

void lftoa

(

LPCSTR lszString,

float fvalue,

int d

)

{

long tmpLong;

float tmpFloat;

int i;

char tmpString[20];

tmpLong = (long)fvalue;

wsprintf(tmpString, "%d", tmpLong);

lstrcpy((LPSTR)lszString, (LPCSTR)tmpString);

for (i = 0, tmpFloat = 1.0f; i < d; i++)

tmpFloat *= 10.0f;

if (fvalue < 0)

tmpLong = (long)(y((fvalue y (float)tmpLong) * tmpFloat));

else

tmpLong = (long)((fvalue y (float)tmpLong) * tmpFloat);

wsprintf(tmpString, ".%d", tmpLong);

lstrcat((LPSTR)lszString, (LPCSTR)tmpString);

}

/*****/

/* Назначение: Данная функция предназначена для выполнения всех */

/*инициализирующих действий, связанных с функциональным блоком пользователем,*/

/*перед запуском стратегии на исполнение. Вызов данной функции производится */

/*перед началом исполнения стратегии после выбора пользователем строки Старт */

/*меню Запуск построителя стратегий GENIE или после выполнения команды Старт */

/*в исполнительной среде GENIE. */

/*****/

DWORD FAR PASCAL __export PrepareToRun

(

LPUSERDATA lpUserData

)

{

lpUserDatay>counter = 0;

return(0L);

}

/*****/

/* Назначение: Вызов данной функции производится один раз в течение периода */

/*сканирования задачи, содержащей соответствующий функциональный блок */

/*пользователя. Разработчик библиотеки динамической компоновки пользователя */

/*в рамках указанной функции должен реализовать все операции над входными */

/*и выходными данными, которые будут выполнены при ее вызове. */

/*****/

DWORD FAR PASCAL __export Run

(

LPUSERDATA lpUserData

)

{

lpUserDatay>counter++;

if (lpUserDatay>state == ST_LOW)

{

if (lpUserDatay>counter >= lpUserDatay>lo_duration)

{

lpUserDatay>state = ST_HIGH;

lpUserDatay>counter = 0;

}

lpUserDatay>outData[0].data. f = lpUserDatay>lo_magnitude;

return(0L);

} else

{

if (lpUserDatay>counter >= lpUserDatay>hi_duration)

{

lpUserDatay>state = ST_LOW;

lpUserDatay>counter = 0;

}

lpUserDatay>outData[0].data. f = lpUserDatay>hi_magnitude;

return(0L);

}

}

/*/

/* Назначение: В рамках данной функции должны быть реализованы все */

/*операции, предшествующие завершению исполнения задачи и связанные с */

/*входящим в ее состав соответствующим функциональным блоком */

/*пользователя. Вызов данной функции производится перед завершением */

/*исполнения стратегии после выбора пользователем строки Стоп меню Запуск*/

/*построителя стратегий GENIE или после выполнения команды Стоп в */

/*исполнительной среде GENIE. */

/*/

DWORD FAR PASCAL __export StopRunning

(

LPUSERDATA lpUserData

)

{

return(0L);

}

ПРИЛОЖЕНИЕ 1. Сообщения об ошибках исполнения

Перечень сообщений об ошибках исполнения

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

"Open COM %d Failure" (Невозможно открыть коммуникационный порт COM %d)

%d является номером коммуникационного порта, как правило лежащим в диапазоне от 1 до 4. Данное сообщение указывает на неустранимую ошибку при инициализации перед запуском стратегии на исполнение. При этом конфигурируемое устройство, подключенное к последовательному порту, по всей видимости работоспособно, однако по какой;либо причине отсутствует ответ от выбранного порта.

Возможные причины:

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

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

3) Выход из строя аппаратных средств порта интерфейса RS-232.

"Unable to transmit to COM %d Address %d" (Невозможно передать данные по адресу %d через порт

COM %d)

COM %d является идентификатором коммуникационного порта. Address %d представляет адрес устройства, подобного модулю ADAM, в сети на базе стандарта RS-485.

Причиной вывода подобного сообщения может являться неисправность передатчика порта RS-232.

"Unable to receive from COM %d Address %d" (Невозможно принять данные от устройства с адресом %d через порт COM %d)

COM %d является идентификатором коммуникационного порта. Address %d представляет адрес устройства, подобного модулю ADAM, в сети на базе стандарта RS-485.

Возможные причины:

1) Ошибка в проводном монтаже интерфейса RS-232 или RS-485.

2) Нарушение работоспособности удаленного устройства (например, серии ADAM) или его блока питания.

3) Выход из строя аппаратных средств порта интерфейса RS-232.

4) Чрезмерно высокий темп опроса задач, содержащей функциональные блоки, связанные с удаленным устройством.

"Invalid Data Received From COM %d Address %d" (Ошибка при приеме данных от устройства с адресом %d через порт COM %d)

COM %d является идентификатором коммуникационного порта. Address %d представляет адрес устройства, подобного модулю ADAM, в сети на базе стандарта RS-485.

Возможные причины:

1) Ошибка или нарушение проводного монтажа интерфейса RS-232 или RS-485.

2) Нарушение работоспособности удаленного устройства (например, серии ADAM) или его блока питания.

"Initialization Failure On I/O=%d" (Ошибка при инициализации устройства ввода-вывода с адресом %d)

%d является адресом порта ввода-вывода. Данная ошибка, как правило, возникает при неверной настройке параметров экземпляра устройства. Однако, возникновение данного сообщения об ошибке может быть вызвано неисправностью регистров модуля (платы) сбора данных и управления, которая выявляется при инициализации модуля.

"Device Reset Failure On I/O=%d" (Ошибка при попытке сброса устройства ввода-вывода с адресом

%d)

%d является адресом порта ввода-вывода. Процедура сброса устройства не может быть выполнена должным образом. Возникновение данного сообщения об ошибке может быть вызвано неисправностью регистров модуля (платы) сбора данных и управления, которая выявляется при попытке сброса конфигурационных регистров модуля.

"Analog Input Initialization Failure On I/O=%d" (Ошибка при инициализации устройства аналогового ввода по адресу %d)

%d является адресом порта ввода-вывода. Процедура инициализации подсистемы аналогового ввода не может быть выполнена должным образом. Данная ошибка, как правило, возникает при неверной настройке параметров экземпляра устройства аналогового ввода. Однако, возникновение данного сообщения об ошибке может быть вызвано неисправностью регистров модуля (платы) аналогового ввода, которая выявляется при его инициализации.

"Analog Output Initialization Failure On I/O=%d" (Ошибка при инициализации устройства аналогового вывода по адресу %d)

%d является адресом порта ввода-вывода. Процедура инициализации подсистемы аналогового вывода не может быть выполнена должным образом. Данная ошибка, как правило, возникает при неверной настройке параметров экземпляра устройства аналогового вывода. Однако, возникновение данного сообщения об ошибке может быть вызвано неисправностью регистров модуля (платы) аналогового вывода, которая выявляется при его инициализации.

"Digital Input Initialization Failure On I/O=%d" (Ошибка при инициализации устройства дискретного ввода по адресу %d)

%d является адресом порта ввода-вывода. Процедура инициализации подсистемы дискретного ввода не может быть выполнена должным образом. Данная ошибка, как правило, возникает при неверной настройке параметров экземпляра устройства дискретного ввода. Однако, возникновение данного сообщения об ошибке может быть вызвано неисправностью регистров модуля (платы) дискретного ввода, которая выявляется при его инициализации.

"Digital Output Initialization Failure On I/O=%d" (Ошибка при инициализации устройства дискретного вывода по адресу %d)

%d является адресом порта ввода-вывода. Процедура инициализации подсистемы дискретного вывода не может быть выполнена должным образом. Данная ошибка, как правило, возникает при неверной настройке параметров экземпляра устройства дискретного вывода. Однако, возникновение данного сообщения об ошибке может быть вызвано неисправностью регистров модуля (платы) дискретного вывода, которая выявляется при его инициализации.

"Temperature Initialization Failure On I/O=%d" (Ошибка при инициализации устройства измерения температуры по адресу %d)

%d является адресом порта ввода-вывода. Процедура инициализации подсистемы измерения температуры не может быть выполнена должным образом. Данная ошибка, как правило, возникает при неверной настройке параметров экземпляра устройства измерения температуры. Однако, возникновение данного сообщения об ошибке может быть вызвано неисправностью регистров модуля (платы) измерения температуры, которая выявляется при его инициализации.

"Analog Input Section Failure On I/O=%d" (Ошибка при приеме данных от устройства аналогового ввода по адресу %d)

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

"Analog Output Section Failure On I/O=%d" (Ошибка при передаче данных устройству аналогового вывода по адресу %d)

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

"Digital Input Section Failure On I/O=%d" (Ошибка при приеме данных от устройства дискретного ввода по адресу %d)

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

"Digital Output Section Failure On I/O=%d" (Ошибка при передаче данных устройству дискретного вывода по адресу %d)

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

"Temperature Section Failure On I/O=%d" (Ошибка при приеме данных от устройства измерения температуры по адресу %d)

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

"Device Not Found" (Устройство не найдено)

Установка устройства ввода-вывода не была произведена должным образом. Кроме того, данное сообщение об ошибке может быть выведено вследствие неверной настройки параметров функциональных блоков аналогового ввода, аналогового вывода, дискретного ввода, дискретного вывода или измерения температуры. Данная ошибка также возникает при отсутствии установленного драйвера устройства. Для устранения ошибки выполните настройку параметров вышеупомянутых функциональных блоков или установите устройство при помощи программы Advantech Device Installation.

"Function Not Supported On I/O=%d" (Отсутствует поддержка функции по адресу ввода-вывода %d)

%d является адресом порта ввода-вывода. Данное сообщение об ошибке может быть выведено из-за отсутствия поддержки функции драйвером устройства, устройством или GENIE, которую драйвер или GENIE пытается выполнить во время исполнения стратегии. Данное сообщение ВСЕГДА связано с ошибкой в программном обеспечении, поскольку драйверу известны все реализованные в нем функции, а GENIE запрашивает у драйвера только те функции, которые поддерживаются устройством. "Следует уменьшить темп опроса задачи" Компьютер не успевает завершить полный цикл опроса задачи при периоде сканирования, который определяется параметром Период опроса в диалоговой панели Параметры сканируемой задачи Редактора задач. Для устранения ошибки следует уменьшить период опроса задачи.

"Not Enough Memory" (Недостаточно памяти)

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

"File Not Found" (Файл не найден)

Данное сообщение выводится на экран монитора при отсутствии файла, к которому осуществляется попытка доступа во время исполнения стратегии.

"Fail to Get Device List" (Невозможно получить список устройств)

Данное сообщение об ошибке выводится при отсутствии или повреждении файла GDECFG. INI, который должен находиться в каталоге \WINDOWS и содержать информацию обо всех установленных экземплярах устройств. При отсутствии или повреждении указанного файла следует создать его повторно. После создания файла GDECFG. INI, не содержащего ни одной записи, необходимо повторно запустить программу Advantech Device Installation и установить все требуемые устройства.

ПРИМЕЧАНИЕ. При переносе стратегий на другой компьютер, следует также скопировать файл GDECFG. INI с компьютера, на котором выполнялась разработка стратегий, в каталог WINDOWS другого компьютера. Кроме того, файлы переносимых стратегий с расширением *.GNI следует поместить в каталог \GENIE другого компьютера.

Файл GDECFG. INI содержит информацию обо всех экземплярах устройств, которые были установлены при разработке стратегий. Для правильного функционирования стратегий на другом компьютере каталог \WINDOWS, который находится на его загрузочном диске, должен содержать копию файла GDECFG. INI, созданного на компьютере, на котором начиналась разработка стратегий.

ПРИЛОЖЕНИЕ 2. Сокращения и терминология

Исполнительный механизм (Actuator)

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

Аналого-цифровой преобразователь — АЦП (A/D Converter)

Электронная схема или устройство, передающее на выход набор цифровых (дискретных) сигналов (разрядов), представляющих величину напряжения, поступающего на его вход. Разрешение устройства пропорционально количеству разрядов выходного кода. Например, разрешение 16;разрядного АЦП лучше разрешения 12;разрядного АЦП.

Добавление устройства (Add a Device)

Добавление устройства в данном случае означает увеличение количества устройств одного типа, обслуживаемых одним установленным драйвером устройства. При добавлении устройства происходит установка только одного экземпляра драйвера (при использовании программы Драйверы, находящейся в Панели управления Windows 3.1x). Информация о настройке параметров конфигурации каждого экземпляра устройства добавляется при помощи программы Advantech Device Installation. В состав системы может входить несколько устройств одного типа. Для добавления устройства следует нажать кнопку Добавить... в диалоговой панели Установка и настройка устройств ввода-вывода программы установки устройств Advantech Device Installation, после чего установить базовый адрес добавляемого устройства и, при необходимости, другие параметры.

Аналоговая величина (Analog)

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

Шкала Цельсия (°C, Centigrade, Celsius)

Нулю градусов Цельсия (0° C) соответствует температура замерзания воды. Ста градусам Цельсия (100° C) соответствует температура кипения воды.

Компенсация температуры холодного спая (CJC, Cold Junction Compensation)

При соединении концов двух проводников, выполненных из разных металлов, образуется два спая. Ток будет протекать по данной цепи, если температура одного спая отличается от температуры другого. Указанный эффект аналогичен и для другого спая, за исключением направления протекания тока. Пусть один из спаев называется измерительным. Разъединим второй спай и присоединим полученные концы проводников к измерителю тока. При проведении измерения температуры с помощью измерительного спая, в случае, если не учитывается ток, порождаемый спаем (холодным спаем), который образован присоединением проводников к клеммам измерителя тока (амперметра), возникает ошибка измерения. Если измерение температуры холодного спая проводится одновременно с измерением температуры измерительного спая, указанная ошибка может быть устранена путем вычитания или суммирования показаний от измерительного спая и холодного спая при выполнении каждого измерения. Автоматическая компенсация температуры холодного спая выполняется путем измерения температуры вблизи клемм (температуры холодного спая) с помощью термометра сопротивления (RTD). Термометром сопротивления является цепь, формирующая ток, величина которого равна величине тока холодного спая, а направление противоположно направлению тока холодного спая. В результате происходит вычитание тока холодного спая из тока измерительного спая. После этого показания измерителя тока могут рассматриваться как истинные и относящиеся только к измерительному спаю.

Компенсационная петля (Comp Loop)

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

Настройка устройства

Настройка устройства ввода-вывода заключается в установке параметров его драйвера в соответствии с имеющейся аппаратной конфигурацией устройства. Установка параметров выполняется согласно положению переключателей, входящих в состав устройства, в диалоговой панели, относящейся к данному устройству и вызываемой для каждого устройства одного типа, имеющегося в составе системы. При добавлении очередного экземпляра устройства перед началом его работы под управлением программного обеспечения следует выполнить настройку его параметров при помощи программы установки устройств Advantech Device Installation.

Регулятор температуры (Temperature Controller)

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

Скорость аналого-цифрового преобразования (A/D Conversion Rate)

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

Цифро-аналоговый преобразователь — ЦАП (D/A Converter)

Устройство, выполняющее преобразование цифровой информации в соответствующий аналоговый сигнал (ток или напряжение). Данное устройство позволяет выполнять непрерывное управление технологическими процессами с помощью компьютера. Аналоговые выходы могут непосредственно управлять технологическим оборудованием при одновременном измерении поддерживаемых (стабилизируемых) параметров контролируемого (управляемого) процессов при помощи аналоговых входов. Имеется возможность реализации замкнутых контуров аналогового регулирования. Аналоговые выходы также могут применяться для формирования сигналов заданной формы (в качестве функциональных генераторов). Разрешение устройства пропорционально количеству разрядов выходного кода. Например, разрешение 16; разрядного ЦАП лучше разрешения 12;разрядного ЦАП.

Зона нечувствительности или гистерезис (Deadband (Hysteresis))

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

Дифференциальный вход (Differential Input)

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

Шкала Фаренгейта (F)

32-м градусов по шкале Фаренгейта соответствует температура замерзания воды. 212;ти градусам по шкале Фаренгейта соответствует температура кипения воды.

Импеданс

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

Устройство ввода-вывода (I/O Device)

Устройство ввода-вывода является аппаратным средством, предназначенным для ввода и/или вывода данных в вычислительную систему. Как правило, устройства ввода-вывода имеют подсистемы аналого-цифрового преобразования, цифро-аналогового преобразования, дискретного ввода и дискретного вывода в различных сочетаниях. Устройства ввода-вывода могут быть выполнены в виде плат, подключаемых к магистрали (шине) расширения, расположенной внутри компьютера, либо в виде отдельных модулей, подключаемых к компьютеру по какому-либо последовательному каналу связи. Перед началом эксплуатации устройств ввода-вывода в составе компьютера следует произвести их аппаратную настройку при помощи входящих в состав устройств переключателей либо специализированного программного обеспечения, поставляемого в комплекте с устройствами. Указания по аппаратной настройке устройств ввода-вывода приведены в эксплуатационной документации на устройства. Перед началом работы устройств ввода; вывода под управлением пакета GENIE следует выполнить настройку параметров добавленного устройства при помощи программы установки устройств Advantech Device Installation.

Установка устройства в GENIE

Установка устройства состоит из следующих операций:

1) Включение драйвера устройства в перечень загружаемых драйверов Windows 3.1x/95. Выполняется при помощи программы Драйверы, находящейся в Панели управления Windows 3.1x. В среде операционной системы Windows 95 рекомендуется производить установку драйверов устройств в автоматическом режиме при установке пакета GENIE.

2) После установки драйвера устройства, добавление устройств (экземпляров устройств одного типа), обслуживаемых данным драйвером при помощи программы установки устройств Advantech Device Installation.

Экземпляр устройства (Device Instance)

Экземпляром устройства является устройство ввода-вывода, добавленное в список установленных устройств при помощи программы установки устройств Advantech Device Installation, и имеющее уникальные значения параметров конфигурации. Например, в список устройств может быть добавлено три модуля сбора данных и управления PCL;818, каждый из которых имеет собственный базовый адрес и другие параметры. Запись о каждом из указанных модулей в списке устройств представляет экземпляр устройства. Все экземпляры однотипных устройств обслуживаются только одним загружаемым драйвером (в данном примере, PCL818.DLL).

Кельвин (K)

Основная единица измерения температуры по термодинамической шкале, принятая в системе единиц СИ. Нулю K соответствует минус 273 градуса по шкале Цельсия.

Измерительный спай (Measuring Junction)

Спай термопары, предназначенный для измерения температуры.

Перерегулирование (Overshoot)

Отношение разности между значением на выходе регулятора и значением стабилизации к значению стабилизации.

Диапазон входного (выходного) сигнала (Input/Output Range)

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

Образцовый спай (Reference Junction)

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

Удаление устройства

Удаление устройства в данном случае означает уменьшение количества устройств одного типа, обслуживаемых одним установленным драйвером устройства. При удалении устройства происходит удаление только одного экземпляра устройства из списка устройств, обслуживаемых одним загружаемым драйвером (который был установлен при помощи программы Драйверы, находящейся в Панели управления Windows 3.1x). Для удаления экземпляра устройства следует выбрать строку, содержащую название экземпляра устройства, и нажать кнопку Удалить... в диалоговой панели Установка и настройка устройств ввода-вывода программы установки устройств Advantech Device Installation. Для последующего удаления единственного экземпляра загружаемого драйвера, обслуживающего однотипные устройства, следует удалить его из списка загружаемых драйверов Windows 3.1x при помощи программы Драйверы, находящейся в Панели управления Windows 3.1x.

Разрешающая способность (Resolution)

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

Время реакции (Response Time)

Время, необходимое устройству (датчику, АЦП, ЦАП), для установления на выходе 63,2% величины, измеряемой или подаваемой на его вход (температура, напряжение и т. д.).

Термометр сопротивления (RTD)

Резистивный элемент, выполненный из медного, никелевого или платинового (или сплава) проводника и предназначенный для измерения температуры. Для подключения к вторичному преобразователю используется 2;х, 3;х или 4;проводная схема.

Вторичный спай (Secondary Junction)

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

Время установления (Settling Time)

Время, необходимое для того, чтобы в ответ на заданное изменение аналогового сигнала на входе АЦП, выходной код АЦП представлял значение, отличающееся от окончательного на некоторую величину (обычно ±1/2 младшего значащего разряда).

Настройка устройства (Setup)

Настройка устройства (в данном контексте) состоит в установке значений параметров конфигурации экземпляра устройства в соответствии с результатами аппаратной настройки физического устройства (платы, модуля) при помощи переключателей, входящих в его состав, либо специальной программы настройки, поставляемой с устройством. Установка значений параметров экземпляра устройства выполняется в соответствующей диалоговой панели, вызываемой путем выбора названия экземпляра устройства в списке устройств диалоговой панели Установка и настройка устройств ввода-вывода программы Advantech Device Installation и нажатием кнопки Настройка...

Нормализатор сигнала (Signal Conditioner)

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

Однопроводный вход (Single Ended Input)

Вход устройства, имеющий один полюс, на который подается сигнал относительно общего провода (земли).

Пределы измерения температуры (Temperature Limit)

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

Диапазон измерения температуры (Temperature Span)

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

Температурная стабильность/нестабильность (Temperature Stability/Instability)

Ошибка измерительного прибора (канала), вызванная изменением его параметров в диапазоне рабочих температур. Как правило, выражается в процентах на градус Цельсия.

Термопара (Thermocouple)

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

Типы термопар согласно ANSI:

Тип

Спай

Предел шкалы в градусах о шкале Фаренгейта

J

Железо-Константан

2192

K

Хромель-Алюмель

2501

T

Медь-Константан

752

E

Хромель-Константан

1832

R

Платина-Платина+13%-Родий

3214

S

Платина-Платина+10%-Родий

3214

B

Платина+6%-Родий –Платина+30%-Родий

3308

Обнаружение обрыва термопары (Thermocouple Break Protection)

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

Первичный преобразователь (Transducer)

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

Измерительный мост (Wheatstone Bridge)

Полный сбалансированный мост, состоящий из трех резисторов и термометра сопротивления. К двум узлам моста подключен источник питания. Измерение проводится между двумя другими узлами моста. Нагрев или охлаждение приводит к дисбалансу схемы, степень которого пропорциональна значению температуры. В зависимости от требований к точности измерения используются различные схемы подключения (2-х, 3-х или 4-проводная). Данные схемы разработаны для устранения влияния сопротивления проводов между датчиком и мостом на результаты измерения. Как правило, погрешность для указанных схем подключения оценивается следующим образом:

2-проводная схема ³ ± 0,5%

3-проводная схема ³ ± (0,25...0,50)%

4-проводная схема ³ ± (0,15...0,25)%