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

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

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

avtzarenko

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1545 : 02 Сентября 2024, 13:07:01 »
Всем спасибо огромное!

ARV

  • Постоялец
  • ***
  • Сообщений: 117
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1546 : 03 Сентября 2024, 11:25:18 »
Приветствую знатоков!
Вопрос1:
Задача: по нажатию кнопки перебрать все созданные по шаблону объекты и поменять в них определенные свойства. Как решить?
Если кликнкуть ПКМ на объекте (из шаблона), можно увидеть его имя, но функция GetObjectByName по этому имени объект не находит. Неужели создаваемые по шаблонам объекты не глобальные?!

Вопрос2:
В событии инициализации шаблонного окна что за объект содержится в Sender? Думал, это экземпляр созданного окна, но это не так. Что же там?

Вопрос3:
Почему кнопка без привязки переменной не реализует базовый функционал, т.е. не фиксируется, если с фиксацией и т.п.? Кнопка ведь может быть нужна не только для управления через переменную, но и сама по себе... Как принудительно изменить состояние кнопки, ActiveState только для чтения...

Многолетняя практика работы с объектами интерфейса оказывается бессильна перед поведением элементов в Simple-Scada...
« Изменён: 03 Сентября 2024, 11:41:45 от ARV »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3146
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1547 : 03 Сентября 2024, 13:35:39 »
Цитировать
Если кликнкуть ПКМ на объекте (из шаблона), можно увидеть его имя, но функция GetObjectByName по этому имени объект не находит. Неужели создаваемые по шаблонам объекты не глобальные?!
У экземпляров шаблонов и шаблонных окон нет уникальных имён. Те имена которые Вы видите на клиенте, генерируются автоматически, на основе количества экземпляров шаблона. Поэтому нет смысла в обращении к ним по имени. Если было три экземпляра tmp1, tmp2, tmp3 и в редакторе был удалён экземпляр tmp2, то после очередного запуска проекта tmp1 останется, а tmp3 станет называться tmp2. Кроме того, к ним в любом случае нельзя обратиться из скрипта, т.к. сами экземпляры шаблонов не регистрируются в скриптах (под них не выделяется никакая память в компилируемой программе).

Цитировать
Задача: по нажатию кнопки перебрать все созданные по шаблону объекты и поменять в них определенные свойства. Как решить?
Зачем именно нужно проходить по экземплярам шаблона?
Если нужно, чтобы объекты в шаблоне перешли в "рабочее состояние" (изменили цвета на соответствующие и т.п.), то для этого достаточно привязать к ним переменную и назначить на событие OnDataChange смену нужных свойств в зависимости от значения переменной. Пример есть в демо-проекте (страница "Шаблоны").
Также, в скриптах объектов, которые находятся в шаблоне/шаблонном окне (и в скриптах на события OnShow / OnClose / OnInit шаблонного окна) можно обращаться к другим объектам того же шаблона, используя функцию GetTemplateObject.

Цитировать
В событии инициализации шаблонного окна что за объект содержится в Sender? Думал, это экземпляр созданного окна, но это не так. Что же там?
Пустой указатель, равный nil. Параметр Sender в данном случае сделан только для того, чтобы на скрипты OnInit можно было назначить любой универсальный скрипт (все универсальные скрипты имеют параметр Sender).

Цитировать
Почему кнопка без привязки переменной не реализует базовый функционал, т.е. не фиксируется, если с фиксацией и т.п.?
Состояния кнопки всегда автоматически отображают значение привязанной к кнопке переменной. Поэтому, для смены состояний нужно привязать к кнопке переменную (например, внутреннюю). Если у переменной включить авто. восстановление, то при перезапусках проекта состояние кнопки также будет восстанавливаться. Можно было бы автоматически генерировать внутренние переменные и назначать их всем кнопкам, но это не выгодно по производительности, т.к. в проектах часто используются кнопки с одним состоянием.

samum

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1548 : 03 Сентября 2024, 15:49:24 »
Такой возможности нет.
Действительно, напрямую быстро и красиво изменять высоту окна не получится. Однако, было замечено, что при переходах меж вкладками, высота всё же меняется. Поэтому пришлось добавить пару переменных и используя "костыль" из GoToPageAll с небольшой задержкой в секунду решить этот вопрос....
Надеюсь, в новых версиях добавят функционал для форм/окон.

