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

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

Victor_P.

#690
lipvasko, UTF8Copy

nwb

Добрый день!
Возник вопрос как можно реализовать следующую функционал:
Имеется определённое количество двигателей с каждым из которых связано по 2-3 переменных: ток, частота, температура, например.
Как можно сделать так, что бы была одна универсальная таблица, а параметры отображаемые в ней, зависели от конкретно выбранного насоса?

Олег Печёнов

#692
Добрый день,

Как при наступлении определенных условий проиграть несколько звуковых файлов подряд?
Код: pascal
if temp100.value = 10 then
  begin
    PlayUserSound("brew",'1.ogg',false);
    PlayUserSound("brew",'2.ogg',false);
    PlayUserSound("brew",'3.ogg',false);
  end; 
 
при таком написании воспроизводится только файл 3.ogg

Timothy Clement

#693
Цитата: Олег Печёнов от 16 августа 2018, 11:59:22как при наступлении определенных условий проиграть несколько звуковых файлов подряд?
Самый простой вариант - в программе вроде Wave editor соедините все 3 файла в 1, вставьте тишину между звуками нужной длины и сохраните как 1 файл .ogg

Simple_Scada

#694
Здравствуйте!

Цитата: nwb от 16 августа 2018, 11:22:04Добрый день!
Возник вопрос как можно реализовать следующую функционал:
Имеется определённое количество двигателей с каждым из которых связано по 2-3 переменных: ток, частота, температура, например.
Как можно сделать так, что бы была одна универсальная таблица, а параметры отображаемые в ней, зависели от конкретно выбранного насоса?

Если переменные имеют однотипные имена, то можно, например при клике по насосу подменять переменные в ячейках таблицы на нужные, при помощи функции GetVariableByName. Пример скрипта подмены переменных у объектов можно найти по ссылке. По аналогии можно подменять переменные в ячейках таблицы:

Код: pascal
begin
  { берём ячейку на пересечении первого столбца и первой строки и 
     привязываем к ней переменную MyVariable }
  Table1.GetCell(0, 0).Variable := MyVariable;
end.

lipvasko

Добрый день , опыта по запросам с базы данных нет ,а реализовать надо ,что пробую - особо не выходит, в общем проблема в следующем , необходимо взять 30 последних значений, одного тэга из БД,   со временем  записи  и вставить в таблицу, соответственно значение тега и времени записи. Заранее спасибо.

Victor_P.

#696
lipvasko, это вопрос больше по SQL (а конкретно по его реализации в MySQL и документации по нему море), чем по simple-scada.
Думаю, запрос должен выглядеть как-то так:
Код: pascal
SELECT date, value FROM table ORDER BY date DESC LIMIT 30

Simple-Scada

Цитироватьнеобходимо взять 30 последних значений, одного тэга из БД,   со временем  записи  и вставить в таблицу, соответственно значение тега и времени записи.
Здравствуйте. Как было отмечено выше -этот вопрос касается работы с SQL-запросами, а не Simple-Scada. Примеры подобных запросов можно найти в интернете. Быстро проверить выполнение и получить результаты запросов можно через MySQLWorkbench. Когда запрос создан и выполняет свои функции достаточно подставить его в скрипт Simple-Scada. Пример под Вашу задачу:
Код: pascal
var
  aQuery: string;
begin
  { формируем SQL-запрос в переменную aQuery }
  aQuery := 'SELECT * FROM (' +
    'SELECT `timestamp`, `value` FROM `trends_data`' + 
    'WHERE id=1' + 
    'ORDER BY `timestamp` DESC LIMIT 30' + 
  ') AS Q ORDER BY `timestamp` ASC;';

  { выполняем запрос aQuery и выводим результат в таблицу Table1 }
  Table1.RunSQL(aQuery, tsSaveFixRow);
end.
В примере производится выборка архивных данных переменной с id=1.

lipvasko

Добрый день , начал плотно заниматься скадой  и возникли вопросы
1) Глюк с AND т.е если я использую в условии связку   тэгов  инт=число  анд булл = фалсе ------ ошибка
2) если  я использую связку только по булам    a.value = false and b.value =true  -----ошибка
понимает так   a.value = false and b.AsBool =true
3) и самое не понятное - которое убило у меня пол дня , если два булевых тяга обрабатывать как условия через and , то происходит двойное выполнение условия , а если  их обрабатывать , последовательно , то все нормально
т.е  if  a=true and b= false then    глючит
     if a=true then     работает как надо
       if b =false then


Simple-Scada

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

Никаких глюков нет, Вы забыли про скобки:
Код: pascal
var
  I: Integer;
  B: Boolean;
