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

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

Автор Тема: Запись битовой переменной по времени  (Прочитано 6440 раз)

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Доброго времени суток, уважаемые форумчане
Может вопрос и простой, но я не нашел решения: как записать значение битовой переменной в заданное время ?

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Запись битовой переменной по времени
« Ответ #1 : 04 Июля 2023, 14:06:02 »
Добрый день. Создаете скрипт "Прошла секунда", получаете из текущей даты и времени (NOW) часы минуты и секунды, сравниваете с заданными, если равно - записать значение переменной.

Код: (delphi)
var 
DT_now : TDateTime;
samebit : Boolean;


begin
DT_now := Now();

   if (HourOf(DT_now) = 12) and (MinuteOf(DT_now)=30) and (SecondOf(DT_now) = 0) then samebit := True;   

end.

В 12:30:00 каждый день установится бит
« Изменён: 04 Июля 2023, 14:15:08 от Timothy Clement »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: Запись битовой переменной по времени
« Ответ #2 : 04 Июля 2023, 15:34:04 »
Здравствуйте.

1. Если требуется включать/отключать бит по расписанию, то нужно использовать отдельную Boolean переменную вместо бита и применять компонент "Расписание".
2. Если нужно выполнять какие-либо действия из скрипта через заданный интервал времени(по таймеру), то пример такого скрипта см. по ссылке.
3. Если нужно выполнять скрипт в начале заданного часа, то можно использовать скрипт с типом события "Прошел час".
4. Если требуется выполнять скрипт в какое-то заданное время(например в 12-30), то можно использовать скрипт с типом события "Прошла секунда", в котором сравнивать текущее время с заданным:
Код: (delphi)
begin
  // если сейчас 12:30
  if (HourOf(Now) = 12) and (MinuteOf(Now) = 30) and (SecondOf(Now) = 0) then
  // , то выполнить какое-то действие
end.
Методы для работы с датой/временем можно найти в руководстве по ссылке. Если требуется изменить нужный бит переменной, то используйте функцию SetBit.
« Изменён: 06 Июля 2023, 10:57:32 от Simple_Scada »

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Запись битовой переменной по времени
« Ответ #3 : 05 Июля 2023, 07:23:26 »
Доброго всем времени суток
Вопрос не совсем об этом
Пример: по одному событию включается таймер на 5 минут. По истечении 5 минут, в зависимости от результата другого события, нужно записать значение битовой переменной 5 минут назад.
Как это сделать ?

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Запись битовой переменной по времени
« Ответ #4 : 05 Июля 2023, 08:33:32 »
Как вариант архивировать переменную по-изменению, потом по истечению таймера использовать функцию работы с архивом

Код: (delphi)
var
  aDate: TDateTime;
  aTimer : Integer;

begin
  aTimer := aTimer * -1;
  aDate:= IncMinute(Now, aTimer); // текущие дата и время минус количество минут в таймере
 
  { извлечь из архива значение переменной "MyVariable" в отметке времени
   "aDate" и записать результат в переменную "MyVariableRes" }
  ArchiveValueByTime(MyVariable, MyVariableRes, aDate);

end.

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Запись битовой переменной по времени
« Ответ #5 : 05 Июля 2023, 09:54:17 »
Спасибо, попробую так. А если мне нужно записать конкретное значение ? Например, такая конструкция будет работать: ArchiveValueByTime(MyVariable, false, aDate) ?
« Изменён: 05 Июля 2023, 10:29:07 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: Запись битовой переменной по времени
« Ответ #6 : 05 Июля 2023, 10:28:30 »
Здравствуйте.

Проще будет создать внутреннюю Boolean переменную и записывать в нее значение бита в момент когда "по одному событию включается таймер на 5 минут". Затем "по истечении 5 минут, в зависимости от результата другого события" использовать значение из внутренней Boolean переменной.

