Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

Simple_Scada

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

Использовать подстановки в скриптах нельзя. Принцип работы с шаблонными окнами описан по этой и этой ссылкам. Работа с шаблонами в скриптах рассмотрена по ссылке. При необходимости, Вы можете прислать на support@simple-scada.com текущую версию проекта и максимально подробно описать задачу - возможно мы сможем предложить решение.

yukiaire

Здравствуйте! У меня вопрос, почему функция GetVariableByName не работает в глобальном модуле в части initialization? При создании проекта мне нужно заполнять список однотипными переменными, у которых по сути только отличаются номера, не хочется заполнять их напрямую, а перебором по получении имени не получается.

Simple Scada

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

В секции initialization глобального модуля нельзя использовать функции поиска, т.к. на момент инициализации список, по которому осуществляется поиск, еще не сформирован. Можно перенести код из секции initialization в отдельный скрипт по событию "Запуск проекта".

ACHE

#1488
Здравствуйте. Есть возможность вычислить в скрипте, какая страница открыта на клиенте?
В проекте сделана замена штатного интерфейса кнопками и все на шаблонах. Хочется менять границу кнопки открытой подстраницы.

pan2000

#1489
   Здравствуйте.
Цитата: ACHE от 22 февраля 2024, 10:02:19Есть возможность вычислить в скрипте, какая страница открыта на клиенте?
Такая возможность есть. Парные события "Пользователь перешел на эту страницу" и "Пользователь покинул эту страницу" позволяют контролировать пару страница - клиент (у которого по определению только ОДИН пользователь).
Собственно, необходимые действия можно выполнить в этих скриптах или отложить до скрипта, который понимает клиента (работает GetClietName) или варианта с одним клиентом (тому всё равно). Отельная неприятность от анонимных (без имени) десктоп-клиентов, неразличимых по определению (хотя у каждого клиента уникальный ID).
А зачем это всё нужно?
Цитата: ACHE от 22 февраля 2024, 10:02:19В проекте сделана замена штатного интерфейса кнопками и все на шаблонах. Хочется менять границу кнопки открытой подстраницы.
При замене штатной системы навигации страниц на каждой странице присутствуют уникальные кнопки навигации, либо как набор отдельных кнопок, либо в составе шаблона. В первом случае кнопку выбранной страницы можно изменить на этапе редактирования проекта, во втором - при инициализации шаблона.
 Пример слежения за клиентами-страницами и инициализации шаблона кнопок во вложении.

   Добавлено 25.02.2024
При инициализации шаблонов можно построить массив ссылок на активную кнопку страниц, что позволит изменять отображение кнопки из скриптов. Поиском по имени/ID клиента в парах "клиент-индекс открытой страницы" определяется индекс страницы, а по нему ссылку на объект-кнопку.
Однако следует помнить, что изменения видны у всех клиентов, перешедших на эту страницу.
Наличие таблицы клиентов позволяет передавать текстовые сообщения от клиента к клиенту.
См. "Граница_кнопки_3".

Pendalf

#1490
Что-то похожее мы делали в своём проекте. Надо было подсвечивать кнопку, которая была в шапке экранной формы. Кнопка была индикатором выбранной экранной формы.
Верхняя панель представляла из себя шаблон с кнопками. Подсвечивались кнопки скриптом при инициализации. На шаблоне в одной из кнопок просто задавалось число в скрытой подсказке либо в поле Tag. Кнопки были пронумерованы в приставке к названию. При инициализации этот TAG считывался и подсвечивал соответствующую кнопку. Работает отлично. Из минусов только то, что надо пройтись по всем экранным формам, где используется этот шаблон и "ручками" вбить номер кнопки, которая должна подсвечиваться.

Других более удобных и быстрых вариантов не придумали. Встроенная навигация от Simple-SCADA не устроила принципиально.

pan2000

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

Цитата: Pendalf от 04 марта 2024, 16:58:20... Из минусов только то, что надо пройтись по всем экранным формам, где используется этот шаблон и "ручками" вбить номер кнопки, которая должна подсвечиваться.
Определить, что кнопка должна подсвечиваться, можно по совпадению владельца и страницы перехода. В шаблоне редактируются ссылки на страницы и заголовки кнопок.
  А "ленивым" можно не заморачиваться связкой кнопок и страниц, достаточно считать, что порядок расположения кнопок соответствует порядку экранных форм (страниц/подстраниц). В шаблоне редактируются только заголовки кнопок.
  Пример во вложении.

Agro_1

Добрый день! Есть переменная со шкалой 0-254 и у нее включено масштабирование в 0-100%. Частный случай - переменная может принимать значение 255.
Можно ли как-то узнать, что переменная что эта переменная вне диапазона? Шкалу не могу изменить, так как к ней многое привязано.

Simple Scada

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

