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

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

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

Lordhmen

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1530 : 26 Июля 2024, 07:43:02 »
Здравствуйте, спасибо. Пока ждал ответа сам придумал костыль в виде для OnCellDataChangeEx
Код: (delphi)
var
  vVar: TM_Variable;
  rVar: TM_Variable;
begin
  if Cell.Col = 3 then
    vVar := GetVariableByName('T1correct_' + Table1.GetCell(0, Cell.Row).Text + '_V');
    rVar := GetVariableByName('T1correct_' + Table1.GetCell(0, Cell.Row).Text + '_R');
    if Assigned(vVar) and Assigned(rVar) then
      Cell.Variable := vVar;
      Cell.VariableEx := rVar;
end.

И для OnCellDataChange

Код: (delphi)
var
  vVar: TM_Variable;
  rVar: TM_Variable;
begin
  if Cell.Col = 3 then
    vVar := GetVariableByName('T1correct_' + Table1.GetCell(0, Cell.Row).Text + '_V');
    rVar := GetVariableByName('T1correct_' + Table1.GetCell(0, Cell.Row).Text + '_R');
    if Assigned(vVar) and Assigned(rVar) then
      Cell.Variable := rVar;
      Cell.VariableEx := vVar;
end.

Но ваш вариант выглядит симпатичнее, проще и менее костыльно.
По поводу уведомлений о границах, попробую отключать проверку границ при отсутствии передачи из opc сервера (у меня кстати owenOPC server) в томже скрипте где и буду подменять переменные))))
« Изменён: 26 Июля 2024, 11:57:43 от Simple-Scada »

user-ss

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1531 : 07 Августа 2024, 12:35:12 »
Возможно ли в функцию, например GetBit, вместо номера бита передать enums ?
что бы потом не исправлять кучу магических чисел по скриптам

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3160
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1532 : 07 Августа 2024, 15:45:08 »
Цитировать
Возможно ли в функцию, например GetBit, вместо номера бита передать enums?
Чтобы привести перечисление к целочисленному типу, нужно использовать функцию Ord.
Код: (delphi)
interface

type
  TMyEnum = (Zero, One, Two);

implementation

function testOrdEnum: Boolean;
begin
  Result := GetBit(1024, Ord(Two));
end;

end.

Lordhmen

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1533 : 14 Августа 2024, 09:56:01 »
Цитировать
Если в ячейки таблицы требуется выводить значения разных переменных, то можно использовать способ с подменной переменных. Например, можно создать скрипт с типом события "Изменились переменные", добавить в него одну из переменных и по ее качеству выполнять переключение между наборами переменных:
Код: (delphi)
begin
  if Variable.IsGoodQuality then // если качество переменной хорошее,
  begin                          // то используем первый набор переменных
    Table1.GetCell(0, 0).Variable := MyVar_1_1;
    Table1.GetCell(1, 0).Variable := MyVar_2_1;
    Table1.GetCell(2, 0).Variable := MyVar_3_1;
  end else                       // иначе, используем второй набор переменных
  begin
    Table1.GetCell(0, 0).Variable := MyVar_1_2;
    Table1.GetCell(1, 0).Variable := MyVar_2_2;
    Table1.GetCell(2, 0).Variable := MyVar_3_2;
  end;
end.

Здравствуйте, подскажите пожалуйста, а возможно ли создать локальные переменные и изменять их? К примеру у меня есть две переменные, которые я получаю с OPC сервера Var1_R и Var1_V. Я создаю локальную переменную Var1 и именно ее назначаю в ячейку таблице или еще ку да либо. С помощью метода IsGoodQuality проверяем состояние к примеру переменной Var1_R - если все хорошо то Var1 = Var1_R, а если Var1_R не передается, то Var1 = Var1_V. Пробовал подобное написать в скрипте, но не получается.
« Изменён: 14 Августа 2024, 10:27:24 от Simple_Scada »

samum

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1534 : 15 Августа 2024, 15:02:49 »
Здравствуйте.
Возможно ли изменение высоты окна?
Имеется окно аварийных сообщений, при изменении количества сообщений высота окна должна "подстраиваться".
Высоту менял как явно
Код
Window4.H := 200;

так и приращивая
Код
Window4.H := Window4.H + 20;

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1535 : 15 Августа 2024, 17:16:06 »
Здравствуйте.

