PDA

Просмотр полной версии : Просмотр сообщения события с помощью скрипта C#



Vinsen
17.03.2017, 03:40
Здравствуйте. Пытаюсь перебрать все события в проекте и вытащить из них формулы и сообщения. С формулами проблем нет, предусмотрено специальное свойство Formula, а вот сообщения не могу понять как вытащить. Вот мой код:


public partial class ФБ : ScriptBase
{

const string FilePathName = "D:\\report.csv";

public override void DoAction()
{
using (var file = new StreamWriter(FilePathName, false, Encoding.GetEncoding("windows-1251")))
{
//перебор всех значений данного объекта
HostFB.TreeItemHlp.Project.ObjectTreeRootItem.Navi gateChilds(delegate(ITreeObjectHlp e)
{
if(e.TypeName == "Событие" || e.TypeName == "Расчет")
{

var action = e as ParserHlp;

if(action.Formula != null)
{
string frm = action.Formula.Replace("\n", "");
frm = frm.Replace("\r", "");
file.WriteLine(string.Format("{0};{1}", action.FullName, frm));
}
}
return true;
}, TreeItemMask.All, NavigateItemsFlags.CurrentComputer);
}
}
}


Может кто-нибудь знает как получить сообщение, заранее благодарен:)

SCADAMaster
17.03.2017, 09:06
Пример проставления связей и сообщений:
HostFB.TreeItemHlp.Parent.NavigateChilds(delegate( ITreeObjectHlp item)
{
var parser=(EventHlp)item;

var innerPin=parser.AddInput("НоваяСвязь");
var targetPin=item.ParentObject.GetPin("Значение 1");
innerPin.Connect(targetPin); //pout - выход с которым надо связать
innerPin.DesignType = typeof(double);
//innerPin.pi
parser.Formula="НоваяСвязь=0";
parser.Pattern="Новое сообщение";
parser.ApplyChange();
return true;
}, TreeItemMask.Event, 0);

Vinsen
17.03.2017, 09:45
Ничего себе, спасибо огромное!!! И как я не заметил, что у события не такой тип как у расчёта:confused:
А вы не знаете, можно ли что-то похожее сделать с ФБ "Обработка аналогового параметра", там есть префикс сообщений, можно ли его тоже изменить из скрипта?:)

SCADAMaster
18.03.2017, 08:18
Чтение:
item.Properties.GetProperty(CatID.General, (int)PropID.General.EventMessagePrefix, false, "")
Запись через метод SetProperty, а затем применить методом ApplyChanges

Vinsen
20.03.2017, 04:48
Все работает отлично, спасибо!
Я по той же схеме пытался получить доступ к полю "Сокращённое наименование" в настройках ФБ "Обработка аналогового параметра", перепробовал вроде все варианты PropID, но у меня ничего не вышло... Подскажите это можно как-нибудь сделать? И может вы посоветуете какую-нибудь инструкцию по всем этим классам и методам, а то в стандартной справке MasterSCADA маловато информации.

SCADAMaster
20.03.2017, 14:24
Пример в приложении

Vinsen
21.03.2017, 06:23
Спасибо, это как раз то что нужно!
У меня ещё такой вопрос. Есть мнемосхема с большим количеством элементов, основные из которых это Текст и Изображение ФБ, можно ли как-то через скрипт перебрать все элементы мнемосхемы, и просмотреть для каждого свойство Имя, для Текста также хотелось бы получить свойство Текст, а для Изображения ФБ - Наименование исполнительного механизма.
Заранее спасибо:)

SCADAMaster
21.03.2017, 08:33
В приложении пример скрипта, который производит замену текста в контролах "значеие" и "Кнопка".
В нем происходит обращение по ID, имя - свойство Name

Pimpl
21.03.2017, 12:53
Здравствуйте. Пытаюсь перебрать все события в проекте и вытащить из них формулы и сообщения. С формулами проблем нет, предусмотрено специальное свойство Formula, а вот сообщения не могу понять как вытащить. Вот мой код:


public partial class ФБ : ScriptBase
{

const string FilePathName = "D:\\report.csv";

public override void DoAction()
{
using (var file = new StreamWriter(FilePathName, false, Encoding.GetEncoding("windows-1251")))
{
//перебор всех значений данного объекта
HostFB.TreeItemHlp.Project.ObjectTreeRootItem.Navi gateChilds(delegate(ITreeObjectHlp e)
{
if(e.TypeName == "Событие" || e.TypeName == "Расчет")
{

var action = e as ParserHlp;

if(action.Formula != null)
{
string frm = action.Formula.Replace("\n", "");
frm = frm.Replace("\r", "");
file.WriteLine(string.Format("{0};{1}", action.FullName, frm));
}
}
return true;
}, TreeItemMask.All, NavigateItemsFlags.CurrentComputer);
}
}
}


Может кто-нибудь знает как получить сообщение, заранее благодарен:)

Можешь поделиться итоговым скриптом?

Vinsen
22.03.2017, 08:47
В приложении пример скрипта, который производит замену текста в контролах "значеие" и "Кнопка".
В нем происходит обращение по ID, имя - свойство Name

Спасибо! Все заработало как и хотел.

Vinsen
22.03.2017, 08:57
Можешь поделиться итоговым скриптом?

Получилось так:


using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using System.Linq;
using System.Windows.Forms;
using MasterSCADALib;
using System.IO;
using MasterSCADA.Documents;
using System.Collections.Generic;
using System.Text;
using MasterSCADA.Common;
using FB.FBAttributes;
using System.ComponentModel;
using InSAT.Library;

public partial class ФБ : ScriptBase
{

const string FilePathNameFormls = "D:\\formuls.csv"; // Файл для формул
const string FilePathNameEvnts = "D:\\events.csv"; // Файл для событий

public override void DoAction()
{
//Поиск События или Расчёта с заданными формулами
using (var file = new StreamWriter(FilePathNameFormls, false, Encoding.GetEncoding("windows-1251")))
{
//перебор всех значений данного объекта
HostFB.TreeItemHlp.Project.ObjectTreeRootItem.Navi gateChilds(delegate(ITreeObjectHlp e)
{
if(e.TypeName == "Событие" || e.TypeName == "Расчет")
{

var action = e as ParserHlp;

if(action.Formula != null && (true/*Ещё какие-то условия, смторя что вы ищите*/))
{

string frm = action.Formula.Replace("\n", "");
frm = frm.Replace("\r", "");
file.WriteLine(string.Format("{0};{1}", action.FullName, frm));
}
}
return true;
}, TreeItemMask.All, NavigateItemsFlags.CurrentComputer);
}
//Поиск события с заданным текстом сообщения
using (var file = new StreamWriter(FilePathNameEvnts, false, Encoding.GetEncoding("windows-1251")))
{
//перебор всех значений данного объекта
HostFB.TreeItemHlp.Project.ObjectTreeRootItem.Navi gateChilds(delegate(ITreeObjectHlp e)
{
if(e.TypeName == "Событие")
{
var action = e as EventHlp;

if(action.Pattern != null && (true/*Ещё какие-то условия, смторя что вы ищите*/))
{
string frm = action.Pattern.Replace("\n", "");
frm = frm.Replace("\r", "");
file.WriteLine(string.Format("{0};{1}", action.FullName, frm));
}
}
return true;
}, TreeItemMask.All, NavigateItemsFlags.CurrentComputer);
}
}
}