Прочитать про что конкретно?
Прочитать про что конкретно?
Спасибо.
Про скрипты... Ну про них вроде разобрался более-менее.
Сейчас есть необходимость обращения к предыдущему значению параметра именно из архива. Т.к. если сохранять его в виде какой-то переменной в проекте, то с выключением программы или компьютера - оно потеряется.
Не подскажите синтаксис обращения из скрипта к последнему/предпоследнему архивированному значению параметра?
В вашем случае нет необходимости обращаться к архивному значению - можно просто сохранять значение на выходе скрипта (используя восстановление при рестарте).
В приложении проект со двумя вариантами скриптов - подсчет по импульсу и по нарастающему итогу. Оба варианта сохраняют значения между рестартами.
Спасибо.
Спасибо! Очень пригодилось. В первую очередь по тому, что не знал о функции восстановления при рестарте.
На ОВЕНовском OPC-сервере для приборов c интерфейсом RS-485 и протоколом ОВЕН нет передачи сигнала сброса для счетчиков СИ-8, передаётся только само значение с него. Поэтому скрипт получился такой:
using System;
using MasterSCADA.Script.FB;
using FB;
public partial class ФБ : ScriptBase
{
public override void Execute()
{
if (DCNT > DCNT_OLD)
{Counter=Counter+(DCNT-DCNT_OLD);
DCNT_OLD=DCNT;}
if ((DCNT == 0) && (DCNT != DCNT_OLD))
{DCNT_OLD=0;}
if (DCNT1 < DCNT_OLD1)
{DCNT_OLD1 = DCNT1;}
}
}
DCNT - входная переменная, значение со счетчика
DCNT_OLD - выходная переменная, сохраняется при рестарте
Counter - выходная переменная, значение рассчитываемое скриптом, сохраняется при рестарте.
Второй IF нужен для ситуации когда значение на счетчике сбросилось в ноль но ещё не прибавилось, чтобы программа дальше могла нормально работать.
Третий - когда кто-то всё-таки сбросил счетчик пока компьютер был выключен.
Последний раз редактировалось Ivan-DM; 29.07.2014 в 09:34.
Как Вы и говорили - проект разрастается. Купили 4 MSTR100, всё работает, приложил самый маленький проект - на один счетчик (sa пароль - 123).
Теперь от меня хотят чтобы в конце отчета, рядом с общим числом произведённой продукции за время между началом отчета и концом отчета, выводилась ещё и средняя производительность за этот указанный период в единицу времени (выбранного интервала). Т.е. если посмотреть на сам отчет, это будет - среднее арифметическое по всем строчкам отчета (разумеется кроме последней-итоговой).
Вроде всё просто, надо поставить в итог данных дополнительный бенд для которого в качестве обработки данных будет выбрано "среднее", но тогда он будет выдавать среднее от общего накопительного итога счетчика, с которым мы собственно и имеем дело - большого числа. А надо чтоб выдавал среднее от разностей этого большого числа, которые выводятся в отчете но как это сделать стандартными средствами MasterSCADA не могу понять-найти. Есть похожий пример с расходом газа, но там такого нет. Как вывести среднее от результатов вычисления?
То есть сейчас в отчёте всё примерно так (при выборе интервала в 1 минуту):
00:00 - 1
00:01 - 2
00:02 - 2
00:03 - 1
Итого: 6
А хочется так:
00:00 - 1
00:01 - 2
00:02 - 2
00:03 - 1
Итого: 6
Средняя производительность: 1,5 в 1 мин
Как-то поиграться с обработкой значений - "Количество значений" не получилось, это количество значений не в отчете как я думал, в архиве MasterSCADA (примерно соответствует накопительному итогу, т.к. архивируется оно у меня по изменению, а изменяется (обычно) на 1). Может быть можно в каком-то виде получить количество генерируемых строк в отчете?
Последний раз редактировалось Ivan-DM; 29.07.2014 в 12:53.
Если у вас значения идут нарастающим итогом, то нужно написать в поле выражение примерно такой код:
{((int)Last(DataИсточникДанных1,ИсточникДанных1.Чи слоИмпульсов)-(int)First(DataИсточникДанных1,ИсточникДанных1.Чис лоИмпульсов))
/(double)Count(DataИсточникДанных1)}
Где DataИсточникДанных1 - имя бэнда, ИсточникДанных1.ЧислоИмпульсов - ваша переменная.
Last - получить последнее значение переменной, First - получить первое значение переменной, Count - получить количество строк.
(double) - приведение к вещественному типу данных (если колонка имеет целый тип данных, то нужно записать (int))
Спасибо.
Больше спасибо за ответ!!
Пробую по разному, пока слабо получается. У меня два источника данных - один периодический, для основных строк отчета, а второй - итоговый, для "Итого"/ Я правильно понял, что в вашем ответе подразумевается второй источник данных?
Нужно ли для "Count" указывать переменную как это делается для "First/Last"? Просто "First/Last" работают хоть как-то по отдельности (даже не в составе приведённой формулы), а вот "Count" что-то никак не хочет.
Зачем приводить к вещественному типу данных количество строк?
Не совсем ясно что такое "имя бэнда". Смотрел в PDF-ки, судя по ним это то что написано в графе свойств "наименование" когда нажимаешь на него. У меня это либо "Данные_Архив_MasterSCADA", либо "ИтогДанных_Архив_MasterSCADA". Или может это всё-таки имя источника данных ("Архив_MasterSCADA" и "Итоговый" соответственно)?
Влияет ли вариант обработки данных на код который необходимо будет написать в поле выражение ?
Последний раз редактировалось Ivan-DM; 29.07.2014 в 17:21.
Ответ был дан в общем виде. Нужно использовать тот источник данных, который нужен для этой задачи.
Нет, не нужно.
Вы можете поле итога поочередно настроить на определение First, Last и Count - на вкладке "Выражение" будет код. Затем можно составить из трех выражений результирующее. Оно будет выглядеть примерно так, как мы написали.
Чтобы получить на выходе ячейки вещественный тип данных.
имя бэнда - это его имя, которые выводится в его заголовке. В вашем случае это "Данные_Архив_MasterSCADA"
Нет.
Спасибо.
Заработало!
Получилось через "{Итоговый.Counter1 / Count(Данные_Архив_MasterSCADA)}" прописанный в выражении.
Counter1 обрабатывается как "разница" и находится в итоговом отчете, поэтому выдаёт разницу между началом и концом отчета вообще, и делится на количество строчек в отчёте. Таким образом получаем среднее.
Ещё раз спасибо за то что рассказали про "Count" и имя бэнда!
А как можно считать разницу , не задавая период. Т.е надо вывести первую и последнию величину и разницу, но не выводить промежуточные значениия. Отрезок может быть равен как и дню так и году. И игнорировались нулевые значения.