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

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

Simple-Scada

ЦитироватьЗначение первой константы будет вычисляться при каждом обращении к ней из скрипта, или только один раз, или как?
Один раз.

Функция RGB это одна из встроенных в компилятор функций, которая описана в руководстве по ссылке. Поэтому не нужно писать собственную функцию. Также нужно учитывать, что переменные цветов в скаде имеют тип данных Cardinal. Ещё цвета можно указывать в шестнадцатеричном виде:
Код: pascal
interface

const
  CLR_LED_ON1: Cardinal = RGB(67, 67, 67);
  CLR_LED_ON2: Cardinal = $434343;

implementation

end.

niyaz

Здравствуйте.
Хотелось бы узнать можно ли через скрипт снять выделение строки ? Например: пользователь выбрал строку в таблице нажал на кнопку, скрипт сработал, выделение строки в таблице снялось. Это необходимо, чтобы пользователь заново выбрал необходимую ему строку в таблице и значения переменных перезаписались.
Спасибо.

Simple-Scada

Здравствуйте.
Такой возможности нет. Выделение может снять только пользователь.

strs

Здравствуйте! Подскажите, есть ли возможность исследовать признак качества переменной? Например, мы считываем отдельные биты из word-переменной из OPC-сервера во внутренние булевы переменные. Нужно, чтобы если качество исходной переменной "бэд",  то и у внутренних выставлялось "бэд".

msigx680

#1219
Здравствуйте! Подскажите как правильно решить задачу:
Считываю данные из счетчика Эл. Энергии в тренд, как писать в тренд с учетом коэффициента трансформации, т.е. значение переменной умножить на число и его уже писать в тренд?

Simple_Scada

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

ЦитироватьНужно, чтобы если качество исходной переменной "бэд",  то и у внутренних выставлялось "бэд".
Так сделать не получится. Качество переменной недоступно для изменения. Можно разложить переменную на биты в OPC-сервере и считывать в скаду отдельные битовые переменные, тогда качество этих переменных всегда будет соответствовать качеству на OPC-сервере.

Цитироватькак писать в тренд с учетом коэффициента трансформации, т.е. значение переменной умножить на число и его уже писать в тренд?
Для этого нужно создать новую внутреннюю переменную, в скрипте произвести необходимые вычисления с исходной переменной и записать результат во внутреннюю переменную. У внешней переменной архивацию выключить, а у внутренней включить и использовать ее в трендах. Универсальный скрипт для подобной задачи можно применить если переменные, в которые нужно записывать рассчитываемые значения будут иметь однотипные имена, например исходная переменная имеет имя "Var1", а пересчитанная переменная имеет имя "Var1_Calc" и т.д. Тогда в скрипте можно использовать поиск переменной по имени через GetVariableByName. В этом случае, можно создать скрипт с типом события "Изменились переменные", добавить в список скрипта нужные переменные, которые требуется умножать на коэффициент и написать такой универсальный скрипт:
Код: pascal
var
  aVar: TM_Variable;
begin
  { ищем переменную, в которую нужно записать преобразованное значение }
  aVar := GetVariableByName(Variable.Name + '_Calc');

  { если переменная найдена, то записать в нее значение переменной умноженное на коэффициент }
  if aVar <> nil then
    aVar.Value := Variable.Value * 0.89;
end.
, где 0.89 - это коэффициент, на который нужно умножить переменную, Variable - переменная, изменение которой привело к выполнению скрипта.

metamorphogenesis

подскажите, возможно ли из скрипта получить доступ к массиву timeTrends[] временного тренда, размещенного в шаблонном окне?


В шаблон передается слово состояния и в трендвьювере на каждый бит предусмотрен график. Хотелось бы, открыв шаблон, иметь возможность в этом окне прятать/показывать каждый график, привязанный к соответствующему биту слова.


Если это можно решить отличным от скрипта способом, подскажите, пожалуйста, как именно. Спасибо

pan2000

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

Цитата: metamorphogenesis от 08 июля 2021, 21:53:56подскажите, возможно ли из скрипта получить доступ к массиву timeTrends[] временного тренда, размещенного в шаблонном окне?
Для управления видимостью трендов, расположенного в шаблонном окне объекта "Временные тренды", можно привязать подстановку управляющей переменной к основной или дополнительной переменной объекта.
Скрипт по изменению переменной:
Код: pascal
var i: integer;
begin
  with Sender as TM_TimeTrendViewer do
    for i := 0 to TimeTrendsCount -1 do TimeTrends[i].Visible := GetBit(AsInt,i);  // или NOT GetBit...
