Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: vladka767 от 19 Июня 2019, 19:25:43

Название: Вопрос по скриптам
Отправлено: vladka767 от 19 Июня 2019, 19:25:43
Добрый день.
Можно ли вызывать скрипт не привязанный ни к какому объекту ни переменной? Т.е. постоянно работающий, в котором можно изменять свойства  не одного, а нескольких объектов.

И еще вопрос. Создал виртуалную переменную типа Single, привязал ее к элементу Поле, пытаюсь присвоить ей значение из скрипта (скрипт привязан к событию 1 сек.):
Код: (delphi)
var
  iVar1: integer;
begin
 iVar1 := iVar1 + 1;
 Variable1.AsInt := iVar1;
end.
Компилятор ругается на то что переменная только для чтения. Можно ли писать значения в виртуальные переменные, если да то как? Если нет, то как решить мою задачу - редактирование значения, отображаемое на элементе Поле из скрипта ?
Название: Re: Вопрос по скриптам
Отправлено: Simple_Scada от 20 Июня 2019, 10:32:35
Здравствуйте.

Цитировать
Можно ли вызывать скрипт не привязанный ни к какому объекту ни переменной? Т.е. постоянно работающий, в котором можно изменять свойства  не одного, а нескольких объектов.

Можно использовать скрипт с типом события "Прошла секунда (https://simple-scada.com/help/script/second-passed.html)".

Цитировать
Компилятор ругается на то что переменная только для чтения.
Компилятор указывает на то, что свойство AsInt (https://simple-scada.com/help/script/varasint.html) доступно только для чтения. Если необходимо записать значение в переменную, то нужно использовать свойство переменной Value (https://simple-scada.com/help/script/varvalue.html):
Код: (delphi)
var
  iVar1: integer;
begin
 iVar1 := iVar1 + 1;
 Variable1.Value := iVar1;
end.
Название: Re: Вопрос по скриптам
Отправлено: vladka767 от 20 Июня 2019, 18:22:58
Сделал как у вас в примере, привязал виртуальную переменную Variable1 к элементу Поле.
При запуске в Поле отображается значение 10ти значное число -21208..., которое постоянно декрементируется примерно на 1000.
Название: Re: Вопрос по скриптам
Отправлено: Simple-Scada от 20 Июня 2019, 22:52:50
В коде из предыдущего сообщения мы просто взяли Ваш код из первого сообщения и устранили ошибку с присвоением. Но этот код некорректен, в нём не инициализируется локальная переменная, что является ошибкой. Вот код с пояснениями:
Код: (delphi)
var
  iVar1: integer;  // переменная iVar1 является локальной, т.к. объявлена в пределах скрипта
begin
  { на этом этом этапе переменная iVar1 может иметь какое угодно
     значение (в пределах типа данных integer), т.к. она не инициализирована.
    Например она может быть равна 24736 }
 
  iVar1 := iVar1 + 1;        // тогда iVar1 := 24736 + 1 = 24737
  Variable1.Value := iVar1;  // в Variable1 запишется 24737
end.

Поэтому локальные переменные нужно инициализировать перед использованием:
Код: (delphi)
var
  iVar1: integer;  // переменная iVar1 является локальной, т.к. объявлена в пределах скрипта
begin
  iVar1 := 0;
  iVar1 := iVar1 + 1;   // тогда iVar1 := 0 + 1 = 1
  Variable1.Value := iVar1;  // в Variable1 запишется 1
end.
Как видно из примера, сделать нарастающий счетчик используя локальную переменную не получится, т.к. при каждом выполнении её придётся инициализировать. ПОэтому для счетчика с нарастанием нужно использовать обычную глобальную переменную из меню "Переменные" (https://simple-scada.com/help/manual/variable-editor.html) или из глобального модуля.
Название: Re: Вопрос по скриптам
Отправлено: vladka767 от 21 Июня 2019, 18:57:53
Да, все получилось .
Спасибо большое!