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

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

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

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1155 : 01 Декабря 2020, 22:26:27 »
Здравствуйте.

Для такой задачи сложно подобрать максимально простое решение. Во вложении пример проекта основанного на "первой переменой" и на двух универсальных скриптах по изменению основной и доп. переменной связанной с объектом. На каждый объект создана внутренняя переменная для подсчета изменений - данная переменная должна быть указана в качестве дополнительной для объекта. Имена переменных имеют однотипные названия, для упрощения работы в скриптах и шаблонах. В секундном скрипте значения счетчиков уменьшаются. В скрипте по изменению основной переменной счетчик изменений увеличивается. По достижении установленного значения(в примере через 5 сек.) выдается сообщение и изменяется цвет объекта. Переход в норму также происходит с задержкой, т.к. по другому не определить, было единичное изменение переменной или она постоянно меняется 0/1. Какой-то более простой способ решения подобрать не получилось, но даже при 1000 переменных описанный способ не должен сказаться на производительности.

Цитировать
изменение состояния первой может в какой-то момент синхронизироваться с частотой опроса и в этом случае скада будет считать, что устройство в первом или втором состоянии
Как Вы указали: " 0 и 1 сменяют друг друга с периодом в 1 секунду". Значит Вам нужно установить частоту опроса данных переменных = 500мс., тогда описанная ситуация никогда не возникнет и не нужно будет использовать вторую переменную.

quarian

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1156 : 03 Декабря 2020, 06:38:11 »
Здравствуйте.
Спасибо за простое и изящное решение :). Взял его как основу.
Вы помогли мне выбраться из своей собственной зацикленности) Попытка отказаться от выполнения скриптов по времени, действительно, привела меня в тупик.

Вячеслав

  • Новичок
  • *
  • Сообщений: 21
  • mgupi
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1157 : 13 Декабря 2020, 21:07:44 »
Здравствуйте! Подскажите как решить такой вопрос. Из OPC считывается значение температуры и выводится на экран. Но есть одна особенность-отрицательная температура вычисляется как Треал=Тполуч-65536. Для этого я создал скрипт по изменению переменной Тполуч.:
Код: (delphi)
var
a: integer;
S: String;
begin
{ условия для поля }
  if Sender is TM_Field then     // проверяем, что Sender это поле
    with Sender as TM_Field do   // приводим Sender к типу "TM_Field"
       if AsInt > 100 then       // если значение температуры больше 100 то
        begin                    // температура отрицательная и вычисляем ее значение
          a:=0;                  // сбрасываем старое значение временной переменной
          a:=AsInt-65536;        // вычисляем отрицательную разницу температуры
          S:= IntToStr(a);       // преобразуем значение с минусом в текстовую строку
          Text:= S;              // выдаем строку в свойство текста элемента поля
         end;
end.
Но с ним обнаружилась одна проблема. Все работает только когда экранная форма с элементом Поле открыта. Если форму закрыть и вернуться обратно то элемент Поле показывает значение Тполуч. То есть скрипт не запускается так как переменная Тполуч. за это время не изменилась.
« Изменён: 13 Декабря 2020, 21:50:20 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1158 : 13 Декабря 2020, 22:41:43 »
Здравствуйте.

В каком диапазоне может меняться значение приходящее с датчика температуры и какая шкала должна быть в скаде? Например, с датчика приходит значение в шкале 0 - 100, а необходимо его отображать в шкале 0 - 150, тогда нужно использовать режим масштабирования - см. описание опции "Сдвиг запятой". Это наиболее правильный способ, не требующий использования скриптов. Если режим масштабирования не подходит, то см. другие варианты ниже.

Чтобы описанные расчеты работали корректно, нужно назначить полю доп. переменную = Тполуч, а основную переменную не назначать и написать скрипт по событию OnDataChangeEx(изменилась доп. переменная):
Код: (delphi)
 begin
{ условия для поля }
  if Sender is TM_Field then     // проверяем, что Sender это поле
    with Sender as TM_Field do   // приводим Sender к типу "TM_Field"
       if VariableEx.AsInt > 100 then       // если значение температуры больше 100 то
         Text:= IntToStr(VariableEx.AsInt - 65536)
       else
         Text:= IntToStr(VariableEx.AsInt);
end.
Но, если требуется архивировать рассчитанное значение переменной(или например использовать его в других скриптах), то лучше создать внутреннюю переменную и записывать результат расчета в нее. Тогда можно будет при необходимости использовать эту переменную в трендах, скриптах, отчетах и т.д. Для такого способа нужно указать в основной переменной поля нашу внутреннюю переменную(при этом доп. переменная поля = Тполуч) и внести небольшие изменения в скрипт:   
Код: (delphi)
begin
{ условия для поля }
  if Sender is TM_Field then     // проверяем, что Sender это поле
    with Sender as TM_Field do   // приводим Sender к типу "TM_Field"
       if VariableEx.AsInt > 100 then       // если значение температуры больше 100 то
         Value := VariableEx.AsInt - 65536
       else
         Value:= VariableEx.AsInt;
end.

Вячеслав

  • Новичок
  • *
  • Сообщений: 21
  • mgupi
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1159 : 17 Декабря 2020, 21:47:08 »
 ;)Спасибо за помощь! Первый вариант кода работает именно так как необходимо. Просто в голову не приходило что скрипт можно запустить только с дополнительной переменной.

