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

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

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

Сергей-К

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1470 : 16 Ноября 2023, 18:00:17 »
Добрый день!
В БД есть таблица, в которую через определённый промежуток времени поступают данные о кол-ве всего собранных коробок с контроллера. Подскажите, можно ли в объекте «Таблица» заполнять только первые две колонки по запросу из БД а в третьей колонке вычислять сколько коробок собрано за промежуток времени (т.е нужно от кол-ва во второй строке отнять кол-во в первой строке, от кол-ва в третьей строке отнять кол-во во второй строке и т.д.)?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3146
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1471 : 16 Ноября 2023, 18:34:48 »
Здравствуйте.

Хотелось бы сделать при выборе любой другой емкости, чтобы сбрасывался выбор предыдущей емкости. Ибо сейчас их можно все разом выбрать. Как это реализовать скриптом пока не понимаю.
Сбрасывать значение переменных других емкостей и включать выбранную.

для каждого маршрута отдельно нарисовать трубу? И как решить вопрос с выходом нужного слоя поверх остальных?
Конечно, делать участки трубопровода (которые нужно окрасить) отдельным объектом и менять цвет конкретного объекта в зависимости от переменной. Слой можно менять через свойство "Слой".

Подскажите, можно ли в объекте «Таблица» заполнять только первые две колонки по запросу из БД а в третьей колонке вычислять сколько коробок собрано за промежуток времени (т.е нужно от кол-ва во второй строке отнять кол-во в первой строке, от кол-ва в третьей строке отнять кол-во во второй строке и т.д.)?
Не нужно переносить функции СУБД на скаду, тогда теряется сам смысл СУБД. Сделайте запрос который сразу сформирует готовый результат, чтобы дополнительно ничего не высчитывать в скаде, например:
Код: (sql)
SELECT 
  my_table.id,
  my_table.value,
  LEAD(my_table.value, 1) OVER win - my_table.value AS "Разница"
FROM my_table
WINDOW win AS (ORDER BY my_table.id)
Другие примеры можно найти в интернете.

Сергей-К

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1472 : 17 Ноября 2023, 04:28:01 »
Большое спасибо за ответ

TamaTama

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1473 : 17 Ноября 2023, 11:23:02 »
Сбрасывать значение переменных других емкостей и включать выбранную.
Слой можно менять через свойство "Слой".
А можно пример как по кнопке с фиксацией button1 сбросить button2 и button3? Универсальным скриптом тут не получится как я понимаю.

Слой то понятно можно менять, а как из пирога в 6 слоев сделать так, чтобы именно определенный слой вышел поверх остальных? Или сделать статичный общий вид и вызывать через visible нужный маршрут нужным цветом?

« Изменён: 17 Ноября 2023, 11:33:04 от Simple-Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 196
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1474 : 18 Ноября 2023, 00:53:29 »
   Здравствуйте.
Всем здравия, я с очередной порцией вопросов...
1. Для выбора только одной или не более чем одной емкости можно использовать так называемую "радиокнопку" - зависимый набор с одной или не более чем одной нажатой кнопкой.
  Кнопки объединены одной переменной в регистр кнопок, каждой кнопке соответствует один бит. Окрашивание цветом емкости с сопутствующими объектами осуществляется скриптом по изменению регистра кнопок для соответствующего бита.
  Почти подходящим для реализации радиокнопки является объект "Кнопка", за исключение того, что новые значения = 0 и 1, в отличии от прочих, работают только с битом (в примере достаточно записать в регистр кнопок число, отличное от степеней 2 и посмотреть на смену емкостей). Обходимо (см. пример), но в рабочем проекте можно применять только после консультации с разработчиками Simple-Scada.
  Второй вариант - шаблон (или россыпью) из двух объектов "Текст" и двух универсальных скриптов.
2. Вытащить "наверх" объект можно присвоив слою заведомо большОе значение. Номера слоев переупорядочиваются,  а номер слоя объекта станет наибольшим среди номеров слоев. Группа объектов упорядочивается по принципу "последний сверху". На странице 2 пример управления слоями. Изменения номеров всех слоёв для 5-ти обэектов можно посмотреть на странице 3.

  Для реального проекта необходимо четко представлять всю схему изменения цветов и слоёв. Например, выбор емкости вытаскивает наверх все объекты, связанные с этой емкостью, а цвет меняется в зависимости от состояния сопутствующих объектов (выходные участки трубопроводов клапанов и насосов - в примере левая ёмкость).


                           Добавлено 20.11.2023.
