Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

pan2000

Цитата: aleks218 от 15 ноября 2018, 23:49:16Здравствуйте!
Не подскажите как из  скрипта для кнопки получить значение Tag(дополнительной переменной) подстраницы на которой находится эта кнопка .Скрипт должен быть универсальным без явного прямого обращения   

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

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

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

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


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


aleks218

Спасибо за ответ по поводу дополнительного тега под страницы!
Замысел заключался в необходимости отслеживания нажатия кнопки на определённой под странице.

kolya_asu

#767
Цитата: Simple-Scada от 12 ноября 2018, 14:21:09Здравствуйте.

См. функции для работы с битами. Разбивать на биты лучше всего в скрипте по изменению переменной.
Код: pascal
begin
  Var1.Value := GetBit(VarName.AsInt, 0); // получить значение 1-ого бита переменной "VarName"    
end.
Здравствуйте. Попробовал повторить скрипт, но он почему то не работает. Что я сделал не правильно? Посмотрите пожалуйста.
Код: pascal
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.  

Timothy Clement

#768
Добрый день! Помогите разобраться почему не работают функции работы с архивом.
Задача такая - получить по данным из архива разницу между минимальным и максимальным значением переменной за промежуток времени и результат занести в таблицу.
Архив заполнен случайными значениями переменной от 0 до 1000 (для теста), начальное время берётся из объекта календарь (переменная StartT):
Код: pascal
  // Заполнение суточной таблицы получасовыми отрезками
  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-запросами, но там я получу все значения за сутки например, как потом из получасовых отрезков получить разность значений?

Simple-Scada

kolya_asu, в приведённом Вами коде берутся первые пять битов переменной MI120_Alarms и расставляются в переменные IntVar_1..IntVar_5 соответственно. Чтобы данный код работал, он должен находиться в скрипте с типом события "Изменились переменные". Если скрипт не выполняется, значит либо переменная MI120_Alarms не изменяется, либо вы забыли добавить эту переменную в список переменных скрипта (кнопка Выбрать переменные).

Timofei, все верно, ведь функции для работы с архивом выполняются асинхронно в отдельном потоке, т.к. они "тяжелые" и могут работать с произвольным кол-вом данных + у пользователей разные по производительности ПК. Вот код с комментариями:
Код: pascal
...
  { здесь мы запускаем вычисление архивного значения. Когда вычисления будут завершены, 
    результаты запишутся в переменные 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

#770
Цитата: Simple-ScadaПоэтому правильнее было бы связать ячейки таблицы с переменными EnergyAin и EnergyAout, тогда скада сама отобразит их значения после завершения вычислений
Спасибо за разъяснение, переделал с перемеными в ячейках, всё работает как надо

p001p

День добрый.
Ситуация очень простая, но поставила в тупик.

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

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

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

Simple-Scada

Здравствуйте.

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

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

Labotrays

отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(

asutpvit

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

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

Timothy Clement

Цитата: Labotrays от 13 декабря 2018, 06:42:08отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(
У кнопки есть выбор типа "С фиксацией", этого недостаточно чтобы сделать переключатель?

Цитата: asutpvit от 13 декабря 2018, 08:30:10Добрый день, прошу подсказки:
как сделать фильтрацию антидребезга контактов с настраиваемым периодом с помощью скрипта.

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

asutpvit

Цитата: Timofei от 13 декабря 2018, 08:46:03Сомнительно что это на скаде получиться реализовать, скада обновляет значение тега с заданным интервалом (1 сек по-умолчанию). Можно конечно попробовать сделать скрипт изменились переменные и по ней запускать таймер, но я таймера не применял никогда, не совсем понятно из хелпа как они работают.
Ну и я о том же, нужно видеть что повторяется включение, запустить таймер (с возможностью менять его значение) и если по прошествии заданного времени условие сохраняется - повторить включение.

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

Labotrays

#777
делается для операторов бабулек и высока вероятность принять включено за включить.

Timothy Clement

#778
Цитата: Labotrays от 13 декабря 2018, 10:16:24делается для операторов бабулек и высока вероятность принять включено за включить.

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


asutpvit

Цитата: Labotrays от 13 декабря 2018, 06:42:08отсутствует объект переключатель, поэтому с помощью двух кнопок хочу сделать аналог переключателя, но в скриптах не нашел как задать состояние кнопки, прочитать можно, а задать нет(
чем Вас кнопка с фиксацией не устраивает? и в ней же как выше посоветовали выбираете цвет индикации состояния.
Если только нужно использовать кнопки без фиксации - то кнопку делаем прозрачной и подкладываем фигуру в размер кнопки с изменением фона по условию изменения доп переменной ( состояния кнопки). Оба варианта использую - так же операторы из "умных"