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

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

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

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 285
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1245 : 04 Августа 2021, 12:47:42 »
Здравствуйте.
Сообщения можно добавлять/редактировать без использования скриптов, через меню сообщений. Для создания множества однотипных сообщений можно использовать шаблонные сообщения. При создании шаблона сообщения, в подстановках можно использовать спец. значения, например добавить в сообщение описание переменной используя подстановку %#var_desc%. При работе с сообщениями нужно всегда стараться использовать штатную систему сообщений и шаблонные сообщения. Добавлять сообщения через скрипты целесообразно только в крайних случаях, когда по каким-либо причинам невозможно использовать штатную систему сообщений.

Код
if (B24_220.Value = false)  
При сравнении значения переменной лучше использовать явное приведение значения переменной к нужному типу. Например, при сравнении с True/False нужно брать значение переменной переведенное в тип Boolean(свойство AsBool)

Подскажите пожалуйста, в скриптах с типом события "изменились переменные" можно обратиться к этой самой переменной не по имени?
Для получения доступа к переменной, изменение которой привело к выполнению скрипта "изменились переменные" можно использовать параметр Variable.

Код: (delphi)
 if (Variable.AsBool = false)   and  (IsFirstChange = false) then
     AddMessageToGroup(Now, mkAlarm, 4, 'Котельная 24 - нет сети 220В!', true, true);
« Изменён: 04 Августа 2021, 13:28:35 от Simple_Scada »

strs

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1246 : 04 Августа 2021, 13:22:07 »
Здравствуйте.
Сообщения можно добавлять/редактировать без использования скриптов, через меню сообщений. Для создания множества однотипных сообщений можно использовать шаблонные сообщения.
Но при перезапуске проекта они тут же все будут выданы. Тут ключевое "IsFirstChange() = false", не понимаю, почему этого нет в стандартном функционале сообщений, как и задержек на срабатывание.

При сравнении значения переменной лучше использовать явное приведение значения переменной к нужному типу. Например, при сравнении с True/False нужно брать значение переменной переведенное в тип Boolean(свойство AsBool)
Учту, спасибо.

Для получения доступа к переменной, изменение которой привело к выполнению скрипта "изменились переменные" можно использовать параметр Variable.

Код: (delphi)
 if (Variable.AsBool = false)   and  (IsFirstChange = false) then
     AddMessageToGroup(Now, mkAlarm, 4, 'Котельная 24 - нет сети 220В!', true, true);
Спасибо!
« Изменён: 18 Августа 2021, 11:53:53 от Simple-Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 285
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1247 : 04 Августа 2021, 14:38:20 »
Но при перезапуске проекта они тут же все будут выданы. Тут ключевое "IsFirstChange() = false", не понимаю, почему этого нет в стандартном функционале сообщений

