<< Click to Display Table of Contents >> Navigation: Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Работа с трендами > Получение класса тренда |
В данном разделе мы рассмотрим взаимодействие скрипта с трендом.
Прежде чем рассматривать конкретные применения тренда, нужно сначала рассмотреть код, с помощью которого можно обратится к тренду. Тренд в MasterSCADA может существовать в двух вариантах - как самостоятельный документ (создаваемый на вкладке Тренды) или размещенный на мнемосхеме. В зависимости от варианта обращение к нему немного отличается, но после того как класс тренда получен дальнейшая работа с ним полностью идентична.
Также следует помнить, что описываемый код будет работать с трендом, только если он в данный момент открыт. Если же тренд закрыт, то обращение к его свойства тоже возможно, но при этом применяются другие методы.
Начнем с тренда созданного на мнемосхеме, с помощью контрола Тренд из раздела Окна палитры мнемосхемы. Сделаем заготовку - компьютер, назначенный ему объект, команда Применить типа дискретный и Скрипт и дискретным входом.
У объекта сделаем мнемосхему и разместим на ней тренд и нашу команду в виде кнопки.
Перейдем к скрипту. Сначала необходимо добавить в скрипт дополнительные сборки - подключить их на вкладке Настройки.
Сборки следующие:
MasterSCADA.Graph.dll
MasterSCADA.Trend.dll
MasterSCADA.Journal.dll
PresentationFramework.dll
PresentationCore.dll
WindowsBase.dll
Теперь в коде скрипта нужно подключить следующие пространства имен.
using System.Threading;
using MasterSCADA.GUI;
using InSAT.Library.Gui.Windowless;
using MasterSCADA.Trend.Controls;
using MasterSCADA.Trend.Services;
using MasterSCADA.RT;
Теперь можно переходить к коду. В классе объявим две строковых константы - имя мнемосхемы и имя тренда.
const string ИМЯ_ТРЕНДА = "Тренд";
const string ИМЯ_ОКНА = "Мнемосхема";
Эти константы мы будем использовать в коде. Имена переменных и констант на кириллице - допускают.
Код метода Execute будет выглядеть следующий образом.
public override void Execute()
{
if (Применить == true && M == false)
{
//Ссылка на текущий проект
var Project = HostFB.TreeItemHlp.Project;
//получаем корневой объект
var ParentObject = (ITreeItemHlp)HostFB.TreeItemHlp.Parent;
//получаем тренд
RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
{
foreach (Trend trend in Project.GetService<TrendService>().Opened)
{
var host = trend.Host as System.Windows.Forms.Control;
if (host != null)
{
Object name = WinFormsControlBase.GetAmbientProperty(host, WindowlessControlBase.DISPID.DISPID_AMBIENT_NAME);
if (name.ToString() != ИМЯ_ТРЕНДА || trend.Attribute.TreeItem.ID != ParentObject.ID || trend.Attribute.DisplayName != ИМЯ_ОКНА) continue;
//работаем с трендом trend
break;
}
}
}));
}
M = Применить;
}
Переменные Project и ParentObject, сохраняют в себе указатели на проект и родительский объект скрипта. Можно их не использовать и указывать везде полный путь к классам, но так получается более короткий код.
RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate уже знакомый нам по прошлому уроку код - в нем происходит создание нового потока, в этом потоке мы будем работать с нашим трендом.
Project.GetService<TrendService>().Opened содержит в себе список всех открытых трендов проекта, как трендов -документов, так и трендов мнемосхемы. При этом открыто может быть несколько трендов, поэтому необходимо перебрать их, выбрать нужный нам - например по имени тренда и имени объекта и работать с ним. Именно это и делается в цикле foreach. Но в случае с трендом на мнемосхеме, необходимо сначала выполнить его приведение к классу System.Windows.Forms.Control и если оно успешно (не равно null), можно уже работать с данным трендом.
Проверка выполняется в коде:
Object name = WinFormsControlBase.GetAmbientProperty(host, WindowlessControlBase.DISPID.DISPID_AMBIENT_NAME);
if (name.ToString() != ИМЯ_ТРЕНДА || trend.Attribute.TreeItem.ID != ParentObject.ID || trend.Attribute.DisplayName != ИМЯ_ОКНА) continue;
В ней проверяется что совпадает имя тренда, имя объекта и имя документа (в нашем случае мнемосхема). Если все условия выполнены, то теперь переменная trend и есть наш искомый тренд, и можно обращаться к его свойствам и методам. После завершения стоит выполнить оператор break и выйти из цикла, чтобы не проверять остальные тренды.
В целом, работа с трендом-документом аналогична, единственное отличие - несколько иная проверка тренда в цикле foreach.
Итоговый код будет выглядеть так:
public override void Execute()
{
if (Применить == true && M == false)
{
//Ссылка на текущий проект
var Project = HostFB.TreeItemHlp.Project;
//получаем корневой объект
var ParentObject = (ITreeItemHlp)HostFB.TreeItemHlp.Parent;
//получаем тренд
RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate
{
foreach (Trend trend in Project.GetService<TrendService>().Opened)
{
if (trend.Attribute.DisplayName != ИМЯ_ТРЕНДА || trend.Attribute.TreeItem.ID != ParentObject.ID) continue;
//работаем с трендом trend
break;
}
}));
}
M = Применить;
}
Как вы можете видеть, здесь нет приведения к контролу, и для того чтобы проверить, что это нужный нам тренд - проверяется его имя в свойстве trend.Attribute.DisplayName и ID объекта.
Готовый проект можно скачать по ссылке. Скрипты из данного проекта можно использовать как основу для собственных скриптов.
В дальнейших проектах мы будем использовать вариант с трендом на мнемосхеме - так нагляднее будут видны изменений. Если вам потребуется работа с трендом-документом, то перенести такой код не составит труда.