pan2000

  • Постоялец
  • ***
  • Сообщений: 196
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1549 : 04 Сентября 2024, 03:57:22 »
   Здравствуйте.
.. по нажатию кнопки перебрать все созданные по шаблону объекты и поменять в них определенные свойства. Как решить?...
  Если предложенные выше способы изменения свойств объектов шаблона не устраивают (переменные объекта уже заняты или необходимо большое количество переменных изменения свойств), то возможен доступ к объектам шаблона с использованием пары объектов связи и одной внутренней переменной. На странице размещается объект-приемник, свойство UserData которого будет содержать ссылку на объект шаблона. На шаблоне размещается объект-источник, формирующий по изменению переменной эту ссылку и передающий её объекту приемнику . Переменная служит ещё и для синхронизации получения ссылки но приемнике.
  В примере есть доступ к объектам двух экземпляров шаблона и возможно изменение некоторых свойств выбранного объекта.

  Ещё одним способом доступа к объектам шаблона является получение при инициализации шаблона цепочки ссылок на следующий объект начиная с объекта источника и передаче в приёмник ссылки на объект-источник.
  Примеры можно найти на форуме по поисковому запросу "Шаблон".

ARV

  • Постоялец
  • ***
  • Сообщений: 117
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1550 : 04 Сентября 2024, 08:39:03 »
pan2000, благодарю!
Однако, насколько я понял, подобный метод не позволяет именно перебрать экземпляры объектов шаблонов, т.к. каждому экземпляру сопоставляется свой "управляющий" элемент на этапе инициализации, и простыми средствами несколько шаблонных объектов не изменить "одновременно" - верно?

Simple-Scada, спасибо за ответы, которые меня не порадовали.
Любопытно, а почему сделано именно так? В основе, как я понимаю, идеология Object Pascal, а там каждый объект-контейнер имеет список своих дочерних объектов и к каждому можно обратиться. Почему сделано такое отступление от "традиций"? Мне кажется, накладные расходы постоянного поиска объектов по имени и т.п. куда больше, чем прямое обращение по адресам соответствующих экземпляров, которые, к тому же, можно сохранять в свои переменные, массивы, списки и т.п., реализуя любые желания... Я чего-то не понимаю?

Зачем именно нужно проходить по экземплярам шаблона?
Задача примерно так описывается: есть шаблон с 10 полями, экземпляров шаблона тоже 10. Каждое поле имеет собственное значение по умолчанию, в процессе работы значения могут произвольно меняться. По нажатию кнопки надо сбросить все поля одного или нескольких экземпляров шаблона в состояние по умолчанию.

Если напривязыввать переменных, как Вы посоветовали, это можно реализовать, но это ведь какой огород будет! И всё лишь потому, что невозможно написать цикл перебора экземпляров шаблона... Насколько проще было бы что-то типа такого:
Код: (delphi)
for i:=1 to 10 do
  for j:= 1 to 10 do begin
    TmpFld := TM_Field(GetObjectByName('Template1_'+IntToStr(i)+'_Field_'+IntToStr(j)));
    TmpFld.Value := TmpFld.VariableEx.Value;
  end;
если бы GetObjectByName находила бы ВСЕ объекты страницы... С моей точки зрения вероятность допустить ошибку в одном простом скрипте, работающем с 1 переменной, ниже, чем в 100500 скриптах, работающих со 100500 переменными... И разбираться потом, если что не так, легче...
Я осознаю, что мой пример не сильно лучше предложенного Вами, т.к. я сознательно упростил восстановление значения по умолчанию путем извлечения его из дополнительной переменной самого поля, что успешно решается одним универсальным скриптом для всех-всех полей, в реальности это не так, значения по умолчанию нельзя просто извлечь из вспомогательной переменной...

Дополнение по смене размеров окна:
Размер окна можно поменять почти как должно быть (но не совсем: окно сначала исчезает, а затем появляется, т.е. мигает):
по клику на кнопке:
Код: (delphi)
procedure OnClick(Sender : TM_Control);
var
  B : TM_Button;
  W : TM_Window;
  X, Y : single;
begin
  W := GetWindowByName('Wnd') as TM_Window;
  W.CloseClient(GetClientName);
  Page1.GoToPageClient(GetClientName);
  if W.H = 120
    then W.H := W.H + 300
    else W.H := W.H - 300;
  GoToPrevPageClient(GetClientName);
  RunDelay(100, 1);
end. 

