Сделал расписание. Ничего не происходит не печатает отчеты и не выводит их на экран. Вот тренды выводятся по расписанию на экран.
Сделал расписание. Ничего не происходит не печатает отчеты и не выводит их на экран. Вот тренды выводятся по расписанию на экран.
Пришлите ваш проект (Проект - Экспортировать), укажите путь к проблемному отчету.
Спасибо.
Если к расписанию управление документом добавить то работает.
Для отчетов как раз лучше этот ФБ и использовать - у него более гибкие настройки.
Из расписания просто подавать импульс на начало формирования отчета.
Спасибо.
Добрый день!
Как в скрипте можно задать тип переменной? Через какое свойство?
Скрипт имеется в виду ФБ "Скрипт"?
В правой части задается тип данных:
https://support.mps-soft.ru/MasterSC..._vyhodami.html
Спасибо.
Нет. Я имел ввиду, если у меня есть много переменных с типом Целый, мне надо у всех поменять на тип Вещественный.
Например я Описание переменных меняю так:
var FilePathNameTxt = Путь к файлу;
string[] lines = File.ReadAllLines(FilePathNameTxt, Encoding.GetEncoding("windows-1251"));
int N = lines.Length;
string FBPath = HostFB.TreeItemHlp.Project.ObjectTreeRootItem.Disp layName + "." +
HostFB.TreeItemHlp.Parent.GetRelativeName(TreeItem Mask.RootObject);
for (int num = 1; num <= N; num++)
{
ITreePinHlp Str = (ITreePinHlp)HostFB.TreeItemHlp.Project.Item(FBPat h + ".Value" + (num + 8).ToString());
Str.Description = lines[num-1];
}
Пример в приложении
Спасибо.
Добрый день!
Есть переменные количеством более 125. Эти переменные нужно сохранять и подгружать из файла. Использую скрипт для сохранения и чтения:
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 InSAT.Library;
public partial class ФБ : ScriptBase
{
Edge read = new Edge();
Edge write = new Edge();
Edge writeAdd = new Edge();
public string Name;
public override void Execute()
{
Name = ((bool)SaveAdd) ? RecipeNameAdd : RecipeName;
var FilePathName = HostFB.TreeItemHlp.Parent.FolderPath+"Наименование _"+Name+".csv";
Path = FilePathName;
if (Load!= null)
read.SetNewValue(Load.Value);
if (read.LeadingEdge) //передний фронт входа Чтения
{
Error=false; //сброс ошибки
if (RecipeName==string.Empty) //ничего не введено - ошибка
{
ReportError("Пустое имя набора");
Error=true;
return; //выход из процедуры
}
if (!File.Exists(FilePathName)) //проверка существования файла
{
ReportError("Набор не найден");
return;
}
using(var file = new StreamReader(FilePathName, Encoding.GetEncoding(1251), false)) //открытие файла для чтения
{
var line=file.ReadLine();//считывание строк из файла
ITreeItemHlp Obj=HostFB.TreeItemHlp.Parent; //объект в который вставлен ФБ
while (line!=null)
{
String[] substrings = line.Split(';'); //разбор строки на составляющие
var path = substrings[0];
var name = substrings[1];
var val = substrings[2];
line = file.ReadLine();
var pin = Obj.GetChild(path, false) as ITreePinHlp; //установление связи
//с переменной имеющей номер сохранненый в файле
if (pin==null) //если такая переменная не найдена
{
var str = string.Format("{0}:{1}","Не могу установить значение",name);
ReportError(str);
Error=true; //ошибка,
continue; //но работа скрипта продолжается
}
pin.AddAssignValueTask(val,null); //присвоение команде значения из файла
}
Loading = false;
}
}
if (Save!=null)
write.SetNewValue(Save.Value);
if (write.LeadingEdge) //передний фронта записи
//сохранение наим наименование рецепта в файл
{
Error=false; //сброс ошибки
if (RecipeName==string.Empty) //ничего не задано - ошибка
{
ReportError("Пустое имя набора");
Error=true;
return; //выход из процедуры
}
Directory.CreateDirectory(HostFB.TreeItemHlp.Paren t.FolderPath); //создание директории сохранения
using(var file = new StreamWriter(FilePathName, false, Encoding.GetEncoding("windows-1251")))
//открытие файла для записи
{
//перебор всех команд данного объекта
HostFB.TreeItemHlp.Parent.NavigateChilds(delegate( ITreeObjectHlp item)
{
if (item.ObjectType != EObjectType.otValue)
return true;
ITreePinHlp command = (ITreePinHlp) item;
var objValue = command.GetRTPin().ObjectValue;
var commandPath = HostFB.TreeItemHlp.Project.GetRelativeName(HostFB. TreeItemHlp.Parent, item, false); //относительное имя команды
var commandName=HostFB.TreeItemHlp.Project.GetRelative Name(HostFB.TreeItemHlp.Parent, command, true).Replace(";", "_");
file.WriteLine("{0};{1};{2}", commandPath, commandName, objValue); //записываем в файл
return true;
}, TreeItemMask.Pin, (NavigateItemsFlags)0);
}
}
if (SaveAdd!=null)
writeAdd.SetNewValue(SaveAdd.Value);
if (writeAdd.LeadingEdge) //передний фронта записи
//сохранение наим наименование рецепта в файл
{
Error=false; //сброс ошибки
if (RecipeNameAdd==string.Empty) //ничего не задано - ошибка
{
ReportError("Пустое имя набора");
Error=true;
return; //выход из процедуры
}
Directory.CreateDirectory(HostFB.TreeItemHlp.Paren t.FolderPath); //создание директории сохранения
using(var file = new StreamWriter(FilePathName, false, Encoding.GetEncoding("windows-1251")))
//открытие файла для записи
{
//перебор всех команд данного объекта
HostFB.TreeItemHlp.Parent.NavigateChilds(delegate( ITreeObjectHlp item)
{
if (item.ObjectType != EObjectType.otValue)
return true;
ITreePinHlp command = (ITreePinHlp) item;
var objValue = command.GetRTPin().ObjectValue;
var commandPath = HostFB.TreeItemHlp.Project.GetRelativeName(HostFB. TreeItemHlp.Parent, item, false); //относительное имя команды
var commandName=HostFB.TreeItemHlp.Project.GetRelative Name(HostFB.TreeItemHlp.Parent, command, true).Replace(";", "_");
file.WriteLine("{0};{1};{2}", commandPath, commandName, objValue); //записываем в файл
return true;
}, TreeItemMask.Pin, (NavigateItemsFlags)0);
}
}
}
void ReportError (string Error) //метод записи ошибки в отчет
{
var ScriptName=HostFB.TreeItemHlp.ToString(); //имя скрипта
HostFB.TreeItemHlp.Project.ErrorTracer.ReportError (string.Format("{0}: {1}",ScriptName,Error));
}
}
Все эти переменные взаимосвязаны с переменными OPC. Если переменных менее 125 то загружается без ошибок, если больше, то в OPC в столбце качество появляется ПОПЫТКА ЗАПИСИ и качество переходит в BAD, но потом заново переходит в GOOD. При это выходит сообщение "Ошибка" по переменным OPC.
Как лучше организовать загрузку переменных? Частями?
Какой ОРС сервер используется?
Спасибо.