Содержание
(Display)
Главное предназначение HMI-проекта - организация графического интерфейса для доступа к данным контроллера. Также, используя учетные записи HMI-проекта, можно разделить доступ к данным между различными пользователями.
Главная особенность HMI-проекта S3-IDE - его кроссплатформенность. То есть доступ к данным QNX-машины может быть организован как под Windows, так и под Linux, и вообще говоря, под любой операционной системой, для которой существует полноценная реализация виртуальной машины Java (Java Runtime Environment). Нет нужды создавать отдельный проект для каждой платформы, однажды созданный проект запустится везде. Разработчик системы автоматизации не привязан к какой-то одной операционной системе, он может выбрать ее сам. Такой подход позволяет снизить не только затраты на разработку, но и общую стоимость системы. Систему можно удешевить использованием свободно распространяемых дистрибутивов операционных систем, тогда сама собой отпадет проблема лицензирования операционной системы для каждого рабочего места оператора. Сильно уменьшается также проблема антивирусной защиты машин операторов, что повышает надежность системы (например, на сегодняшний день сколько-нибудь опасных вирусов для UNIX-подобных систем нет).
Для организации интерфейса оператора необходимо создать хотя бы
один экран-мнемосхему в ветке
Display
, что мы сейчас и сделаем:
В появившемся диалоге нужно дать новой мнемосхеме
Имя
, под которым она будет известна в проекте,
Заголовок
, который будет отображаться как заголовок окна
(если мнемосхема будет
временной
, у
постоянной
мнемосхемы нет заголовка окна), задать положение
мнемосхемы относительно верхнего левого угла (поля
X
и
Y
) и размеры в пикселах.
Если дважды щелкнуть по элементу "MainScreen" в
Дереве проекта
, мнемосхема откроется в основном окне для
редактирования. Окно
S3-IDE c открытой мнемосхемой выглядит следующим образом:
Подробно редактор мнемосхем описан в разделе
«Разработка мнемосхем» справки, мы остановимся на некоторых моментах.
Редактор мнемосхем позволяет добавлять/удалять компоненты, изменять их свойства,
а также добавлять/удалять события и действия. Сама мнемосхема имеет набор
свойств, таких как:
Имя
. Об этом уже было сказано выше. Это свойство
изменить нельзя.
Цвет фона
. Любой. Для задания можно ввести его в
виде трех чисел в формате
RGB, разделенных запятыми, а можно нажать на кнопку
рядом со значением и выбрать цвет из палитры.
Заголовок
. Это свойство, в отличие от имени,
менять можно.
Тип мнемосхемы
. Значения могут быть следующими:
Постоянная
. Такую мнемосхему нельзя
закрыть, она открывается автоматически при запуске
проекта. В секции
Display
должна хотя
бы одна мнемосхема должна быть постоянной.
Временная
мнемосхема имеет кнопку
Закрыть
, как и обычное окно.
Открывается она с помощью действия
Открыть мнемосхему
.
Временная и модальная
мнемосхема подобна диалоговому окну - пока она открыта,
мнемосхема, с которой она была запущена, недоступна.
В нашем проекте будет присутствовать одна постоянная мнемосхема - для отображения установки, и одна временная - для редактирования системных настроек.
О разделе
Безопасность
свойств компонентов
вообще и мнемосхемы в частности мы поговорим при рассмотрении
учетных записей пользователей.
Есть несколько способов поместить компонент на мнемосхему:
Выбрать компонент в
Палитре
, нажимая на его изображение и, не
отпуская кнопки мыши, перетащить его в нужное место на мнемосхеме.
Вызвать правой кнопкой контекстное меню, выбрать нужный компонент из палитры. Затем поместить курсор в требуемую точку и нажать левую кнопку.
Компоненты мнемосхемы отображаются также в виде дерева в окне
Дерево компонентов
. Компонент, выделенный в этом окне,
автоматически выделяется в редакторе мнемосхем, и наоборот.
Чтобы выделить компонент, нужно нажать на нем левой кнопкой мыши.
Чтобы выделить несколько компонентов:
Нажмите и удерживайте Ctrl, нажимая при этом на компоненты, которые нужно выделить.
Удерживая левую кнопку мыши, "нарисуйте" в поле редактора прямоугольник - все компоненты, попавшие в него целиком, будут выделены.
Выделите в
Дереве компонентов
первый компонент из тех,
которые должны попасть в выделение, затем нажмите
Shift и выделите последний.
Компоненты могут быть вложены в контейнер (позже остановимся на этом подробнее). Компонент, вложенный в контейнер, выделяется так же, как и невложенный компонент. Контейнер, содержащий компонент, можно выделить, если сначала просто выделить компонент, а затем удерживая Shift нажать левой кнопкой на нем же еще раз.
Несколько компонентов можно выровнять по краю. Для этого на панели инструментов редактора предусмотрены четыре кнопки - для выравнивания по верхнему, нижнему, левому и правому краю. Для выравнивания выделите несколько компонентов и нажмите нужную кнопку. Выравнивание будет выполнено по первому выделенному компоненту (он выделяется рамкой белого цвета, остальные - желтого).
Группы компонентов можно выровнять по высоте, ширине, можно выстроить их в таблицу. Выравнивание размеров работает так же, как выравнивание положения. Для всех этих операций имеются соответствующие кнопки на панели инструментов редактора. При выравнивании компонентов в таблицу вы увидите диалог, задающий параметры выравнивания:
Здесь
Vertical gap
и
Horizontal gap
- расстояния соответственно между строками
и столбцами в пикселах.
Также для выравнивания можно воспользоваться контекстным меню:
Перемещать компоненты на мнемосхеме можно двумя способами:
Выделить и перетащить мышью
Выделить и перемещать с помощью клавиш Ctrl+Left(Right,Up,Down)
Это основная палитра редактора мнемосхем в S3-IDE. Название ее происходит от имени графической среды операционной системы QNX. Компонентов, которые содержатся в палитре, достаточно для реализации сложных пользовательских интерфейсов.
Для управления компонентами мнемосхем применяется модель событий и действий. Каждый компонент может получать события и выполнять действия при получении событий. Компонент может получать больше одного события и к каждому событию может быть привязано больше одного действия. События бывают двух типов:
генерируемые действиями оператора (нажатие кнопок мыши, нажатие клавиш, открытие/закрытие мнемосхем и т.д.)
генерируемые системой (изменение переменной или тревоги)
Создание/удаление и редактирование событий и действий выполняется в окне
События и Действия
. События и действия можно копировать между
компонентами, как поодиночке, так и группами.
Контейнер может содержать в себе любые компоненты. Он предназначен для
группировки компонентов на мнемосхеме. Это удобно как при редактировании,
так и при управлении отображением содержимого мнемосхемы. Добавим на
мнемосхему контейнер, назовем его
HeaterPane
(имя изменим в окне
Свойства
). Сделаем его фон прозрачным (для этого нужно
стереть содержимое поля
Цвет фона
и нажать
Enter).
Для добавления нового компонента в контейнер нужно:
Выделить контейнер, затем вызвать меню и выбрать компонент
Выбрав компонент в
Палитре
, перетащить его в контейнер.
Вы можете помещать на мнемосхему растровые изображения в формате
JPEG,
PNG,
GIF. Пусть контейнер
HeaterPane
,
созданный ранее, содержит компненты, относящиеся к нагревателю. Поместим в
него изображение самого нагревателя. Для этого сначала поместим в контейнер
одним из описанных выше способов компонент
Изображение
. Затем вызовем окно свойств изображения и
выберем файл, который будем использовать в качестве картинки.
Изображение можно менять в зависимости от значения переменной. Допустим,
с помощью пиктограммы лампочки нужно индицировать включенное состояние
клапана подачи воды. Добавим на мнемосхему изображение лампочки в
выключенном состоянии, затем добавим к изображению событие
Изменение переменной
:
Теперь добавим к событию действие
Сменить изображение
.
В появившемся диалоге для добавления изображения нажмите кнопку
Добавить
, выберите изображение для значения
0
, затем снова нажмите
Добавить
, выберите изображение для значения
1
. Изображения можно перемещать по списку значений
переменной, просто перетаскивая их мышью.
Вы можете заметить, что имя переменной, значение которой используется,
состоит из двух частей. К имени переменной, которое было дано ей при
объявлении, добавился префикс в виде
QNXServer@
, что означает, что переменная принадлежит
узлу
QNXServer
.
Помните, что для того, чтобы обратиться к переменной, находящейся на
другом узле, имя переменной должно иметь формат
имя_узла@имя_переменной
. При выборе
переменных через соответствующий диалог редактор событий и действий
автоматически дополняет имена префиксом, но там, где имена переменных
вводятся вручную, префикс также нужно дописывать вручную.
Компонент
Прогресс
может использоваться для вывода на экран значения
аналоговой переменной в виде столбика (в случае, если известны пределы
изменения переменной). Добавим индикатор уровня к нашему изображению
нагревателя.
Чтобы отобразить значение переменной, нужно добавить к событиям компонента
событие
Изменение переменной
и привязать к нему действие
Вывести значение
.
Появится диалог, запрашивающий параметры отображения значения. В нем можно
выбрать из определенных ранее границ или ввести верхний и нижний пределы
вручную.
Теперь если дважды щелкнуть на только что добавленном событии, откроется
окно редактирования события. В этом окне можно редактировать само событие
и действия, привязанные к нему.
Компонент
Текст
предназначен для отображения текстовой информации.
Текст может быть статическим, а может содержать значение переменной. Добавим
в контейнер поле, в котором будем выводить температуру нагревателя.
Добавим к компоненту событие
Изменение переменной
,
затем действие -
Вывести значение
.
Появится диалог, запрашивающий формат выводимого значения. Введем строку,
как показано на рисунке.
Запись
%.1v
означает
«значение переменной с точностью 1 знак после запятой».
Остальной текст выведется без изменений (символ "%" нужно экранировать, т.е.
чтобы вывести его, нужно вписать в поле "%%").
Компонент
Поле ввода
предназначен для отображения и редактирования
значения переменной. Добавим в контейнер поле, в котором будем задавать
требуемое значение температуры. Чтобы не форматировать новый компонент
(допустим, нужно, чтобы поле выглядело как то, в котором отображается
температура - цвет фона был тот же, границы и пр.), скопируем текстовое
поле, а затем превратим его в поле ввода. Все свойства, а также события и
действия, наследуются измененным компонентом, если его новый тип имеет такие
свойства и способен содержать такие события и действия. Можно убедиться в
этом - новый компонент унаследовал не только свойства, но и событие
Изменение переменной
(правда, в данном случае оно нас не
интересует).
Чтобы привязать переменную к полю ввода, нужно добавить к нему событие
Редактирование
. Потребуется выбрать переменную для
редактирования, формат вывода переменной в поле (как для компонента
Текст
), также опционально можно ввести сообщение, которое
будет выводиться в протокол при редактировании поля. Если отметить опцию
Подтверждать ввод
, система при нажатии клавиши
Enter будет запрашивать подтверждение.
Добавим к полю заголовок. Проделаем те же операции для сигнала уровня в
нагревателе (добавим текстовое поле для отображения значения и поле ввода
для задания значения). Получим следующее:
Компонент
Кнопка
предназначен для реализации ввода пользователя
посредством нажатия кнопки мыши. Компонент также может содержать текст или
изображение.
Добавим на мнемосхему изображение клапана подачи воды и кнопку включения его.
Пусть первое нажатие кнопки посылает команду клапану включиться, а второе
нажатие - выключиться (переключает значение логической переменной). Пусть
также, когда команда включения подана, кнопка окрашивается в зеленый, а когда
команды нет, будет серой. Для первого нам потребуется событие
Клик левой кнопкой
и действие
Toggle value
.
Будет запрошена переменная, которую нужно переключать:
Обратите внимание, для события
Клик левой кнопкой
можно задать свойство
Подтверждать ввод/не подтверждать ввод
, как
для события
Редактирование
поля ввода. Для того, чтобы изменять цвет
кнопки, нам потребуется событие
Изменение переменной
и действие
Изменить фон
.
В появившемся диалоге для добавления цвета нажмите кнопку
Добавить
, выберите цвет для значения
0
, затем снова нажмите
Добавить
, выберите цвет для значения
1
. Цвета можно перемещать по списку значений переменной,
просто перетаскивая их мышью.
Осталось логическую переменную задействовать в процессе
управления.
Как и разнообразные действия (см. предыдущий раздел), скрипты процесса отображения предназначены для управления содержимым мнемосхем. Они могут помочь разработчику сделать интерфейс оператора более гибким и интерактивным, к тому же использование скриптов способно сильно облегчить разработку системы, а в некоторых случаях является просто необходимостью. Скрипты можно писать на языке ST, имеющем схожий с языком Pascal синтаксис. В реализации языка ST для S3-IDE существует набор библиотечных функций для работы с компонентами мнемосхем.
В дополнение к библиотечным функциям разработчик может объявить собственные
функции на языке
ST, и вызывать их затем так же, как и библиотечные функции.
Создадим функцию, которая будет включать/отключать компонент на экране в
зависимости от того, находится система в автоматическом режиме, или нет.
Для определения такой функции нужно создать ее в ветке
Подпрограммы
.
Редактирование скрипта производится так же, как и для
ST-подпрограммы процесса управления, в разделе
Подпрограммы процесса управления. Создадим входной строковый параметр, и
наполним скрипт несложным кодом. То, что делает эта подпрограмма, можно
реализовать и с помощью действия
Включить/отключить компонент
, но так получается гибче,
так как впоследствии мы можем организовать проверку каких-нибудь
дополнительных условий, или изменить поведение скрипта, отредактировав его
только там, где он определен.
Теперь привяжем скрипт к компоненту. Пусть это будет кнопка управления
клапаном подачи воды - в автоматическом режиме она не должна быть видна.
Добавим к кнопке событие
Изменение переменной
, в качестве переменной выберем
mdGlobalAuto
, к этому событию привяжем действие
Скрипт
.
В скрипте вызовем подпрограмму, передав ей имя компонента.
В ветке
Запуск
можно разместить скрипты, инициализирующие
мнемосхемы. Допустим, нужно вывести диалог ввода логина и пароля для
пользователя, или запросить опции, с которыми будет стартовать
процесс отображения, а затем применить эти опции. В принципе, по
назначению стартовые скрипты аналогичны стартовой секции процесса
управления. Для написания этих скриптов также применяется язык
ST.
В ветке
Периодические
могут быть размещены скрипты,
выполняемые с заданным интервалом (интервал задается отдельно для каждого
из скриптов). Это применимо в случаях, когда вызова скрипта по событию типа
Изменение переменной
недостаточно, и его нужно
выполнять периодически. Использование периодически вызываемых скриптов
избавляет от необходимости самостоятельно организовывать счет времени,
для чего пришлось бы прибегнуть к помощи процессов управления на
QNX-узле.
В
QNX-проекте один контроллер может содержать несколько
процессов отображения, полностью аналогичных процессам отображения
HMI-проекта. Все сказанное по поводу
Display
HMI,
можно с равным успехом отнести к
Display
QNX. То есть контроллер, имеющий стандартный набор устройств
ввода/вывода, может содержать в таком случае весь проект - как управляющую его
часть, так и операторский интерфейс. Разница между процессами отображения
контроллера и
HMI-проекта в том, что "отрисовка" мнемосхем в первом случае
производится средствами графической среды
QNX -
Photon
, а во втором - средствами виртуальной машины Java.
Для разработчика проекты полностью совместимы.
Исходя из вышесказанного, логично будет предположить наличие в среде возможности копировать мнемосхемы (компоненты, события, действия) из QNX-проекта в HMI-проект и наоборот. Такая возможность есть. Копировать компоненты из проекта в проект можно так же, как и в пределах одной мнемосхемы.
Копирование мнемосхем осуществляется следущим образом. Для начала создадим в QNX-проекте процесс отображения.
Процесс отображения в
QNX-проекте имеет следующие свойства:
Приоритет
- задает приоритет процесса отображения.
Он должен быть меньше приоритета драйверов и процессов управления.
Номер консоли
- номер виртуальной консоли (1..9)
на которой будут отображаться мнемосхемы.
Минимальное обновление
- минимальный период
считывания переменных, все переменные период обновления которых
меньше минимального, будут обновляется с этим периодом.
Авт. отрег.
- автоматическая отрегистрация
пользователя. Если пользователь не двигал мышью и не нажимал клавиш,
то по истечению указанного времени он будет отрегистрирован.
Сохранять положение мнемосхем
- включает/отключает
сохранение положения и состояния временных мнемосхем между запусками
проекта.
Теперь мышью перетащим мнемосхему из секции
Display
HMI-проекта в секцию
Display
QNX-проекта, предварительно нажав и удерживая клавишу
Ctrl. На этом копирование мнемосхемы практически закончено.
Остается только создать в ветке
Подпрограммы
те подпрограммы, которые вы вызываете в
скопированной мнемосхеме, иначе при попытке скомпилировать проект компилятор
укажет вам на ошибку компиляции - на попытку вызвать не определенную функцию.
Точно таким же образом можно копировать мнемосхемы в обратном направлении - из
QNX-проекта в
HMI-проект.