Здравствуйте всем.
Есть такой скрипт по изменению переменных:
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
Информацию показывает как скада так и переменная верно, но из-за того что числа меняются постоянно и в большинстве там одинаковый бит - сообщения дублируются.
У кого какие идеи, как можно такое пофиксить?
Здравствуйте!
Можно ввести блокировку повторного выполнения фрагмента скрипта (в т.ч. и вывода сообщения).
Для блокировки необходима предыстория, т.е. нужна переменная MessID, содержащая информацию о последнем выполненном фрагменте - некоторое число (перечисляемая величина).
Измененный фрагмент скрипта:
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. Условие (StatusWord_PNS3.Value = TRUE)
всегда ложно (По крайней мере в моем примере)(См. вложение).
2. Есть неопределенное состояние ((StatusWord_PNS3 = TRUE), GetBit(Ext_Status_Word_2_PNS3.AsInt, 21) = TRUE).
Здравствуйте!
Скриншот показывает последовательную инициализацию при запуске проекта двух переменных StatusWord_PNS3 и Ext_Status_Word_2_PNS3 первая в 0, а потом вторая в 1.
Для исключения "ложных" индикаций можно добавить блокирующую внутреннюю логическую переменную FullyLaunched, с начальным состоянием false, и
принимающую значение true в скрипте по событию "Полностью запущен".
Изменение в скрипте "Изменились переменные StatusWord_PNS3, Ext_Status_Word_2_PNS3, FullyLaunched"(Включение переменной FullyLaunched в список обеспечивает правильную индикацию состояния после запуска проекта, если в этом нет необходимости, то переменную нужно исключить из списка):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;
. . .
Пример в вложении. Пример позволяет просмотреть порядок вызова скрипта с указанием имени изменившейся переменной.