Можно выполнять проверку превышения оригинального значения переменной (например, используя свойство "OriginalAsInt") над максимумом шкалы переменной и выдавать соответствующее сообщение. Пример универсального скрипта на событие "OnDataChange" объекта, с которым связана переменная:
Код: pascal
begin
  if Sender is TM_Object then   // проверяем, что Sender это объект
    with Sender as TM_Object do // приводим Sender к типу "TM_Object"
      if Variable.OriginalAsInt > Maximum then
        AddMessage(Now, mkAlarm, 'Значение переменной "' + Variable.Name +
        '" вышло за пределы диапазона допустимых значений: ' + AsStr, True, False);
end.

Agro_1


ZWolol

Задана группа сообщений "Двери скважин", ID=1
Как нажав кнопку можно проквитировать все сообщения этой группы?

Все эти сообщения привязаны к битам переменных, которые сбрасываются при квитировании сообщений.
Если я сбрасываю этот бит, то появляется дата завершения, но сообщение остается не подтвержденным.

Simple_Scada

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

ЦитироватьКак нажав кнопку можно проквитировать все сообщения этой группы?
Подтвердить сообщения определенной группы, возможности нет. Можно подтвердить либо последнее неподтвержденное сообщение (процедура "ConfirmMessage"), либо все неподтвержденные сообщения (процедура "ConfirmAllMessages").

ЦитироватьВсе эти сообщения привязаны к битам переменных, которые сбрасываются при квитировании сообщений. Если я сбрасываю этот бит, то появляется дата завершения, но сообщение остается не подтвержденным.
В группе "Неподтвержденные" отображаются все неподтвержденные сообщения проекта. Для подтверждения сообщения его необходимо квитировать через клиент, либо через скрипты, как это описано выше. Сброс бита сообщения не приведет к его квитированию.

Если требуется видеть только активные сообщения проекта, то нужно просматривать группу "Активные сообщения". При необходимости, активные сообщения можно вывести в компонент "Список сообщений" (в свойстве "Группа" указать "Активные сообщения"). При сбросе бита сообщения, оно будет удаляться из группы "Активные сообщения".

surgutking

Есть необходимость управлять цветом фигуры по изменению основной и дополнительной переменной. По основной переменной вызывается скрипт меняющий прозрачность фигуры, и это работает: 1-фигура окрашена в цвет, 0-фигура прозрачна. По дополнительной переменной предполагалось включать или отключать мигание цветом: 1-фигура мигает заданным цветом, 0-фигура не мигает. Совместно эти два события корректно не обрабатываются, при нулевом значении дополнительной переменной фигура мигает если значение основной переменной 1.

Simple Scada

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

Для работы с дополнительной переменной необходимо использовать свойство переменной VariableEx. Также, Вы можете ознакомиться с этим разделом руководства - в нем рассмотрены частые ошибки при работе со скриптами, в том числе и ошибки в скриптах по событию OnDataChangeEx.

Если таких объектов будет несколько, то писать отдельные скрипты для каждого объекта не требуется. Можно написать один универсальный скрипт и использовать его для всех объектов. Судя по описанию, Ваши переменные имеют тип данных Boolean? Для обращения к значению переменной рекомендуется использовать явное приведение значения переменной к нужному типу. Например, при сравнении с True/False нужно брать значение переменной, переведенное в тип Boolean (свойство AsBool).

Пример универсального скрипта на событие OnDataChange:
Код: pascal
begin
  if Sender is TM_Shape then     // проверяем, что Sender это фигура
     with Sender as TM_Shape do  // приводим Sender к типу "TM_Shape"
       if AsBool then            // если значение основной переменной связанной с фигурой равно True/1
         Alpha := 255            // изменить прозрачность фигуры на 255
       else                      // иначе
         Alpha := 0              // изменить прозрачность фигуры на 0
end.

Пример универсального скрипта на событие OnDataChangeEx:
Код: pascal
begin
  if Sender is TM_Shape then      // проверяем, что Sender это фигура
     with Sender as TM_Shape do   // приводим Sender к типу "TM_Shape"
       if  VariableEx.AsBool then // если значение доп.переменной связанной с фигурой равно True/1
         FlashColor := clRed      // включить мигание объекта красным цветом
       else                       // иначе
         FlashColor := clNone;    // отключить мигание объекта
end.

avtzarenko

#1499
Добрый день.
Просьба подсказать как организовать подсчет выпуска продукции в минуту.
С контролера  передаются накопительные данные 0~25000, требуется получить какое количество произведено в минуту с выводом на форму для просмотра и построения трендов.

Написал скрипт, но не понимаю, как организовать: выпуск продукции в мин= выпуск продукции текущий - выпуск продукции минуту назад (например текущий - 1200, минуту назад - 1150, т.е выпуск в минуту равен 50 шт)

Код: pascal
var
  Speedbotle_temp: integer;

begin
  if Dicount2.Value = 0 then
    Speedbotle_min.Value := 0
  else
    Speedbotle_min.Value := Dicount2.Value - Speedbotle_temp;
  Speedbotle_temp := Dicount2.Value
end.