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

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

Автор Тема: Сравнение переменной с текущей датой  (Прочитано 5001 раз)

vyacheslav

  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
Добрый день, возникла такая задача для проекта. Существует узел учета тепловой энергии, в состав которого входят некие приборы у которых есть своя дата для поверок. Нужно чтобы допустим было наименование прибора и рядом окно с переменной DataTime в которое указывается дата следующей поверки прибора. Эта переменная должна сравниваться с текущей датой и допустим за два месяца до нее сообщать о необходимости поверки прибора..допустим вызывая мигание красным цветом окна с прибором или еще как нибудь. Спасибо за ранее, за помощь...

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Сравнение переменной с текущей датой
« Ответ #1 : 23 Июля 2018, 20:51:11 »
Здравствуйте.

Допустим что переменная с датой поверки имеет имя vrCheckDate и имеет тип данных DateTime. Лучше всего вывести на мнемосхему объект Календарь и привязать его к этой переменной. Через календарь дату удобнее всего редактировать и можно задать соответствующий формат. Для сравнения vrCheckDate с текущей датой можно использовать функции из этого раздела. Например можно выполнять следующий код в скрипте с типом события "Прошел час":
Код: (delphi)
begin
  { если между текущим временем и vrCheckDate прошло 2 или более месяца }
  if MonthsBetween(Now, vrCheckDate.AsDateTime) >= 2 then
    { то выдаём аварийное сообщение на панель сообщений }
    AddMessage(Now, mkAlarm, 'Нужно проверить прибор!', True, False); 
end.

vyacheslav

  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
Re: Сравнение переменной с текущей датой
« Ответ #2 : 30 Июля 2018, 14:36:49 »
Возникла такая проблема. переменная типа DateTime привязанная к календарю... и выполняется такой скрипт :
begin
if MonthsBetween(Now, data_poverki_1.AsDateTime) < 2 then
data_poverki_1_1.Value := 1
else
data_poverki_1_1.Value := 0;
end.

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

И даже когда выбираю другой тип переменной.. и задаю ей значение в проекте. То после перезапуска значение пропадает.. В чем может быть причина?

Здравствуйте.

Допустим что переменная с датой поверки имеет имя vrCheckDate и имеет тип данных DateTime. Лучше всего вывести на мнемосхему объект Календарь и привязать его к этой переменной. Через календарь дату удобнее всего редактировать и можно задать соответствующий формат. Для сравнения vrCheckDate с текущей датой можно использовать функции из этого раздела. Например можно выполнять следующий код в скрипте с типом события "Прошел час":
Код: (delphi)
begin
  { если между текущим временем и vrCheckDate прошло 2 или более месяца }
  if MonthsBetween(Now, vrCheckDate.AsDateTime) >= 2 then
    { то выдаём аварийное сообщение на панель сообщений }
    AddMessage(Now, mkAlarm, 'Нужно проверить прибор!', True, False); 
end.
« Изменён: 30 Июля 2018, 15:19:48 от vyacheslav »

pan2000

  • Постоялец
  • ***
  • Сообщений: 225
    • Просмотр профиля
Re: Сравнение переменной с текущей датой
« Ответ #3 : 30 Июля 2018, 15:28:11 »
vyacheslav!

При открытии проекта виртуальные переменные иницализируются.
Хранить даты поверки можно в самой программе, файле или БД.
Каждый из вариантов имеет свои преимущества и недостатки.

В примере из вложения даты поверки хранятся в программе.

vyacheslav

  • Новичок
  • *
  • Сообщений: 40
    • Просмотр профиля
Re: Сравнение переменной с текущей датой
« Ответ #4 : 31 Июля 2018, 08:39:15 »
vyacheslav!

При открытии проекта виртуальные переменные иницализируются.
Хранить даты поверки можно в самой программе, файле или БД.
Каждый из вариантов имеет свои преимущества и недостатки.

В примере из вложения даты поверки хранятся в программе.

Я так понимаю вы храните данные в программе, то есть в скрипте

Код: (delphi)
const   TestTime: array[1..8] of UTF8string = (
        '21.09.2018', '22.09.2018',
        '23.09.2018', '24.09.2018',
        '25.09.2018', '26.09.2018',
        '27.09.2018', '28.09.2018'
        );
var i: integer;
    aText: TM_Text;
begin
  for i := 1 to 8 do
    begin
      aText := GetTextByName('Text' + IntToStr(i));
      if aText = nil then exit;
      aText.Visible :=
          CompareDate(IncDay(dtNOW.AsDateTime, 60), StrToDate(TestTime)) > -1;
      aText.Text := 'Дата поверки ' + TestTime;
    end;
end.

    Для меня это не совсем удобно, когда подходит дата поверки приборов а их одновременно может быть до 100 - 200 шт.... то нужно менять на новую дату и так постоянно, это постоянно переделывать скрипты. Это не реально реализовать. Подскажите как с помощью других двух вариантов заполнять внутренние переменные!

« Изменён: 31 Июля 2018, 09:20:48 от Simple_Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Сравнение переменной с текущей датой
« Ответ #5 : 31 Июля 2018, 10:22:35 »
Цитировать
Подскажите как с помощью других двух вариантов заполнять внутренние переменные!
Заполнять внутренние переменные можно как и внешние, например: "vrCheckDate.Value := Now;" запишет текущие время и дату в переменную vrCheckDate. Сразу после запуска проекта скада автоматически записывает текущую дату во все переменные DateTime (в будущем появится возможность задавать значение инициализации для каждой переменной). Вы можете в скрипте с типом события "Проект запущен" инициализировать переменные другими значениями.

Цитировать
И даже когда выбираю другой тип переменной.. и задаю ей значение в проекте. То после перезапуска значение пропадает.. В чем может быть причина?
Значение любой внутренней переменной всегда будет теряться после перезапуска, т.к. они хранятся в оперативной памяти. Если нужно чтобы значения сохранялись, то это придется реализовывать на скриптах, например через сохранение в файл / БД и последующую загрузку. Разработать действительно надёжную систему сохранения значений на скриптах - сложная задача, т.к. нужно учитывать ситуации когда работу скады резко завершили, например из-за отключения электричества. Обычно, чтобы не сохранять и не загружать значения, работают с внешними переменными (с ПЛК) и после запуска скада просто считывает значение с ПЛК в переменную.
« Изменён: 31 Июля 2018, 22:05:01 от Simple-Scada »