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

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

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

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1290 : 15 Октября 2021, 14:39:46 »
Снова добрый день. Опять за помощью. :'(

1.  Имеется необходимость управлять оборудованием с помощью импульсов.
Сперва сделал все с помощью секундных таймеров. Все работало. Решил оптимизировать и упростить вариант исполнения.
Для этого написал два скрипта:
один на кнопку, который при нажатии изменяет внешнюю переменную в 1, и ставит флаг в 1, указывая на то, что переменная меняется именно со Scadы.
второй на скрытое поле, который по изменению внешней переменной в 1 (при условии, что флаг 1) изменяет ее в 0.
Все работает.
Но есть нюанс. Если после первого нажатия на кнопку, нажать в короткий промежуток времени кнопку второй раз, второй скрипт (который как раз таки запускается по изменению внешней переменной) не выполняется второй раз и внешняя переменная остается в 1.

Я подразумеваю, что внешняя переменная просто не успевает принять нулевое значение на момент нажатия кнопки второй раз.
Как от этого избавиться? или есть другой вариант управления фронтами?

2. Есть два события. Одинарное и двойное нажатие на кнопку мыши.
Допустим мне нужно, чтобы на одну кнопку были два этих события. Один раз нажал - отрылось одно окно, два раза - другое.
Но если я назначаю эти два события на кнопку, то у меня не получается запустить только "двойное нажатие", одновременно запускается
и первое. Т.е. нет паузы после первого нажатия, событие выполняется сразу. Я все правильно понимаю?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1291 : 15 Октября 2021, 17:20:56 »
Здравствуйте.

1. Подобные схемы для управления рекомендуем не использовать, т.к. они потенциально небезопасны. Например, если в Вашей схеме в переменную запишется 1 и в это время оборвется связь с ПЛК, зависнет/выключится ПК, то в ней так и останется 1 и значение не сбросится на 0, что может привести к каким-либо негативным последствиям. Если Вы хотите применять подобную схему, то сброс значения на 0 лучше производить в ПЛК. Т.е. в скаде использовать кнопку "с фиксацией" с одним состоянием, которая записывает фиксированное значение 1, а сброс на 0 производить в ПЛК. Либо можно использовать кнопку "без фиксации", тогда при нажатии в переменную кнопки будет записываться 1, а при отпускании 0(при необходимости, можно задать другие значения). А самый лучший вариант - это использовать для управления кнопку "с фиксацией".

