Диалоги
редактора, открываемые при создании скриптов различных типов, имеют небольшие
отличия. Вызов диалога редактора скриптов в окне WindowMaker осуществляется
командой Special/Scripts с последующим выбором типа создаваемого или
редактируемого скрипта. Для этого можно также воспользоваться окном Application
Explorer, выбрав папку Scripts. На рис. 5.1.1 приведен диалог Application
Scripts (скрипты уровня приложения).
Редактор
скриптов InTouch поддерживает два типа скриптов: простые и сложные. Простые
скрипты - это скрипты, содержащие операторы присваивания, сравнения, простые
математические функции и т. д. Сложные скрипты позволяют выполнять различные
логические операции типа IF - THEN - ELSE, а также могут включать циклы типа
FOR - NEXT.
Справа, в
поле Functions, размещены клавиши вызова списков различных групп встроенных
функций. Доступ к спискам встроенных функций возможен также командой
Insert/Functions с последующим выбором группы функций (см. рис. 5.1.1).
Встроенные
функции
В пакете
InTouch имеется набор встроенных функций, которые могут быть связаны с
командами или использованы в скриптах для выполнения самых различных задач.
Все
встроенные функции разбиты на четыре группы:
String... -
для обработки различных символьных строк и переменных;
Math... -
математические функции;
System... -
системные функции;
Misc... -
функции для работы с алармами распределенных систем, трендами, печатью и др.
Вызов списка
функций группы осуществляется нажатием соответствующей клавиши. Например,
щелчок по клавише String... редактора скриптов вызывает появление диалога
Choose function (выбор функции) со списком строковых функций.
Каждая
строковая функция имеет один или несколько аргументов (до 6). Например,
синтаксис функции StringFromReal выглядит следующим
образом:(Number,Precision,Type);
Number -
конвертируемая вещественная величина;
Precision -
количество десятичных знаков;
Type - тип
формата ( "f", "e", "E").
Например,
функция
StringFromReal(263.365, 2, "f") возвращает "263.36";
функция
StringFromReal(263.365, 2, "e") возвращает "2.63e2";
функция
StringFromReal(263.55, 3, "E") возвращает "2.636E2".
Функция Text имеет два аргумента: Text(Analog_Tag,
"Format_Text");
- Analog_Tag
- вещественное или целое число;
Format_Text -
формат преобразования.
Если
указанный формат функции Text - "#0.00", то:
при
Analog_Tag = 66 функция возвращает 66.00;
при
Analog_Tag =22.269 функция возвращает 22.27;
при
Analog_Tag =9.999 функция возвращает 10.00.
Щелчок по
клавише Math... вызывает появление диалога Choose function (выбор функции) со
списком математических функций.
Математические
функции работают с целыми и вещественными аргументами, выдавая целый или
вещественный результат. В левой части оператора присваивания допускается указывать
и целые переменные. Однако необходимо иметь ввиду, что преобразование
вещественного значения в целое может привести к усечению результата.
Системные
функции делятся на две категории: файловые (File) и для работы с Windows -
приложениями (Info).
Таблица 2
Встроенные функции группы System
|
Функция Описание FileCopy Копирует
исходный файл в файл-приемник FileReadFields
Возвращает очередную запись данных из
CSV - файла FileReadMessage
Возвращает указанное количество байтов
(или всю строку) из указанного файла FileWriteFields
Сохраняет в CSV - файле запись данных,
состоящую из разделенных запятыми величин InfoDisk Возвращает информацию об указанном локальном или
сетевом диске InfoFile Возвращает информацию об указанном файле или
подкаталоге компьютера или сетевого устройства InfoTouchAppDir Возвращает
имя текущего каталога InTouch - приложения
|
Файловые
функции предназначены для считывания и записи информации в файлы. У всех
файловых функций есть два общих аргумента - Filename и FillOffset. Аргумент
Filename (имя файла) хранит имя файла, из которого должна быть считана или в
который должна быть записана информация (имя также должно включать и путь к
файлу). Аргумент FillOffset (смещение в файле) задает относительную позицию в
файле, начиная с которой будут читаться или записываться данные. Смещение
задается в байтах от начала файла. Первый байт файла имеет смещение 0. После
завершения каждая функция возвращает следующее доступное смещение в файле.
Например, если функция читает 5 байтов данных, начиная с 10-го байта, то после
завершения функция возвратит 15. Некоторые встроенные функции группы System
приведены ниже.
Например,
функция FileReadFields имеет четыре аргумента и следующий синтаксис:
FileReadFields(Filename,FileOffset,StartTag,NumberOfFields);
- StartTag -
идентифицирует первый элемент в имени InTouch-переменной; - NumberOfFields -
идентифицирует число полей для чтения.
Группа
функций Miscellaneous (клавиша Misc...) включает функции для работы с алармами
распределенных систем, трендами, печатью и др.
В этой
широкой (с точки зрения назначения функций) группе можно выделить несколько
более узко специализированных подгрупп. Функции, название которых начинается с
alm, используются только в распределенных системах алармов
Первым
аргументом всех встроенных функций алармов является ObjectName (имя объекта
алармов). Часто в роли одного из аргументов выступает Comment (комментарий).
Например, функция almAckSelect имеет следующий синтаксис:
almAckDisplay(ObjectName,Comment);.
Встроенные
функции для работы с архивными трендами также могут иметь несколько аргументов
(до четырех). Функции, приведенные в табл. 5.3.2, имеют следующий синтаксис:
HTGetPenName(Hist_Tag, UpdateCount, PenNum);
-
HTGetValue(Hist_Tag,UpdateCount,PenNum,ValType_Text);
HTScrollLeft(Hist_Tag,Percent);
HTSetPenName(Hist_Tag,PenNum,Tagname);
- HTZoomIn (Hist_Tag,LockString).
Первый
аргумент всех встроенных функций для работы с трендами - Hist_Tag (имя тренда).
Из других аргументов следует отметить PenNum (номер пера тренда), ValType_Text
(строка, указывающая тип возвращаемого значения), Tagname (новое имя пера).
Функции,
название которых начинается с wc (табл.5.3.3), используются с управляющими
объектами окна (простые списки, текстовые окна, ниспадающие списки и т. д.)
Функции этой
подгруппы также могут иметь до четырех аргументов:
-
wcDeleteItem("ControlName", ItemIndex);
wcInsertItem("ControlName",
ItemIndex, "MessageTag");
wcLoadText("ControlName",
"Filrename");.
Первый аргумент всех встроенных функций этой подгруппы - ControlName (имя управляемого окна). Часто в качестве аргумента используются ItemIndex
(номер, соответствующий позиции элемента), MessageTag (строковое сообщение),
Filrename (имя файла в формате ASCII).
В
рассматриваемой группе функций Miscellaneous следует отметить функцию
PrintWindow, i?aaiacia?aiioю для печати окна. Ее синтаксис выглядит следующим
образом:
PrintWindow("Window",Left,Top,Width,Height,Options);,
где:
Window - имя
окна;
Left - число
дюймов от левого края;
Top - число
дюймов от верхнего края;
Width -
ширина распечатываемого окна;
Height -
высота распечатываемого окна;
Options -
дискретные значения 0 или 1.
Вставка
встроенных функций в скрипт производится щелчком по выбранной функции в списке
функций. Она вместе со своими аргументами будет автоматически вставлена в текст
скрипта в точку, указанную курсором. После этого можно отредактировать список
аргументов.
По окончании
редактирования скрипта следует нажать кнопку Ok. При обнаружении в скрипте
каких-либо ошибок на экран будет выведено соответствующее сообщение. В
большинстве случаев курсор установится в ту позицию, которая привела к
появлению ошибки. Прежде чем скрипт будет сохранен, все ошибки должны быть
исправлены.
Функции Quick
FunctionsFunctions - это скрипты, которые могут вызываться из других скриптов и
использоваться в выражениях при определении динамических свойств объектов.
Скрипты Quick Functions хранятся внутри того приложения, в котором они были
созданы, и могут многократно использоваться в других скриптах InTouch.
Наиболее
часто эти функции используют в выражениях при определении динамических свойств
объектов. Чем это вызвано? Дело в том, что длина выражения в поле Expression
диалогов определения динамических свойств объектов должна быть не более 256
символов. Это относится к таким динамическим свойствам, как цвет линии, цвет
заполнения, изменение высоты и ширины, вертикальное и горизонтальное
перемещение, вертикальное и горизонтальное заполнение, видимость, мерцание,
ориентация, блокировка.
Для ввода
более длинных выражений можно воспользоваться функциями Quick Functions. При
этом выражение в поле Expression должно содержать операторы CALL вызова функций
Quick Functions, каждая из которых, в свою очередь, должна иметь в качестве
последнего оператора RETURN для возврата результата в вызывающее выражение.
Организованное таким образом выражение может содержать многие тысячи символов и
быть сколь угодно сложным.
Сохраненная
функция Quick Functions может быть использована в любом другом скрипте или
выражении.Functions могут быть синхронными и асинхронными скриптами. Синхронные
скрипты выполняются последовательно, в то время, как после запуска одного
асинхронного скрипта может быть запущен другой (синхронный или асинхронный)
скрипт. Это позволяет отделять исполняющиеся довольно долго операции (типа
обращений к базам данных) от основной программы. Асинхронные скрипты не могут
возвращать результаты. Поэтому в качестве скриптов Quick Functions,
используемых в выражениях (Expression) для определения динамических свойств
объектов, следует применять только синхронные скрипты.
Создание
скриптов Quick Functions осуществляется в диалоговом окне редактора Quick
Functions. Вызов этого диалога на экран в окне WindowMaker производится в
командой Special/Scripts с последующим нажатием на строке Quick Functions.
Список Name содержит
имена всех определенных к данному моменту скриптов Quick Functions. Щелчок по
имени скрипта выводит его текст в рабочее поле диалога.
Команда
Scripts/New предназначена для создания нового скрипта и вызывает на экран
диалог для ввода его имени. После щелчка по Ok новое имя будет включено в
список имен Name.
Следующий
этап - определение аргументов нового скрипта в таблице Arguments диалога Quick
Function. В левую колонку таблицы вводят имя аргумента (до 31 символа), в
правую - его тип (Integer, Real, Discrete, Message). В одном скрипте
допускается до 16 аргументов.
После
определения типов аргументов можно приступать к написанию текста скрипта Quick
Function в рабочем поле (под таблицей Arguments).
Разработка
графопостроителя в системе InTouch
Данный раздел
посвящен разработке четырехканального графопостроителя визуализирующего данные,
поступающие по DDE каналу с DDE сервера. В программе предусмотрена возможность
масштабирования по каждому из каналов.

