SCADA системы
|StringToIntg() |
|Преобразует символьное представление целого числа во внутренний формат |
| |
|StringUpper() |
|Преобразует все символы исходной строки в нижнем регистре в верхний |
|регистр |
| |
|Text() |
|Осуществляет форматированный вывод указанной целой или вещественной |
|переменной в соответствии со строкой форматирования |
| |
| |
|Таблица 5.1. |
Каждая строковая функция имеет один или несколько аргументов (до 6).
Например, синтаксис функции StringFromReal выглядит следующим образом:
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).
Файловые функции предназначены для считывания и записи информации в файлы.
У всех файловых функций есть два общих аргумента - Filename и FillOffset.
Аргумент Filename (имя файла) хранит имя файла, из которого должна быть
считана или в который должна быть записана информация (имя также должно
включать и путь к файлу). Аргумент FillOffset (смещение в файле) задает
относительную позицию в файле, начиная с которой будут читаться или
записываться данные. Смещение задается в байтах от начала файла. Первый
байт файла имеет смещение 0. После завершения каждая функция возвращает
следующее доступное смещение в файле. Например, если функция читает 5
байтов данных, начиная с 10-го байта, то после завершения функция возвратит
15. Некоторые встроенные функции группы System приведены в табл. 5.2.
|Функция |
|Описание |
| |
|FileCopy() |
|Копирует исходный файл в файл-приемник |
| |
|FileReadFields() |
|Возвращает очередную запись данных из CSV - файла |
| |
|FileReadMessage() |
|Возвращает указанное количество байтов (или всю строку) из указанного |
|файла |
| |
|FileWriteFields() |
|Сохраняет в CSV - файле запись данных, состоящую из разделенных запятыми|
|величин |
| |
|InfoDisk() |
|Возвращает информацию об указанном локальном или сетевом диске |
| |
|InfoFile() |
|Возвращает информацию об указанном файле или подкаталоге компьютера или |
|сетевого устройства |
| |
|InfoTouchAppDir() |
|Возвращает имя текущего каталога InTouch - приложения |
| |
| |
|Таблица 5.1. |
Остальные аргументы файловых функций не поддаются типизации и различны для
каждой функции.
Например, функция FileReadFields имеет четыре аргумента и следующий
синтаксис:
FileReadFields(Filename,FileOffset,StartTag,NumberOfFields);
- StartTag - идентифицирует первый элемент в имени InTouch-
переменной;
- NumberOfFields - идентифицирует число полей для чтения.
. Группа функций Miscellaneous (клавиша Misc...) включает функции для
работы с алармами распределенных систем, трендами, печатью и др.
В этой широкой (с точки зрения назначения функций) группе можно выделить
несколько более узко специализированных подгрупп. Функции, название которых
начинается с alm, используются только в распределенных системах алармов.
Некоторые из них приведены в табл.5.3.1.
|Функция |
|Описание |
| |
|almAckDisplay() |
|Подтверждает только те алармы, которые в текущий момент видны в окне |
|отображения алармов |
| |
|almAckSelect() |
|Подтверждает алармы, отмеченные оператором в окне отображения алармов |
| |
|almShowStats() |
|Выводит панель статистики объекта отображения алармов |
| |
| |
|Таблица 5.3.1. |
Первым аргументом всех встроенных функций алармов является ObjectName (имя
объекта алармов). Часто в роли одного из аргументов выступает Comment
(комментарий). Например, функция almAckSelect имеет следующий синтаксис:
almAckDisplay(ObjectName,Comment); .
Функции, название которых начинается с HT, используются только с архивными
трендами. Примеры таких встроенных функций - в табл.5.3.2.
|Функция |
|Описание |
| |
|HTGetPenName() |
|Возвращает имя переменной, связанной в текущий момент с указанным пером |
|указанного тренда |
| |
|HTGetValue() |
|Возвращает значение указанного типа, вычисляемого для указанного пера в |
|пределах всего тренда |
| |
|HTScrollLeft() |
|Устанавливает в качестве начала графика более раннее время. Визуально |
|происходит прокрутка тренда влево |
| |
|HTSetPenName() |
|Связывает перо тренда с указанной переменной |
| |
|HTZoomIn() |
|Масштабирует существующий тренд путем задания новых времени начала и |
|охватываемого интервала времени |
| |
| |
|Таблица 5.3.2. |
Встроенные функции для работы с архивными трендами также могут иметь
несколько аргументов (до четырех). Функции, приведенные в табл. 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() |
|Уничтожает элемент с заданным порядковым номером как в простом, так и в |
|ниспадающем списке |
| |
|wcInsertItem() |
|Вставляет указанное сообщение в список |
| |
|wcLoadText() |
|Заменяет содержимое текстового окна на новую информацию |
| |
| |
|Таблица 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 Functions
Quick Functions - это скрипты, которые могут вызываться из других скриптов
и использоваться в выражениях при определении динамических свойств
объектов. Скрипты Quick Functions хранятся внутри того приложения, в
котором они были созданы, и могут многократно использоваться в других
скриптах InTouch.
Наиболее часто эти функции используют в выражениях при определении
динамических свойств объектов. Чем это вызвано? Дело в том, что длина
выражения в поле Expression диалогов определения динамических свойств
объектов должна быть не более 256 символов. Это относится к таким
динамическим свойствам, как цвет линии, цвет заполнения, изменение высоты и
ширины, вертикальное и горизонтальное перемещение, вертикальное и
горизонтальное заполнение, видимость, мерцание, ориентация, блокировка.
Для ввода более длинных выражений можно воспользоваться функциями Quick
Functions. При этом выражение в поле Expression должно содержать операторы
CALL вызова функций Quick Functions, каждая из которых, в свою очередь,
должна иметь в качестве последнего оператора RETURN для возврата результата
в вызывающее выражение. Организованное таким образом выражение может
содержать многие тысячи символов и быть сколь угодно сложным.
Сохраненная функция Quick Functions может быть использована в любом другом
скрипте или выражении.
Quick 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 сервера. В
программе предусмотрена возможность масштабирования по каждому из каналов.
Разработка DDE-сервера
Приложение, получающее данные из другого приложения по DDE и/или
управляющее другим приложением с помощью команд через DDE является DDE-
клиентом. В этом случае второе приложение является DDE-сервером. Рассмотрим
проект DDE-сервера, выполненного на языке программирования Borland Delphi
6.
На рис.20 представлено окно DDE-сервера во время дизайна в среде Delphi
[pic]
Рис. 20. Окно 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);
var nidata : TNotifyIconData;
begin
Application.ShowMainForm := False;
ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Application.MainForm.Handle, SW_HIDE);
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_MYICONNOTIFY;
hIcon := Application.Icon.Handle;
StrPCopy(szTip,Application.Title);
end;
Shell_NotifyIcon(NIM_ADD, @nidata);
ru:=10;
end;
В этой процедуре приложение сворачивается в системный Tray, а форма
становится невидимой. Окончание работы DDE-сервера вызывается путём нажатия
левой или правой кнопкой мыши на иконке приложения в области системного
Tray. Обработка этого события выполняется в процедуре TDDEServe.WMICON:
procedure TDDEServe.WMICON(var msg: TMessage);
begin
case msg.LParam of
WM_RBUTTONDOWN,WM_LBUTTONDOWN: close;
end;
end;
При этом, при закрытии окна приложения вызывается процедура
TDDEServe.FormDestroy, в которой происходит удаление иконки из системного
Tray:
procedure TDDEServe.FormDestroy(Sender: TObject);
var nidata : TNotifyIconData;
begin
with nidata do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Self.Handle;
uID := 1;
end;
Shell_NotifyIcon(NIM_DELETE, @nidata);
end;
Работа приложения в целом строится посредством вызова процедуры
TDDEServe.Timer1Timer по прерыванию таймера.
implementation
{$R *.DFM}
uses ComObj, activex, ShellApi, shlobj, registry;
var
xsin: integer;
ru:real;
boolka:boolean;
procedure TDDEServe.Timer1Timer(Sender: TObject);
var LPTbyte: byte;
begin
xsin:=xsin+1;
if xsin>1000 then xsin:=xsin-1000;
DDEItem100.Text:=inttostr(5*(xsin-20*trunc(xsin/20)));
//пилообразный сигнал
asm
mov dx,379h
in al,dx
and al,80h
mov LPTbyte,al
end;
DDEItem200.Text:=inttostr(LPTbyte*100); //состояние линии LPT-порта
DDEItem300.Text:=inttostr(round(50+50*sin(xsin/20)));
if (xsin/5)=trunc(xsin/5) then
if (ru
begin
boolka:=true;
ru:=ru+20
end else
begin
boolka:=false;
ru:=ru-20
end;
if 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:».
Для организации обмена данными через DDE интерфейс необходимо определить
четыре (по числу каналов) переменные типа DDE Integer (Item1, Item2, Item3,
Item4). Для этого сначала в разделе Special/DDE Access Names… необходимо
нажать кнопку Add и в появившемся диалоговом окне указать имя приложения
(DDE Application/Server Name), от которого будет производиться запрос
данных, и имя группы/объекта (DDE Topic Name), содержащего требуемую
информацию. В нашем случае качестве имени приложения используется имя
DDEServer, имя объекта – DDETopic. Далее в разделе Special/Tagname
Dictionary/New вводятся поочередно переменные типа DDE Integer. Название
элемента (Item) для каждой переменной имеет различные имена: DDEItem100 –
для Item1, DDEItem200 – для Item2, DDEItem300 – для Item3 и DDEItem400 –
для Item4. Данная информация используется для определения DDE-переменной в
Словаре Переменных InTouch.
Для того, чтобы запустить программу графопостроителя и начать DDE – обмен,
необходимо включить DDE сервер (т. е. запустить файл Ddeserver.exe) и
переключиться в окно InTouch - WindowViewer (нажатием кнопки Runtime! в
правом верхнем углу окна InTouch - WindowMaker). В процессе работы InTouch
WindowViewer автоматически выполнит все требуемые действия по установлению
канала обмена данными и обработке значений элемента.
Ниже представлен внешний вид программы графопостроителя в окне InTouch -
WindowViewer отображающей в виде четырех графиков данные, полученные от
программы DDE сервера и соответствующие им масштабирующие коэффициенты.
[pic]
Рис. 21. Окно программы графопостроителя.
Список литературы
1. Scada . ru - Публикации - SCADA - системы: взгляд изнутри
// URL: http://www.scada.ru/publication/book/preface.html
2. Кабаев С.В. Пакет программного обеспечения Intouch - система мониторинга
и управления в объектах промышленной автоматизации
// URL: http://www.mka.ru/go/?id=40463&url=www.rtsoft.ru
3. ТРЕЙС МОУД - интегрированная SCADA- и softlogic-система для разработки
АСУТП // URL: http://adastra.ru/ru/tm/tm5/
4. Кузнецов А. Genesis for Windows – графическая scada-система для
разработки АСУ ТП. // Современные технологии автоматизации.- 1997.- №3.
Страницы: 1, 2, 3, 4, 5, 6
|