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

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

Автор Тема: Вопросы по скриптам в Simple-Scada 2  (Прочитано 314222 раз)

Guchi

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #210 : 07 Марта 2017, 12:58:58 »
Добрый день!

есть скрипт на изменение цвета  объекта (ежесекундный)

begin
  if Teg1. IsGoodQuality = False then TM_Field6.Color :=clRed
     else TM_Field.Color :=clLime
end.

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

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #211 : 07 Марта 2017, 13:16:44 »
Здравствуйте.

Лучше избегать секундных скриптов, т.к. такие скрипты выполняются строго по таймеру и если переменная не меняется скрипт все равно будет выполняться проделывая лишние вычисления. Для создания универсального скрипта можно делать так:

Допустим у нас есть множество полей, каждое из которых связано со своей переменной. Создаем новый скрипт с типом события "Универсальный". и пишем такой код:

Код
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
      TM_Object(Sender).Color := clRed;
  end;
end.

Готово. Теперь выделяем наше поле и на событие OnDataChange ставим этот универсальный скрипт. Этот же скрипт можно поставить на любые другие поля или объекты и они будет менять цвет при изменении качества тега.
« Изменён: 07 Марта 2017, 13:17:43 от Simple-Scada »

Guchi

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #212 : 07 Марта 2017, 13:56:13 »
огромное спасибо...возможно ли к данному скрипту прибавить сообщение..которое будет появляться в логе (+звук), при плохом признаке качества переменной...
естественно сообщение должно соответствовать  тому полю которое окрасилось в красный цвет..

vio

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Вопросы по скриптам в Simple-Scada 2
« Ответ #213 : 07 Марта 2017, 23:26:59 »
Здравствуйте. В Simple Scada 2 имеется двадцать полей, в которые выводятся значения температур. Как можно периодически (по таймеру) подсвечивать поле с максимальным значением?
« Изменён: 07 Марта 2017, 23:28:26 от vio »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #214 : 08 Марта 2017, 00:07:16 »
огромное спасибо...возможно ли к данному скрипту прибавить сообщение..которое будет появляться в логе (+звук), при плохом признаке качества переменной... естественно сообщение должно соответствовать  тому полю которое окрасилось в красный цвет..
Да, можно. Вот так:

Код
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.
« Изменён: 09 Марта 2017, 09:57:42 от Simple-Scada »

vio

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #215 : 08 Марта 2017, 12:32:30 »
Спасибо, завтра попробую.

pan-nn

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #216 : 08 Марта 2017, 16:44:24 »
Есть несколько объектов CheckBox.   Каждый отвечает за свой режим работы оборудования.  Одновременно может быть активирован только один ChekBox. Вопрос такой - не получается при нажатии на определенный чекбох деактивировать остальные, связанные с данной переменной. Т.е. нужно получить аналог радиокнопки в Делфи.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #217 : 08 Марта 2017, 17:02:48 »
Цитировать
Вопрос такой - не получается при нажатии на определенный чекбох деактивировать остальные, связанные с данной переменной.
Флажок всегда отображает состояние переменной, с которой он связан. И если все флажки связаны с одной и той же переменной, то они всегда будут отображать одно и то же состояние, т.е. будут либо все включены, било все выключены. А чтобы отделить их друг от друга сейчас придется использовать разные переменные.

Как мы поняли Вам нужно сделать так, чтобы один флажок был активен только когда значение переменной равно, например 1. Второй активен только когда значение переменой равно 2 и т.д. Тогда несколько флажков действительно смогут работать с одной и той же переменной и в зависимости от её значения будут включаться/выключаться, при этом активен будет только один. Но для этого нужно чтобы у них было дополнительное свойство "значение", с которым они связаны. Сейчас так сделан компонент "Список". Может быть он подойдет Вам? Ставим список, связываем его с переменной и добавляем в него строки. Для каждой строки выбираем своё значение переменной. Но, конечно, список не будет выглядеть как несколько флажков и может не подойти.
« Изменён: 08 Марта 2017, 17:04:45 от Simple-Scada »