по событию "Выполнена задержка":
Код: (delphi)
procedure DelayDone(DelayEventData : TM_DelayEventData);
var  W : TM_Window;
begin
  W := GetWindowByName('Wnd') as TM_Window;
  if DelayEventData.Tag = 1 then begin
    W.ShowClient(GetClientName);
  end;
end.
но из-за крайне кривой реализации класса TM_Window положение окна сбрасывается на то, которое было при создании шаблона, и никакими способами (либо я не сумел просто) нельзя заново открыть его в той позиции, где оно было закрыто - координаты окна всегда те же самые, что и в шаблоне.

P.S. Речь не о шаблонном окне! С шаблонными окнами та же беда - их по невозможно найти
« Изменён: 19 Сентября 2024, 10:09:26 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3146
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1551 : 04 Сентября 2024, 11:00:50 »
Цитировать
Задача примерно так описывается: есть шаблон с 10 полями, экземпляров шаблона тоже 10. Каждое поле имеет собственное значение по умолчанию, в процессе работы значения могут произвольно меняться. По нажатию кнопки надо сбросить все поля одного или нескольких экземпляров шаблона в состояние по умолчанию.
Цитировать
Если напривязывать переменных, как Вы посоветовали, это можно реализовать, но это ведь какой огород будет!
Если мы правильно поняли, у Вас поля не привязаны к переменным и только отображают текст. Пример проекта для последней версии 2.6.14.0 во вложении. В примере значения по-умолчанию для полей равны 99, 88, 77 (при необходимости можно для каждого поля задать разные значения). Их можно изменить, а затем нажать "Сброс", либо "Сбросить все".

Если есть ещё какие-то условия/связи и нужен ещё более точный ответ, то просьба сделать примитивный набросок проекта с необходимым минимумом переменных и объектов / шаблонов / окон, максимально точно описать задачу (какие переменные в каких полях должны отображаться, по каким условиям меняться / сбрасываться, на какие именно значения, как пользователь должен взаимодействовать с объектами, что должно происходить со значениями при перезапусках проекта и т.п.) и выслать его нам на support@simple-scada.com. Мы опишем варианты реализации, либо внесём изменения в будущие версии скады для упрощения решения задачи.

Цитировать
С моей точки зрения вероятность допустить ошибку в одном простом скрипте, работающем с 1 переменной, ниже, чем в 100500 скриптах, работающих со 100500 переменными...
Мы никогда не предлагаем писать множество скриптов, а наоборот - призываем сокращать количество скриптов, используя универсальные скрипты, а также обходиться без скриптов и циклов везде, где это возможно. На практике (практически во всех случаях по которым к нам обращаются), если пользователь пишет о необходимости перебора объектов в цикле, то он либо переносит функции ПЛК на скаду, либо не понимает как решить ту же задачу через привязку переменных и события.

Цитата: samum
Поэтому пришлось добавить пару переменных и используя "костыль" из GoToPageAll с небольшой задержкой в секунду решить этот вопрос....
Размер окна можно поменять почти как должно быть (но не совсем: окно сначала исчезает, а затем появляется, т.е. мигает):
Как мы писали ранее: в текущих версиях Simple-Scada нет возможности через скрипты корректно изменить размеры окна (чтобы это изменение корректно отобразилось на web и десктоп клиентах). Если бы такая возможность была, мы сразу бы написали об этом. Вы можете менять свойства W, H окон, т.к. они наследуются от класса TM_Control и доступны для записи, но полное обновление размеров на клиентах произойдёт только при повторной загрузке окна. Решение описанное пользователем samum подходит только для проектов с одним клиентом, или для одностраничного проекта. ARV, пример который Вы описали не будет работать в web-клиентах, а также на десктоп клиентах у которых задано имя, т.к. функция GetClientName не будет работать в скрипте "Выполнена задержка", эти скрипты исполняются сервером скады. См. описание функции GetClientName в руководстве. Да и решение с использованием задержки является жутким "костылём".
Исходя из вышеописанного, рекомендуем отказаться от смены размеров окна через скрипты, чтобы не удивляться "неправильной" смене размера окна в будущем. Если это обязательное требование при разработке проекта, то воспользуйтесь другими SCADA-системами в которых предусмотрена смена размеров окна.
« Изменён: 04 Сентября 2024, 12:05:16 от Simple-Scada »