end.
.
Во вложении пример шаблонного окна с управлением видимостью трех трендов.

metamorphogenesis

#1223
Большое спасибо, сейчас затестю :)


@тестирует


UPD. Работает чётенько, как и задумано. Еще раз спасибо!

vaarman

#1224
Здравствуйте!
Прошу помочь разобраться с работой функции setbit
Имеется следующий код
Код: pascal
var
  VarNm: Variant;    //объявляем внутренние переменные
  dwStatus: Int64;  //объявляем внутренние переменные
  dwCmd: Int64;    //объявляем внутренние переменные

begin

  if not (Sender is TM_Object) then   // если скрипт вызван не объектом, то прерываем выполнение
    Exit;
  with (Sender as TM_Object) do

    VarNm := TM_Object(Sender).Variable.Name;     // получаем имя переменной, которая привязана к этому объекту

    dwStatus:= GetVariableByName('GV_' + VarNm + '_dwStatus').Value; //ищем переменную  с именем 'GV_' + VarNm + '_dwStatus' и получаем ее значение (переменная из OPC сервера типа longword)
    dwCmd:= GetVariableByName('GV_' + VarNm + '_dwCmd').Value;  //ищем переменную  с именем  'GV_' + VarNm + '_dwCmd' и получаем ее значение (переменная из OPC сервера типа longword)

     if  GetBit(dwStatus, 5) = true  then       //проверяем, если 5 бит переменной dwStatus равен единице, то
    dwCmd:=SetBit(dwCmd,  1, True);        // устанавливаем 1 бит переменной dwCmd в единицу
end.
 

Так вот, все работает корректно ровно до момента  dwCmd:=SetBit(dwCmd,  1, True). То есть считываются значения правильно, но не записывает нужный мне бит. Может связано с приведением типов переменных? Может подскажите, заранее спасибо

Simple Scada

#1225
Здравствуйте.
 
Код: pascal
var
  VarNm: Variant;
  dwStatus, dwCmd: TM_Variable;
begin
  if not (Sender is TM_Object) then   // если скрипт вызван не объектом, то прерываем выполнение
    Exit;

  VarNm := TM_Object(Sender).Variable.Name;     // получаем имя переменной, которая привязана к этому объекту
  dwStatus:= GetVariableByName('GV_' + VarNm + '_dwStatus'); //ищем переменную  с именем 'GV_' + VarNm + '_dwStatus'
  dwCmd:= GetVariableByName('GV_' + VarNm + '_dwCmd');  //ищем переменную  с именем  'GV_' + VarNm + '_dwCmd'
 
  if (dwStatus <> nil) and (dwCmd <> nil) and (GetBit(dwStatus.Value, 5))  then    //если переменные существуют, и 5 бит переменной dwStatus равен единице, то
    dwCmd.Value := SetBit(dwCmd.AsInt64,  1, True);        // устанавливаем 1 бит переменной dwCmd в единицу
end.

vaarman

#1226
Спасибо за подсказку!

metamorphogenesis

#1227
Добрый день. У меня два вопроса.


1. На двух клиентах разный интервал мигания, проект один. На дальнем ТВ правильно.
https://dropmefiles.com/YidkO


2. команды
Код: pascal
    CloseApplicationClient(getClientName);  
    MinimizeApplicationClient(getClientName);  
применяются ко всем открытым клиентам. Каждая команда размещена в своем отдельном скрипте, который привязан к событию онклик кнопки.

Simple-Scada

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

ЦитироватьНа двух клиентах разный интервал мигания, проект один. На дальнем ТВ правильно.
Если Вы используете процедуру смены частоты мигания "SetFlashInterval", то причина нам известна и теперь устранена.

Цитироватьприменяются ко всем открытым клиентам. Каждая команда размещена в своем отдельном скрипте, который привязан к событию онклик кнопки.
Вероятно у Вас клиенты имеют одинаковые имена. Задайте на разных клиентах разные имена через утилиту настроек. Второй вариант - Вы вызываете getClientName в скрипте который выполняется сервером, что неправильно (см. описание функции в руководстве). Также непонятно, зачем Вы вызываете "CloseApplicationClient" два раза. Достаточно одного раза.

metamorphogenesis

#1229
Блин,  это я хотел одну команду переименовать в минимайз и позабыл

Скрипт привязан к событию onClick, как я написал.

Попробую настроить имя клиента.


@пробует настроить имя

Да, имя по умолчанию пустое на всех клиентах, потому и так. Спасибо, переименование клиентов в настроках решило проблему.