var param=list[0];
В скрипте берется нулевое перо (самое первое в легенде), а вам нужно другое перо.
var param=list[0];
В скрипте берется нулевое перо (самое первое в легенде), а вам нужно другое перо.
Спасибо.
using System;
using System.Windows;
using System.Threading;
using System.Linq;
using MasterSCADA.GUI;
using InSAT.Library.Gui.Windowless;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using System.Windows.Forms;
using MasterSCADA.Trend.Controls;
using MasterSCADA.Trend.Helpers;
using MasterSCADA.Trend.Services;
using MGDesign.MasterSCADA;
using MGDesign.Hosts;
using MGDesign.Items;
using System.Collections.Generic;
using MasterSCADA.RT;
using MasterSCADA.Graph.Objects;
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.Ob jects.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.TimeO fDay).ToOADate(), Y1.Value)},
new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X2.Value.TimeO fDay).ToOADate(), Y2.Value)},
new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X3.Value.TimeO fDay).ToOADate(), Y3.Value)},
new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X4.Value.TimeO fDay).ToOADate(), Y4.Value)},
new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X5.Value.TimeO fDay).ToOADate(), Y5.Value)},
}
}
};
}
}
}));
}
M=Применить;
}
}
.................................................. ..
Start.Date.ToUniversalTime()+X1.Value.TimeOfDay).T oOADate() — это печатает относительно
координаты времени
а если я ставлю ось вещественную , то где осуществляется к ней привязка- в свойствах оси ?
а если меняю эту запись на
Point(X1.Value, Y1.Value)
- почему бьет ошибку?
где указывается, что первый аргумент у функции
POINT в этой программе должен быть временным?
Последний раз редактировалось in37usd; 24.04.2021 в 12:31.
Потому что это график, и точка на графике должна иметь привязку ко времени.
Поэтому вам в любом случае нужно формировать точку в меткой времени.
Если нужно выводить значения с привязкой к оси значений X, то просто прибавляйте Start.Date.ToUniversalTime() сколько вам нужно секунд (то ест значение координаты X). Ось времени потом сделаете невидимой.
Спасибо.
Мне нисколько не нужно ни минут ни секунд- мне надо время исключить СОВЕРШЕННО!
в программу на C# надо передать один хотя бы массив точек , а лучше два, и построить один , а лучше два графика по точкам
я брал просто два массива в программе и строил на их основе два графика , не зависящие от времени
int[] YH = { 45, 50, 52, 57, 58, 59, 60, 61, 62, 63 }, YL = { 5, 6, 8, 9, 7, 1, 2, 3, 4, 5 };
for (int x = 0; x < 10; x++)
{
chart1.Series[0].Points.AddXY(x * 10, YH[x]);
chart1.Series[0].Points.AddXY(x * 10, YL[x]);
}
а потом между ними будет строиться третий график, на основе двух переменных от
OPC-сервера- все совершенно не должно зависеть от времени!
то есть первые два графика - допустимый "коридор" для третьего графика
третий график должен идти между первыми двумя и не касаться их визуально
третий график мы уже с Вами построили- см выше!
меня совершенно устроили бы точки на основе массива(массивов) в программе
int[] YH = { 45, 50, 52, 57, 58, 59, 60, 61, 62, 63 }, YL = { 5, 6, 8, 9, 7, 1, 2, 3, 4, 5 };
а "передвигаться " по координате X можно с помощью цикла наращивания Х:
///////////////////////////////////////////////////////
for (int x = 0; x < 10; x++)
{
chart1.Series[0].Points.AddXY(x * 10, YH[x]);
chart1.Series[0].Points.AddXY(x * 10, YL[x]);
}
Последний раз редактировалось in37usd; 24.04.2021 в 21:31.
Еще раз - это тренд, тренд по определению - это временной ряд.
Как сделать - мы вам описали, делаете точку с привязкой ко времени - прибавляете пропорциональное количество секунд к Start.Date.ToUniversalTime()
int[] YH = { 45, 50, 52, 57, 58, 59, 60, 61, 62, 63 }
Вот и прибавляйте к Start.Date.ToUniversalTime() 45, 50 и т.д. Временную ось потом скроете и добавите горизонательную ось значений
Спасибо.
Вроде заработало
По графику, который делали выше пару страниц-
1)как делать очистку -сброс "RESET" всего графика?
2)сохранять пробовал во внешний файл типа ACSESS- там пусто!
и где почитать , как сохраняют график в таблице на форме
Последний раз редактировалось in37usd; 27.04.2021 в 06:05.
Вот так можно сделать:
param.XMLTableValues=new GraphFigureCollection();
Сохранять что? Если делать экспорт в Access данных, то в случае с задающим графиком сохранять нечего - так как данные существует только на тренде, а в архиве их нет.
Если же график зависимости - должен экспортироваться.
Посмотрите документацию
https://insat.ru/products/?category=1525
Архивы MasterSCADA
В виде таблицы?
Вкладка Значение.
Если нужно автоматизированно - с помощью ФБ "Управление документом". В документации Архивы MasterSCADA это описывается
Спасибо.
смотрю в Visual studio выполнение кода C#
как посмотреть значение переменных в точке остановки
для строчки
new Coord {Logic = new Point((Start.Date.ToUniversalTime()+X5.Value.TimeO fDay).ToOADate(), Y5.Value)},???
точка остановки ниже
Последний раз редактировалось in37usd; 29.04.2021 в 10:56.
///////////////
Последний раз редактировалось in37usd; 29.04.2021 в 10:31.
Разбиваете на несколько промежуточных переменных и смотрите для них.
вида
var startTime=Start.Date.ToUniversalTime();
var startTimeWithValue=startTime+X5.Value.TimeO fDay;
и тд
их же потом и используете в этой переменной
Logic = new Point((startTimeWithValue).ToOADate(), Y5.Value)
Спасибо.