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

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

Автор Тема: Проверка битов в переменных  (Прочитано 1029 раз)

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Проверка битов в переменных
« : 07 Августа 2020, 12:53:47 »
Здравствуйте всем.

Есть такой скрипт по изменению переменных:
Код: (delphi)
    
if (StatusWord_PNS3.Value = TRUE) and (GetBit(Ext_Status_Word_2_PNS3.AsInt, 21) = FALSE) then
    begin
      Shape1.FlashColor := clNone;
      Shape1.Color := clGreen;
      Text12.Text := "ВВІМКНУТО";
      Text12.FontColor := clWhite;
      AddMessage(Now, mkMessage, '[ПНС 7 Гайдара] ввімкнута', true, false);
    end else if (StatusWord_PNS3.Value = FALSE) and (GetBit(Ext_Status_Word_2_PNS3.AsInt, 21) = TRUE) then
    begin
      Shape1.FlashColor := clNone;
      Shape1.Color := clYellow;
      Text12.Text := "СОН";
      Text12.FontColor := clBlack;
      AddMessage(Now, mkWarning, '[ПНС 7 Гайдара] сон', true, false);
    end else if (StatusWord_PNS3.Value = FALSE) and (GetBit(Ext_Status_Word_2_PNS3.AsInt, 21) = FALSE) then
    begin
      Shape1.FlashColor := clNone;
      Shape1.Color := clRed;
      Text12.Text := "ВИМКНЕНО";
      Text12.FontColor := clWhite;
      AddMessage(Now, mkWarning, '[ПНС 7 Гайдара] вимкнута', true, false);
end;

всё работает правильно, но есть проблема с переменной Ext_Status_Word_2_PNS3, а именно: она несколько раз меняет своё значение и бит этих значений одинаковый и по этому в сообщения в скаде дублируются по 4-8 раз.

Ext_Status_Word_2_PNS3 менят постоянно свои значение на:
  • 2148270464 что означает бит 0
  • 2282488192 что означает бит 0
  • 2883968      что означает бит 1
  • 6528            что означает бит 0

Информацию показывает как скада так и переменная верно, но из-за того что числа меняются постоянно и в большинстве там одинаковый бит - сообщения дублируются.

У кого какие идеи, как можно такое пофиксить?
« Изменён: 07 Августа 2020, 12:55:23 от razorqhex »

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Проверка битов в переменных
« Ответ #1 : 07 Августа 2020, 23:07:32 »
   Здравствуйте!

  Можно ввести блокировку повторного выполнения фрагмента скрипта (в т.ч. и вывода сообщения).
Для блокировки необходима предыстория, т.е. нужна переменная MessID, содержащая информацию о последнем выполненном фрагменте - некоторое число (перечисляемая величина).
Измененный фрагмент скрипта:
Код: (delphi)
if StatusWord_PNS3.AsBool and (not GetBit(Ext_Status_Word_2_PNS3.AsInt, 21)) and (MessID.AsInt <> 1) then
    begin
      MessID.Value := 1;

      Shape1.FlashColor := clNone;
      Shape1.Color := clGreen;
      Text12.Text := "ВВІМКНУТО";
      Text12.FontColor := clWhite;
      AddMessage(Now, mkMessage, '[ПНС 7 Гайдара] ввімкнута', true, false);
    end else if (not StatusWord_PNS3.AsBool) and GetBit(Ext_Status_Word_2_PNS3.AsInt, 21) and (MessID.AsInt <> 2)  then
    begin
      MessID.Value := 2;
      Shape1.FlashColor := clNone;
      Shape1.Color := clYellow;
      Text12.Text := "СОН";
      Text12.FontColor := clBlack;
      AddMessage(Now, mkWarning, '[ПНС 7 Гайдара] сон', true, false);
    end else if (not StatusWord_PNS3.AsBool) and (not GetBit(Ext_Status_Word_2_PNS3.AsInt, 21)) and (MessID.AsInt <> 3)  then
    begin
      MessID.Value := 3;
      Shape1.FlashColor := clNone;
      Shape1.Color := clRed;
      Text12.Text := "ВИМКНЕНО";
      Text12.FontColor := clWhite;
      AddMessage(Now, mkWarning, UTF8Encode('[ПНС 7 Гайдара] вимкнута'), true, false);
    end; 
Во вложении пример работы исходного и нового скриптов. Для сравнения вывод сообщений ведется в индивидуальные текстовые области.

Замечания.
1. Условие
Код: (delphi)
(StatusWord_PNS3.Value = TRUE)
всегда ложно (По крайней мере в моем примере)(См. вложение).
2. Есть неопределенное состояние ((StatusWord_PNS3 = TRUE), GetBit(Ext_Status_Word_2_PNS3.AsInt, 21) = TRUE).
« Изменён: 07 Августа 2020, 23:27:16 от pan2000 »

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Проверка битов в переменных
« Ответ #2 : 11 Августа 2020, 15:48:53 »
pan2000, огромное Вам спасибо, только смотрите какая неприятная штука произошла (см. вложение)

Как показывает скриншот, то станция выключилась и ушла в сон одновременно, а такого быть не может

Значение StatusWord_PNS3 = 0, а Ext_Status_Word_2_PNS3 = 2883968. 21-й бит в этом числе равняется 1

То есть:
StatusWord_PNS3 = 0 и Ext_Status_Word_2_PNS3 = 1 = сон
StatusWord_PNS3 = 1 и Ext_Status_Word_2_PNS3 = 0 = включена
StatusWord_PNS3 = 0 и Ext_Status_Word_2_PNS3 = 0 = выключена
« Изменён: 11 Августа 2020, 16:11:53 от razorqhex »

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Проверка битов в переменных
« Ответ #3 : 11 Августа 2020, 22:45:51 »
    Здравствуйте!

 Скриншот показывает последовательную инициализацию при запуске проекта двух переменных StatusWord_PNS3 и Ext_Status_Word_2_PNS3 первая в 0, а потом вторая в 1.
Для исключения "ложных" индикаций можно добавить блокирующую внутреннюю логическую переменную FullyLaunched, с начальным состоянием false, и
принимающую значение true в скрипте по событию "Полностью запущен".
Изменение в скрипте "Изменились переменные StatusWord_PNS3, Ext_Status_Word_2_PNS3, FullyLaunched"(Включение переменной FullyLaunched в список обеспечивает правильную индикацию состояния после запуска проекта, если в этом нет необходимости, то переменную нужно исключить из списка):
Код: (delphi)
begin 
  if not FullyLaunched.AsBool then exit;   // игнорировать изменения переменных до завершения полного запуска проекта
  if StatusWord_PNS3.AsBool and (not GetBit(Ext_Status_Word_2_PNS3.AsInt, 21)) and (MessID.AsInt <> 1) then
    begin
      MessID.Value := 1;
    . . .
Пример в вложении. Пример позволяет просмотреть порядок вызова скрипта с указанием имени изменившейся переменной.
« Изменён: 12 Августа 2020, 05:04:55 от pan2000 »