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

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

Simple-Scada

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

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

lipvasko

#1081
Добрый день, не совсем понял, как  обращаться к AResult1 и AResult2, со стороны вызова глобальной процедуры , обычно указывается один результат , как указать несколько  т.е.
функция------
Код: pascal
function mySum(A, B: Integer): Integer;
begin
  Result := A + B;
end;
вызов-----
Код: pascal
var
  aNum1, aNum2, aSum: Integer;
begin
  aNum1 := 10;
  aNum2 := 15;
  aSum := mySum(aNum1, aNum2);    //как вызвать правильно несколько результатов? можно ли их вызывать по отдельности?
end.


Simple-Scada

Процедура с двумя результатами типа Integer:
Код: pascal
procedure MyProc(out AResult1, AResult2: Integer);
begin
  AResult1 := 1;
  AResult2 := 2;
end;

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

lipvasko

#1083
Вопрос, а почему не получается в данный алгоритм вызова , вставить напрямую переменную  интежер со списка переменных (например a1.value), а не объявленную в скрипте.

Simple-Scada

Если параметр объявлен как "out" или "var", то переменная напрямую передаётся в процедуру/функцию. Но "a1.value" является свойством, а не переменной. Свойство нельзя передать как "out" или "var" параметр. Вместо этого можно объявить локальную переменную в скрипте и скопировать в неё значение свойства, затем передать её как out-параметр.
Либо просто объявите как "out" только те параметры, которые нужны для вывода. А все остальные параметры оставьте обычными, тогда можно будет передавать свойства.

Например здесь параметры AInp1, AInp2 обычные, в них можно передать свойство. А AResult1, AResult2 объявлены как "out":
Код: pascal
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;

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

Lihoj

#1085
Добрый день! Уже все обыскал! Нужен скрипт для уровня по температуре. Есть основной тег температура в комнате, а дополнительный тег - включение обогревателя - подключается к полю с нижней предупреждающей границей. В общем что б уровень работал как терморегулятор!

Vitaly Demidov

#1086
Доброго дня! Возникли следующие вопросы.

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



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

Проблема в том, что  используя примеры из руководства, можно взять данные только первой строки. Как прочитать данные второй, третьей..десятой?  Пробовал выполнять несколько запросов , раз в секунду- как результат, данные записываются в переменные хаотично, то из одного запроса, то из другого, не смотря на разные тэги(как мне показалось).

Victor_P.

#1087
Vitaly Demidov, например так:

Код: pascal
if not DataSet.IsEmpty then
    begin
      DataSet.First;
      Repeat
        //Ваш код
        DataSet.Next;
      Until DataSet.EOF;
    end;
    end;

Simple_Scada

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

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

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

Lihoj

Simple-Scada, Спасибо за ответ! Буду реализовывать терморегулятор в контроллере!

lipvasko

#1090
Доброго дня, подскажите, можно как то найти файл определенного расширения, не зная его имени , по дате создания, т.е. нужен последний созданный файл в папке с определенным расширением.  А еще вопрос можно обратиться к файлу как например в питоне ,  с неизвестными символами в названии файла например  "Total_12??.??.??_??.txt , где ? - любой символ ,и соответственно открыть любой файл который соответствует условию? Или только полное имя файла?

Simple-Scada

ЦитироватьДоброго дня, подскажите, можно как то найти файл определенного расширения, не зная его имени , по дате создания, т.е. нужен последний созданный файл в папке с определенным расширением.
Нужно использовать функцию ScanDirectory. Она подробно (с подходящим примером) описана в руководстве. По отметке времени ".Timestamp" можно определить файл созданный/отредактированный последним и работать с ним. Расширение файла можно проверить через свойство ".Ext".

Миханик

Здравствуйте.
Подскажите, формирую таблицу вот таким скриптом Table1.RunSQL(aQuery, tsAll);
А как узнать, что таблица сформирована и с ней можно работать?
Вопрос к тому, что я формирую таблицу и потом сразу вызываю скрипт обработки данных в таблице (подсвечиваю нужные ячейки). Но ячейки подсвечиваются не всегда, вот я и думаю, что может скрипт обработки выполняется раньше, чем успевает заполниться таблица.

deldemo

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

Simple-Scada

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

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

Цитата: Миханик от 28 августа 2020, 12:08:35вот я и думаю, что может скрипт обработки выполняется раньше, чем успевает заполниться таблица.
Да, так и происходит.

Цитата: deldemo от 31 августа 2020, 08:25:06Возможно открыть цвет заголовка таблицы для записи?
Да, откроем в одном из будущих обновлений.