Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Расчёт суточный расход  (Прочитано 5366 раз)

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Расчёт суточный расход
« : 10 Декабря 2019, 15:08:50 »
Здравствуйте.

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

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

И нужно высчитать сколько кубов воды было использовано за сутки

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Расчёт суточный расход
« Ответ #1 : 10 Декабря 2019, 15:17:02 »
Здравствуйте.

Т.е. в скаду передаётся постоянно нарастающее значение счетчика импульсов, верно?
« Изменён: 10 Декабря 2019, 15:26:26 от Simple-Scada »

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Расчёт суточный расход
« Ответ #2 : 10 Декабря 2019, 18:04:12 »
Здравствуйте.

Т.е. в скаду передаётся постоянно нарастающее значение счетчика импульсов, верно?
Здравствуйте. Совершенно верно. Это значение записывается в базу данных получается. И за сутки нужно вычислить сколько кубов воды было использовано. Что-то логика совсем перестала работать

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Расчёт суточный расход
« Ответ #3 : 11 Декабря 2019, 10:12:23 »
Значит нужно взять значение счётчика на конец суток, например 1000, вычесть из него значение на начало суток, например 400 и полученный результат будет количеством импульсов накопленных за сутки, т.е 1000 - 400 = 600 импульсов. Делим это количество на 10 и получаем значение в кубах 600 / 10 = 60 кубов.
Для извлечения значений из архива нужно использовать процедуру ArchiveValueByTime. Эта процедура берёт значение переменной из архива и записывает результат в переменную которую Вы укажете. Т.е. можно создать две внутренние переменные для значения на начало и на конец суток, например 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.
, здесь мы время формируем в скрипте, но можно брать его из переменной или из компонента Календарь, как угодно.

Теперь можно создать отдельный скрипт с типом события "Изменились переменные", добавить в него переменные vrStart и vrEnd и написать код пересчёта:
Код: (delphi)
begin
  // вычисляем значение в кубометрах и записываем результат в переменную vrResult
  vrResult.Value := (vrEnd.Value - vrStart.Value) / 10;
end.

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Расчёт суточный расход
« Ответ #4 : 11 Декабря 2019, 17:14:17 »
Это получается, что суточный расход рассчитывается только с 10-го по 11 декабря?

А как делать продолжение чтобы на все дни работало? 

Neskad

  • Новичок
  • *
  • Сообщений: 31
    • Просмотр профиля
Re: Расчёт суточный расход
« Ответ #5 : 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
Ну и далее, как вам уже объяснили.
« Изменён: 12 Декабря 2019, 13:44:57 от Neskad »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Расчёт суточный расход
« Ответ #6 : 12 Декабря 2019, 19:04:39 »
А как делать продолжение чтобы на все дни работало? 
Можно у переменной результата включить архивацию "по-изменению" и каждый день в 00:00:00 высчитывать в неё расход за последние сутки. Тогда у Вас получится тренд суточного расхода и его можно будет просмотреть за любой период в любое время через меню трендов. Как выше описал Neskad, можно задавать любое время для процедуры ArchiveValueByTime, т.е. Вы можете выполнять расчеты в нужное Вам время, за нужный период. Подробное описание функций для работы с датой/временем есть в руководстве.

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Расчёт суточный расход
« Ответ #7 : 14 Декабря 2019, 02:25:54 »
Первый скрипт создавать как "Универсальный"?
« Изменён: 16 Декабря 2019, 16:15:42 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Расчёт суточный расход
« Ответ #8 : 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.