Для того, чтобы не выдавались сообщения при перезапусках проекта в настройках Options.exe на вкладке "Simple-Scada Server" имеется опция "Показывать сообщения по первому изменению", если ее отключить, то сообщения при перезапусках не будут выдаваться.
« Изменён: 04 Августа 2021, 15:03:06 от Simple_Scada »

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1248 : 05 Августа 2021, 02:14:29 »
Доброй ночи.
Глупый вопрос.
Имеется шаблон для устройств.
Устройства подобные и по своей сути однотипные, но с незначительными изменениями относительно друг друга.
Допустим, в одной приточно-вытяжной машине есть ПЧ, в другой отсутствует рекуператор, в другой нет заслонок и т.д.
Как мне создать некий один универсальный шаблон, для всех типов устройств.
Допустим если в шаблоне к некому полю, тексту, изображению скады не привязана переменная , скрыть этот объект, возможно ли это?
Тогда при клонировании установок, не нужно детально разбираться с каждой индивидуально:
есть переменная => есть поле, текст, изображение., нет привязки=> скрыть поле, текст, изображение.
Или эту задачу можно решить другим методом?
Заранее спасибо.

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1249 : 05 Августа 2021, 08:30:09 »
Допустим если в шаблоне к некому полю, тексту, изображению скады не привязана переменная , скрыть этот объект, возможно ли это?
Тогда при клонировании установок, не нужно детально разбираться с каждой индивидуально:
есть переменная => есть поле, текст, изображение., нет привязки=> скрыть поле, текст, изображение.
Я решал эту задачу следующим способом: для объектов в шаблоне назначал подсказку %hint% либо значение Тега объекта %num% либо Подпись %name% в случае с чекбоксом.
К таким объектам привязывал Доп.переменную, которая выступала триггером для вызова скрипта OnDataChangeEx. Если нужно скрыть объект на шаблоне, значит в подстановке указывал
'-' для текстовых параметров или 0 для числовых. Переменная-триггер всегда меняла своё значение через InverseBit при переходе на страницу с шаблонами или открытии окна с шаблоном. При этом срабатывает универсальный скрипт
Код: (delphi)
begin
  with Sender as TM_CheckBox do
    begin
      if Caption = '-' then Visible := False        //Если вместо названия датчика прочерк, скрыть чекбокс
      else Visible := True;                         //Название есть - отобразить чекбокс
    end;
end.
Сюда можно дописать поля, кнопки и прочие объекты, назначить скрипт на OnDataChangeEx. Решение может немного и топорное, но работает как нужно.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1250 : 05 Августа 2021, 09:50:27 »
Здравствуйте.

В обновлении 2.5.8 шаблонам и окнам добавлено событие OnInit и функция GetTemplateObject, которые позволяют легко решить эту задачу. Допустим в шаблоне есть заслонка Valve1 и изображение Image1, которые нужно скрывать, если они не связаны с переменной. Тогда на событие OnInit шаблона пишем такой код:
Код: (delphi)
var
  aObj: TM_Object;
begin
  aObj := GetTemplateObject('Image1');
  aObj.Visible := aObj.Variable <> nil;

  aObj := GetTemplateObject('Valve1');
  aObj.Visible := aObj.Variable <> nil;
end.

Aister

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1251 : 05 Августа 2021, 11:45:00 »
Здравствуйте. Не получается решить задачку изящным способом. Подскажите пожалуйста как лучше ее реализовать.
Суть задачи в следующем. Требуется отправлять телеграм уведомления по трем типам событий:
1) Выход значения за аварийные границы с пропуском первого уведомления(при старте проекта). Решено скриптом "выход за границы" и добавлением группы переменных.
2) То же, что и в первом условии, но нужна обработка дополнительной булевой переменной. К примеру, сообщение отправится при выходе температуры холодильника за границы, НО, если условный переключатель "Работа" включен.
3) Сообщение в случае: Bool = TRUE И (Значение переменной больше верхней аварийной границы И Таймер обратного отсчета закончил работу). По сути - задержка выхода величины на нормальный уровень за заданное время.

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

Заранее спасибо.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1252 : 05 Августа 2021, 14:13:29 »
Здравствуйте.
В обновлении 2.5.8 шаблонам и окнам добавлено событие OnInit и функция GetTemplateObject, которые позволяют легко решить эту задачу.
Большое спасибо. Заработало. ;)

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1253 : 05 Августа 2021, 23:53:26 »
Здравствуйте.

Цитировать
Суть задачи в следующем. Требуется отправлять телеграм уведомления по трем типам событий:
Для второй задачи можно использовать следующий способ: переменные, по которым настроены границы и переменные "Работа" должны иметь однотипные имена. Например, переменная температуры холодильника №1 - Temp1, переменная работы холодильника Temp1Work, холодильник №2 - Temp2 и Temp2Work и т.д. Тогда можно в скрипте использовать поиск переменной "Работа" по имени и далее использовать ее в скрипте, например:
Код: (delphi)
var
  aVar: TM_Variable;