pan-nn

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #218 : 08 Марта 2017, 17:25:47 »
Приложил картинку. Есть пять чекбоксов. Одновременно может быть нажат только один. Да, они связаны с одной переменной, но с разными ее битами (чтобы съэкономить на переменных). Допустим нажат первых чекбокс. Переменная равна 1  (бит 0). Если нажать чекбокс 2 переменная будет равна 3 (бит 1 + бит 0), а мне нужно чтобы отжался чекбокс 1 и переменная была равна 2.  Надеюсь объяснил понятно

pan-nn

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #219 : 08 Марта 2017, 22:24:27 »
Еще вопрос. Как в скрипте задать иконку  кнопке?
Не понятен сиктаксис кода  Button54.Icon := ????
 

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #220 : 09 Марта 2017, 00:02:53 »
Цитировать
Да, они связаны с одной переменной, но с разными ее битами (чтобы съэкономить на переменных).
Теперь понятно, но к сожалению с битами ситуация такая же, ведь нужно при установке одного бита сбрасывать остальные. Сейчас этого нормально не реализовать даже скриптом, т.к. нажатие на флажок будет "перебивать" действие скрипта. Поэтому мы добавим объекту "Флажок" новое свойство "Значение", тогда можно будет реализовать радиокнопки на основе значения одной переменной, а также и на основе битов одной переменной. Т.е. получится максимальная гибкость и без использования скриптов. А пока нормально реализовать это можно только объектом "Список".

Цитировать
Еще вопрос. Как в скрипте задать иконку  кнопке?
Кнопка представляет собой набор состояний и работать нужно не с самой кнопкой, а с её состояниями. Свойство Button54.Icon доступно только для чтения, оно возвращает номер иконки для активного состояния кнопки. Вот так можно изменить иконку для первых двух состояний кнопки:

Код
begin
   Button1.States[0].Icon := 5;
   Button1.States[1].Icon := 5;
end.
« Изменён: 09 Марта 2017, 00:04:06 от Simple-Scada »

Guchi

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #221 : 09 Марта 2017, 10:40:19 »
в скаду выведены 2 переменные Connect (устройство_1) и Connect_1(устройство_2) из arOPC...
необходимо контролировать связь с 2-мя устройствами и ОРС сервером
1) при потере  признака качества переменных (Connect и Connect_1) - отпал OPC сервер;
2) значение 0 - нет связи с устройством, 1- есть связь с устройством (по каждому устройству соответственно)
  Необходимо при выявлении события (нет связи с ОРС сервером, нет связи с устройством 1, нет связи с устройством 2) сделать задержку (например на 1 минуту) и если связь не восстановится выдать в лог сообщение с звуком о соответствующем сообытии...с возможностью автоквитирования сообщения при возобновлении связи, до того как сообщение будет в ручную подтверждено.
« Изменён: 09 Марта 2017, 10:40:51 от Guchi »

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #222 : 09 Марта 2017, 11:25:14 »
Приложил картинку. Есть пять чекбоксов. Одновременно может быть нажат только один. Да, они связаны с одной переменной, но с разными ее битами (чтобы съэкономить на переменных). Допустим нажат первых чекбокс. Переменная равна 1  (бит 0). Если нажать чекбокс 2 переменная будет равна 3 (бит 1 + бит 0), а мне нужно чтобы отжался чекбокс 1 и переменная была равна 2.  Надеюсь объяснил понятно
Экономить можно и нужно внешние переменные :) Внутренние то зачем?

Если есть 1 ворд(внешний), то создаем 5 локальных булей и привязываем их к чекбоксам. Прописываем чекбоксам тег от 0 до 4.
Пишем 2 скрипта. 1 универсальный на изменение переменной чекбокса. Второй на изменение глобальной переменной.

1 скрипт - по тегу сендера при изменении его в true присваивает внешней переменной значение 2 в степени тег(1.2.4.8.16)
2 скрипт присваивает локальным переменным значение битов глобальной переменной.
Все...