2. Так сделать не получится, событие двойного клика всегда начинается с одиночного клика. Одновременно на одном объекте использовать оба этих события не получится.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1292 : 18 Октября 2021, 14:25:58 »
Спасибо за ответ.
1. Метод управления зашит в PLC, без возможности, что-либо поменять там.
Поэкспериментировал с кнопкой без фиксации. Все работает. Но есть нюанс ((:
Импульсы мне надо подавать одной кнопкой на разные переменные в зависимости от состояний флагов в PLC.
В следствии чего вместо кнопки я попытался использовать Tm_image
(при нажатии: записываю 1 в соответствующую переменную, при отпускании: записываю 0 в соответствующую переменную).
Не работает. Почему-то скрипт "onClick" выполняется только после того как я отпустил кнопку мыши, что собственно говоря аналогично методу: "OnMouseUp".
Поправьте меня, если ошибаюсь.
2. Понял.

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 153
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1293 : 18 Октября 2021, 14:55:16 »
Почему-то скрипт "onClick" выполняется только после того как я отпустил кнопку мыши, что собственно говоря аналогично методу: "OnMouseUp".
OnClick вызывается если пользователь нажал и отпустил ЛКМ. OnMouseUp вызывается при отпускании ЛКМ. Поэтому, эти два события будут срабатывать одновременно.
OnClick - вызывается при нажатии, а затем отпускании над одним и тем же элементом (после нажатия, можно убрать указатель с элемента, отпустить кнопку и скрипт не сработает). OnMouseUp - вызывается при нажатии над элементом и отпускании в любом месте (не обязательно над элементом). Это единственная разница между ними. Т.е. OnMouseUp на практике можно использовать только если требуется по нажатию на элемент 100% выполнить скрипт.
« Изменён: 18 Октября 2021, 15:02:08 от Senpai »

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1294 : 18 Октября 2021, 15:14:16 »
Понял, спасибо. Буду экспериментировать дальше.

pan2000

  • Постоялец
  • ***
  • Сообщений: 170
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1295 : 20 Октября 2021, 06:49:33 »

       Здравствуйте.

1. ... нажать в короткий промежуток времени кнопку второй раз ...
Блокировка повторного нажатия в течение некоторого временного интервала.
Цитировать
2. ... Допустим мне нужно, чтобы на одну кнопку были два этих события...
Событие по одиночному нажатию выполнится через некоторый временной интервал, при условии что в этом интервале не выполнялось событие по двойному нажатию. Действия по одиночному событию начинаются с некоторой задержкой относительно одиночного нажатия.
Алгоритм несколько проблемный из-за использования временного интервала между двумя асинхронными событиями и применим только в случае отсутствия фатальных последствий при ошибке определения кратности нажатия.  Т.е. так можно: "Одиночное нажатие - окно просмотра состояния объекта, двойное - окно изменения параметров", а так нельзя - "Одиночное нажатие - включить двигатель, двойное - выключить".

...OnClick - вызывается при нажатии, а затем отпускании над одним и тем же элементом (после нажатия, можно убрать указатель с элемента, отпустить кнопку и скрипт не сработает)...
И это можно использовать для выбора варианта действия по схеме: "пользователь нажал/дважды_нажал" - "пользователь "сдвинул" объект".

Примеры во вложении (необходимо пересохранить проект).

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1296 : 20 Октября 2021, 12:05:35 »
Ого. Спасибо за помощь.

1. Разобрался.
2. Глянув решение в присланном проекте, разобрался, но слегка заплутал (: и не совсем понял ваш комментарий:
Цитировать
между двумя асинхронными событиями и применим только в случае отсутствия фатальных последствий при ошибке определения кратности нажатия.  Т.е. так можно: "Одиночное нажатие - окно просмотра состояния объекта, двойное - окно изменения параметров", а так нельзя - "Одиночное нажатие - включить двигатель, двойное - выключить".

Это конечно выходит за рамки понятия "Simple" Scada (; , и я вряд ли буду использовать этот метод в проекте.
При сопровождении проекта, следующий человек будет крыть меня благим матом (((;
Со стороны обывателя, данный способ не вызывает трудностей:
нажал кнопку, ждем второго нажатия, если нажатия не произошло => 1 событие, если произошло второе нажатие => 2 событие. сбрасываем таймер.
« Изменён: 20 Октября 2021, 12:09:15 от Botsmall »

pan2000

  • Постоялец
  • ***
  • Сообщений: 170
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1297 : 20 Октября 2021, 19:47:05 »
... разобрался, но слегка заплутал (: и не совсем понял ваш комментарий:
Два асинхронных события - имеется ввиду, что временной интервал между ними имеет некоторое распределение и его среднее значение зависит от используемого ПК, что и создает проблему с величиной интервала контроля. Причем среднее очень мало зависит от загруженности сервера, в частности от количества обрабатываемых событий, объема вычислений, графики и объема архивируемых данных. А вот задержка от физического нажатия клавиши мыши до вызова скрипта по однократному нажатию, на "загнанном" сервере, может визуально составлять несколько секунд.
Событие для контроля интервала - "Прошла секунда", в свою очередь асинхронное по отношению к событию нажатия, и очень бы не хотелось тратить лишнюю секунду для гарантированного превышения интервала контроля. В алгоритме при первом, после нажатия клавиши, событии "Прошла секунда" контролируется задержка между ними, и при её достаточной величине считается, что это одиночное нажатие, в противном случае решение откладывается до следующего события "Прошла секунда".

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1298 : 25 Октября 2021, 11:26:47 »
А можете теперь все то-же расписать, но с условием, что ExtVar может измениться "с той стороны"? Например есть еще один сервер работающий с тем-же регистром и нам надо переключить кнопки в актуальное положение? При том что щелкать по ним могут фактически одновременно. :-\
Для этого достаточно написать обратный универсальный скрипт на событие OnDataChangeEx для кнопок:

Код
begin
  if not (Sender is TM_Object) then Exit;

  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      Value := VariableEx.Value;
end.
Тогда виртуальная переменная будет всегда иметь актуальное значение и работа будет корректной.

Я так понимаю, в данной структуре уже нет необходимости после обновления, можно не использовать внутреннюю переменную?:
"улучшенная работа с внешними переменными (значение на присвоение временно хранится в оперативной памяти);"

Еще момент (;
Имеется переменная int32, биты которой управляют разными функциями. Так же биты этой переменной могут меняться из вне.
Все замечательно, все работает.
Но если методично последовательно включать/выключать эти биты, возникает ситуация:
после отправки в OPC сервер значения, PLC не мгновенно это дело обрабатывает и с неким запаздыванием возвращает ответ.
и этот ответ уже не коррелирует со значением вводимым со Scada=> вновь нажатые кнопки сбрасываются...
Как лучше решить эту проблему?


P.S. Ситуация более менее стабилизировалась при изменении опроса переменной обратной связи в 20 мс (Цикл в PLC 200мс).
до:
https://drive.google.com/file/d/1zy6FY_BrciNz-h9qFaCBbibRUd1nS8Zb/view?usp=sharing
после:
https://drive.google.com/file/d/1ciD5fKBIhy9thffB2z9OLWi0Av1OhEU2/view?usp=sharing


« Изменён: 25 Октября 2021, 12:28:42 от Botsmall »

msigx680

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Вопросы по скриптам в Simple-Scada 2
« Ответ #1299 : 26 Октября 2021, 21:30:12 »
Здравствуйте! Помогите пожалуйста со скриптом уровня (есть переменная уровень (шкала), задача менять цвет от значения в одном скрипте):
Код
{ условия для уровня }
  begin
  if Sender is TM_Level then          // проверяем, что Sender это уровень
     with Sender as TM_Level do        // приводим Sender к типу "TM_Level"
        if AsInt < 70 then             // если перем. меньше 70, то
          BackgroundColor := clRed    // изменить цвет фона уровня на красный
             else                          // иначе
               BackgroundColor := clBlue; // изменить цвет фона уровня на синий
                end begin

                if AsInt > 98 then             // если перем. ,больше 98, то
                   BackgroundColor := clRed    // изменить цвет фона уровня на красный
                   else                          // иначе
               BackgroundColor := clBlue; // изменить цвет фона уровня на синий
end.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1300 : 26 Октября 2021, 22:57:41 »
Здравствуйте.

Цитировать
Я так понимаю, в данной структуре уже нет необходимости после обновления, можно не использовать внутреннюю переменную?
Вы процитировали очень старое сообщение 2017г. Сейчас не требуется создавать подобные скрипты при работе с битами.

Цитировать
Имеется переменная int32, биты которой управляют разными функциями. Так же биты этой переменной могут меняться из вне.
Если переменная используется для управления битами в скаде и при этом может изменяться с ПЛК, то при таком подходе в любом случае будут проблемы. В моменты, когда изменение переменной из скады и из ПЛК будет происходить близко по времени, будет создаваться впечатление, что "вновь нажатые кнопки сбрасываются". Такая же ситуация будет если к этому добавляются задержки в работе ПЛК или OPC-сервера. Немного сгладить это можно уменьшив частоту опроса переменной, но это не решит проблему полностью. Если цикл в PLC 200мс., то нет смысла задавать частоту ниже 100мс., а лучше всегда задавать максимально большую частоту опроса, которая подходит под требования проекта - это позволит снизить нагрузку на ПЛК и OPC-сервер.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1301 : 26 Октября 2021, 23:07:47 »
Цитировать
Помогите пожалуйста со скриптом уровня (есть переменная уровень (шкала), задача менять цвет от значения в одном скрипте):
Для подобной задачи не требуется использовать скрипты. Задайте у переменной необходимые границы, например верхнюю аварийную 98, нижнюю аварийную 70. Затем выделите Уровень и активируйте у него свойство "Границы". После этого, уровень будет изменять цвет на красный если значение будет выше 98 или ниже 70. При необходимости можно управлять границами переменных из клиента, а также включить автогенерируемые сообщения при нарушении границ.

teplocom

  • Новичок
  • *
  • Сообщений: 40
  • с чувством уверенности в завтрашнем дне
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1302 : 29 Октября 2021, 12:47:56 »
Приветствую всех.
Задача в скриптах преобразовать Word в SmallInteger
Чтобы число от 0 to 65535 стало -32768 to 32767?

Нашел такой способ решения, или есть проще?
Код: (delphi)
begin
  // перевести значение переменной из шкалы "0 - 65535" в шкалу "-32768 - 32767" и вывести результат в Variable1
  if  Variable1.Value > 32767 then
    Variable1.Value := Scaling(32768,65535,-32768,-1, Variable1.Value);
end.
« Изменён: 29 Октября 2021, 20:59:49 от Simple-Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 153
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1303 : 29 Октября 2021, 20:51:39 »
Здравствуйте.
В скаде это можно сделать без использования скриптов (если реальная шкала переменной 0..65535), используя режим масштабирования - см. описание опции "Сдвиг запятой" в руководстве. В Вашем случае, необходимо у переменной задать шкалу min= 0, max= 65535, перейти на вкладку "Дополнительные", включить режим масштабирования(кнопка напротив опции "Сдвиг запятой") и задать "Виз. минимум" = -32768, "Виз. максимум" = 32767.
« Изменён: 29 Октября 2021, 20:59:08 от Simple-Scada »

teplocom

  • Новичок
  • *
  • Сообщений: 40
  • с чувством уверенности в завтрашнем дне
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1304 : 31 Октября 2021, 04:41:18 »
Спасибо за ответ. Знаю про эту опцию и сразу ей и пытался пользоваться, но в моем случае она "не работает". Дело в том что текущее значение внутренней переменной (которая SmallInteger) присваивается в скриптах, а масштабирование видимо работает только для внешних переменных при передаче/преобразовании от OPC в SCADA.
У меня же: -есть внешняя переменная DWORD. Потом эта переменная становится двумя внутренними WORD через HiWord и LoWord. А дальше нужно из них сделать вместо WORD два SmallInteger.
Наверное, более элегантно мою задачу не решить  ???
« Изменён: 01 Ноября 2021, 13:24:54 от Simple_Scada »