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

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

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

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3195
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1215 : 21 Мая 2021, 20:59:24 »
Цитировать
Значение первой константы будет вычисляться при каждом обращении к ней из скрипта, или только один раз, или как?
Один раз.

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

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

implementation

end.

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1216 : 30 Мая 2021, 12:53:21 »
Здравствуйте.
Хотелось бы узнать можно ли через скрипт снять выделение строки ? Например: пользователь выбрал строку в таблице нажал на кнопку, скрипт сработал, выделение строки в таблице снялось. Это необходимо, чтобы пользователь заново выбрал необходимую ему строку в таблице и значения переменных перезаписались.
Спасибо.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3195
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1217 : 01 Июня 2021, 10:45:29 »
Здравствуйте.
Такой возможности нет. Выделение может снять только пользователь.

strs

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1218 : 01 Июля 2021, 22:59:22 »
Здравствуйте! Подскажите, есть ли возможность исследовать признак качества переменной? Например, мы считываем отдельные биты из word-переменной из OPC-сервера во внутренние булевы переменные. Нужно, чтобы если качество исходной переменной "бэд",  то и у внутренних выставлялось "бэд".

msigx680

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1219 : 02 Июля 2021, 19:08:42 »
Здравствуйте! Подскажите как правильно решить задачу:
Считываю данные из счетчика Эл. Энергии в тренд, как писать в тренд с учетом коэффициента трансформации, т.е. значение переменной умножить на число и его уже писать в тренд?
« Изменён: 02 Июля 2021, 19:11:43 от msigx680 »

Simple_Scada

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

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

Цитировать
как писать в тренд с учетом коэффициента трансформации, т.е. значение переменной умножить на число и его уже писать в тренд?
Для этого нужно создать новую внутреннюю переменную, в скрипте произвести необходимые вычисления с исходной переменной и записать результат во внутреннюю переменную. У внешней переменной архивацию выключить, а у внутренней включить и использовать ее в трендах. Универсальный скрипт для подобной задачи можно применить если переменные, в которые нужно записывать рассчитываемые значения будут иметь однотипные имена, например исходная переменная имеет имя "Var1", а пересчитанная переменная имеет имя "Var1_Calc" и т.д. Тогда в скрипте можно использовать поиск переменной по имени через GetVariableByName. В этом случае, можно создать скрипт с типом события "Изменились переменные", добавить в список скрипта нужные переменные, которые требуется умножать на коэффициент и написать такой универсальный скрипт:
Код: (delphi)
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

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1221 : 08 Июля 2021, 21:53:56 »
подскажите, возможно ли из скрипта получить доступ к массиву timeTrends[] временного тренда, размещенного в шаблонном окне?


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


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

pan2000

  • Постоялец
  • ***
  • Сообщений: 216
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1222 : 09 Июля 2021, 09:56:15 »
    Здравствуйте.

подскажите, возможно ли из скрипта получить доступ к массиву timeTrends[] временного тренда, размещенного в шаблонном окне?
Для управления видимостью трендов, расположенного в шаблонном окне объекта "Временные тренды", можно привязать подстановку управляющей переменной к основной или дополнительной переменной объекта.
Скрипт по изменению переменной:
Код: (delphi)
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

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1223 : 09 Июля 2021, 10:10:50 »
Большое спасибо, сейчас затестю :)


@тестирует


UPD. Работает чётенько, как и задумано. Еще раз спасибо!
« Изменён: 09 Июля 2021, 16:05:10 от Simple_Scada »

vaarman

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1224 : 10 Июля 2021, 14:01:10 »
Здравствуйте!
Прошу помочь разобраться с работой функции setbit
Имеется следующий код
Код: (delphi)
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). То есть считываются значения правильно, но не записывает нужный мне бит. Может связано с приведением типов переменных? Может подскажите, заранее спасибо
« Изменён: 11 Июля 2021, 10:15:53 от Simple_Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 271
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1225 : 10 Июля 2021, 22:12:00 »
Здравствуйте.
 
Код: (delphi)
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.
« Изменён: 12 Июля 2021, 11:55:52 от Simple-Scada »

vaarman

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1226 : 11 Июля 2021, 00:36:20 »
Спасибо за подсказку!
« Изменён: 11 Июля 2021, 10:14:59 от Simple_Scada »

metamorphogenesis

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1227 : 12 Июля 2021, 16:01:33 »
Добрый день. У меня два вопроса.


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


2. команды
Код: (delphi)
    CloseApplicationClient(getClientName);  
    MinimizeApplicationClient(getClientName); 
применяются ко всем открытым клиентам. Каждая команда размещена в своем отдельном скрипте, который привязан к событию онклик кнопки.
« Изменён: 27 Июля 2021, 11:04:44 от metamorphogenesis »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3195
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1228 : 15 Июля 2021, 22:41:18 »
Здравствуйте.

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

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

metamorphogenesis

  • Пользователь
  • **
  • Сообщений: 58
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1229 : 16 Июля 2021, 16:08:18 »
Блин,  это я хотел одну команду переименовать в минимайз и позабыл

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

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


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

Да, имя по умолчанию пустое на всех клиентах, потому и так. Спасибо, переименование клиентов в настроках решило проблему.
« Изменён: 20 Июля 2021, 09:39:10 от metamorphogenesis »