огромное спасибо...возможно ли к данному скрипту прибавить сообщение..которое будет появляться в логе (+звук), при плохом признаке качества переменной... естественно сообщение должно соответствовать тому полю которое окрасилось в красный цвет..
Да, можно. Вот так:
var
aVar: TM_Variable;
begin
// сначала проверяем что скрипт вызван объектом
if Sender is TM_Object then
begin
// получаем переменную с которой связан объект
aVar := TM_Object(Sender).Variable;
// если не удалось получить переменную объекта, то прерываем выполнение скрипта
if not Assigned(aVar) then Exit;
if aVar.IsGoodQuality then
TM_Object(Sender).Color := clLime
else
begin
TM_Object(Sender).Color := clRed;
AddMessage(Now, mkWarning, Sender.Name + '. Плохое качество тега!', TRUE, TRUE);
end;
end;
end.
Обратите внимание, что процедура AddMessage появилась только в Simple-Scada 2.2.0.0. Обновите, если у Вас более старая версия.
Здравствуйте. В Simple Scada 2 имеется двадцать полей, в которые выводятся значения температур. Как можно периодически (по таймеру) подсвечивать поле с максимальным значением?
Здравствуйте. Правильнее будет не по таймеру, а по изменению (OnDataChange). Все поля придется перебирать в скрипте (в будущем сможем предложить лучшее решение, но пока только так). Далее подробное описание реализации.
Допустим наши поля называются Field1, Field2 ... Field20. Переходим в меню скриптов и нажимаем кнопку "Создать скрипт". В раскрывшемся окне вводим название скрипта, а тип события оставляем "Универсальный". И пишем такой код:
var
aMaxField: TM_Field;
procedure GetMax(AField: TM_Field);
begin
AField.Color := clSilver; // сбрасываем цвет поля на стандартный
if AField.AsInt > aMaxField.AsInt then
aMaxField := AField;
end;
begin
aMaxField := Field1;
GetMax(Field1);
GetMax(Field2);
//... и так далее
GetMax(Field20);
aMaxField.Color := clIndianRed;
end.
Готово. Теперь выделяем все 20 полей и на событие OnDataChange ставим этот скрипт.
Далее опишем код скрипта: есть локальная переменная aMaxField, которая сначала устанавливается равной первому полю Field1. Затем для каждого из полей вызывается подпроцедура GetMax в которую передается очередное поле. И если значение в переданном поле больше чем значение в aMaxField, то aMaxField приравнивается переданному полю. В итоге после всех процедур GetMax в переменной aMaxField будет поле с самым большим значением. Его мы и подсвечиваем красным цветом. В примере работа идет с целочисленными переменными. Если у вас в полях вещественные числа, то измените в коде AsInt на AsFloat.
может чтобы не перебирать поля связать их имя с переменной например таким образом
имя поля равно Field + ID переменной
а в переборе использовать GetFieldByName('Field' + inttostr(Variable.ID)) вместо Field1,Field2 и тп?
все равно ведь в скрипт будут добавляться переменные для отслеживания?
или если в качестве переменных в скрипте будут лежать TM_Field то может Variable.Maximum?