А можно тогда управлять архивацией для тэга (включать/выключать архивацию)?
Вид для печати
В режиме исполнения - нельзя.
Что именно вы хотите сделать?
Можно использовать повторитель по условию. Выход архивируете, когда не нужно отключаете - значения перестанут меняться и архивироваться соответственно.
Можно ли в журнале сообщений поменять шрифт? И сделать квитирование сообщений через свою кнопку? Например квитировать все сообщения
Шрифт поменять можно.
Квитировать можно через скрипт
https://support.mps-soft.ru/MasterSC...bshchenij.html
Есть ли возможность убрать зону вокруг индикаторы чтобы он был по контуру столбика? Вложение 75983
Имеется ввиду окантовка столбика?
К сожалению, отключить ее нельзя.
Задайте этот вопрос в разделе про Codesys
Здравствуйте.
В проекте задана длительность файлового архивирования переменных 90 дней.
На тренде видно, что некоторые переменные хранятся 90 дней, как и положено, а некоторые торчат на тренде уже 10 месяцев.
Различий у этих переменных практически нет - всё это температуры.
Не могу понять, в чем причина такого поведения и как поправить дело?
Спасибо
Вложение 76471
Помимо длительности есть еще и объем хранения. Его нужно задать с запасом - тогда такой проблемы не будет.
Посмотрите раздел справки про архивы, и особенно внимательно - раздел с рекомендациями по настройке
https://support.mps-soft.ru/MasterSC...j_sistemy.html
Спасибо за ответ.
А не повредятся ли (не пропадут ли) архивы, если я сейчас остановлю работающий проект, выставлю "Объем хранения" в ноль (как указано в справке) и снова пущу проект?
Не повредятся.
Добрый день.
Подскажите есть готовый блок из битовой маски например "Статус" сделать текстовый вывод на мнемосхеме?
...в Симплайт например есть готовый стейтовый индикатор там сразу каждому биту задаешь текстовое значение для индикатора пока только вижу путь распаковать битовую маску и от нее уже плясать
Да про аварии я уже понял:(... Думаю хотябы со статусом поколдую:))) он в любом случае какой-то один из А переключатель N к 1 получится текстовые на входах значения мультиплексировать? Битовая маска 0-15
Сначала нужно распаковать через ФБ Распаковка 32-битного значения, а дальше каждому выходу можете назначить нужный вам вариант текстового представления.
А подскажите сразу выходы в текстовый вариант не получится переназначить там только тип логический доступен?
Вложение 76737
Можно назначить шкалу выходу - на вкладке Общие.
Создавать свои шкалы - Система - Шкалы - Дискретные.
Спасибо!!! Все получилось!!! Именно это и хотел чтобы в отладке видеть
Вложение 76738
Здравствуйте. Помогите разобраться с отображением графика на тренде. На одном объекте данные отображаются в реальном времени без сдвига на двух других показывают как будто на 1 час раньше, но данные в реальном времени совпадают. в Настройках тренда не могу найти период отображения или какую-то привязку ко времени.Вложение 76844
Это означает, что данные имеют неверную временную метку.
Какой сервер ОРС используется для обмена данными? Откуда поступают эти данные?
Вы берете данные из MasterSCADA 3 работающей в режиме UA сервера?
Тогда проверьте настройку часовых поясов - скорее всего стоит не тот что нужно. Или включен перевод летнее-зимнее.
Значит неверный часовой пояс
Добрый день, чем отличается интегральное среднее от среднего? Вроде математически это одно и то же?
Среднее - это среднее арифметическое (сумма значений деленная на их количество), а интегральное среднее - считается интеграл от значений, и делится на период этого интервала.
Добрый день, как сделать событие раз в месяц для автоматической печати месячных отчетов?
У объекта есть вкладка Расписание:
https://support.mps-soft.ru/MasterSC...spisanije.html
Сделал расписание. Ничего не происходит не печатает отчеты и не выводит их на экран. Вот тренды выводятся по расписанию на экран.
Пришлите ваш проект (Проект - Экспортировать), укажите путь к проблемному отчету.
Если к расписанию управление документом добавить то работает.
Для отчетов как раз лучше этот ФБ и использовать - у него более гибкие настройки.
Из расписания просто подавать импульс на начало формирования отчета.
Добрый день!
Как в скрипте можно задать тип переменной? Через какое свойство?
Скрипт имеется в виду ФБ "Скрипт"?
В правой части задается тип данных:
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.
Как лучше организовать загрузку переменных? Частями?
Какой ОРС сервер используется?