Цитировать
Например, такая конструкция будет работать: ArchiveValueByTime(MyVariable, false, aDate) ?
Такая конструкция не будет работать.

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Запись битовой переменной по времени
« Ответ #7 : 05 Июля 2023, 10:30:12 »
А если мне нужно записать конкретное значение ?
Например, такая конструкция будет работать: ArchiveValueByTime(MyVariable, false, aDate) ?
Эта функция принимает в качестве аргумента переменную, поэтому можно создать переменную пустышку и присваивать ей нужное значение перед выполнением функции.

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Запись битовой переменной по времени
« Ответ #8 : 05 Июля 2023, 10:32:01 »
Коллеги, спасибо за помощь !

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Запись битовой переменной по времени
« Ответ #9 : 05 Июля 2023, 13:39:10 »
И всё-таки что-то не работает :(

Имеем глобальные переменные:
1. Переменная Дата_события
2. Переменная Бит_События
3. 2 переменные Всегда_true и Всегда_false

Код
If Событие_1 then Дата_События:=Now;
If Событие_2 then ArchiveValueByTime(Всегда_true, Бит_События, Дата_события.Value) else ArchiveValueByTime(Всегда_false, Бит_События, Дата_события.Value);

Что не так ?

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Запись битовой переменной по времени
« Ответ #10 : 05 Июля 2023, 15:56:29 »
И всё-таки что-то не работает :(

Что не так ?

Не совсем пойму что нужно сделать. Если нужно конкретное значение присвоить, то просто пишем  Бит_события := True или False. Если используем функцию то из архива будет брать не смотря на то какое значение в данный момент. Если хотите присвоить значение которое было во время события 1 то обращаетесь к архивной переменной, если надо присвоить False то просто оператором присвоения :=

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Запись битовой переменной по времени
« Ответ #11 : 05 Июля 2023, 15:59:35 »
Нужно "вернуться в прошлое" в момент Событие_1 и записать либо 0, либо 1 в переменную, в зависимости от События_2

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Запись битовой переменной по времени
« Ответ #12 : 05 Июля 2023, 16:03:25 »
Напишите четко задачу с переменными или код, без абстрактных названий типо событие1 и событие 2. Так ничего непонятно

Rolich

  • Пользователь
  • **
  • Сообщений: 78
    • Просмотр профиля
Re: Запись битовой переменной по времени
« Ответ #13 : 06 Июля 2023, 06:35:37 »
Доброго всем времени суток
Вообще глобально стоит задача подсчитывать количество и длительность простоя механизма, длительностью от 3 до 5 минут.
Алгоритм сейчас такой: по сигналу Var2 остановки механизма запускается таймер отсчёта простоя Timer, в переменную Vremya записывается время начала простоя
Если таймер простоя находится в интервале от 180 до 300 секунд и механизм продолжает стоять, то в переменную Var1 нужно записать true во время начала простоя
Если таймер простоя перешагнул отметку 300 секунд, в переменную Var1 нужно записать false во время начала простоя, т.е. этот простой не учитывать

Код (скрипт выполняется каждую секунду):
Код: (delphi)
Var
Vremya, Timer:TDateTime;
Var1, Var2, AlwTrue, AlwFalse: Boolean;
K:integer;

Begin
  AlwTrue.Value:=true;
  AlwFalse.Value:=false;
  K:=TimerGetState(Timer);
   if ((Var2.value=false) and (K=-1)) then
   begin
    TimerStart(Timer,0);
    Vremya:=Now;
   end;
   if ((Var2.value=true) and (K=1)) then
   begin
    TimerReset(Timer);
    Var1.Value:=false;
   end;
   if ((Var2.value=false) and ((SecondsBetween(0, Timer.AsDateTime)>180) and (SecondsBetween(0, Timer.AsDateTime)<300))) then ArchiveValueByTime(Alwtrue,Var1, Vremya);
   if ((Var2.value=false) and (SecondsBetween(0, Timer.AsDateTime)>300)) then ArchiveValueByTime(Alwfalse,Var1, Vremya);
end.
« Изменён: 06 Июля 2023, 08:59:23 от Rolich »

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Запись битовой переменной по времени
« Ответ #14 : 06 Июля 2023, 09:17:47 »
В таком случае если переменная Var1 у вас будет архивируемая и вы планируете по ней строить отчеты, создайте в базе данных свою таблицу для простоев с полями простой и время начала. По сигналу Var2 добавляете запросом в таблицу новую строчку INSERT простой, время. Если таймер переходит за 300 то делаете к таблице запрос DELETE запись WHERE время = Vremya. Таким образом у вас будет таблица с простоями которую можно выводить в скаду и строить отчеты.