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

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

Автор Тема: Вопросы и предложения по Simple-Scada 2  (Прочитано 358212 раз)

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1425 : 11 Января 2022, 11:12:47 »
Т.е. если на одну переменную был создан скрипт "по изменению" и скрипт универсальный (OnDataChange), они будут выполнятся в той последовательности, которые созданы? В manual`е описана ситуация с секундным скриптом.

String = UnicodeString (разобрался, спасибо, моя ошибка).

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1426 : 11 Января 2022, 11:15:28 »
    Здравствуйте.

Но я натолкнулся на проблему, когда переменная указывает на тип аварии, а ее биты на то или иное устройство:
в этом случае при изменении значения переменной запускается сразу несколько "экземпляров" универсального скрипта.
пред. значение необходимо записывать только после выполнения последнего "экземпляра",- это дополнительные условия.
Пришлось прибегнуть к использованию доп. переменных и скрипта типа "изменились переменные".
Для разделения сообщений по устройствам можно использовать маски. Во вложении пример шаблона устройства с изменяемыми битами состояния (ошибками). Единственный параметр шаблона - это номер устройства, соответствующий номеру бита основной переменной и передаваемый через свойство Tag.
Код: (delphi)
var i: integer;
    j, k: int64;
begin
  with Sender as TM_Object do begin
    k := AsInt64;
    if Hint = '' then Hint := IntToStR(k);                  // начальное значение
    j := (k xor StrToInt64(Hint)) and Setbit(0, Tag, true); // вектор изменений переменной для выбранного устройства (маска по Tag)
    if j = 0 then exit;                                     // изменения не относятся к данному устройству
    AddMessage(Now, mkAlarm,                                // сообщение при изменении бита переменной
        'Переменная ' + Variable.Name + ' бит ' + IntToStr(Tag) + ' изменился в ' + GetBit(k,Tag).ToISOString, true, false);
    Hint := IntToStR(k);                                    // запомнить текущее значение как предыдущее
  end;
end.
Маски позволяют работать с полями, как-то номер устройства или небинарный код ошибки.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1427 : 11 Января 2022, 12:31:00 »
Спасибо большое, это именно то, что я хотел.
Моя ошибка была в том, что я пред. значение хранил в Hint самой переменной, а надо было в отдельном объекте шаблона.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1428 : 13 Января 2022, 15:58:06 »
Снова добрый день. И снова прошу помощи.
Появились вопросы по импорту тегов.
1. Имеется ли функция "обновить теги" в редакторе переменных?(если тег существует в SS, ничего не делать, если его нет, добавить).
Т.е. допустим в проекте уже существует набор импортированных тегов. Программа PLC меняется=> набор тегов меняется (что-то добавляется, что-то удаляется, - непрерывный процесс ((: ). С набором импортированных тегов уже произведены манипуляции (изменения свойств архивирования, период опроса и т.д.).
Наталкиваюсь на проблему: либо мне все удалять, добавлять теги заново, и опять изменять вручную их свойства, либо вручную выискивать какие-же теги добавились в PLC и добавлять их стандартным способом...с большими объемами очень тяжело, либо вручную смотреть две эксельки: до изм., после изм., тоже тяжко...

2. Есть ли функция "purge" для тегов: те теги которые никак не участвуют в проекте, удаляются. Я конечно понимаю, что это проблематично реализовать, но на всякий случай спрошу ((;
« Изменён: 13 Января 2022, 18:38:20 от Botsmall »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1179
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1429 : 14 Января 2022, 17:46:29 »
Здравствуйте.

Цитировать
Имеется ли функция "обновить теги" в редакторе переменных? (если тег существует в SS, ничего не делать, если его нет, добавить).
При импорте переменных с OPC-сервера такой возможности нет. Поэтому, теги которые были удалены с ПЛК нужно удалить в редакторе переменных. Необходимые новые теги ПЛК нужно выбрать и импортировать с OPC-сервера. Такой функционал имеется при использовании импорта переменных из файла. Если просто нажать кнопку "Импортировать", то существующие переменные при импорте из файла будут пропущены. Можно обновить свойства совпадающих по имени переменных нажав кнопку "Импортировать" удерживая клавишу "Shift" на клавиатуре.

Цитировать
либо мне все удалять, добавлять теги заново
Учитывайте, что при этом будут разорваны связи переменных с объектами(если они есть) и их нужно будет вновь связывать с объектами.

Цитировать
Есть ли функция "purge" для тегов: те теги которые никак не участвуют в проекте, удаляются.
Такой функции нет.

Rindzin

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1430 : 17 Января 2022, 12:09:46 »
Добрый день,
возможно ли импортировать теги сохраняя структуру каталогов? В больших проектах приходится сначала создавать все группы вручную и только потом импортировать теги в каждую группу по отдельности, что очень не удобно

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1179
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1431 : 17 Января 2022, 16:34:52 »
Здравствуйте.

При импорте переменных с OPC-сервера структуру каталогов импортировать нельзя. Пожелание учтем и возможно в будущем такой функционал появится.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1432 : 17 Января 2022, 16:54:46 »
Жаль, была бы очень полезная функция.

Еще вопросики.
1. Имеется шаблон, в нем есть кнопка, которая в зависимости от подстановки в шаблон %название окна%, открывает шаблонное окно с именем %название окна%.
Проблема в том, что в скрипте по нажатию той самой кнопки мне не найти шаблонное окно. Функции GetTemplateObj, GetWindowByName = nil.

2. Есть шаблонное окно в шаблонном окне. Во втором шаблоне есть скрипт по событию OnInit.  Его задача скрыть элементы, если привязанные к ним переменные отсутствуют в таблице переменных. Изначально все переменные были объявлены, все элементы видны. По мере удаления переменных реакция не изменяется:
GetVariableByName(Str) <> nil (для проверки в скрипте изменил GetVariableByName(Str + 'такой переменной нет') => элементы из второго шаблонного окна исчезли.)

Прошу помощи.
« Изменён: 17 Января 2022, 18:47:17 от Botsmall »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1179
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1433 : 17 Января 2022, 22:23:52 »
Здравствуйте.

Для того, чтобы лучше понять принцип работы с объектами шаблона из скриптов, рекомендуем ознакомиться с этим разделом руководства.

Цитировать
Проблема в том, что в скрипте по нажатию той самой кнопки мне не найти шаблонное окно. Функции GetTemplateObj, GetWindowByName = nil.
Указанные функции не предназначены для вызова окна из шаблона. Функция GetTemplateObject позволяет обратиться к нужному объекту шаблона/шаблонного окна. Функция GetWindowByName предназначена для поиска и работы с обычными окнами. Для вызова шаблонного окна из шаблона не требуется использовать скрипты - см. руководство по ссылке.

Цитировать
Есть шаблонное окно в шаблонном окне. Во втором шаблоне есть скрипт по событию OnInit.  Его задача скрыть элементы, если привязанные к ним переменные отсутствуют в таблице переменных.
Данную задачу можно решить с помощью функции GetTemplateObject. Допустим, в шаблонном окне есть заслонка Valve1 и изображение Image1, которые нужно скрывать если они не связаны с переменной. Тогда на событие OnInit шаблонного окна пишем такой код:
Код: (delphi)
var
  aObj: TM_Object;
begin
  aObj := GetTemplateObject('Image1');
  aObj.Visible := aObj.Variable <> nil;
 
  aObj := GetTemplateObject('Valve1');
  aObj.Visible := aObj.Variable <> nil;
end.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1434 : 18 Января 2022, 11:35:45 »
1. В приведенном примере https://simple-scada.com/help/manual/templandtemplwnd.html, из шаблона вызывается одно конкретное шаблонное окно с разными вводными.
Моя же задача, заключается в том, чтобы по нажатию на насос разных экземпляров одного шаблона, в зависимости от подставновки %название окна% (обычный текст внутри шаблона), открывалось то или иное шаблонное окно (не экземпляр конкретного шаблонного окна, а именно совершенно разные шаблонные окна).
Не смог найти решения.
2. Разобрался, моя ошибка.
« Изменён: 18 Января 2022, 11:41:57 от Botsmall »

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1435 : 18 Января 2022, 15:53:33 »
   Здравствуйте.

Моя же задача, заключается в том, чтобы по нажатию на насос разных экземпляров одного шаблона, в зависимости от подставновки %название окна% (обычный текст внутри шаблона), открывалось то или иное шаблонное окно (не экземпляр конкретного шаблонного окна, а именно совершенно разные шаблонные окна).
В экземпляре шаблона возможна только статическая связь объекта и шаблонного окна. Для выбора одного из нескольких шаблонных окон (при их разумном количестве) можно использовать группу одинаковых объектов, в которой каждый объект связан с уникальным шаблонным окном.
Объекты "сложены стопочкой", выбор нужного окна осуществляется посредством управления видимостью объектов при инициализации шаблона.
Во вложении пример для 3-х шаблонных окон. Имя шаблонного окна хранится в свойстве Hint объектов TM_Image с однотипными именами, имя вызываемого окна в свойстве Text отдельного объекта TM_Text.
Скрипт инициализации шаблона:
Код: (delphi)
var aStr: string;
    i: integer;
begin
  aStr := TM_Text(GetTemplateObject('Text1')).Text;      // имя вызываемого шаблонного окна
  for i := 1 to 3 do
    with GetTemplateObject('Image' + IntToStr(i)) as TM_Control do Visible := aStr = Hint;   // видимость объекта по совпадению имен
end.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1436 : 18 Января 2022, 17:05:38 »
Большое спасибо за ответ.
Именно к тому выводу я пришел. Решение рабочее.
Есть еще момент.
Если я использую свойство "максимальное число открытых окон" на странице в которой есть возможность открыть окно в окне
(к примеру в моем случае двойная вложенность, - окно в окне), возникает ситуация: если я использую значение "1" этого свойства, я не могу открыть вложенное окно в окне. Если же я использую значение "2" у меня появляется возможность открыть 2 "корневых" окна, но тогда теряется смысл происходящего. Проконтролировать это дело у меня не получилось, так как не нашел возможности с помощью скрипта закрыть шаблонное окно:
Цитировать
Функция GetWindowByName предназначена для поиска и работы с обычными окнами

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1179
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1437 : 18 Января 2022, 21:15:48 »
Здравствуйте.

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

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

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1438 : 19 Января 2022, 07:55:34 »
   Здравствуйте.
Если я использую свойство "максимальное число открытых окон" на странице в которой есть возможность открыть окно в окне
(к примеру в моем случае двойная вложенность, - окно в окне), возникает ситуация: если я использую значение "1" этого свойства, я не могу открыть вложенное окно в окне. Если же я использую значение "2" у меня появляется возможность открыть 2 "корневых" окна, но тогда теряется смысл происходящего.
Частичное решение проблемы "корневых" окон это использование переменной-флажка "Открыто корневое окно" (по событиям окна OnShow, OnClose), управляющего свойством Enable объектов выбора окна, т.е. "корневое" открытое окно блокирует прочие "корневые".
Наличие глобальной переменной ограничивает доступ других клиентов. Контролировать клиентов проблематично из-за неконтролируемого отключения клиентов.
Частичное = различное поведение окон разных уровней при их вызове. Решением могла бы стать редко используемая процедура "Закрыть все неактивные окна" (возможность закрыть шаблонное окно из скрипта, в частности все окна, за исключением нового "корневого").
Пример во вложении.

Botsmall

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Re: Вопросы и предложения по Simple-Scada 2
« Ответ #1439 : 19 Января 2022, 11:36:59 »
Большое спасибо за ответы, будем разбираться.