ARV

  • Постоялец
  • ***
  • Сообщений: 117
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1552 : 05 Сентября 2024, 16:12:27 »
Если мы правильно поняли, у Вас поля не привязаны к переменным и только отображают текст. Пример проекта для последней версии 2.6.14.0 во вложении. В примере значения по-умолчанию для полей равны 99, 88, 77 (при необходимости можно для каждого поля задать разные значения). Их можно изменить, а затем нажать "Сброс", либо "Сбросить все".
Спасибо за ответ. Ваше решение почти то, к которому стремлюсь я, за исключением двух "нюансиков":
1. Поля привязаны к переменным (привязываются при инициализации автоматически, примерно как в вашем скрипте при сбросе перебор полей, а не через подстановки)
2. Значение после сброса у каждого поля своё и берется их других переменных (т.е. дополнительная переменная уже занята полезным делом)

в текущих версиях Simple-Scada нет возможности через скрипты корректно изменить размеры окна
Да это уже понятно, и было понятно даже раньше. Мой жуткий костыль просто попытка обойти проблему, вряд ли он вообще пригодится, т.к. все равно положение окна невозможно задать правильно.
А проблема с окнами вот в чем: есть, допустим, объект, управляемый ПИД-регулятором. Так вот, оператору по клику на объекте должно открываться окно только с заданием ПИД-а и текущим значением регулируемого параметра, а наладчику в этом окне должна быть кнопка "Параметры ПИД", и, соответственно, по клику на ней должны появляться поля с параметрами регулятора. В других SCADA по кнопке окно увеличивается, и на нем становятся видны ранее невидимые элементы, вот и всех делов. В Simple-Scada по кнопке придется открывать другое окно, положение которого невозможно правильно установить, т.е. объект в правом верхнем углу, его окно для оператора примерно там же, а окно с параметрами для наладчика будет в центре... не логично, и не удобно. И как быть с закрытием окон "не по порядку" или не закрытием их вообще? В общем, криво все выходит... Ну, или я снова туплю и не понимаю, как сделать красиво.
Применять другие SCADA не вариант, ибо импортозамещение...

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


Очередной вопрос по окнам, но с конкретикой. Задумал реализовать такое:
Есть объект, допустим, задвижка. С ней связаны 2 переменные, одна, допустим, VLV_1, другая VLV_1_MODE. Есть еще куча переменных, связанных с этим объектом, но их изменение надо делать в отдельном окне по клику на объекте. И таких объектов у меня много, все их переменные отличаются друг от друга индексами, т.е. VLV_2, VLV_3 и т.д.
Применять подход с шаблонами и шаблонными окнами в полном объеме [пока] не намереваюсь по вышеуказанной причине - ручной ввод подстановок чреват ошибками ввода.
Решил сделать так:
  • Завёл глобальную переменную TMP_Var, в событии клика на объекте в неё заношу значение Variable из Sender, т.е. в случае с кликом на первой задвижке в неё попадает VLV_1.
  • В событии открытия окна беру переменную TMP_Var, беру её имя "VLV_1" и, дополняя это имя суффиксами нужных мне переменных, получаю их имена типа "VLV_1_MODE", "VLV_1_CTRL" и так далее. Потом по этим именам извлекаю переменные и заношу их в объекты самого окна
  • Таким образом, окно в момент открытия получает комплект всех переменных, связанных с объектом, на котором был клик.
В этом варианте ручного ввода переменных нет вообще, вероятность "механических" ошибок минимальна. Собственно, это метод подстановок, только динамический, а не статический, как с классическими шаблонами. Вопрос у меня такой: нет ли в этом подходе каких-то подводных камней, которые я не вижу? Например, связанных с множеством клиентов или там WEB или еще чем-нибудь?

P.S. У меня больше 20 лет стажа в Object Pascal, но всего 2,5 месяца в области ПЛК, и к принятым в этой области подходам я как-то еще не приспособился... так что прошу извинить, если вопросы кажутся тупыми.
« Изменён: 19 Сентября 2024, 10:06:07 от Simple-Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 196
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1553 : 06 Сентября 2024, 09:43:41 »
   Здравствуйте.
...
1. Поля привязаны к переменным (привязываются при инициализации автоматически, примерно как в вашем скрипте при сбросе перебор полей, а не через подстановки)
2. Значение после сброса у каждого поля своё и берется их других переменных (т.е. дополнительная переменная уже занята полезным делом)
...
...либо пытается сделать рутину проще. Например, метод подстановки для шаблонов по сути означает, что имя переменной надо ввести вручную, а не выбрать из списка переменных, что сильно повышает вероятность ошибки ввода, найти которую потом будет сложно...
   Предпосылки для примера из вложения:
