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

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

Автор Тема: Вопрос об универсальности скриптов  (Прочитано 2896 раз)

GridLink

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Всем привет. Столкнулся с проблемой работы универсального скрипта. Имеются 8 кнопок с фиксацией в SCADA, у всех кнопок одна и та же заданная переменная, каждая кнопка управляет своим битом в этой перемененной. Написал скрипт, который по нажатии кнопки, выдает одно из двух сообщений, в зависимости от того, в каком из состояний находится данная кнопка :
Код: (delphi)
begin
    if Sender is TM_Button then
      with Sender as TM_Button do
     case ActiveState of
      0: AddMessage(Now, mkMessage, Hint + ' отключено', TRUE, FALSE);
      1: AddMessage(Now, mkMessage, Hint + ' включено', TRUE, FALSE);
      end;
end.

У каждой кнопки в событии OnClick указал данный скрипт. В итоге данный скрипт нормально срабатывает по событию только у кнопки которая отвечает за 0-ой бит заданной переменной, у остальных 7-ми кнопок, нажимай не нажимай выходит только одно сообщение - "отключено". Возможно ли, что если кнопки которые управляют битами, применение универсальных скриптов ставиться под вопрос?. Возможно проблема в самом скрипте!?. Поправьте, если я не прав. Спасибо.
« Изменён: 09 Января 2020, 19:12:53 от GridLink »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос об универсальности скриптов
« Ответ #1 : 07 Января 2020, 16:49:38 »
Здравствуйте.

Проверка ActiveState для проверки срабатывания кнопки - плохой вариант, т.к. событие клика по кнопке выполняется моментально, но присвоение значения выполняется асинхронно и может потребовать времени. И только после выполнения присвоения будет изменено активное состояние кнопки.
Выявить изменение бита переменной со 100% гарантией можно через событие OnDataChange кнопки с таким кодом:
Код: (delphi)
  if Sender is TM_Button then
    with Sender as TM_Button do
      if GetBit(AsInt, BitNumber) then
        AddMessage(Now, mkMessage, Hint + ' включено', TRUE, FALSE)
      else
        AddMessage(Now, mkMessage, Hint + ' отключено', TRUE, FALSE);
end.
, но проблема в том, что событие OnDataChange будет выполняться при каждом изменении переменной для всех кнопок сразу (ведь все эти кнопки связаны с одной переменной) и будет выдано сразу множество сообщений.
Насколько мы понимаем, описанный Вами скрипт нужен чтобы контролировать действия оператора. Но ведь можно использовать стандартный список действий оператора в меню сообщений. В этом списке выводится полная информация обо всех действиях оператора, включая нажатия на кнопки.

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос об универсальности скриптов
« Ответ #2 : 07 Января 2020, 18:59:14 »
Цитировать
В этом списке выводится полная информация обо всех действиях оператора, включая нажатия на кнопки.
У меня почему то не записывается сообщения о том, что пользователь нажал на кнопку. Как это реализовать ?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос об универсальности скриптов
« Ответ #3 : 08 Января 2020, 11:41:54 »
Сообщения о действиях автоматически записываются в отдельный список "Действия оператора", нужно подключиться к серверу с клиента, перейти в список сообщений и выбрать группу "Действия оператора", пример на скрине во вложении.
У Вас этот список пустой? Или в нём есть какие-то сообщения о действиях пользователя, помимо нажатия на кнопки?
Если список пустой, то убедитесь что в проекте корректно настроено подключение к БД. Обратите внимание, что список действий оператора доступен только в версиях Demo-Time, Standard и Professional.
Также учитывайте, что если кнопка не связана с какой-либо переменной, то нажатия на кнопку не попадут в журнал действий. Чтобы действия записывались кнопка должна быть связана с переменной.
Если все вышеописанные шаги выполнены, но сообщения о действиях все равно не выдаются, то отправьте нам папку с проектом на support@simple-scada.com для проверки.
« Изменён: 08 Января 2020, 11:43:46 от Simple-Scada »

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос об универсальности скриптов
« Ответ #4 : 08 Января 2020, 14:53:44 »
Спасибо, за подробный ответ. Список не пустой, другие действия оператора отображаются.
Цитировать
Чтобы действия записывались кнопка должна быть связана с переменной.
Не знал об этом, поэтому нажатие на кнопку не отображалась.

