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

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

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

aMster

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1680 : 07 Июня 2026, 20:38:27 »
Спасибо.

Еще вопрос
Имеется текстовое поле, к нему привязана переменная из opc сервера.
Проверить в скрипте содержимое у меня получается через поле .text
А вот изменить его содержимое не получилось, скрипт вроде отработал, а значения не поменялись.
пришлось лезть через .value, то есть к привязанной переменной.
Соответственно это достаточно долго.
Что-то упустил?
« Изменён: 07 Июня 2026, 20:47:40 от aMster »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1428
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1681 : 07 Июня 2026, 21:29:59 »
Здравствуйте.

Для изменения значения не нужно использовать скрипты - введите новое значение в поле и нажмите клавишу Enter. Если все же требуется изменить значение через скрипт, то для этого нужно менять значение переменной через свойство Value.

Цитировать
Проверить в скрипте содержимое у меня получается через поле .text. А вот изменить его содержимое не получилось
Изменить содержимое поля через свойство Text получится только в случае, когда поле не связано с переменной.

aMster

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1682 : 08 Июня 2026, 07:56:49 »
Потребовалось реализовать восстановление набора уставок ( несколько полей). В голову только скрипт по нажатию кнопки пришел.
а событие "OnDoneInputEvent" не поможет?
« Изменён: 08 Июня 2026, 14:45:58 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1428
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1683 : 08 Июня 2026, 15:04:07 »
Сохранение/восстановление значений внешних переменных обычно реализуется на ПЛК. Если такой возможности нет и требуется записать значения сразу в несколько переменных, то подойдет вариант с записью по нажатию на кнопку (событие "OnClick").

Цитировать
а событие "OnDoneInputEvent" не поможет?
Нет. Как мы уже писали ранее, для изменения значения достаточно ввести новое значение в поле и нажать клавишу Enter. Если требуется записать значения в несколько разных переменных, то можно использовать скрипт по нажатию на кнопку.

titanicnwa

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1684 : 16 Июля 2026, 11:27:29 »
Подскажите как в скрипте из события OnEnter объекта Page получить имя текущей подстраницы?
В Руководстве по скриптам не нашел описание объекта TM_Subpage

pan2000

  • Постоялец
  • ***
  • Сообщений: 240
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1685 : 17 Июля 2026, 01:50:36 »
   Здравствуйте.

Подскажите как в скрипте из события OnEnter объекта Page получить имя текущей подстраницы?
В скрипте OnEnter объекта Page нет возможности получить имя текущей подстраницы. При переходе на страницу (подстраницы ещё скрыты) однократно последовательно вызываются скрипты OnEnter и OnEnterSubpage текущей подстраницы, далее при переходам по подстраницам вызывается скрипт OnEnterSubpage.
Следовательно, достаточно поместить текст обработки имени текущей подстраницы в скрипт OnEnterSubpage и обеспечить однократность его выполнения при первом вызове. В универсальных скриптах для флажка однократности можно использовать свойство Tag страницы.
Скрипт OnEnter:
Код: (delphi)
begin
  Sender.Tag := 0;       // 0 - скрипт OnEnterSubpage ещё не вызывался
end.
Скрипт OnEnterSubpage:
Код: (delphi)
begin
  with TM_Subpage(Sender).OwnerPage do         // страница для текущей подстраницы
    if Tag = 0 then
    begin
      Tag := 1;    // однократность вызова скрипта при переходе по подстраницам
// действия по обработке имени текущей подстраницы

      Text1.Text := Text1.Text + 'ПЕРЕХОД: Page=' + Name + '    SubPage=' + TM_Subpage(Sender).Name + #10;

    end;
  Window1.ShowAll;
end.
Пример из вложения показывает список имён последних активных подстраниц перед переходом к другой странице.

P.S. Если Tag занят, то в качестве флага и имени подстраницы можно использовать строковую переменную. Для универсальности скриптов имя переменной должно быть связано с именем страницы, например так: vrSubPageName_<Имя страницы>.
« Изменён: 17 Июля 2026, 16:32:26 от pan2000 »

