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

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

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

pan2000

  • Постоялец
  • ***
  • Сообщений: 225
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #765 : 17 Ноября 2018, 04:04:58 »
Здравствуйте!
Не подскажите как из  скрипта для кнопки получить значение Tag(дополнительной переменной) подстраницы на которой находится эта кнопка .Скрипт должен быть универсальным без явного прямого обращения   

Получить пары: <тэг текущей подстраницы> - <тэг объекта> можно следующими способами:

1. Разделить собственный тэг объекта на два поля: <тэг подстраницы><тэг объекта> с учетом количества объектов и подстраниц. 
Скрипт для десятичного представления тэга (до 100 объектов): <тэг подстраницы> * 100 + <тэг объекта>
Код: (delphi)
var
  aName: string;
  aTagPage: string;
begin
  . . .
  aName := IntToStr(Sender.Tag div 100);
  aTagPage := IntToStr(Sender.Tag mod 100);
  . . .
end.

2. Использование переменной для хранения тэга текущей подстраницы iTagPage.
   Скрипты для отслеживания перемещения по страницам/подстраницам:
   Событие "Пользователь перешел на эту страницу/подстраницу":
Код: (delphi)
begin
// для подстраницы - установить ее тэг, для страницы - восстановить тэг подстраницы, открытой последней на этой странице
  iTagPage.Value := Sender.Tag;
end.
   Событие "Пользователь покинул эту страницу":
Код: (delphi)
begin
  Sender.Tag := iTagPage.AsInt;    // запомнить тэг подстраницы, открытой последней на этой странице
    Начальные значения:
Тэг страницы равен тэгу первой подстраницы.
Начальное значение переменной iTagPage равно тэгу первой подстраницы первой страницы.

Пример для объектов типа Text (2 в 1: управление - индикация) во вложении.


P.S. На мой взгляд задавать вопрос "как сделать" следует в отдельной теме (поиск по названию темы, ответы в одном месте,
возможность продолжения).


aleks218

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #766 : 17 Ноября 2018, 22:56:29 »
Спасибо за ответ по поводу дополнительного тега под страницы!
Замысел заключался в необходимости отслеживания нажатия кнопки на определённой под странице.

kolya_asu

  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #767 : 03 Декабря 2018, 04:03:16 »
Здравствуйте.

См. функции для работы с битами. Разбивать на биты лучше всего в скрипте по изменению переменной.
Код: (delphi)
begin
  Var1.Value := GetBit(VarName.AsInt, 0); // получить значение 1-ого бита переменной "VarName"   
end.
Здравствуйте. Попробовал повторить скрипт, но он почему то не работает. Что я сделал не правильно? Посмотрите пожалуйста.
Код: (delphi)
begin
  IntVar_1.Value := GetBit(MI120_Alarms.AsInt, 0);
  IntVar_2.Value := GetBit(MI120_Alarms.AsInt, 1);
  IntVar_3.Value := GetBit(MI120_Alarms.AsInt, 2);
  IntVar_4.Value := GetBit(MI120_Alarms.AsInt, 3);
  IntVar_5.Value := GetBit(MI120_Alarms.AsInt, 4);
end. 
« Изменён: 04 Декабря 2018, 10:31:07 от Simple-Scada »

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #768 : 03 Декабря 2018, 14:16:08 »
Добрый день! Помогите разобраться почему не работают функции работы с архивом.
Задача такая - получить по данным из архива разницу между минимальным и максимальным значением переменной за промежуток времени и результат занести в таблицу.
Архив заполнен случайными значениями переменной от 0 до 1000 (для теста), начальное время берётся из объекта календарь (переменная StartT):
Код: (delphi)
  // Заполнение суточной таблицы получасовыми отрезками
  if chbValue_2.Value = 1 then
    begin
      tbl_Ed.Visible := True;
      tbl_Ed.Caption := tblCapt;
      et := StartT;                   
      st := IncMinute(StartT,-30);  // Начало периода
        for i:=1 to 48 do
          begin
            st := IncMinute(st,30);
            et := IncMinute(et,30);
            ArchiveMin(EnergyAin_1,EnergyAin,st,et);
            ArchiveMax(EnergyAin_1,EnergyAout,st,et);
            tbl_Ed.Columns[0].Cells[i].Text := DateTimeToStr(st)+ ' - ' +TimeToStr(et);
            tbl_Ed.Columns[1].Cells[i].Text := FloatToStr(EnergyAout.Value-EnergyAin.Value);
          end;
    end;

Таблица заполняется нулями, хотя данные в архиве есть. Переменная EnergyAin_1 с ID = 8 в проекте архивируется, в Workbench данные записаны, все скрины во вложении.
Пробовал Average, Integral просто минимальное за период - всегда нули.
Scada версии Demo-Time 2.3.2

UPD. Пробовал сделать просто вывод в окна минимального и максимального значения за период с 12:10 по 12:40. Значения выводит верно, разность считает только при повторном выполнении скрипта. Почему в цикле не берёт значения из архива непонятно, подскажите куда копать или вообще может по-другому сделать? Думал о варианте с SQL-запросами, но там я получу все значения за сутки например, как потом из получасовых отрезков получить разность значений?
« Изменён: 04 Декабря 2018, 09:53:07 от Timofei »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3210
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #769 : 04 Декабря 2018, 10:47:37 »
kolya_asu, в приведённом Вами коде берутся первые пять битов переменной MI120_Alarms и расставляются в переменные IntVar_1..IntVar_5 соответственно. Чтобы данный код работал, он должен находиться в скрипте с типом события "Изменились переменные". Если скрипт не выполняется, значит либо переменная MI120_Alarms не изменяется, либо вы забыли добавить эту переменную в список переменных скрипта (кнопка Выбрать переменные).