GridLink

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопрос об универсальности скриптов
« Ответ #5 : 09 Января 2020, 16:46:48 »
Здравствуйте.

Проверка ActiveState для проверки срабатывания кнопки - плохой вариант, т.к. событие клика по кнопке выполняется моментально, но присвоение значения выполняется асинхронно и может потребовать времени. И только после выполнения присвоения будет изменено активное состояние кнопки.
Выявить изменение бита переменной со 100% гарантией можно через событие OnDataChange кнопки с таким кодом:
, но проблема в том, что событие OnDataChange будет выполняться при каждом изменении переменной для всех кнопок сразу (ведь все эти кнопки связаны с одной переменной) и будет выдано сразу множество сообщений.
Насколько мы понимаем, описанный Вами скрипт нужен чтобы контролировать действия оператора. Но ведь можно использовать стандартный список действий оператора в меню сообщений. В этом списке выводится полная информация обо всех действиях оператора, включая нажатия на кнопки.

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

Спасибо за ответ. Да Вы правильно поняли, мне нужен был этот скрипт для контроля действий операторов, из-за того, что стандартный список действий оператора не совсем удобочитаемый и выдает на мой взгляд лишнюю информацию. Поясню. - Там указывается название переменной, которая была 0, а стало 1 и т.д., а так же название кнопки из свойства кнопки - name.

Зачем руководству, если они потребуют отчет действий операторов к примеру, знать, что какая-то переменная была 0, а потом стала 1. :)
Возможно это где-то настраиваться, я не нашел по крайне мере ни в руководстве ни на форуме.

Я подумал, логичнее по нажатию кнопки запросить в скрипте в каком состоянии сейчас находится данная кнопка, и выводить ту информацию которая будет информативней и нужна, но оказывается не учел асинхронного присвоение значения состояний кнопок. По этому данный скрипт работает не совсем корректно. Далее пока ждал решения на форуме, я реализовал скрипт по событию OnDataChange, с запросом GetBit..., как Вы и предложили. Данный скрипт был мной забракован, ввиду множество сообщений, из-за изменения переменной. Пока в данном вопросе я не продвинулся. Есть идея написать глобальный скрипт который будет опрашивать в цикле состояния кнопок и присваивать их локальным переменным и уже с этих переменных писать универсальный скрипт, по событию OnClick. Пока что не садился за реализацию.
« Изменён: 09 Января 2020, 17:16:29 от GridLink »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос об универсальности скриптов
« Ответ #6 : 10 Января 2020, 12:30:58 »
Здравствуйте.

В данный момент нельзя изменить формат сообщений о действиях оператора. Сейчас скада выводит в такие сообщения максимально полную информацию (чтобы в случае возникновения проблем можно было точно понять какие действия выполнил каждый оператор), которая содержит: время выполнения действия, имя оператора который выполнил действие, имя объекта с которым взаимодействовал пользователь, номер изменённого бита (если используется работа с битами), значение до вмешательства пользователя, и значение которое было задано пользователем.
Если данный формат не подходит, то остаётся только реализовывать отдельную систему архивации действий оператора на скриптах, но реализация скорее всего будет сложной и затратной по производительности. Если сделать отдельную таблицу в БД для действий оператора, то придётся работать со всеми сообщениями о действиях через SQL-запросы, без возможности вывода таких сообщений в стандартное меню "Сообщения". Такой список действий можно будет отобразить только в компоненте "Таблица" на мнемосхеме при помощи SQL-запросов к БД, что плохо. Второй вариант: добавлять сообщения о действиях через AddMessage в стандартные списки сообщений, но тогда они будут смешиваться с обычными другими сообщениями. Также оба варианта не исключают проблем описанных в предыдущих сообщениях этой темы.
« Изменён: 10 Января 2020, 12:32:31 от Simple-Scada »