1. Все имена переменных и объектов имеют структуру <префикс>_<индекс от 1 до ...> и желательны непрерывные значения индекса;
2. У шаблона единственная подстановка - номер шаблона;
3. Объект связи должен иметь индекс совпадающий с номером шаблона и используется для передачи начальных имен переменной. Нужен для исключения ошибок редактирования, т.к. переменные выбираются из списка. Хотя по мне, так два имени вполне могут быть включены и в подстановки шаблона. Использование объекта оправдано при передаче чего-то из шаблона.
4. При инициализации шаблона выполняется несколько видов контроля - наличие объекта связи, наличие обоих переменных у объекта связи, наличие пар переменных с допустимыми префиксами.
5. Вид экземпляра шаблона настраивается по числу переменных.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3146
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1554 : 06 Сентября 2024, 10:16:41 »
Цитировать
Ваше решение почти то, к которому стремлюсь я, за исключением двух "нюансиков":
1. Поля привязаны к переменным (привязываются при инициализации автоматически, примерно как в вашем скрипте при сбросе перебор полей, а не через подстановки)
2. Значение после сброса у каждого поля своё и берется их других переменных (т.е. дополнительная переменная уже занята полезным делом)
Пример во вложении (TemplatesReset_26140).

Цитировать
Есть, допустим, объект, управляемый ПИД-регулятором. Так вот, оператору по клику на объекте должно открываться окно только с заданием ПИД-а и текущим значением регулируемого параметра, а наладчику в этом окне должна быть кнопка "Параметры ПИД", и, соответственно, по клику на ней должны появляться поля с параметрами регулятора.
Четыре варианта реализации во вложении.
PID_26140 - так мы чаще всего делаем, с одним окном, когда отличия у окон оператора и наладчика - минимальные;
PID_26140_ManyParams - когда есть значительные отличия у окон оператора и наладчика;
PID_26140_TwoWindow - так, как Вы описали;
PID_26140_TwoWindowBtn - вариант с отдельной кнопкой для наладчика.

Цитировать
Во всех случаях используется стандартная система шаблонов, без скриптов, с обычными подстановками, все варианты дают максимальную производительность во время запуска/работы проекта и минимизируют количество данных отправляемых от сервера клиентам.
Мы не видим никаких существенных причин использовать скрипты (как Вы описали), чтобы не использовать подстановки. Если у разработчика возникают сложности с заполнением подстановок (единственной непостоянной части в имени переменной, постоянная часть заполняется один раз, во время разработки шаблона), то здесь уже возникает вопрос: зачем нужен разработчик? Неужели действительно трудно скопировать экземпляр шаблона и изменить подстановку с 1 на 2 и т.д.? Может быть разных подстановок очень много? Тогда можем рассмотреть добавление возможности группового переименования/заполнения подстановок, для быстрого ввода.

Цитировать
В Simple-Scada по кнопке придется открывать другое окно, положение которого невозможно правильно установить, т.е. объект в правом верхнем углу, его окно для оператора примерно там же, а окно с параметрами для наладчика будет в центре... не логично, и не удобно.
Про положение окон ничего не понятно. Почему в центре? Положение окон определяется опциями "Положение" и "Запоминать положение". Окна автоматически выравниваются по объекту, если свойство "Положение" = "По координатам объекта". Если оставить включенной опцию "Запоминать положение", то оператор сможет переместить окно в удобную позицию и окно в следующий раз откроется в ней. Посмотрите примеры во вложении, в них окна открываются по координатам объекта. Или Вы и окна открываете тоже через скрипты? Если да, пришлите код скрипта. Или, возможно, используете старую версию скады?

Цитировать
В других SCADA по кнопке окно увеличивается, и на нем становятся видны ранее невидимые элементы, вот и всех делов.
В Simple-Scada окна и объекты работают по единому принципу. Есть экземпляр объекта и его могут видеть множество пользователей. Если Вы сделаете кнопку, которая меняет цвет объекта на красный, то после нажатия на кнопку все пользователи (на web и десктоп клиентах) увидят, что объект стал красным. Ведь объект один и его видят все, кому разрешено правами. То же самое касается окон (кроме координат и видимости, они на каждом клиенте могут быть разными). Скада не создаёт отдельные окна для отдельных клиентов "на ходу". Поэтому, когда наладчик увеличит размер окна, оно увеличится у всех клиентов, которые видят это окно, у оператора тоже. Для корректного решения вместо окон нужно использовать что-то вроде форм, которые каждый раз создаются для каждого клиента. Но у такого подхода множество других недостатков и, как показывает практика, всегда можно обойтись обычными окнами с лучшей производительностью.