AndreyA

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1686 : 24 Сентября 2026, 16:00:26 »
Здравствуйте!
Существует скрипт который исполняется раз в секунду, данные накапливаются и выводятся в рапорт, но столкнулся с проблемой что запись в переменные накопления происходят не у всех.
Вопрос: это неправильно сделаный скрипт или что то еще - куда смотреть?
Код: (delphi)
  Hour = 3600;
  MaxLimit = 100.0; //  значение производительности

procedure CalcWeightSum(FLeistung: TM_Variable; var WeightSum, WeightDelta: TM_Variable);
begin
   // 1. Проверяем, входят ли текущие показания в допустимый диапазон
   if (FLeistung.AsFloat >= 0) and (FLeistung.AsFloat <= MaxLimit) then
   begin
      // 2. Если всё в порядке, считаем дельту и прибавляем к сумме
      WeightDelta.Value := FLeistung.AsFloat / Hour;
      WeightSum.Value := WeightSum.AsFloat + WeightDelta.AsFloat;
   end
   else
   begin
      // 3. Если сигнал вышел за пределы, обнуляем только дельту для этого такта (сумма не растет)
      WeightDelta.Value := 0;
   end;
end;

begin
   CalcWeightSum(FLeistung_BW_P10_1_db256, WeightSum_P10_1, WeightDelta_P10_1);
   CalcWeightSum(FLeistung_BW_P11_1_db256, WeightSum_P11_1, WeightDelta_P11_1);
   CalcWeightSum(FLeistung_BW_P16_3_db256, WeightSum_P16_3, WeightDelta_P16_3);
   CalcWeightSum(FLeistung_BW_P21_1_db256, WeightSum_P21_1, WeightDelta_P21_1);
   CalcWeightSum(FLeistung_BW_P24_1_db256, WeightSum_P24_1, WeightDelta_P24_1);
   CalcWeightSum(FLeistung_BW_P28_1_db256, WeightSum_P28_1, WeightDelta_P28_1);
   CalcWeightSum(FLeistung_BW_P32_1_db256, WeightSum_P32_1, WeightDelta_P32_1);
   CalcWeightSum(FLeistung_BW_P36_1_db256, WeightSum_P36_1, WeightDelta_P36_1);
   CalcWeightSum(FLeistung_BW_P50_1_db256, WeightSum_P50_1, WeightDelta_P50_1);
   CalcWeightSum(FLeistung_BW_P59_1_db256, WeightSum_P59_1, WeightDelta_P59_1);
   CalcWeightSum(FLeistung_BW_P63_1_db256, WeightSum_P63_1, WeightDelta_P63_1);
   CalcWeightSum(FLeistung_BW_P64_1_db256, WeightSum_P64_1, WeightDelta_P64_1);
   CalcWeightSum(FLeistung_BW_P69_1_db256, WeightSum_P69_1, WeightDelta_P69_1);
   CalcWeightSum(FLeistung_BW_P70_1_db256, WeightSum_P70_1, WeightDelta_P70_1);
   CalcWeightSum(FLeistung_BW_P71_1_db256, WeightSum_P71_1, WeightDelta_P71_1);
   CalcWeightSum(FLeistung_BW_P72_1_db256, WeightSum_P72_1, WeightDelta_P72_1);
end.
« Изменён: 24 Сентября 2026, 16:06:51 от Simple_Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 240
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1687 : 25 Сентября 2026, 18:27:24 »
    Здравствуйте.