Цитировать
а возможно ли создать локальные переменные и изменять их? К примеру у меня есть две переменные, которые я получаю с OPC сервера Var1_R и Var1_V. Я создаю локальную переменную Var1 и именно ее назначаю в ячейку таблице или еще ку да либо. С помощью метода IsGoodQuality проверяем состояние к примеру переменной Var1_R - если все хорошо то Var1 = Var1_R, а если Var1_R не передается, то Var1 = Var1_V. Пробовал подобное написать в скрипте, но не получается.
В Simple-Scada существует несколько типов переменных - подробнее см. по ссылке. При необходимости, Вы можете создать внутреннюю переменную и по требуемым условиям записывать в нее значения других переменных. Например:
Код: (delphi)
begin
  MyVar_1.Value := MyVar_2.Value;
end.
, где MyVar_1 это внутренняя пременная, а MyVar_2 внешняя.
 
Но применительно к задаче описанной в Вашем первом сообщении, проще будет выполнять переключение между наборами переменных, как это описано в нашем прошлом ответе.

Цитировать
Возможно ли изменение высоты окна?
Такой возможности нет.

avtzarenko

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1536 : 21 Августа 2024, 15:25:29 »
Добрый день.
Просьба подсказать причину по которой компилятор выдает ошибку
Заполнение таблицы из БД
Написал код, напрямую запрос к БД sql отрабатывает нормально (скрин 211), через компилятор Scada c ошибкой (скрин 210) :(
Код: (delphi)
var
aQuery: string;
begin
 aQuery :=

 'WITH
 RankedData1 (ID, Descr, Value_1, Time_1, Date_1, Rank) AS
 (
 SELECT TOP (35) trends_data.ID  as ID, variables_data.Description   AS Descr, trends_data.Value   as Value_1,  FORMAT(Timestamp ,'hh:mm:ss')  AS Time_1,
 CAST (Timestamp as date) AS Date_1,
 ROW_NUMBER() OVER (PARTITION BY CAST (Timestamp as date), trends_data.ID ORDER BY FORMAT(Timestamp ,'hh:mm:ss'))  AS Rank
 FROM trends_data join variables_data on trends_data.ID = variables_data.ID
 WHERE trends_data.ID in (1619) AND (FORMAT(Timestamp ,'hh:mm:ss') BETWEEN '12:00:00' AND '13:00:00')
 ORDER BY Date_1 desc
 SELECT  Date_1, Time_1, Value_1
 FROM RankedData1WHERE Rank = 1
 ORDER BY Date_1  , ID ,  Time_1';

Table5.RunSQL(aQuery, tsAll);
  end;
end.

И второй вопрос как сделать чтобы данный скрипт исполнялся каждый понедельник?
« Изменён: 21 Августа 2024, 16:02:14 от Simple_Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 246
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1537 : 21 Августа 2024, 16:59:40 »
Здравствуйте.

Запросы для скады не нужно никак менять. Их можно просто подставить в RunSQL в виде строки. Исключение: символы одинарных кавычек (т.к. в скаде одинарные кавычки используются для указания строки) – см. пример по ссылке.

Как видно, Ваш запрос не является строкой, соответственно, такой код работать не будет. В руководстве по ссылке можно ознакомиться с примером переноса строк в длинном SQL-запросе. Т.е. каждая строка Вашего запроса должна быть заключена в одинарные кавычки, и чтобы сложить эти строки, нужно использовать знак "+" в конце каждой строки.

Насколько мы поняли, Вы пытаетесь решить задачу, описанную в этой теме – см. последний ответ от одного из пользователей с возможным вариантом решения.
« Изменён: 22 Августа 2024, 07:06:09 от Simple Scada »

avtzarenko

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1538 : 29 Августа 2024, 09:51:22 »
Добрый день.
Как реализовать отправку только одного тревожного сообщения при достижении границы доп переменной?
основная переменная  - датчик температуры с ОРС
доп. переменная  - граница срабатывания, вручную выставленное значение в поле
Реализовано универсальным скриптом, но сейчас при любом изменении переменной выше доп переменной шлются сообщения
Код: (delphi)
begin
   if Sender is TM_Object then     // проверяем, что Sender это объект
     with Sender as TM_Object do   // приводим Sender к типу "TM_Object"

         if AsSingle >= VariableEx.AsSingle  then
            begin
              Color := clRed;
              AddMessage(Now, mkWarning, Variable.Description + ' превысила ' + Variable.AsStr + ' градуса ', True, True);
            end else

    Color := RGB(191,191,191);

       end.
« Изменён: 29 Августа 2024, 10:02:04 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1539 : 29 Августа 2024, 12:12:22 »
Здравствуйте.

Для этого не требуется использовать скрипты. Можно использовать штатный функционал, задав нужные границы у переменной температуры. При необходимости, границами можно управлять из клиента. Если в качестве границ нужно использовать внешние переменные, то их можно привязать к границам в настройках переменной. Для переменных, у которых включена выдача сообщений о нарушении границ, будут генерироваться автоматические сообщения. Задать формат автоматически генерируемых сообщений можно в настройках проекта.

Чтобы поле отображающее температуру меняло цвет при нарушении границ, у поля должно быть включено свойство "Границы". Тогда при нарушении границ переменной, поле будет автоматически менять цвет.

avtzarenko

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1540 : 29 Августа 2024, 13:41:16 »
Границы переменной не подходят т.к границу срабатывания указываются вручную и они  не постоянные.
Например при розливе виноматериала на тихие вина температура должна быть -3, чтобы получить температуру виноматериала  +6, а для игристого -7 градусов

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1541 : 29 Августа 2024, 15:06:42 »
Цитировать
Границы переменной не подходят т.к границу срабатывания указываются вручную и они  не постоянные.
Если требуется, чтобы оператор указывал границы вручную, то как мы писали выше, используйте управление границами переменных.

avtzarenko

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1542 : 29 Августа 2024, 16:05:26 »
После перезапуска проекта не сохраняются значения, которые введены  в поля описанные в инструкции "управление границами переменных", хотя в свойствах переменной стоит восстановление.
Система сообщений у меня работать не будет, у меня архивация v1 и всего многообразия настроек описанных в инструкции https://simple-scada.com/help/manual/messet.html у меня нет, ну или они неявные.
Спасибо.
считаю вопрос закрыт тк мой скрипт криво, но справляется с уведомлениями.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1543 : 29 Августа 2024, 16:22:51 »
Цитировать
После перезапуска проекта не сохраняются значения, которые введены  в поля описанные в инструкции "управление границами переменных"
Внимательно прочтите статью "Управление границами переменных". В конце статьи указано как настроить сохранение границ переменных - ссылка.

Цитировать
хотя в свойствах переменной стоит восстановление.
Описание свойства "Автоматическое восстановление" доступно по ссылке. Данное свойство не имеет отношения к границам переменной.

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1544 : 29 Августа 2024, 17:47:11 »
  Здравствуйте.

считаю вопрос закрыт тк мой скрипт криво, но справляется с уведомлениями.
Для однократной отправки сообщения необходим флаг "сообщение отправлено", причем в качестве оного можно использовать свойство Color объекта.
Вполне возможно, что дополнительно придется добавить гистерезис температуры для исключения отправки сообщений при "болтанке" температуры вблизи границы:
Код: (delphi)
const dT = 3;   // гистерезис температуры
begin
   if Sender is TM_Object then     // проверяем, что Sender это объект
     with Sender as TM_Object do   // приводим Sender к типу "TM_Object"
       if Color <> clRed then
       begin
         if AsSingle >= VariableEx.AsSingle then
         begin
           Color := clRed;
           AddMessage(Now, mkWarning, Variable.Description + ' превысила ' + Variable.AsStr + ' градуса ', True, True);
         end;
       end
      else
        if AsSingle < (VariableEx.AsSingle - dT) then Color := RGB(191,191,191);
end.
Для выполнения контроля при изменении границы можно добавить скрипт по изменению дополнительной переменной (границы):
Код: (delphi)
begin
    Sender.Color := RGB(191,191,191);     // обязательно выполнить сравнение с границей
    TM_Object(Sender).OnDataChangeEvent;
end.

Вполне рабочий вариант с использованием границ переменных.
{удалено, чтобы не повторять написанное Simple_Scada выше}

Во вложении два примера как со скриптами по изменению переменных, так и по нарушению границы. Как говорится, найдите 3 отличия.