Цитировать
Применять другие SCADA не вариант, ибо импортозамещение...
Но и Российских SCADA-систем сейчас много, есть очень крупные и "тяжелые" скады, наверняка в них будет больше гибкости. Мы стремимся к максимальному упрощению и использованию штатных решений, поэтому маловероятно, что в будущем будут методы для замены штатных функций скриптами (т.к. решения на скриптах всегда проигрывают по производительности штатному функционалу без скриптов + пользователи обычно пишут скрипты очень плохо). Вам явно нужна скада полностью ориентированная на скрипты. Мы такого не планируем.

Цитировать
Есть объект, допустим, задвижка. С ней связаны 2 переменные, одна, допустим, VLV_1, другая VLV_1_MODE. Есть еще куча переменных...
Применять подход с шаблонами и шаблонными окнами в полном объеме не намереваюсь по вышеуказанной причине - ручной ввод подстановок чреват ошибками ввода.
Решил сделать так:
1. Завёл глобальную переменную TMP_Var...
Когда мы читаем такое, у нас возникает желание удалить скрипты из скады (или искусственно их замедлить), чтобы вынудить пользователей использовать стандартный подход к разработке проектов. Вызов скрипта на каждый клик, на каждое открытие окна (это плохо даже с точки зрения программирования), ради ухода от подстановок, при этом те же подстановки выполняются в скриптах и получается нерабочий вариант для многопользовательской системы.

Цитировать
Вопрос у меня такой: нет ли в этом подходе каких-то подводных камней, которые я не вижу? Например, связанных с множеством клиентов или там WEB или еще чем-нибудь?
Такой вариант конечно работать не будет, если к проекту будет подключено более 1 клиента одновременно. Два пользователя будут мешать друг другу вызывая подстановку нового набора переменных кликом. Если бы был какой-то магический и эффективный способ автоматической подстановки значений скриптом на все объекты проекта, мы бы давно его описали и внесли в руководство, либо сделали, чтобы он автоматически всегда работал в скаде. К сожалению, такого способа нет и в будущем точно не появится.

Также просьба прикреплять к вопросам текущий вариант проекта (либо отправить его на support@simple-scada.com), чтобы мы могли дать ответ конкретно под Ваш проект, учитывая все условия, переменные и объекты. 
« Изменён: 06 Сентября 2024, 12:52:47 от Simple-Scada »

cavikal

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1555 : 06 Сентября 2024, 10:58:17 »
Почитываю иногда форум и до сих пор поражаюсь как изощрятся люди при решении простейших задач. А потом приходишь на такой объект и ломаешь голову с огородом непонятных скриптов  :-\. Проще удалить всё и сделать заново. simple-scada, вы же видите, человек не ищет лёгких путей. у него чем сложнее, тем проще. Штатными средствами сейчас не модно, нужно обязательно через одно место.

ARV

  • Постоялец
  • ***
  • Сообщений: 117
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1556 : 06 Сентября 2024, 12:58:51 »
Я сейчас занимаюсь тем, что проект для ПЛК, неизвестно кем сделанный неизвестно когда, подключаю к SCADA. И сталкиваюсь с тем, что нет никакой универсальности в наименованиях объектов, то бишь переменных для них. Например, задвижка имеет номер 7, а переменные для неё этого номера не имеют, зато для для моторов все переменные индексные... Но есть некоторые задвижки с индексными переменными... И так во всём.
В итоге подстановки очень туго идут... Пока нахожусь в стадии поиска решений, и раздумываю, что проще: вручную вбивать все переменные в отдельные окна, или переделать весь проект для унификации имен переменных и объектов...

За предоставленные примеры большое спасибо, буду изучать.

Upd1:
Не понял, как в примере PID_26140_ManyParams делается переключение между окнами? В шаблоне привязано к кнопке только окно наладчика, как оно меняется на окно оператора?!

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

Или это опять будет криво и не правильно?
Правильно будет делать 2 подстановки - одна для номера объекта, вторая для номера переменных?

