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

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

Автор Тема: Реализация калибровки  (Прочитано 2463 раз)

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Реализация калибровки
« : 28 Июля 2020, 12:28:56 »
Всем здравствуйте.

С ОРС сервера скада подтягивает тег DiscreteInputCount0_8. Это обыкновенный счётчик, он постоянно накапливает значение. Так же есть поле ввода числа для калибровки Field_Calibrate_VNS8, поле где нужно выводить с калиброванное число Field66 и переменная, которая в себе хранит собственно это с калиброванное число DiscreteInputCount0_8_GeneralQ.

Реализовать такую штуку у меня получилось крайне неправильно и костыльно. Для калибровки значения оператор должен был ещё производить некие вычисления у себя на бумажке и нужное число вписать в поле Field_Calibrate_VNS8, но калибровка на то и калибровка, что оператор должен ввести число 54749273 и это число должно вывестись в поле Field66 + учитывать НОВЫЕ значения счётчика, то-есть счётчик имеет число (тег DiscreteInputCount0) 54749273, но скада была выключена и счётчик намотал 54749856, оператор вводит число в поле калибровки 54749856 и заодно скада должна учитывать новые данные со счётчика уже, то-есть 54749857, 54749858, 54749859 и т.д. то-есть от введённого числа калибровки продолжить считать. Также ежемесячно оператор должен писать 0 в поле для калибровки, и скада должна обнулить счётчик в 0, но обнулить свой тег DiscreteInputCount0_8_GeneralQ (потому что тег с ОРС сервера обнулить невозможно) и с нуля учитывать новые вхождения значений от счётчика, то-есть 0, 1, 2...и до какого-то 8763452394 числа пока снова оператор не обнулит счётчик
« Изменён: 28 Июля 2020, 12:37:04 от razorqhex »

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Реализация калибровки
« Ответ #1 : 29 Июля 2020, 10:59:18 »
      Здравствуйте!

 Для правильной работы счетчика DiscreteInputCount0_8_GeneralQ можно применить коррекцию текущего значения счетчика на величину изменения DiscreteInputCount0_8 с момента последней коррекции. Для этого используется внутренняя переменная HoldCount0_8, запоминающая значение DiscreteInputCount0_8 в момент последней коррекции.
Сам скрипт может вызываться по событиям: изменение переменной (например, DiscreteInputCount0_8), по времени ("Прошла секунда") и т.д.
Пример скрипта, в предположении, что DiscreteInputCount0_8 представляет собой образ 32-разрядного счетчика в контроллере.
Код: (delphi)
var i, j: int64;
begin
  i := DiscreteInputCount0_8.AsInt64 and $FFFFFFFF;
  j := i - (HoldCount0_8.AsInt64 and $FFFFFFFF);       // добавка к "большому" счетчику со времени последней коррекции
  if j < 0 then j := j + 4294967296;                   // коррекция при переполнении 32-разрядного счетчика
  DiscreteInputCount0_8_GeneralQ.Value := DiscreteInputCount0_8_GeneralQ.AsInt64 + j;
  HoldCount0_8.Value := i;                   // запомнить текущее значение счетчика
end.
Скрипт установки счетчика в 0:
Код: (delphi)
begin
DiscreteInputCount0_8_GeneralQ.Value := 0;
HoldCount0_8.Value := DiscreteInputCount0_8.Value;
end.

Во вложении пример модели счетчика контроллера (изменение: прямая запись, генератор 1 Гц, +1, число 4294967290)
с возможностью отключения/подключения данных от ОРС-сервера и сохранением данных при перезапуске проекта.

К сожалению, я так и не понял алгоритм калибровки.

razorqhex

  • Пользователь
  • **
  • Сообщений: 79
    • Просмотр профиля
Re: Реализация калибровки
« Ответ #2 : 30 Июля 2020, 14:14:09 »
Здравствуйте, pan2000, спасибо за Ваш отклик. Скачал пример, но он не работал (или скорее всего я не правильно что-то делаю)

Сейчас я постараюсь подробнее объяснить задачу с скриншотами

На экране "Загальний Q" (Общий Q) отображаются общее число, сколько накрутил счётчик (тег с ОРС сервера DiscreteInputCount0_8)
На другом скриншоте отображаются поля для калибровки, для примера возьмём ВНС8. Как видно на скриншоте счётчик накрутил 44432, допустим оператору нужно добавить к уже имеющемся числу 20 и в итоге получится результат 44452. Это число никуда не отправляется, а хранится только на скаде. Так как счётчик будет и дальше считать, то к числу 44452 нужно прибавлять данные, к примеру 44453, 44454, 44455 и т.д., потом же в конце каждого месяца оператор должен обнулить счётчики. Просто в поля калибровки написать 0 и нажать энтер. В теге DiscreteInputCount0_8 число 44432 так и остаётся, но на скаде 0 уже получается. Получается счётчик крутанул раз и получилось число 44433, а на скаде уже вместо 0 должна появится 1 и дальше должно всё инкриминироваться

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Реализация калибровки
« Ответ #3 : 30 Июля 2020, 18:46:06 »
      Здравствуйте!

Я добавил в пример один калибруемый счетчик. Сам алгоритм работы счетчика не изменился, только скрипт переведен в универсальный.
Калибровка в пределах (-50..50) определяется шкалой переменной величины калибровки. Если не нужны минус калибровки то скрипт можно урезать.
Относительно примера - я удаляю скомпилированные файлы, просто предварительно надо сохранить проект.