Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: razorqhex от 07 Августа 2020, 12:53:47

Название: Проверка битов в переменных
Отправлено: razorqhex от 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 менят постоянно свои значение на:

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

У кого какие идеи, как можно такое пофиксить?
Название: Re: Проверка битов в переменных
Отправлено: pan2000 от 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).
Название: Re: Проверка битов в переменных
Отправлено: razorqhex от 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 = выключена
Название: Re: Проверка битов в переменных
Отправлено: pan2000 от 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;
    . . .
Пример в вложении. Пример позволяет просмотреть порядок вызова скрипта с указанием имени изменившейся переменной.