если есть 2 чек, а мы ставим на 3-й (тег=2) Переменной присвоится 4, при ее смене скинется фажок с 2 переменной, 1 скрипт при этом не исполнится. Одна проблема, что при снятии птичек вообще, в глобальной переменной останется последнее значение, т.к. скрипт 1 не выполнится. Если это не критично, то можно попользовать последний бит внешней переменной и независимо от того что вызвало первый скрипт менять его на обратный. Тогда и второй исполнится, хоть бит и не участвует в процессе.
Использование 2-х скриптов критично, если есть другие источники изменений (контроллер, панельки). Если менять настройку только в скаде, то можно все вписать в 1 скрипт.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #223 : 09 Марта 2017, 21:12:51 »
1) при потере  признака качества переменных (Connect и Connect_1) - отпал OPC сервер;
Guchi , эта проверка никогда не будет достоверной, т.к. скада получает качество тегов и их значения с OPC-сервера и при потере связи скады с OPC-сервером она не получит BAD-статус на переменные Connect и Connect_1. Скада в этом случае просто начнет попытки переподключения к OPC-серверу. Вы работаете с удаленным OPC-сервером, или локальным? Если OPC-сервер на том же компьютере, что и скада, то связь между ними может потеряться только если OPC-сервер принудительно закроет пользователь.

Цитировать
2) значение 0 - нет связи с устройством, 1- есть связь с устройством (по каждому устройству соответственно)...  сделать задержку (например на 1 минуту)
Для этого удобнее всего сделать подсчет секунд в секундном таймере. Создать две внутренние переменные (одна на каждое устройство), допустим vrTimer_1 и vrTimer_2 с типом данных Integer и шкалой от 0 до 2147483647. И в секундном скрипте написать такой код:

Код
begin
  {  обрабатываем первый таймер }
  if Connect.AsInt = 0 then
  begin
    vrTimer_1.Value := vrTimer_1.Value + 1;
    if vrTimer_1.AsInt = 60 then
      AddMessage(Now, mkAlarm, 'Нет связи с первым устройством!', TRUE, TRUE);
  end else
    vrTimer_1.Value := 0;

  {  обрабатываем второй таймер }
  if Connect_1.AsInt = 0 then
  begin
    vrTimer_2.Value := vrTimer_2.Value + 1;
    if vrTimer_2.AsInt = 60 then
      AddMessage(Now, mkAlarm, 'Нет связи со вторым устройством!', TRUE, TRUE);
  end else
    vrTimer_2.Value := 0;
end;

Цитировать
.с возможностью автоквитирования сообщения при возобновлении связи
Автоквитирование сделать не получится, т.к. данные неквитированных сообщений недоступны из скриптов.

Guchi

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #224 : 13 Марта 2017, 08:13:39 »
Исходные данные:
имеем 2 устройства по 8 точек измерения (Тег1...Тег8 и Тег9-Тег16) и 8 точкам измерения Статус (Тег17..Тег24 и Тег25..Тег32)
сбор с устройств (МВ110-8А Овен) идет посредством терминала GPRS Teleofis - Master OPC Universal Modbus Server   - Simple Scada...
Требуется определять
1. связь с утройствами.... применить универсальный скрип по изменению параментра...если признак качества по Тег1...Тег8 плохой, то устройство №1 "нет связи", если Тег9...Тег16 признак качества плохой, то "устройство №2 нет связи".
2. нештатки по каналам измерения....универсальный скрипт: если Тег1....Тег8 имеет хороший признак качество то читаем Тег17...Тег24 и если переменные: 1) = 61447, то выводим сообщение "датчик отключен", 2) = 61493, то выводим сообщение "обрыв датчика" и т.д.
если признак качества Тег1...Тег8 плохой, то конец скрипта....аналогично с Тег9...Тег16 (статусы Тег25...Тег32)....
технически у меня ничего не получилось...прошу помочь...
« Изменён: 13 Марта 2017, 08:17:09 от Guchi »