Рисунок 19. -
Окно DDE-сервера на стадии проектирования в Delphi. Примечание: [составлено автором]
Разработка DDE-сервера
Приложение,
получающее данные из другого приложения по DDE и/или управляющее другим
приложением с помощью команд через DDE является DDE-клиентом. В этом случае
второе приложение является DDE-сервером. Рассмотрим проект DDE-сервера, выполненного на языке
программирования Borland
Delphi 6.
На рисунке
представлено окно DDE-сервера во время дизайна в среде Delphi
Для
построении DDE-сервера в Delphi имеются два объекта, расположенные на странице
System Палитры Компонент - TDdeServerConv и TDdeServerItem. Обычно в проекте
используется один объект TDdeServerConv и один или более TDdeServerItem. Для
получения доступа к сервису DDE-сервера, клиенту потребуется знать несколько
параметров: имя сервиса (Service Name) - это имя приложения (обычно - имя
выполняемого файла без расширения EXE, возможно с полным путем); Topic Name - в
Delphi это имя компоненты TDdeServerConv; Item Name - в Delphi это имя нужной
компоненты TDdeServerItem. Назначение объекта TDdeServerConv - общее управление
DDE и обработка запросов от клиентов на выполнение макроса.
Объект
TDdeServerItem связывается с TDdeServerConv и определяет, что, собственно,
будет пересылаться по DDE. Для этого у него есть свойства Text и Lines. (Text
имеет то же значение, что и Lines[0].) При изменении значения этих свойств
автоматически происходит пересылка обновленных данных во все
приложения-клиенты, установившие связь с сервером.
При запуске
приложения происходит выполнение процедуры TDDEServe.FormActivate:
procedure
TDDEServe.FormActivate(Sender: TObject);nidata: TNotifyIconData;.ShowMainForm:=
False;(Application.Handle, SW_HIDE);(Application.MainForm.Handle, SW_HIDE);nidata
do:= SizeOf(TNotifyIconData);:= Self.Handle;:= 1;:= NIF_ICON or NIF_MESSAGE or
NIF_TIP;:= WM_MYICONNOTIFY;:=
Application.Icon.Handle;(szTip,Application.Title);;_NotifyIcon(NIM_ADD,
@nidata);:=10;
end;
В этой
процедуре приложение сворачивается в системный Tray, а форма становится невидимой. Окончание работы DDE-сервера вызывается путём нажатия
левой или правой кнопкой мыши на иконке приложения в области системного Tray. Обработка этого события выполняется
в процедуре TDDEServe.WMICON:
procedure
TDDEServe.WMICON(var msg: TMessage);msg.LParam of_RBUTTONDOWN,WM_LBUTTONDOWN:
close;
end;;
При этом, при
закрытии окна приложения вызывается процедура TDDEServe.FormDestroy, в которой происходит удаление
иконки из системного Tray:
procedure
TDDEServe.FormDestroy(Sender: TObject);nidata: TNotifyIconData;nidata do:=
SizeOf(TNotifyIconData);:= Self.Handle;:= 1;;_NotifyIcon(NIM_DELETE, @nidata);;
Работа
приложения в целом строится посредством вызова процедуры TDDEServe.Timer1Timer
по прерыванию таймера.
implementation
{$R
*.DFM}ComObj, activex, ShellApi, shlobj, registry;: integer;:real;:boolean;
TDDEServe.Timer1Timer(Sender:
TObject);LPTbyte: byte;:=xsin+1;xsin>1000 then
xsin:=xsin-1000;.Text:=inttostr(5*(xsin-20*trunc(xsin/20))); //пилообразный
сигналdx,379hal,dxal,80hLPTbyte,al;.Text:=inttostr(LPTbyte*100);
//состояние линии LPT-порта.Text:=inttostr(round(50+50*sin(xsin/20)));(xsin/5)=trunc(xsin/5)
then(ru<round(50+50*sin(xsin/20)))
then:=true;:=ru+20else:=false;:=ru-20;boolka then DDEItem400.Text:='100' else
DDEItem400.Text:='0';
end;
Для
обеспечения DDE-обмена задекларированы следующие
константы:
‘DDEServer’
- имя сервиса (Service Name);
‘DDETopic’
- Topic Name;
‘DDEItem100’
- переменная обмена;
‘DDEItem200’ - переменная обмена;
‘DDEItem300’ - переменная обмена;
‘DDEItem400’ - переменная обмена.
Разработка DDE - клиента
Основа
человеко-машинного интерфейса в рамках InTouch - это иерархически
взаимосвязанные анимированные сенсорные окна. Для создания нового окна выполним
команду File/New Window... (Файл/Новое Окно). На экране появится диалоговое
окно Window Properties (Свойства Окна), которое необходимо заполнить.
Здесь следует
ввести только имя окна (поле Name) Scope. Остальные поля и опции оставлены без изменений. Окно с указанными
атрибутами появится на экране. Там же будет отображена и Панель Инструментов
InTouch - Tools, с которой предстоит интенсивно работать далее.
График
представляет собой прямоугольную область с нанесенными координатными прямыми,
на которой графически представляется изменение значения одной или нескольких
переменных в течение времени. В пакете InTouch имеются объекты для
динамического отображения значения переменной в реальном времени - графики
реального времени (инструмент (Real-time Trend)), и, так называемые,
аналитические кривые, которые строятся на основании архивных данных (инструмент
(Historical Trend)). Для того, чтобы он появился в созданном нами окне,
необходимо на Панели Инструментов InTouch - Tools выбрать пункт Real - Time
Trend и затем в окне приложения, удерживая нажатой левую кнопку мышки, придать
графику необходимые размеры.
Панель
настройки графиков вызывается двойным щелчком левой кнопки мышки по окну
графика и состоит из четырех текстовых строк соответствующих графикам (Graph 1,
Graph 2, Graph 3, Graph 4). Каждый график имеет независимые настройки масштаба
и величины сдвига по вертикали, отображаемые на экране. Для этого используется компонент Analog Tagname Display (Wizard Selection ® Value Displays ® Analog Tagname Display). Ввод данных осуществляется не непосредственно в WindowViewer, а посредством компоненты Incr/Decr Buttons Up/Down
(Wizard Selection ® Buttons ® Incr/Decr Buttons Up/Down). Нажатие на верхнюю или нижнюю стрелку приводит
соответственно к увеличению или уменьшению значения переменной. Ограничение
максимального и минимального значения указываются при декларации. Каждый
компонент связан со своей переменной zoom1 - zoom4 (изменение масштаба графиков 1 - 4
соответственно) и sh1 - sh4 (изменение смещения графиков 1 -
4). Все переменные имеют тип Memory Integer. Для того, чтобы ввести новую переменную, необходимо описать
ее в разделе Special/Tagname Dictionary/New. При этом необходимо указать ее имя
в поле «Tagname:» и тип - в поле «Type:».