begin
  if (I = 0) and (B = false) then
  begin

  end;

  if (myVar1.Value = false) and (myVar2.Value = true) then
  begin

  end;
end.
Если скобки не указывать, например: "if a=true and b= false then", то сначала вычислится правая часть выражения, т.е. "true and b=false" (он будет true, если b=false, иначе результат будет false), затем результат сравнится с "a".

Genrosol

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

1. Вопрос касательно механизма работы окон в Simple-Scada, в частности примера "Подмены переменных у объектов" https://simple-scada.com/help/script/index.html?varsubs.html.
Допустим у нас имеется несколько клиентов. На одном клиенте пользователь нажал на некий объект "Valve1", при этом произошел вызов окна "ValveWindow" с подменой переменных "Valve1_Cmd", "Valve1_Status", "Valve1_Mode". В это же время на другом клиенте пользователь нажал на объект "Valve2" и вызвал то же окно "ValveWindow" с подменной соответствующих переменных. Что будет отображаться в окнах на каждом клиенте: окно с переменными для "Valve2", или для каждого клиента свой экземпляр окна?

2. Не планируется ли добавить возможность привязки к объектам произвольное количество переменных, а не только основную переменную и дополнительную (подмена переменных у объектов - способ интересный, но усложняет процесс наладки в крупных АСУ ТП).

3. На форуме неоднократно поднимался вопрос о возможности группировки объектов или создания шаблонов. Ведутся ли работы по данному направлению?

Заранее спасибо, очень приятно работать с Simple-Scada!

Simple_Scada

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

ЦитироватьВопрос касательно механизма работы окон в Simple-Scada, в частности примера "Подмены переменных у объектов" https://simple-scada.com/help/script/index.html?varsubs.html.
Допустим у нас имеется несколько клиентов. На одном клиенте пользователь нажал на некий объект "Valve1", при этом произошел вызов окна "ValveWindow" с подменой переменных "Valve1_Cmd", "Valve1_Status", "Valve1_Mode". В это же время на другом клиенте пользователь нажал на объект "Valve2" и вызвал то же окно "ValveWindow" с подменной соответствующих переменных. Что будет отображаться в окнах на каждом клиенте: окно с переменными для "Valve2", или для каждого клиента свой экземпляр окна?
Если второй пользователь нажал объект позже, то у обоих будет отображаться окно с переменными для "Valve2". Подмена переменных происходит одновременно на всех клиентах - в примере имеется соответствующее предупреждение об этом. Поэтому, если клиентов несколько, то использовать подмену переменных следует с  осторожностью или не использовать вообще для избежания ситуаций, подобных описанной Вами.

По вопросам 2,3: мы планируем добавить поддержку шаблонных объектов, функции импорта и экспорта объектов между проектами. Какой-то определенный срок появления таких возможностей сейчас назвать сложно. Возможно, данные функции будут добавлять поэтапно.

Genrosol

ЦитироватьПодмена переменных происходит одновременно на всех клиентах - в примере имеется соответствующее предупреждение об этом.
Невнимательно прочитал, так вопроса бы не возникло.
Получается подменять переменные в моем случае нельзя, но и для каждого объекта делать отдельное окно считаю очень затратным.
Попробую создать несколько экземпляров одного и того же окна (ValveWindow1, ValveWindow2 ...) и соответствующие переменные состояния каждого окна (активно окно или не активно). По нажатию на объект скриптом открывать свободное (не активное) окно. В случае, если все окна активны, закрывать одно из окон.

ЦитироватьПо вопросам 2,3: мы планируем добавить поддержку шаблонных объектов, функции импорта и экспорта объектов между проектами. Какой-то определенный срок появления таких возможностей сейчас назвать сложно. Возможно, данные функции будут добавлять поэтапно.
Главное, что это планируется.
Лично я в Simple-Scada (и не только в ней) очень редко использую готовые решения (например, объект "Заслонка" и его параметры "Ручной режим", "Открывается", "Авария", "Обслуживается"), все равно приходится реализовывать динамику через собственные скрипты (даже для такого объекта, как "Поле"). В связи с этим хотелось бы видеть какие-либо инструменты, позволяющие создавать пользовательские объекты.

ООО "БЛС инжинеринг"

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

Подскажите как можно сделать скрипт под задачу типа калькулятора.
Прилагаю схему для понятия задачи.

Simple-Scada

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

Т.е. результат деления двух локальных переменных нужно записать во внешнюю переменную? Допустим локальные переменные называются vrA (целое) и vrB (вещественное). Переменная с OPC-сервера имеет имя vrOPC (целое). Тогда код будет таким:
Код: pascal
begin
  { здесь функция Round используется для округления результата деления до целого числа }
  vrOPC.Value := Round(vrA.Value / vrB.Value);
end.