PDA

Просмотр полной версии : Расчёт данных, полученных с расходомера СИ 30



test25874
08.12.2016, 17:48
здравствуйте.
I.
просмотрев форум ответ на следующий вопрос найти не смог:
есть расходомер (СИ 30), данные с которого прилежно архивитруются. название счётчика "Значение_счетчика_в_физических_величинах". необходимо выводить расчётные данные на основании данных архива, а именно:
1. текущее значение
2. количество прокачанной жидкости за последний час (60 минут), с начала часа
3. количество прокачанной жидкости за сутки: (последние 24 часа), с начала суток, за предыдущий день
4. количество прокачанной жидкости за месяц: с начала текущего, за предыдущий месяц
5. количество прокачанной жидкости за год: с начала текущего года, за предыдущий год

приступив к решению вышел на такое:
1
AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime (), 1)
при просмотре графика симуляции бросается в глаза, что данные со счётчика и данные из архива смещены по фазе на 1 шаг (не критично) и что важнее формульное значение "скачет", хотя должно быть ровным - чем вызвано разобраться не смог.
2.1.

AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime (), 1)-AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime ()-3600, 1)
2.2.

AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime (), 1)-AbsArchMomentValue (Значение_счетчика_в_физических_величинах, CurHour(), 1)
3.1

AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime (), 1)-AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime ()-86400, 1)
3.2

AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime (), 1)-AbsArchMomentValue (Значение_счетчика_в_физических_величинах, CurDay(), 1)
3.3, 4.1, 4.2, 5.1, 5.2 -пока не придумал

II.
отдельно встаёт вопрос про цикл счётчика 0-999999. возникают следующие вопросы:
1. определение периода прохождение цикла, затем его усреднение и выявление минимального периода, за который цикл не успеет пройти (возможно экспорт данных со временем или отображение на графике).
2. учёт этого события при расчёте. например на текущий момент значение 8, а час назад значение было 999994. т.е. учитывая вышесказанное если нам необходимо рассчитать разницу между текущим значением и значением, которое было час назад то я вывышел следующим образом:

ЕСЛИ(AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime (), 1)>=AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime ()-3600, 1), AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime (), 1)-AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime ()-3600, 1), 1000000+AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime (), 1)-AbsArchMomentValue (Значение_счетчика_в_физических_величинах, DateTime ()-3600, 1))
логика такая: Если(v1>=v0, v1-v0,1000000+v1-v0)
замечание что данный метод применим если если за период проходит не больше одного цикла. как быть в противном случае не знаю. (вернее в голове есть соображения по утяжелению вычислений с разбивкой на сегменты пропорциональные циклу и анализ логикой ЕСЛИ, но хочу спросить есть ли альтернатива с простым решением ко всему второму блоку вопроса)

спасибо за все советы и предложения.

SCADAMaster
09.12.2016, 08:16
3. количество прокачанной жидкости за сутки: (последние 24 часа), с начала суток, за предыдущий день

Также - функция CurDay( ), для получения начала текущих суток.



4. количество прокачанной жидкости за месяц: с начала текущего, за предыдущий месяц
5. количество прокачанной жидкости за год: с начала текущего года, за предыдущий год

С этим в текущей версии есть проблемы - нет возможности прибававлять-убавлять месяцы. В версии 3.8 мы добавили функцию AddMonths.



отдельно встаёт вопрос про цикл счётчика 0-999999. возникают следующие вопросы:

Правильно - сделать переменную которая не сбрасывается. То есть счетчик перешел значение 0, а эта переменная продолжает рост - продолжает прибавлять растущее значение.

Еще замечания по работе с данными функциями. Нужно понимать, что работа с архивами - это ресурсоемкая операция, поэтому крайне не желательно выполнять ее постоянно. Либо сделайте цикл опроса у расчета побольше (например 10 тактов) или, еще лучше - опрашивайте при возникновении необходимости. Открыл оператор мнемосхему - данные посчитались. Для этого можно положить такие расчеты в отдельный объект, а затем включать опрос этого объекта используя поле "Условие выполнения" на закладке "Опрос" объекта

test25874
09.12.2016, 13:11
Правильно - сделать переменную которая не сбрасывается. То есть счетчик перешел значение 0, а эта переменная продолжает рост - продолжает прибавлять растущее значение.

Еще замечания по работе с данными функциями. Нужно понимать, что работа с архивами - это ресурсоемкая операция, поэтому крайне не желательно выполнять ее постоянно. Либо сделайте цикл опроса у расчета побольше (например 10 тактов) или, еще лучше - опрашивайте при возникновении необходимости. Открыл оператор мнемосхему - данные посчитались. Для этого можно положить такие расчеты в отдельный объект, а затем включать опрос этого объекта используя поле "Условие выполнения" на закладке "Опрос" объекта

расскажите подробнее как это сделать или пример куда можно посмотреть.

ещё вопрос по поводу "скачков" значений - почему происходит при расчёте с шагом в 1 такт, хотя текущее значение, взятое из архива не должно скакать

если правильно понял вместе с функциями оперирования месяцами будут добавлены функции по работе с годами?
спасибо за ответ

SCADAMaster
09.12.2016, 14:24
расскажите подробнее как это сделать или пример куда можно посмотреть.

В приложении пример с двумя скриптами. Один как раз для решения задачи переполнения счетчика.



ещё вопрос по поводу "скачков" значений - почему происходит при расчёте с шагом в 1 такт, хотя текущее значение, взятое из архива не должно скакать

Время у вас смещается, по поиск попадают разные данные, от этого и прыжки.
Смотрите у переменное какие есть данные в каждый момент времени и сравнивайте.



если правильно понял вместе с функциями оперирования месяцами будут добавлены функции по работе с годами?

Нет. Только месяцы.

test25874
21.12.2016, 16:07
поставил скрипт (второй) работает отлично.

спасибо.

появился следующий вопрос (возможно лучше создать новый топик?): можно ли при первом запуске (или каждом) перетянуть архивные данные показателя счётчика в архив расчётных данных скрипта (для удобства дальнейших расчётов)?

возможно уже есть готовые решения. алгоритм вижу приблизительно таким:
1 сравнение количества записей архивов (с учётом погрешности в несколько строк - 100 например) или даты первого значения
2 пересчёт и архивирование данных из архива счётчика в архив скрипта с учётом цикла и записи увеличивающегося значения

SCADAMaster
21.12.2016, 16:37
Вообще приложенный скрипт сохраняет накопленное значение между перезапусками.
А так можно, примеры есть в блоге:
http://blog.insat.ru/search/label/Скрипты

test25874
22.12.2016, 10:18
я имею ввиду значения, которые записаны в архив счётчика - обработать их и полученные данные записать в архив скрипта. в дальнейшем расчёты будут опираться на них.
т.к. значение счётчика находится в пределах 0-1000000 и изменятеся циклически (в виде пилы) - для простых расчётов не пригодно. архив "выровненных" значений удобнее для расчётов. на данном этапе трудность - узнать например количество перекачанной жидкости с начала года (при том что значения счётчика с начала года есть, а скрипт выравнивания запущен только сейчас) - для этого нужно привести к общему знаменателю значения.

спасибо за скрипт и за ссылку на решения. посмотрю в готовые решения - возможно смогу найти нужное )

Shogun
21.01.2017, 18:21
Стоит похожая задача, не сбросите пример что у вас получилось?