"Вторая фигура марлезонского балету" - случай большого количества кнопок или добавление к существующему проекту, в котором нет возможности использовать предыдущие варианты радиокнопки.
1 вариант: используется контроль за изменением состояния "кнопочных" переменных, к проекту добавляется один скрипт.
2 вариант: нажатие на кнопку записывает имя её переменной в общую для всех кнопок переменную, по изменению которой происходит сброс всех кнопок, кроме нажатой.
« Изменён: 20 Ноября 2023, 04:14:49 от pan2000 »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1278
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1475 : 20 Ноября 2023, 10:48:11 »
Здравствуйте.

Цитировать
А можно пример как по кнопке с фиксацией button1 сбросить button2 и button3? Универсальным скриптом тут не получится как я понимаю.
Можно использовать универсальный скрипт для группы кнопок. Например, кнопка Button1 связана с переменной vrA1, Button2 – с vrA2 и Button3 – с vrA3. Переменные имеют тип "Boolean". Тогда можно создать новый скрипт с типом "Универсальный скрипт" и назначить его на событие OnClick требуемых кнопок:
Код: (delphi)
 begin
  if Sender is TM_Object then   // проверяем, что Sender это объект
    with Sender as TM_Object do // приводим Sender к типу "TM_Object"
    begin
      if Variable = vrA1 then   // если переменная связанная с кнопкой это vrA1, то ..
      begin
        vrA2.Value := 0;        // сбрасываем другие кнопки
        vrA3.Value := 0;
      end else
      if Variable = vrA2 then
      begin
        vrA1.Value := 0;
        vrA3.Value := 0;
      end else
      if Variable = vrA3 then
      begin
        vrA1.Value := 0;
        vrA2.Value := 0;
      end;
    end;
end.
Теперь при нажатии кнопки, в переменную связанную с кнопкой запишется значение 1, а в остальные переменные кнопок запишется значение 0.


Цитировать
Слой то понятно можно менять, а как из пирога в 6 слоев сделать так, чтобы именно определенный слой вышел поверх остальных? Или сделать статичный общий вид и вызывать через visible нужный маршрут нужным цветом?
Самым простым способом будет отдельными объектами "Трубопровод" отрисовать маршруты и менять их цвет в зависимости от значения связанной с ними переменой. Если пересечение участков маршрута достаточно сложное и обычным изменением цвета не обойтись, то можно отрисовать несколько маршрутов и менять их видимость с помощью свойства "Visible".
« Изменён: 20 Ноября 2023, 11:22:50 от Simple-Scada »

TamaTama

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1476 : 20 Ноября 2023, 13:16:49 »
Спасибо, завтра попробую. Вариант с видимостью я наверно и буду реализовывать. А сброс скриптик исправлю свой, я не так построил.
И большое спасибо товарищу  pan2000, его примеры разберу для обучения.
« Изменён: 20 Ноября 2023, 13:42:35 от TamaTama »

yukiaire

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1477 : 29 Ноября 2023, 16:37:01 »
Здравствуйте! Я хочу заполнять таблицу подменными переменными, как в примере вашего руководства, но таблица открывается в шаблонном окне. Надо, чтобы при открытии окна выполнялся скрипт и таблица заполнялась архивными данными. Хотела написать подстановку имен переменных путем указания шаблонного номера в теге таблицы, но скрипт упорно отказывается компилироваться пока таблица расположена в шаблонном окне.
Код: (delphi)
var
g : Integer;
t_var : TM_Variable;
begin
  g := Table1.Tag;
  t_var.Value := GetVariableByName('rate_hour' + IntToStr(g));
  ArchiveValueByTime(t_var, t_rate1, Now - 60);
  ArchiveValueByTime(t_var, t_rate2, Now - 120);
end.

Upd я так понимаю, что данная проблема возникает потому что фактически до запуска проекта объектов в шаблонном окне не существует, то есть необходимо в скрипте сначала проверять таблицу на существование. Подскажите, каким образом это сделать? Есть примеры с проверкой существования переменной, в данном случае необходимо проверять объект

Все получилось, использовала функцию GetTemplateObject
Код: (delphi)
var
  g : Integer;
  t_var : TM_Variable;
  aTable : TM_Table;
begin
  aTable := GetTemplateObject('Table1') as TM_Table;
  g := aTable.Tag;
  t_var := GetVariableByName('rate_hour' + IntToStr(g));
  ArchiveValueByTime(t_var, t_rate1, Now - 60);
  ArchiveValueByTime(t_var, t_rate2, Now - 120);
end.
« Изменён: 30 Ноября 2023, 17:21:46 от Simple-Scada »

ZWolol

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1478 : 21 Декабря 2023, 11:40:37 »
Если я правильно понял, то Value у Объекта это значение Основной переменной, с которой связан объект ?

