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

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

Автор Тема: Событие OnDataChange  (Прочитано 2356 раз)

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Событие OnDataChange
« : 21 Января 2020, 16:10:26 »
Столкнулся с такой странной ошибкой. Есть поле, привязанное к некой переменной типа integer, получаемой с контроллера (Podd_Width). В событии OnDataChange этого поля прописано простенькое выражение типа vrCounter.Value := vrCounter.Value + 1 (виртуальная переменная для счетчика изменений значений переменной Podd_Width). Вроде все работает, но после перезапуска проекта счетчик увеличивается на единицу, хотя значение Podd_Width не изменяется. Третий день не пойму, в чем дело, может, Вы подскажете?
« Изменён: 21 Января 2020, 16:38:32 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Событие OnDataChange
« Ответ #1 : 21 Января 2020, 16:38:05 »
Здравствуйте.
Здесь нет ошибки. После запуска проекта (т.к. переменные не могут не иметь значения) все целочисленные переменные инициализируются нулём, строки - пустой строкой, а длина переменных массивов - обнуляется. Это и есть первое изменение значения.

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Событие OnDataChange
« Ответ #2 : 21 Января 2020, 16:41:54 »
Для тех.процесса это ошибка, ведь фактического изменения параметра не было. Как ее избежать? Просто vrCounter.Value - 1 при старте?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Событие OnDataChange
« Ответ #3 : 21 Января 2020, 16:45:19 »
Не обязательно вычитать единицу. Если переменная vrCounter внутренняя, то можно задать ей начальное значение равное -1.

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Событие OnDataChange
« Ответ #4 : 21 Января 2020, 16:50:02 »
Но эта переменная vrCounter при перезапуске проекта должна сохраняться и восстанавливаться.
P.S. Мой вариант (- 1 при старте) вроде помог. Придется это сделать для всех счетчиков.
« Изменён: 21 Января 2020, 17:04:10 от alan54 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Событие OnDataChange
« Ответ #5 : 21 Января 2020, 17:10:51 »
Цитировать
Но эта переменная vrCounter при перезапуске проекта должна сохраняться и восстанавливаться.
Да, тогда остаётся только вычитать единицу.

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Событие OnDataChange
« Ответ #6 : 21 Января 2020, 17:14:04 »
А нельзя ли эту "мелочь" как-то исправить в будущих версиях?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Событие OnDataChange
« Ответ #7 : 21 Января 2020, 17:35:30 »
Нет, она ведь не просто так сделана. Если убрать начальное изменение, то при старте не будут выполняться скрипты OnDataChange с начальными значениями (0 для чисел). А многие пользователи в скриптах в зависимости от значения переменной меняют свойства объектов и т.п. например при нуле - объект невидим, при 1 видим. Если событие OnDataChange не выполнится, то объект останется видимым, хотя значение равно 0 и соответствует условиям скрипта. То же касается всех остальных свойств.

Цитировать
Для тех.процесса это ошибка, ведь фактического изменения параметра не было.
В данном случае со стороны скады неважно как пользователи будут трактовать изменение значений (скада может и вовсе не подключиться к конечному устройству, или подключиться с задержкой, но значение переменная получит сразу), главное что значение изменилось в скаде и стало равно к примеру 0. А OnDataChange события срабатывают при каждом изменении значения в скаде.

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Событие OnDataChange
« Ответ #8 : 21 Января 2020, 19:30:14 »
А почему в качестве начальных значений не используются последние значения из базы данных, записанные в нее при остановке проекта?

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Событие OnDataChange
« Ответ #9 : 22 Января 2020, 11:57:26 »
А почему в качестве начальных значений не используются последние значения из базы данных, записанные в нее при остановке проекта?
Вы можете настроить Вашу переменную и она будет восстанавливать своё значение из базы данных.
Для начала, в настройках этого тега, включите архивацию "По изменению" в пункте "Тип архивации" на вкладке "Архив", далее на вкладке "Основные" в пункте "Автоматическое восстановление" выберите пункт "Включить". Сохраняете проект и всё  ;)

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Событие OnDataChange
« Ответ #10 : 22 Января 2020, 12:07:23 »
А почему в качестве начальных значений не используются последние значения из базы данных, записанные в нее при остановке проекта?
А почему они должны использоваться для восстановления? В большинстве проектов в архивации участвует 30% переменных, а восстанавливать после перезапуска иногда нужно все переменные. Тогда получается что придётся включить архивацию у всех переменных ради восстановления их значений. Что приведёт к огромным затратам памяти на жестком диске и тратам производительности на архивацию. Поэтому у переменных есть отдельная опция "Автоматическое восстановление" которая работает во много раз эффективнее и не требует архивации.

Вы можете настроить Вашу переменную и она будет восстанавливать своё значение из базы данных.
Для начала, в настройках этого тега, включите архивацию "По изменению" в пункте "Тип архивации" на вкладке "Архив", далее на вкладке "Основные" в пункте "Автоматическое восстановление" выберите пункт "Включить". Сохраняете проект и всё  ;)
Это неверно. "Автоматическое восстановление" не использует БД. Архивацию включать просто так не нужно, это только излишне нагрузит проект. Использовать архивацию нужно только для просмотра архивных трендов (исторических данных).

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Событие OnDataChange
« Ответ #11 : 22 Января 2020, 14:30:20 »
"Автоматическое восстановление" включено, но при перезапуске проекта все равно срабатывает событие OnDataChange. Видимо, переменная сначала инициализируется как 0, и лишь затем происходит автоматическое восстановление, то есть изменение значения. А это сосчитывать нежелательно.