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

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

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

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1080 : 18 Августа 2020, 16:50:51 »
Здравствуйте.

Для этого используют out-параметры. Пример глобальной процедуры с двумя выходными параметрами:
Код: (delphi)
procedure MyProc(out AResult1, AResult2: Integer);
begin
  AResult1 := 1;
  AResult2 := 2;
end;

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1081 : 20 Августа 2020, 09:04:10 »
Добрый день, не совсем понял, как  обращаться к AResult1 и AResult2, со стороны вызова глобальной процедуры , обычно указывается один результат , как указать несколько  т.е.
функция------
Код: (delphi)
function mySum(A, B: Integer): Integer;
begin
  Result := A + B;
end;
вызов-----
Код: (delphi)
var
  aNum1, aNum2, aSum: Integer;
begin
  aNum1 := 10;
  aNum2 := 15;
  aSum := mySum(aNum1, aNum2);    //как вызвать правильно несколько результатов? можно ли их вызывать по отдельности?
end.

« Изменён: 20 Августа 2020, 09:21:29 от Simple_Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1082 : 20 Августа 2020, 09:24:47 »
Процедура с двумя результатами типа Integer:
Код: (delphi)
procedure MyProc(out AResult1, AResult2: Integer);
begin
  AResult1 := 1;
  AResult2 := 2;
end;

Использование:
Код: (delphi)
var
  aRes1, aRes2: Integer;
begin
  MyProc(aRes1, aRes2);
  // здесь переменные aRes1 и aRes2 будут равны 1 и 2. Т.к. их изменила процедура MyProc.
end;
Аналогично Вы можете сделать процедуру которая будет возвращать сколько угодно результатов, через out-параметры.

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1083 : 20 Августа 2020, 15:54:50 »
Вопрос, а почему не получается в данный алгоритм вызова , вставить напрямую переменную  интежер со списка переменных (например a1.value), а не объявленную в скрипте.
« Изменён: 20 Августа 2020, 16:04:08 от Simple_Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1084 : 20 Августа 2020, 20:51:05 »
Если параметр объявлен как "out" или "var", то переменная напрямую передаётся в процедуру/функцию. Но "a1.value" является свойством, а не переменной. Свойство нельзя передать как "out" или "var" параметр. Вместо этого можно объявить локальную переменную в скрипте и скопировать в неё значение свойства, затем передать её как out-параметр.
Либо просто объявите как "out" только те параметры, которые нужны для вывода. А все остальные параметры оставьте обычными, тогда можно будет передавать свойства.

Например здесь параметры AInp1, AInp2 обычные, в них можно передать свойство. А AResult1, AResult2 объявлены как "out":
Код: (delphi)
procedure MyProc(AInp1, AInp2: Integer; out AResult1, AResult2: Integer);
begin
  if (AInp1 = 1) then AResult1 := 1 else AResult1 := 0;
  if (AInp2 = 1) then AResult2 := 1 else AResult2 := 0;
end;

Использование:
Код: (delphi)
var
  aRes1, aRes2: Integer;
begin
  MyProc(a1.value, a2.value, aRes1, aRes2);
end;

Lihoj

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
    • Промышленное програмирование
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1085 : 26 Августа 2020, 14:26:47 »
Добрый день! Уже все обыскал! Нужен скрипт для уровня по температуре. Есть основной тег температура в комнате, а дополнительный тег - включение обогревателя - подключается к полю с нижней предупреждающей границей. В общем что б уровень работал как терморегулятор!
« Изменён: 26 Августа 2020, 14:32:08 от Lihoj »

Vitaly Demidov

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1086 : 27 Августа 2020, 06:13:35 »
Доброго дня! Возникли следующие вопросы.

Задача: нужно периодически (раз в секунду, например) доставать данные из таблицы MySQL. но не одно значение, а несколько колонок и  строк одновременно, по нескольким параметрам. Например, все данные запроса(их может быть больше), таблица во вложении.



Вопрос - Как реализовать это, используя  DataSet.Fields[0] ?

Проблема в том, что  используя примеры из руководства, можно взять данные только первой строки. Как прочитать данные второй, третьей..десятой?  Пробовал выполнять несколько запросов , раз в секунду- как результат, данные записываются в переменные хаотично, то из одного запроса, то из другого, не смотря на разные тэги(как мне показалось).
« Изменён: 27 Августа 2020, 06:19:42 от Vitaly Demidov »

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1087 : 27 Августа 2020, 10:23:13 »
Vitaly Demidov, например так:

Код: (delphi)
if not DataSet.IsEmpty then
    begin
      DataSet.First;
      Repeat
        //Ваш код
        DataSet.Next;
      Until DataSet.EOF;
    end;
    end;
« Изменён: 27 Августа 2020, 10:29:22 от Victor_P. »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1088 : 27 Августа 2020, 16:38:12 »
Здравствуйте.

Lihoj, обычно подобные задачи решаются на контроллере. В скаде Вы можете описать необходимое поведение через скрипты. Если требуется выполнять какие-либо проверки по изменению переменной уровня, то можно написать скрипт по событию OnDataChange уровня, такой скрипт будет выполняться при изменении значения переменной связанной с уровнем. В скрипте Вы можете выполнять необходимые проверки и в зависимости от каких-либо условий включать/отключать обогреватель изменяя значение нужной переменной. Получить нарушенную границу переменной можно через функцию GetValueZone или через свойства границ переменной HighAlarm, HighWarning, LowWarning, LowAlarm.

Vitaly Demidov, см. этот ответ, в нем подробно описано как работать с DataSet если в полученной выборке более одной строки.

Lihoj

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
    • Промышленное програмирование
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1089 : 28 Августа 2020, 09:25:26 »
Simple-Scada, Спасибо за ответ! Буду реализовывать терморегулятор в контроллере!

lipvasko

  • Пользователь
  • **
  • Сообщений: 65
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1090 : 28 Августа 2020, 11:44:17 »
Доброго дня, подскажите, можно как то найти файл определенного расширения, не зная его имени , по дате создания, т.е. нужен последний созданный файл в папке с определенным расширением.  А еще вопрос можно обратиться к файлу как например в питоне ,  с неизвестными символами в названии файла например  "Total_12??.??.??_??.txt , где ? - любой символ ,и соответственно открыть любой файл который соответствует условию? Или только полное имя файла?
« Изменён: 28 Августа 2020, 11:54:17 от lipvasko »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1091 : 28 Августа 2020, 11:51:36 »
Цитировать
Доброго дня, подскажите, можно как то найти файл определенного расширения, не зная его имени , по дате создания, т.е. нужен последний созданный файл в папке с определенным расширением.
Нужно использовать функцию ScanDirectory. Она подробно (с подходящим примером) описана в руководстве. По отметке времени ".Timestamp" можно определить файл созданный/отредактированный последним и работать с ним. Расширение файла можно проверить через свойство ".Ext".

Миханик

  • Постоялец
  • ***
  • Сообщений: 182
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1092 : 28 Августа 2020, 12:08:35 »
Здравствуйте.
Подскажите, формирую таблицу вот таким скриптом Table1.RunSQL(aQuery, tsAll);
А как узнать, что таблица сформирована и с ней можно работать?
Вопрос к тому, что я формирую таблицу и потом сразу вызываю скрипт обработки данных в таблице (подсвечиваю нужные ячейки). Но ячейки подсвечиваются не всегда, вот я и думаю, что может скрипт обработки выполняется раньше, чем успевает заполниться таблица.

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1093 : 31 Августа 2020, 08:25:06 »
Здравствуйте. Возможно открыть цвет заголовка таблицы для записи?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1094 : 31 Августа 2020, 09:56:42 »
Здравствуйте.

Подскажите, формирую таблицу вот таким скриптом Table1.RunSQL(aQuery, tsAll); А как узнать, что таблица сформирована и с ней можно работать?
К сожалению узнать о выполнении SQL-запроса отправленного от таблицы - нельзя. Постараемся добавить таблице отдельное событие на этот случай.
UPD: в версиях 2.4.0.3 и выше у таблицы есть событие OnDoneSQL для отслеживания выполнения SQL-запросов

вот я и думаю, что может скрипт обработки выполняется раньше, чем успевает заполниться таблица.
Да, так и происходит.

Возможно открыть цвет заголовка таблицы для записи?
Да, откроем в одном из будущих обновлений.
« Изменён: 07 Сентября 2020, 17:21:40 от Simple-Scada »