Задающий график создается в тренде, на продвинутом уровне при активной панели настроек. Выберем – Задание таблицей


В дереве объектов разместим команду типа «Время» - «День», с ее помощью мы будем создавать за какой день нужно построить график. Дискретной командой «Сформировать» мы будем выполнять формирование точек пера.
Также разместим в дереве 5 одинаковых объектов – Координата 1 – Координата 5. В них мы создадим команду типа Время – X, и аналоговая – Y. Также добавим значение Подпись – в нем мы дадим имя каждой точке («Точка 1» - «Точка 5»).

У объектов сделаем изображения объектов, в котором расположим подпись и команды X и Y. Из данных изображений скомпонуем таблицу. В итоге мнемосхема будет выглядеть примерно так.

Теперь перейдем к скрипту. Создадим у скрипта набор входов и выходов - входные сигналы даты формирования, сигнала для формирования, значения координат точек, и выходы – начало и конец для управления трендом (их мы свяжем с параметрами тренда Дата С и Дата по), и выход ошибки.

Установим связи в дереве:

И на мнемосхеме:

Формирование координат пера мы будем выполнять по сигналу на входе Применить. При этом добавим контроль что все входы имеют значения – в противном случае выдадим ошибку и выйдем из скрипта.
if (Применить==true && M==false) { if (!День.HasValue || !X1.HasValue || !X2.HasValue || !X3.HasValue || !X4.HasValue || !X5.HasValue || !Y1.HasValue || !Y2.HasValue || !Y3.HasValue || !Y4.HasValue || !Y5.HasValue) { Ошибка="Не заданы все параметры"; return; } } M=Применить; |
DateTime Start=День.Value.Date; Начало=Start; Конец=Start.AddDays(1); |
var проект = HostFB.TreeItemHlp.Project; //получаем корневой объект var объект = (ITreeItemHlp)HostFB.TreeItemHlp.Parent; //получаем тренд RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate { foreach (Trend trend in проект.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!=объект.ID || trend.Attribute.DisplayName!=ИМЯ_ОКНА) continue; //Теперь можно работать с трендом } } })); |
var проект = HostFB.TreeItemHlp.Project; //получаем корневой объект var объект = (ITreeItemHlp)HostFB.TreeItemHlp.Parent; //получаем тренд RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate { foreach (Trend trend in проект.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!=объект.ID || trend.Attribute.DisplayName!=ИМЯ_ОКНА) continue; //Теперь можно работать с трендом } } })); |
var list = trend.Settings.Objects.OfType<MasterSCADA.Graph.Objects.Graph2D>().ToList(); |
var list = trend.Settings.Objects.OfType<MasterSCADA.Graph.Objects.UserGraph2D>().ToList(); |
//получаем нулевое перо var param=list[0]; param.XMLTableValues = new GraphFigureCollection { new GraphFigure { Coords = new CoordCollection { new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X1.Value.TimeOfDay).ToOADate(), Y1.Value)}, new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X2.Value.TimeOfDay).ToOADate(), Y2.Value)}, new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X3.Value.TimeOfDay).ToOADate(), Y3.Value)}, new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X4.Value.TimeOfDay).ToOADate(), Y4.Value)}, new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X5.Value.TimeOfDay).ToOADate(), Y5.Value)}, } } }; |
В строке Start.Date.ToUniversalTime()+X5.Value.TimeOfDay происходит сложение даты (начала дня) приведенной ко времени UTC, и заданной пользователем координаты времени (дата отбрасывается). Затем с помощью метода ToOADate происходит преобразование формата DateTime в переменную Double, которую требует структура Point.
Наш скрипт готов. Итоговый вариант выглядит следующим образом:
public partial class ФБ : ScriptBase { bool? M=false; string ИМЯ_ТРЕНДА = "Тренд"; string ИМЯ_ОКНА = "Мнемосхема"; public override void Execute() { if (Применить==true && M==false) { if (!День.HasValue || !X1.HasValue || !X2.HasValue || !X3.HasValue || !X4.HasValue || !X5.HasValue || !Y1.HasValue || !Y2.HasValue || !Y3.HasValue || !Y4.HasValue || !Y5.HasValue) { Ошибка="Не заданы все параметры"; return; } DateTime Start=День.Value.Date; Начало=Start; Конец=Start.AddDays(1); //System.Diagnostics.Debug.Assert(false); //Ссылка на текущий проект var проект = HostFB.TreeItemHlp.Project; //получаем корневой объект var объект = (ITreeItemHlp)HostFB.TreeItemHlp.Parent; //получаем тренд RTManager.Instance.ThreadHolder.BeginInvoke(new ThreadStart(delegate { foreach (Trend trend in проект.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!=объект.ID || trend.Attribute.DisplayName!=ИМЯ_ОКНА) continue; //получаем коллекцию перьев var list = trend.Settings.Objects.OfType<MasterSCADA.Graph.Objects.UserGraph2D>().ToList(); //получаем нулевое перо var param=list[0]; param.XMLTableValues = new GraphFigureCollection { new GraphFigure { Coords = new CoordCollection { new Coord {Logic = new Point((Start.Date+X1.Value.TimeOfDay).ToOADate(), Y1.Value)}, new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X2.Value.TimeOfDay).ToOADate(), Y2.Value)}, new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X3.Value.TimeOfDay).ToOADate(), Y3.Value)}, new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X4.Value.TimeOfDay).ToOADate(), Y4.Value)}, new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X5.Value.TimeOfDay).ToOADate(), Y5.Value)}, } } }; } } })); } M=Применить; } } |
