1
Ваши вопросы / Re: Вопросы по скриптам в Simple-Scada 2
« : 15 Марта 2017, 08:44:44 »Код
begin
{ обрабатываем первый таймер }
if Tag11.IsGoodQuality = False then
if Tag12.IsGoodQuality = False then
if Tag13.IsGoodQuality = False then
if Tag14.IsGoodQuality = False then
if Tag15.IsGoodQuality = False then
if Tag16.IsGoodQuality = False then
if Tag17.IsGoodQuality = False then
if Tag18.IsGoodQuality = False then
begin
vrTimer_1.Value := vrTimer_1.Value + 1;
begin
if vrTimer_1.AsInt = 1 then
AddMessage(Now, mkMessage, 'Отсутсвует связь. Устройство 1!', TRUE, FALSE);
if vrTimer_1.AsInt = 60 then
AddMessage(Now, mkWarning, 'Отсутсвует связь. Устройство 1!', TRUE, FALSE);
if vrTimer_1.AsInt = 180 then
AddMessage(Now, mkAlarm, 'Нет связи. Устройство 1 !', TRUE, TRUE);
end;
end else
vrTimer_1.Value := 0;
{ обрабатываем второй таймер }
if Tag21.IsGoodQuality = False then
if Tag22.IsGoodQuality = False then
if Tag23.IsGoodQuality = False then
if Tag24.IsGoodQuality = False then
if Tag25.IsGoodQuality = False then
if Tag26.IsGoodQuality = False then
if Tag27.IsGoodQuality = False then
if Tag28.IsGoodQuality = False then
begin
vrTimer_2.Value := vrTimer_2.Value + 1;
begin
if vrTimer_2.AsInt = 1 then
AddMessage(Now, mkMessage, 'Отсутсвует связь. Устройство 2!', TRUE, FALSE);
if vrTimer_2.AsInt = 60 then
AddMessage(Now, mkWarning, 'Отсутсвует связь. Устройство 2!', TRUE, FALSE);
if vrTimer_2.AsInt = 180 then
AddMessage(Now, mkAlarm, 'Нет связи. Устройство 2 !', TRUE, TRUE);
end;
end else
vrTimer_2.Value := 0
end.
секундный скрипт проверяет 8 переменных на качество и если все 8 плохого качества то по таймеру выдает сообщение...скрипт мой (выстраданный с Вашей помощью...за что я Вам очень благодарен) вроде бы работает...как его можно упростить ? потому как переменных может быть и не 8
)) возможно применить процедуру Check... Идет просто проверка на связь с Устройством...по всем переменным...возможно и по одному (любому)
Код
var
aGoodCount, aBadCount: Byte;
a61447, a61493: Byte;
procedure Check(AQuality: Boolean; var ATag: TM_Variable);
begin
{ если нужно проверять качество }
if AQuality = TRUE then
if ATag.IsGoodQuality then
Inc(aGoodCount)
else
Inc(aBadCount);
{ если нужно проверять значение }
if AQuality = FALSE then
if ATag.AsInt = 61447 then
Inc(a61447)
else
if ATag.AsInt = 61493 then
Inc(a61493);
end;
{ проверяет восемь тегов на качество (при AQuality = TRUE)
или на значение (при AQuality = FALSE) }
procedure GoodOrBad(AQuality: Boolean; var T1, T2, T3, T4, T5, T6, T7, T8: TM_Variable);
begin
aGoodCount := 0;
aBadCount := 0;
a61447 := 0;
a61493 := 0;
Check(AQuality, T1);
Check(AQuality, T2);
Check(AQuality, T3);
Check(AQuality, T4);
Check(AQuality, T5);
Check(AQuality, T6);
Check(AQuality, T7);
Check(AQuality, T8);
end;
begin
{ проверяем качество 8 тегов первого устройства }
GoodOrBad(TRUE, Tag1, Tag2, Tag3, Tag4, Tag5, Tag6, Tag7, Tag8);
{ если все 8 тегов с плохим качеством }
if aBadCount = 8 then
AddMessage(Now, mkAlarm, 'Устройство 1. Нет связи!', TRUE, TRUE);
{ если все 8 тегов с хорошим качеством }
if aGoodCount = 8 then
begin
{ проверяем значение тегов 17..24 }
GoodOrBad(FALSE, Tag17, Tag18, Tag19, Tag20, Tag21, Tag22, Tag23, Tag24);
if a61447 = 8 then // все равны 61447
AddMessage(Now, mkAlarm, 'Устройство 1. Датчик отключен!', TRUE, TRUE);
if a61493 = 8 then // все равны 61493
AddMessage(Now, mkAlarm, 'Устройство 1. Обрыв датчика!', TRUE, TRUE);
end;
////// далее тот же код, но для тегов второго устройства //////
{ проверяем качество 8 тегов второго устройства }
GoodOrBad(TRUE, Tag9, Tag10, Tag11, Tag12, Tag13, Tag14, Tag15, Tag16);
{ если все 8 тегов с плохим качеством }
if aBadCount = 8 then
AddMessage(Now, mkAlarm, 'Устройство 2. Нет связи!', TRUE, TRUE);
{ если все 8 тегов с хорошим качеством }
if aGoodCount = 8 then
begin
{ проверяем значение тегов 25..32 }
GoodOrBad(FALSE, Tag25, Tag26, Tag27, Tag28, Tag29, Tag30, Tag31, Tag32);
if a61447 = 8 then // все равны 61447
AddMessage(Now, mkAlarm, 'Устройство 2. Датчик отключен!', TRUE, TRUE);
if a61493 = 8 then // все равны 61493
AddMessage(Now, mkAlarm, 'Устройство 2. Обрыв датчика!', TRUE, TRUE);
end;
end.
Насчет проверки по значению- эту часть скрипта можно убрать...только по качеству