Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: razorqhex от 10 Декабря 2019, 15:08:50

Название: Расчёт суточный расход
Отправлено: razorqhex от 10 Декабря 2019, 15:08:50
Здравствуйте.

Вот несколько дней бьюсь над вопросом расчёта суточного расхода воды. На плате высчитываются импульсы, скада их получает.

10 импульсов это 1 куб воды

И нужно высчитать сколько кубов воды было использовано за сутки
Название: Re: Расчёт суточный расход
Отправлено: Simple-Scada от 10 Декабря 2019, 15:17:02
Здравствуйте.

Т.е. в скаду передаётся постоянно нарастающее значение счетчика импульсов, верно?
Название: Re: Расчёт суточный расход
Отправлено: razorqhex от 10 Декабря 2019, 18:04:12
Здравствуйте.

Т.е. в скаду передаётся постоянно нарастающее значение счетчика импульсов, верно?
Здравствуйте. Совершенно верно. Это значение записывается в базу данных получается. И за сутки нужно вычислить сколько кубов воды было использовано. Что-то логика совсем перестала работать
Название: Re: Расчёт суточный расход
Отправлено: Simple-Scada от 11 Декабря 2019, 10:12:23
Значит нужно взять значение счётчика на конец суток, например 1000, вычесть из него значение на начало суток, например 400 и полученный результат будет количеством импульсов накопленных за сутки, т.е 1000 - 400 = 600 импульсов. Делим это количество на 10 и получаем значение в кубах 600 / 10 = 60 кубов.
Для извлечения значений из архива нужно использовать процедуру ArchiveValueByTime (https://simple-scada.com/help/script/archivevaluebytime.html). Эта процедура берёт значение переменной из архива и записывает результат в переменную которую Вы укажете. Т.е. можно создать две внутренние переменные для значения на начало и на конец суток, например vrStart и vrEnd и в них получать значение из архива:
Код: (delphi)
var
  aDate: TDateTime;
begin
  aDate := EncodeDateTime(2019, 12, 10, 0, 0, 0, 0);    // время на начало суток (10 декабря 00:00:00)
  { извлечь из архива значение переменной "MyVariable" в отметке времени "aDate" и записать результат в переменную "vrStart" }
  ArchiveValueByTime(MyVariable, vrStart, aDate);

  aDate := EncodeDateTime(2019, 12, 11, 0, 0, 0, 0);    // время на конец суток (11 декабря 00:00:00)
  { извлечь из архива значение переменной "MyVariable" в отметке времени "aDate" и записать результат в переменную "vrEnd" }
  ArchiveValueByTime(MyVariable, vrEnd, aDate);
end.
, здесь мы время формируем в скрипте, но можно брать его из переменной или из компонента Календарь, как угодно.

Теперь можно создать отдельный скрипт с типом события "Изменились переменные" (https://simple-scada.com/help/script/changemulvar.html), добавить в него переменные vrStart и vrEnd и написать код пересчёта:
Код: (delphi)
begin
  // вычисляем значение в кубометрах и записываем результат в переменную vrResult
  vrResult.Value := (vrEnd.Value - vrStart.Value) / 10;
end.
Название: Re: Расчёт суточный расход
Отправлено: razorqhex от 11 Декабря 2019, 17:14:17
Это получается, что суточный расход рассчитывается только с 10-го по 11 декабря?

А как делать продолжение чтобы на все дни работало? 
Название: Re: Расчёт суточный расход
Отправлено: Neskad от 12 Декабря 2019, 13:43:33
Очень просто.

Код: ("delphi")
var
  aDate: TDateTime;
begin
  aDate := RecodeTime(Now, 0, 0, 0, 0);
  ArchiveValueByTime(MyVariable, vrEnd, aDate);
 
  aDate := IncDay(aDate, -1);
  ArchiveValueByTime(MyVariable, vrStart, aDate);
end
Ну и далее, как вам уже объяснили.
Название: Re: Расчёт суточный расход
Отправлено: Simple-Scada от 12 Декабря 2019, 19:04:39
А как делать продолжение чтобы на все дни работало? 
Можно у переменной результата включить архивацию "по-изменению" и каждый день в 00:00:00 высчитывать в неё расход за последние сутки. Тогда у Вас получится тренд суточного расхода и его можно будет просмотреть за любой период в любое время через меню трендов. Как выше описал Neskad, можно задавать любое время для процедуры ArchiveValueByTime, т.е. Вы можете выполнять расчеты в нужное Вам время, за нужный период. Подробное описание функций для работы с датой/временем есть в руководстве (https://simple-scada.com/help/script/datetime.html).
Название: Re: Расчёт суточный расход
Отправлено: razorqhex от 14 Декабря 2019, 02:25:54
Первый скрипт создавать как "Универсальный"?
Название: Re: Расчёт суточный расход
Отправлено: Simple-Scada от 16 Декабря 2019, 16:20:49
Скрипт должен быть таким, какой Вам нужен. Можете назначить его на событие OnClick кнопки, тогда по нажатию на кнопку будут запущены вычисления расхода. Если хотите выполнять периодически, например раз в сутки, то можно создать скрипт с типом события "Прошел час" и например в 00 часов запускать вычисление расхода, например:
Код: (delphi)
var
  aDate: TDateTime;
begin
  if HourOf(Now) = 0 then // если сейчас 00 часов, то запускаем вычисление расхода за последние сутки
  begin
    aDate := RecodeTime(Now, 0, 0, 0, 0);
    ArchiveValueByTime(MyVariable, vrEnd, aDate);
 
    aDate := IncDay(aDate, -1);
    ArchiveValueByTime(MyVariable, vrStart, aDate);
  end;
end.