mihanikus45rus

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1160 : 05 Января 2021, 12:24:22 »
Добрый день. При создании скрипта скада не видит имя обьекта, и при компиляции пишет что не обьявленный. Обьект(например Shape49) расположен в окне №2. Причём в окне №1 все работает. То есть в окне №2 10 обьектов, и ни один не виден при создании скрипта. Перенёс обьект из окна №2 в окно №1 - стал видимым для скрипта. Версия скады 2.4.0.12 demo time. Может я что то упустил?

Simple-Scada

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

Возможно Вы создали шаблонное окно, тогда объекты в нём действительно не будут видны в скриптах и это правильно, т.к. на основе шаблонного окна может быть создать множество окон с множеством отдельных объектов (о которых скада не знает на этапе компиляции). Если окно обычное, но объекты всё равно не видны, то вышлите проект для проверки на support@simple-scada.com.
« Изменён: 05 Января 2021, 13:59:30 от Simple-Scada »

mihanikus45rus

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1162 : 05 Января 2021, 14:09:41 »
Спасибо, действительно шаблонное. Всё работает.

dima_k

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1163 : 17 Января 2021, 15:36:33 »
пытаюсь создать модальное окно (почти, чтобы для оператора не было возможности тыкать в то, что видно за пределами окна).
Кладу bg:TM_Shape на всю закладку. и когда надо показать окно - есть кнопка Btn1 с событием OnClick:
  bg.Visible:=true;
  bg.Layer:=9999;
  WinRecipe.ShowAll;
в закладке есть еще кнопка со скриптом перехода на главное окно
PageMain.GoToPageAll;     
(bg - это объект TM_Shape, WinRecipe - окно)
окно WinRecipe появляется, но все другие объекты, которые по идее находятся под bd продолжают получать фокус ввода.
в окне WinRecipe есть кнопка у нее скрипт по click:
  bg.Visible:=false;
  bg.Layer:=1;
  WinRecipe.CloseAll;

После нажатия на эту кнопку окно WinRecipe скрывается и дальше чертичто. Клавиша Btn1 срабатывает со второго раза, клавиша перехода на главное окно вообще не работает.


P.S. Как бы сделать модальные окна?

PPS RowIndex у таблицы  давно хотелось бы самому устанавливать.
« Изменён: 18 Января 2021, 10:01:13 от dima_k »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1164 : 18 Января 2021, 11:03:37 »
Здравствуйте.

Модальное окно реализовать не получится, в том числе методом, которым Вы пытаетесь это сделать. Также, следует учитывать, что изменения свойств объектов применяются для всех клиентов, т.е. если скрыть объект "Фигура", то он будет скрыт на всех клиентах, независимо от того, на каком клиенте нажали кнопку выполняющую скрипт скрытия объекта. Поэтому, при наличии более 1 клиента данный способ абсолютно не рабочий.

Цитировать
Клавиша Btn1 срабатывает со второго раза, клавиша перехода на главное окно вообще не работает.
При желании, Вы можете прислать нам для проверки проект из директории "...\Simple-Scada 2\Projects\Имя_проекта" и мы скажем почему именно это происходит.

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1165 : 19 Января 2021, 05:52:24 »
  В текущей версии (для последующих не гарантировано) Simple-Scada можно создать модальное окно добавив к обычному окну четыре шторки, окружающие это окно. Т.к. окно (и его объекты) перекрывают страницу, то шторки блокируют доступ к объектам страницы, в т.ч. и все элементы управления страницы, включая переходы по страницам и т.д.

Для нескольких клиентов можно определить правила вызова окна (только один клиент, несколько, для конкретного пользователя ...).

Пример во вложении (процесс создания шторок в комментарии скрипта).

dima_k

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1166 : 19 Января 2021, 11:56:55 »
Прикольное решение.

Может кто подскажет, как в таблице передвигать фокус ввода на нужную клетку или хотя бы строку?
Свойство RowIndex у таблицы readOnly.

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1167 : 02 Февраля 2021, 10:01:49 »
Доброго дня,  второй раз сталкиваюсь с  некорректной обработкой  оператора not , условие  такое
 if not  aaa.value then   нормально не обрабатывается ,  ааа- переменная bool

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3160
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1168 : 02 Февраля 2021, 10:06:49 »
Здравствуйте.

Оператор not всегда работает правильно. Дело в том, что свойство Value переменной является типом Variant и может интерпретироваться компилятором, например, как число. Если Вам известен тип данных, то берите значение в этом типе, например:
Код: (delphi)
if not aaa.AsBool then 
или
Код: (delphi)
if aaa.AsBool = false then 

Также, рекомендуем ознакомиться с описанием частых ошибок в скриптах - ссылка. Данная ошибка там также рассмотрена - см. пример №2.
« Изменён: 02 Февраля 2021, 10:23:15 от Simple_Scada »

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1169 : 02 Февраля 2021, 22:07:07 »
Это понятно, но всегда использовал if aaa.value then, и всегда компилятор , понимал , что  true  , это та же 1, а  вот  с falsе, так не выходит,  а почему тогда работает  if aaa.value = false then, понятно, что лучше использовать  AsBool и т.д.,но это часто неудобно.
« Изменён: 02 Февраля 2021, 22:29:30 от Simple_Scada »