И, если это переменная OPC, то её качество можно проверить по Variable.IsGoodQuality ?
« Изменён: 21 Декабря 2023, 12:13:27 от ZWolol »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1278
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1479 : 21 Декабря 2023, 12:10:31 »
Здравствуйте.

Value может быть значением любой переменной(внутренней, внешней, основной, дополнительной), в зависимости от того, как данное свойство используется в скрипте. Например:
Код: (delphi)
Field1.Value := 10;            // записать значение в основную переменную связанную с объектом
Field1.VariableEx.Value := 10; // записать значение в доп. переменную связанную с объектом
MyVar.Value := 10;             // записать значение в переменную MyVar

ZWolol

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1480 : 22 Декабря 2023, 04:46:44 »
Спасибо, понял что для Объекта Value := 10; и Variable.Value := 10; одинаковы.
А если Объекту не назначена основная переменная, то можно ли присваивать Value значение?

Если локальной переменной присвоить значение OPC переменной:
aVariable := vrOPCVariable;
if aVariable.IsGoodQuality then ... - Эта проверка сработает?

И сохранится ли признак качества при присвоении этой переменной значения:
aVariable.Value := SetBit(aVariable.Value,0,True);

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1278
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1481 : 22 Декабря 2023, 11:33:35 »
Здравствуйте.

Цитировать
А если Объекту не назначена основная переменная, то можно ли присваивать Value значение?
Если объект не будет связан с переменной, то записывать значение будет некуда и при попытке записи возникнет ошибка "Обращение к несуществующему объекту".

Цитировать
Если локальной переменной присвоить значение OPC переменной:
aVariable := vrOPCVariable;
if aVariable.IsGoodQuality then ...
Эта проверка сработает?
Да, сработает. В данном случае локальная переменная aVariable будет хранить ссылку на переменную vrOPCVariable, поэтому работа с aVariable будет аналогична работе с переменной vrOPCVariable.


Цитировать
И сохранится ли признак качества при присвоении этой переменной значения:
aVariable.Value := SetBit(aVariable.Value,0,True);
Как мы указали выше, в переменной aVariable будет храниться ссылка на внешнюю переменную vrOPCVariable, поэтому у переменной aVariable будет то качество, которое имеет переменная vrOPCVariable на момент выполнения скрипта.

ZWolol

  • Новичок
  • *
  • Сообщений: 28
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1482 : 26 Декабря 2023, 07:14:52 »
Мы работаем с самопальным DA OPCServer (2008г), который берет данные из базы MS SQL.
Ни каких проблем с MasterScada не было на Win7.
Сейчас установили его на Win10 и с MS3.12 проблем нет, а вот у SimpleScada нет данных.
Причем нет данных и у других клиентов OPC (подключаются, но значения 0 bad).
Исходников OPCServer нет, писать новый - нет удовольствия.
Как определить в чем проблема?

P.S.
Похоже в нем защита (работа только с MS), другого объяснения я не вижу...
« Изменён: 26 Декабря 2023, 12:55:58 от ZWolol »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1278
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1483 : 26 Декабря 2023, 13:56:26 »
Здравствуйте.

Цитировать
Мы работаем с самопальным DA OPCServer (2008г), который берет данные из базы MS SQL. Ни каких проблем с MasterScada не было на Win7. Сейчас установили его на Win10 и с MS3.12 проблем нет, а вот у SimpleScada нет данных.
Simple-Scada представляет собой OPC-клиент и работает в соответствии со спецификациями OPC-DA/ OPC-UA. В этих спецификациях описаны правила обмена сообщениями с OPC-серверами, размер сообщений в байтах, ограничения и т.д., независимо от OPC-сервера. Т.е., для работы с любыми OPC-серверами и контроллерами в Simple-Scada используется один и тот же код. Поэтому, со всеми OPC-серверами и контроллерами Simple-Scada работает совершенно одинаково, передает те же самые запросы, в соответствии со стандартами OPC. Если OPC-сервер соответствует спецификации OPC, то проблем в работе с ним не будет.

Цитировать
Причем нет данных и у других клиентов OPC (подключаются, но значения 0 bad).
Это говорит о том, что в работе данного OPC-сервера явно имеются проблемы. Возможно он работает корректно только при подключении с одного OPC-клиента (можно это протестировать), либо имеются какие-то другие ограничения и проблемы. Точную причину может определить только разработчик данного OPC-сервера.

AndreyA

  • Новичок
  • *
  • Сообщений: 35
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1484 : 07 Января 2024, 12:14:47 »
Здравствуйте!
Каким образом в скрипте можно обратиться к параметру "Подстановка" в объекте TM_Template_Window?
Необходимо считывать "имя подстановки"  и при совпадении открывать необходимое окно.
Спасибо!
« Изменён: 07 Января 2024, 18:23:39 от AndreyA »