Timofei, все верно, ведь функции для работы с архивом выполняются асинхронно в отдельном потоке, т.к. они "тяжелые" и могут работать с произвольным кол-вом данных + у пользователей разные по производительности ПК. Вот код с комментариями:
Код: (delphi)
...
  { здесь мы запускаем вычисление архивного значения. Когда вычисления будут завершены,
    результаты запишутся в переменные EnergyAin и EnergyAout }
  ArchiveMin(EnergyAin_1, EnergyAin, st, et);
  ArchiveMax(EnergyAin_1, EnergyAout, st, et);
  { и сразу же, не дожидаясь завершения вычислений (ведь они могут занять сколько угодно
    времени), переходим к выполнению следующих строк скрипта }

  { здесь в переменных EnergyAin и EnergyAout всё ещё будут нули, т.к. вычисления архивных функций
    ещё не завершены }
  tbl_Ed.Columns[0].Cells[i].Text := DateTimeToStr(st)+ ' - ' +TimeToStr(et);
  tbl_Ed.Columns[1].Cells[i].Text := FloatToStr(EnergyAout.Value-EnergyAin.Value);
...
Поэтому правильнее было бы связать ячейки таблицы с переменными EnergyAin и EnergyAout, тогда скада сама отобразит их значения после завершения вычислений

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #770 : 04 Декабря 2018, 11:40:57 »
Цитата: Simple-Scada
Поэтому правильнее было бы связать ячейки таблицы с переменными EnergyAin и EnergyAout, тогда скада сама отобразит их значения после завершения вычислений
Спасибо за разъяснение, переделал с перемеными в ячейках, всё работает как надо
« Изменён: 06 Декабря 2018, 21:08:14 от Simple-Scada »

p001p

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #771 : 05 Декабря 2018, 22:43:31 »
День добрый.
Ситуация очень простая, но поставила в тупик.

Как реализовать скрипт "обратной связи" для модбас значения с ОРС сервера?

Дано:
2 задатчика, локальный и скада.
Устройство которое не имеет никаких средств для хранения значений и сразу "пропускает" значение в логику программы.

Пример работы:
1. На локальном изменили уставку, значение записалось в логику программы и в тэг А (тэг предназначен только для чтения).
2. Скада читает данный тэг А.
3. В самой скаде присутствует тэг В, который осуществляет запись в устройство. При этом, если мы записываем в тэг В, то тэг А остается без именений. И наоборот. Если мы записываем в тэг А, то тэг В остается без изменений.
4. Собственно вопросы по скрипту:
- как сделать проверку значения А==В и запись в тэг В значения тэга А если условие А=!В?

Simple-Scada

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

Цитировать
как сделать проверку значения А==В и запись в тэг В значения тэга А если условие А=!В?
Код: (delphi)
{ если значение тега А не равно значению тега B }
if (A.Value <> B.Value) then
  {  то записываем значение тега А в тег B }
  B.Value := A.Value;

Пример проверки на равенство:
Код: (delphi)
{ если значение тега А равно значению тега B }
if (A.Value = B.Value) then
begin
  // здесь можно расположить свой код
end;

Labotrays

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #773 : 13 Декабря 2018, 06:42:08 »
отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #774 : 13 Декабря 2018, 08:30:10 »
Добрый день, прошу подсказки:
как сделать фильтрацию антидребезга контактов с настраиваемым периодом с помощью скрипта.

Не спрашивайте лучше почему в скаде: просто нужно)
Спасибо заранее

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #775 : 13 Декабря 2018, 08:46:03 »
отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(
У кнопки есть выбор типа "С фиксацией", этого недостаточно чтобы сделать переключатель?

Добрый день, прошу подсказки:
как сделать фильтрацию антидребезга контактов с настраиваемым периодом с помощью скрипта.

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

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #776 : 13 Декабря 2018, 08:52:09 »
Сомнительно что это на скаде получиться реализовать, скада обновляет значение тега с заданным интервалом (1 сек по-умолчанию). Можно конечно попробовать сделать скрипт изменились переменные и по ней запускать таймер, но я таймера не применял никогда, не совсем понятно из хелпа как они работают.
Ну и я о том же, нужно видеть что повторяется включение, запустить таймер (с возможностью менять его значение) и если по прошествии заданного времени условие сохраняется - повторить включение.

управляющим устройством идет модуль МУ210. Принимающим состояние: МВ210 ( в нем еще сейчас включил антидребезг, может и хватит данной манипуляции ;D)

Labotrays

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #777 : 13 Декабря 2018, 10:16:24 »
делается для операторов бабулек и высока вероятность принять включено за включить.
« Изменён: 13 Декабря 2018, 10:37:52 от Simple-Scada »

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #778 : 13 Декабря 2018, 13:51:20 »
делается для операторов бабулек и высока вероятность принять включено за включить.

Так сделайте в выключенном состоянии кнопку зелёного цвета с надписью "Включить", во включённом - красного с надписью "Отключить". Ещё и иконки поставьте информативные, никакая бабуля не спутает 8)

« Изменён: 13 Декабря 2018, 13:56:19 от Timofei »

asutpvit

  • Новичок
  • *
  • Сообщений: 48
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #779 : 13 Декабря 2018, 14:04:05 »
отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(
чем Вас кнопка с фиксацией не устраивает? и в ней же как выше посоветовали выбираете цвет индикации состояния.
Если только нужно использовать кнопки без фиксации - то кнопку делаем прозрачной и подкладываем фигуру в размер кнопки с изменением фона по условию изменения доп переменной ( состояния кнопки). Оба варианта использую - так же операторы из "умных"