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

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

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - abarenov

Страницы: [1]
1
Добрый День,
Сделал проект в котором выводятся показания уставок и текущих температур с 2х приборов (всего датчиков 14 и 14 уставок)
при попытке создания отчета по изменению для уставок приборов выводится 14 строк с одинаковым значением времени и переменных,можно как то избежать дублирования?

2
огромное спасибо...возможно ли к данному скрипту прибавить сообщение..которое будет появляться в логе (+звук), при плохом признаке качества переменной... естественно сообщение должно соответствовать  тому полю которое окрасилось в красный цвет..
Да, можно. Вот так:

Код
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?

Страницы: [1]