Upd3:
В шаблон окна передается подстановка %VAR%, которая является именем переменной.
Как в заголовке шаблонного окна вывести описание этой переменной? #var_desc в какое место лепить?
« Изменён: 07 Сентября 2024, 11:38:20 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3146
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1557 : 07 Сентября 2024, 12:21:46 »
Цитировать
Пока нахожусь в стадии поиска решений, и раздумываю, что проще: вручную вбивать все переменные в отдельные окна, или переделать весь проект для унификации имен переменных и объектов...
Если в проекте однотипные объекты и нужно максимально упростить проект (в том числе для будущих доработок) и увеличить производительность, то сначала нужно выполнить унификацию имён, затем создать шаблоны для однотипных объектов и окон и использовать их вместо множества отдельных объектов. Для быстрого переименования множества переменных можно использовать групповое переименование. Если на это нет времени, то проще всего будет отказаться от системы шаблонов и делать "по-старому". Всё вручную: создавать каждый объект (и окна) отдельно, привязывать к нему переменные, скрипты и т.д. Тогда и в скриптах можно будет обратиться к каждому объекту отдельно и менять любые его свойства (в том числе пройти по объектам в цикле с поиском по имени, если имена однотипные).

Цитировать
Не понял, как в примере PID_26140_ManyParams делается переключение между окнами?
В шаблоне два изображения "Насоса" друг над другом, для каждого изображения указано свое окно и настроена видимость через права доступа к объекту.

Цитировать
Правильно будет делать 2 подстановки - одна для номера объекта, вторая для номера переменных?
Подстановок должно быть столько, сколько требуется по структуре проекта и объектов в нём. Если структура такая:
Код
Станция 1. Насос 1.
Станция 1. Насос 2.
Станция 2. Насос 1.
Станция 2. Насос 2.
, то при создании шаблона насоса нужны две подстановки: номер станции и номер насоса.

Если структура такая:
Код
Станция 1. Агрегат 1. Насос 1.
Станция 1. Агрегат 1. Насос 2.
Станция 1. Агрегат 2. Насос 1.

Станция 2. Агрегат 1. Насос 1.
Станция 2. Агрегат 1. Насос 2.
Станция 2. Агрегат 2. Насос 1.
, то при создании шаблона насоса нужны три подстановки: номер станции, номер агрегата и номер насоса.
Имена переменных в проекте также должны соответствовать этой структуре, например: St1_Aggr1_Pump1 и т.д.

Цитировать
В шаблон окна передается подстановка %VAR%, которая является именем переменной.
Как в заголовке шаблонного окна вывести описание этой переменной? #var_desc в какое место лепить?
У окон нет переменных, поэтому #var_desc неоткуда будет взять описание. Вы можете подставить в заголовок окна описание любой переменной из объекта в окне.
Допустим в шаблонном окне есть поле с именем Field1 и подстановкой %VAR%, тогда универсальный скрипт на событие OnInit шаблонного окна будет таким:
Код: (delphi)
var
  obj: TM_Object;
begin
  obj := GetTemplateObject('Field1');                           // получаем объект Field1 из шаблонного окна
  if Assigned(obj.Variable) then                                // если он связан с переменной,
    TM_Window(obj.GetOwner).Title := obj.Variable.Description;  // то в заголовок окна подставляем описание переменной
end.
« Изменён: 07 Сентября 2024, 12:30:05 от Simple-Scada »

ARV

  • Постоялец
  • ***
  • Сообщений: 117
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1558 : 09 Сентября 2024, 08:06:06 »
Спасибо за ответы, ув. Simple-Scada!

В шаблоне два изображения "Насоса" друг над другом, для каждого изображения указано свое окно и настроена видимость через права доступа к объекту.
И это шаманство считается нормальной практикой?!

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3146
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1559 : 09 Сентября 2024, 20:08:04 »
Да, это обычное использование системы прав. Если для разных пользователей поведение должно значительно отличаться, то здесь уже не получится обойтись одним объектом/окном. Поэтому создаются отдельные окна/объекты для разных пользователей и каждый пользователь работает со своим объектом/окном. Простой и производительный способ, подходит для очень крупных проектов. Разработчики проекта всегда могут посмотреть ссылки на окно и увидеть к каким именно объектам оно привязано.
« Изменён: 19 Сентября 2024, 10:10:12 от Simple-Scada »