Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: alan54 от 21 Января 2020, 16:10:26

Название: Событие OnDataChange
Отправлено: alan54 от 21 Января 2020, 16:10:26
Столкнулся с такой странной ошибкой. Есть поле, привязанное к некой переменной типа integer, получаемой с контроллера (Podd_Width). В событии OnDataChange этого поля прописано простенькое выражение типа vrCounter.Value := vrCounter.Value + 1 (виртуальная переменная для счетчика изменений значений переменной Podd_Width). Вроде все работает, но после перезапуска проекта счетчик увеличивается на единицу, хотя значение Podd_Width не изменяется. Третий день не пойму, в чем дело, может, Вы подскажете?
Название: Re: Событие OnDataChange
Отправлено: Simple-Scada от 21 Января 2020, 16:38:05
Здравствуйте.
Здесь нет ошибки. После запуска проекта (т.к. переменные не могут не иметь значения) все целочисленные переменные инициализируются нулём, строки - пустой строкой, а длина переменных массивов - обнуляется. Это и есть первое изменение значения.
Название: Re: Событие OnDataChange
Отправлено: alan54 от 21 Января 2020, 16:41:54
Для тех.процесса это ошибка, ведь фактического изменения параметра не было. Как ее избежать? Просто vrCounter.Value - 1 при старте?
Название: Re: Событие OnDataChange
Отправлено: Simple-Scada от 21 Января 2020, 16:45:19
Не обязательно вычитать единицу. Если переменная vrCounter внутренняя, то можно задать ей начальное значение (https://simple-scada.com/help/manual/variable-new.html) равное -1.
Название: Re: Событие OnDataChange
Отправлено: alan54 от 21 Января 2020, 16:50:02
Но эта переменная vrCounter при перезапуске проекта должна сохраняться и восстанавливаться.
P.S. Мой вариант (- 1 при старте) вроде помог. Придется это сделать для всех счетчиков.
Название: Re: Событие OnDataChange
Отправлено: Simple-Scada от 21 Января 2020, 17:10:51
Цитировать
Но эта переменная vrCounter при перезапуске проекта должна сохраняться и восстанавливаться.
Да, тогда остаётся только вычитать единицу.
Название: Re: Событие OnDataChange
Отправлено: alan54 от 21 Января 2020, 17:14:04
А нельзя ли эту "мелочь" как-то исправить в будущих версиях?
Название: Re: Событие OnDataChange
Отправлено: Simple-Scada от 21 Января 2020, 17:35:30
Нет, она ведь не просто так сделана. Если убрать начальное изменение, то при старте не будут выполняться скрипты OnDataChange с начальными значениями (0 для чисел). А многие пользователи в скриптах в зависимости от значения переменной меняют свойства объектов и т.п. например при нуле - объект невидим, при 1 видим. Если событие OnDataChange не выполнится, то объект останется видимым, хотя значение равно 0 и соответствует условиям скрипта. То же касается всех остальных свойств.

Цитировать
Для тех.процесса это ошибка, ведь фактического изменения параметра не было.
В данном случае со стороны скады неважно как пользователи будут трактовать изменение значений (скада может и вовсе не подключиться к конечному устройству, или подключиться с задержкой, но значение переменная получит сразу), главное что значение изменилось в скаде и стало равно к примеру 0. А OnDataChange события срабатывают при каждом изменении значения в скаде.
Название: Re: Событие OnDataChange
Отправлено: alan54 от 21 Января 2020, 19:30:14
А почему в качестве начальных значений не используются последние значения из базы данных, записанные в нее при остановке проекта?
Название: Re: Событие OnDataChange
Отправлено: razorqhex от 22 Января 2020, 11:57:26
А почему в качестве начальных значений не используются последние значения из базы данных, записанные в нее при остановке проекта?
Вы можете настроить Вашу переменную и она будет восстанавливать своё значение из базы данных.
Для начала, в настройках этого тега, включите архивацию "По изменению" в пункте "Тип архивации" на вкладке "Архив", далее на вкладке "Основные" в пункте "Автоматическое восстановление" выберите пункт "Включить". Сохраняете проект и всё  ;)
Название: Re: Событие OnDataChange
Отправлено: Simple-Scada от 22 Января 2020, 12:07:23
А почему в качестве начальных значений не используются последние значения из базы данных, записанные в нее при остановке проекта?
А почему они должны использоваться для восстановления? В большинстве проектов в архивации участвует 30% переменных, а восстанавливать после перезапуска иногда нужно все переменные. Тогда получается что придётся включить архивацию у всех переменных ради восстановления их значений. Что приведёт к огромным затратам памяти на жестком диске и тратам производительности на архивацию. Поэтому у переменных есть отдельная опция "Автоматическое восстановление" которая работает во много раз эффективнее и не требует архивации.

Вы можете настроить Вашу переменную и она будет восстанавливать своё значение из базы данных.
Для начала, в настройках этого тега, включите архивацию "По изменению" в пункте "Тип архивации" на вкладке "Архив", далее на вкладке "Основные" в пункте "Автоматическое восстановление" выберите пункт "Включить". Сохраняете проект и всё  ;)
Это неверно. "Автоматическое восстановление" не использует БД. Архивацию включать просто так не нужно, это только излишне нагрузит проект. Использовать архивацию нужно только для просмотра архивных трендов (исторических данных).
Название: Re: Событие OnDataChange
Отправлено: alan54 от 22 Января 2020, 14:30:20
"Автоматическое восстановление" включено, но при перезапуске проекта все равно срабатывает событие OnDataChange. Видимо, переменная сначала инициализируется как 0, и лишь затем происходит автоматическое восстановление, то есть изменение значения. А это сосчитывать нежелательно.