begin
  // пропускаем первое изменение
  if not IsFirstChange then Exit;
  // ищем переменную "Работа", соответствующую сработавшей переменной
  aVar := GetVariableByName(Variable.Name + 'Work');
  // если переменная существует, то..
  if aVar <> nil then
    // если переменная "Работа" = True
    if aVar.AsBool then
    // отправляем сообщение в зависимости от того, в какой зоне находится значение переменной
    case Variable.GetValueZone of
     -2: SendTelegram('Нарушена НА граница переменной ' + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
     -1: SendTelegram('Нарушена НП граница переменной ' + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
      0: SendTelegram('Значение вернулось в норму '     + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
      1: SendTelegram('Нарушена ВП граница переменной ' + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
      2: SendTelegram('Нарушена ВА граница переменной ' + Variable.Name + '. Значение: ' + IntToStr(Variable.AsInt));
    end;
end.
     
Для третьей задачи можно применить тот же подход, но вместо задержки настроить у переменных необходимую зону нечувствительности для выдачи сообщений о нарушении границ. Это позволит избежать дублирующихся сообщений при колебании значения переменной на границах.

Цитировать
Можно ли каким-то образом устроить "сегрегацию" пользователей Телеграм, или создать несколько групп.
Проще всего будет создать несколько групп в Telegram, распределить пользователей по этим группам и отправлять сообщения в нужные группы.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1254 : 10 Августа 2021, 16:52:18 »
Добрый день. Пытаюсь проникнуться в идеологию.
Возник вопрос.

Создал шаблон в виде графического строчного примитива:
Код
[%назв. установки%] [%номер пом.%].......[%index%_температура_1] [%index%_температура_2] [%index%_температура_3] [%index%_температура_4]....
Далее создаю таблицу, путем копирования этого шаблона построчно с указанием переменных %...%:
Код
[%назв. установки%] [%номер пом.%].......[%index%_температура_1] [%index%_температура_2] [%index%_температура_3] [%index%_температура_4]
[%назв. установки%] [%номер пом.%].......[%index%_температура_1] [%index%_температура_2] [%index%_температура_3] [%index%_температура_4]
[%назв. установки%] [%номер пом.%].......[%index%_температура_1] [%index%_температура_2] [%index%_температура_3] [%index%_температура_4]
Получаю некую сводную инф. таблицу.
С целью экономии рабочего пространства пытаюсь "объединить" столбцы температуры.
Т.е. создать некий всплывающий список, который бы выбирал, что именно показывать в этом столбце: 1,2,3 или 4 температуры.

Как я пытаюсь это сделать:
1. создаю внутреннюю переменную "Filter_Column", подвязанную к ComboBox.
2. поле температуры в шаблоне имеет свойства: переменная - %index%, доп. переменная - Filter_Column.
3. создаю скрипт для поля температуры по изменению доп. переменной:
Код: (delphi)
begin
  if Sender is TM_Field then
    with Sender as TM_Field do
      case Filter_Column_Ahu.value of
        0 :   Variable := GetVariableByName(AsStr + '_температура_1');
        1 :   Variable := GetVariableByName(AsStr + '_влажность_212');
        2 :   Variable := GetVariableByName(AsStr + '_температура_3');
        3 :   Variable := GetVariableByName(AsStr + '_любое_другое_строковое_значение');
      end;
end.
4. Предполагаю, что при выборе ComboBox, в столбце будет фигурировать та переменная, которая необходима пользователю в данный момент.

Не получается )=
Есть подозрение, что я не верно передаю в скрипт %.....%.
Прошу помощи.

Возможна реализация данной мысли в другом исполнении.
P.S. %Index% - включает в себя много информации => "стринговое" значение.
« Изменён: 10 Августа 2021, 17:50:47 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1400
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1255 : 12 Августа 2021, 10:35:09 »
Здравствуйте.

В скрипте Вы ищите переменные по имени через GetVariableByName, но не проверяете их существование. Возможно, имеются ошибки в формировании имен переменных и их не находит, из-за чего будет возникать ошибка при выполнении скрипта - подробнее см. по ссылке. Откройте журнал сервера скады и посмотрите, нет ли в нем ошибок выполнения скриптов. Если не разберетесь, пришлите для проверки на support@simple-scada.com текущую версию проекта из директории "..\Simple-Scada 2\Projects\".

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 285
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1256 : 12 Августа 2021, 11:35:24 »
С целью экономии рабочего пространства пытаюсь "объединить" столбцы температуры.
Т.е. создать некий всплывающий список, который бы выбирал, что именно показывать в этом столбце: 1,2,3 или 4 температуры.

Здравствуйте.
Посмотрите пример, возможно Вы что-то подобное описали?
« Изменён: 25 Марта 2022, 12:37:32 от Simple_Scada »

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1257 : 12 Августа 2021, 13:25:57 »
Спасибо, за пример. Да, именно такую конструкцию я и хотел увидеть.
Но, для ее реализации вы используете свойство переменной Tag, который вы передаете в шаблон и который является целочисленным значением.
В моем же случае нужно передавать строку.
Получилось решить задачу используя свойство: "подсказка". Т.е. в  "подсказку" записал %index% и в скрипте обрабатываю это значение.
Код: (delphi)
begin
  if Sender is TM_Field then
    with Sender as TM_Field do
      case Filter_Column_Ahu.value of
        0 :   Variable := GetVariableByName(Hint + '_Температура1');
        1 :   Variable := GetVariableByName(Hint + '_Влажность1');
        2 :   Variable := GetVariableByName(Hint + '_любое другое тестовое значение');
      end;
end.
« Изменён: 15 Августа 2021, 20:16:33 от Simple-Scada »

KungLao

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1258 : 17 Августа 2021, 14:31:46 »
Добрый день. Небольшой вопрос по использованию таймера. Есть кнопка (Btn1) с подсветкой, подсветкой управляет релейный выход контроллера (переменная OPC - K1). При  нажатии кнопки Btn1, в SCADA выводится сообщение о ее нажатии и в соответствующее поле выводится время нажатия. Как реализовать отклик, т.е. при нажатии на кнопку ( только если в SCADA зарегистрировалось нажатие, сгенерировалось сообщение и зафиксировалось время!) чтобы пропала подсветка на 2 секунды (K1.Value := 29) и потом снова включилась (K1.Value :=31). В контроллере эту задумку осуществить не получится(это контроллер компании Новатэк, там не все так просто в плане написания логики работы). А также есть ли возможность если кнопка Btn1 не нажималась 120 минут то реализовать мигание (записывать раз в секунду в переменную K1 команду вкл-выкл: 29, 31)?
« Изменён: 17 Августа 2021, 16:17:31 от KungLao »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 285
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1259 : 17 Августа 2021, 17:43:28 »
Здравствуйте.

Пример использования таймера:

Удобнее использовать таймер с обратным отсчетом, и задавать интервал для таймера по нажатию на кнопку с дополнительной проверкой, что таймер уже запущен, чтобы пользователь не смог перезапустить таймер при повторных нажатиях на кнопку. Для этого нужно создать новую внутреннюю переменную типа Integer, например, с именем vrTimer, и два новых скрипта.

1. Скрипт для кнопки на событие OnClick:

Код: (delphi)
begin
  if vrTimer.Value = 0 then vrTimer.Value := 20;
end.

2. Скрипт с типом события "Прошла секунда" с таким кодом:
Код: (delphi)
begin
  if vrTimer.Value > 0then
     begin
      vrTimer.Value := vrTimer.AsInt -1;
       if vrTimer.Value = 0 then
         begin
           // КОД РАЗМЕЩЕННЫЙ ЗДЕСЬ БУДЕТ ВЫПОЛНЯТЬСЯ ПО ТАЙМЕРУ

         end;
     end;
end.

Примеры, мигание цветом, без использования таймера, можно посмотреть по ссылке