Существует скрипт который исполняется раз в секунду, данные накапливаются и выводятся в рапорт, но столкнулся с проблемой что запись в переменные накопления происходят не у всех.
Вопрос: это неправильно сделанный скрипт или что то еще - куда смотреть?

  Проверить на ошибки фазы выполнения проекта. См. журнал сервера.

  Сам скрипт можно проверить тестовыми последовательностями (константа - линейное нарастание результата, пила - весь диапазон входной переменной).

  При выполнении функции возможно изменение значения входной переменной. Значение входной переменной типа TM_Variable следует передавать как типизированное значение (формально параметр по значению передается локальной копией, однако при передаче объекта (экземпляра класса), внутри функции/процедуры работа идет со ссылкой на тот же объект, а не с копией его полей):
Код: (delphi)
procedure CalcWeightSum(FLeistung: single; var WeightSum, WeightDelta: TM_Variable);
begin
   // 1. Проверяем, входят ли текущие показания в допустимый диапазон
   if (0 <= FLeistung) and (FLeistung <= MaxLimit) then
. . .
end;

begin
   CalcWeightSum(FLeistung_BW_P10_1_db256.AsFloat, WeightSum_P10_1, WeightDelta_P10_1);
. . .
end;
или однократным присвоением локальной переменной:
Код: (delphi)
procedure CalcWeightSum(FLeistung: TM_Variable; var WeightSum, WeightDelta: TM_Variable);
var aFLeistung: single;
begin
   aFLeistung := FLeistung.AsFloat;
   // 1. Проверяем, входят ли текущие показания в допустимый диапазон
   if (0 <= aFLeistung) and (aFLeistung <= MaxLimit) then
. . .
end;

Дальнейшие проверки определятся уже из методики обнаружения отсутствия записи.


                                             Добавлено 26.09.2026.

P.S. Замечания по алгоритму скрипта и (в случае архивирования данных) использование функций для работы с архивом. Правило для вышедших за границы значений:
- принимает граничное значение. Архивирование переменной с применением фильтра "Фильтр мин. макс.", функции работы с архивом будут выдавать правильный результат;
- принимает предыдущее значение или игнорируется. Архивирование дополнительной переменной после соответствующей фильтрации. функции работы с архивом будут выдавать правильный результат;
- принимает предыдущее значение. В скрипте необходимо перенести суммирование за условное выражение, а само условное выражение оставить только для корректных значений;
- игнорируется. Как это сделано в скрипте. Появление игнорируемых входных значений приведёт к искажению результата в сторону уменьшения, т.к. [за период 3600 сек] суммируется меньшее число отсчетов. Т.е. для каждой переменной необходим счётчик числа корректных значений. Для правильного результата применяется повышающий коэффициент 3600/<значение счетчика>.
« Изменён: 27 Сентября 2026, 04:10:18 от pan2000 »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1428
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1688 : 25 Сентября 2026, 23:49:01 »
Здравствуйте.

Цитировать
Существует скрипт который исполняется раз в секунду, данные накапливаются и выводятся в рапорт, но столкнулся с проблемой что запись в переменные накопления происходят не у всех.
1. В первую очередь нужно проверить журнал сервера Simple-Scada, в нем могут содержаться ошибки выполнения скрипта или другие ошибки, которые подскажут причину проблемы.
2. Нужно проверять выполнение условий скрипта для проблемных переменных. Например, можно записывать в лог (Log_Add) все значения, участвующие в условиях по проблемным переменным и затем анализировать лог на выполнение условий скрипта.
3. Если требуется вычислять суммарную величину (например расход воды, расход электроэнергии и т.д.) по мгновенным значениям, то это можно реализовать без скриптов используя вычисление интеграла. В отчете нужно создать периодический источник данных и добавить в этот источник переменную расхода с типом обработки "Интеграл". В результате будет получен накопленный расход.

Вы можете прислать текущую версию Вашего проекта и целиком папку с логами на support@simple-scada.com. После проверки проекта и логов, возможно сможем дать дополнительные комментарии.

AndreyA

  • Новичок
  • *
  • Сообщений: 47
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1689 : 30 Сентября 2026, 09:56:12 »
Коллеги,
Благодарю за помощь!
Все верно требуется подсчет  количества материала и сделал как предложили - считать с помощью интеграла. Все работает.