вторник, 25 октября 2016 г.

ФБ «Скрипт C#» и его использование в MasterSCADA. Скрипт отслеживания открытых окон для создания пользовательских тулбаров

По умолчанию в MasterSCADA в верхней части программы находится специальный тулбар позволяющий выполнять различные действия – осуществлять переход между окнами, открывать журналы и тренды, завершать сеанс пользователя и выходить из системы. Однако некоторые пользователи предпочитают скрывать данный тулбар и создавать собственный. В данной статье мы рассмотрим пример такого тулбара и специальный скрипт, который позволяет отследить какое окно открыл пользователь, что позволяет сделать тулбар интерактивным.
Итак, в дереве объектов у нас будет находится объект первого уровня Цех, в нем расположены 4 объекта Аппарат1-Аппарат4. Переменных в них нет – они для нас в данном случае не важны.
Нам необходимо сделать универсальный тулбар, который позволил бы делать переходы между аппаратами, выполнять смену пользователя и выход из режима исполнения.
Теперь создадим объект, который будет выполнять функцию тулбара. Сделаем его отдельным объектом. В него положим скрипт и две дискретных команды для выхода и завершения сеанса пользователя. Также сделаем у объекта окно управления с кнопками перехода и кнопками-командами.

В свойствах окна включим Разрешить закрытие, Поверх других окон и Не закрывать при открытии нового окна
В таком виде окно будет представлять собой плавающее окошко поверх остальных окон. При необходимости, его можно будет «приклеить» к определенному месту экрана – задав координаты, и убрав отображение рамки.
Выключим отображение системного тулбара – это делается в свойствах системы или конкретного компьютера. Сбросим флаги Основная панель и Панель вызова документов.
Сделаем чтобы наш тулбар открывался при запуске. Это делается на этой же вкладке компьютера – нижняя вкладка Стартовые окна.
При необходимости можно сделать несколько окон.
Запустим режим исполнения и проверим работу – переходы выполняются.
Все замечательно, но неплохо бы индицировать – на какой именно мнемосхеме мы находимся или какие окна открыты в данный момент. Для этой цели мы и будем использовать скрипт.
Мы будет управлять с помощью скрипта входом динамизации кнопки «Цвет фона». Для управления добавим в скрипт 4 логических выхода – с названиями как у наших объектов «Аппарат1» - «Аппарат4».
Как определить, что открыта та или иная мнемосхема. Для этого есть специальное свойство, которое позволяет получить весь перечень открытых документов:
HostFB.TreeItemHlp.Project.Documents
Полученную коллекцию можно перебрать, и проверить является ли открытой мнемосхема того иного объекта с помощью свойства Opened.
Однако поскольку в MasterSCADA есть режим, при котором при старте происходит загрузка всех окон, то проверки на открытость недостаточно, так как даже закрытые в данный момент окна будут находится в памяти. Для того чтобы точно знать что окно открыто, нужно проверить уникальный идентификатор окна (Handle) – если он больше нуля, значит окно открыто. Также можно дополнительно проверить тип окна – является ли оно окном, новым окном или документом (мы будем проверять только документы).
Определить короткое имя объекта можно с помощью свойства document.Attribute. TreeItem.Name
Полное имя объекта - document.Attribute.TreeItem.FullName
Мы будем использовать короткое имя. Итоговый код будет выглядеть следующим образом.

    public override void Execute()
    {  
     Аппарат1=Аппарат2=Аппарат3=Аппарат4=false; //сбрасываем все выходы
     foreach (IDocumentHlp document in HostFB.TreeItemHlp.Project.Documents) //перебираем документы
  {
   IAttributeHlp attribute = document.Attribute;      
   if (attribute.Opened) //проверяем загружено ли окно
   {    
    var mnemoInfo = attribute.CurrentCallInfo;
         var callType = mnemoInfo.CurrentCallType;         
         //проверяем что окно открыто и оно имеет тип "документ"
         if (attribute.DocumentInfo.Handle != 0 && callType == MasterSCADA.Interfaces.ECallType.ctDocument )
         {
          //взводим определенный выход в зависимости от имени объекта у которого открыто окно
     if (attribute.TreeItem.Name=="Аппарат1") Аппарат1=true;
     if (attribute.TreeItem.Name=="Аппарат2") Аппарат2=true;
     if (attribute.TreeItem.Name=="Аппарат3") Аппарат3=true;
     if (attribute.TreeItem.Name=="Аппарат4") Аппарат4=true;
    }
   }
  }
    }
Теперь каждый выход динамизации нужно перетащить на вход динамизации цвета кнопки и настроить динамизацию. Мы будем использовать при выбранном аппарате коричневый цвет.
Проверим работу в режиме исполнения – все работает корректно.

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

Проект с примером данного скрипта можно скачать по данной ссылке.

Комментариев нет:

Отправить комментарий

Поделиться