Вычисляемые параметры
Определение вычисляемых параметров
Механизм задания вычисляемых параметров предоставляет мощный и гибкий инструмент для расчета дополнительных параметров, которые необходимо постоянно рассчитывать по выборке измеряемых параметров.
С точки зрения обработки, вычисляемые параметры ничем не отличаются от измеряемых. Вычисляемый параметр можно связать с контрольной процедурой, сформировать с ним события, либо вывести его на виджет.
Примеры использования вычисляемых параметров:
- Два электросчетчика присылают показания энергопотребления, но пользователю важно получать общее значение. Для этого необходимо определить вычисляемый параметр, который будет рассчитывать сумму полученных показаний от электросчетчиков.
- В помещении установлено 10 температурных датчиков, но пользователю необходимо получать среднее значение. Для этого необходимо определить вычисляемый параметр, который будет рассчитывать среднее значение параметра от 10 датчиков.
- Три считывателя меток beacon передают данные о расстоянии, но пользователю необходима информация о расположении метки на плане помещения. Для этого вводятся вычисляемые параметры, которые по результатам данных от считывателей рассчитывают координаты метки на плане помещений.
В платформе поддерживаются любые арифметические операции для задания параметра. Основное ограничение, которое контролируется платформой: нельзя задать измеряемые параметры разной категории (физических величин), т.е. нельзя сложить напряжение в вольтах и расход воды в литрах.
Правда, есть исключение для встроенных функций, которые вычисляют групповой статус параметров. Об этом написано ниже.
Формулы можно задать вручную, либо использовать оснастку. Формула хранится в виде арифметического выражения идентификаторов измеряемых параметров, но оснастка платформы представляет формулу по именам параметров. Для написания формул используется формат:
D<Id> – обозначение параметра;
DR<id> – обозначение параметра, участвующего в встроенной функции.Если в формуле применяются логические выражения, то результатом вычисления будет значение 1 или 0. Следует учесть, что такой вычисляемый параметр становится сигнальным.
Система поддерживает ряд специальных встроенных функций, которые рассчитывают интервальные приращения относительно текущего значения измеряемого параметра. В качестве точек отсчета могут указываться:
- начало текущих суток;
- начало текущей недели;
- начало текущего месяца;
- начало текущего квартала;
- начало текущего года.
- текущее время минус сутки;
- текущее время минус неделя;
- текущее время минус месяц;
- текущее время минус квартал;
- текущее время минус год.
Математические функции
Платформа использует интерпретатор формул, позволяющий использовать сложные арифметические и логические конструкции. Формулы используются в следующих сущностях:
- Вычисляемые параметры – для создания вычисляемого параметра на базе любых измеряемых параметров и арифметических действий над ними используются арифметические выражения.
- Контрольные процедуры – для проверки значений параметров на соответствие заданным границам на стороне сервера приложений используются логические выражения.
- Правила контроллера – для проверки значений параметров на соответствие заданным условиям непосредственно на контроллере используются логические выражения.
Арифметические операции
Состав разрешенных арифметических операций и их приоритеты приведены в следующей таблице.
Описание арифметических операций
| Приоритет | Обозначение | Описание |
|---|---|---|
| 0 | ( | Открывающая скобка |
| 1 | ) | Закрывающая скобка |
| 2 | || | Логическое ИЛИ
| 3 | && | Логическое И
| 4 | ! | Логическое НЕ
| 5 | == != < <= > >= | Сравнение (равно, не равно, меньше, меньше или равно, больше, больше или равно)
| 6 | + - | Сложение и вычитание
| 7 | * / | Умножение и деление
| 8 | % | Получение остатка деления
Описание форматов формул
| Место применения | Обозначение | Примечание |
|---|---|---|
| CalcParam.Expression | D<IdP> | Идентификатор параметра типовой конфигурации |
| ProcCondition.Condition | V | Текущее значение контролируемого параметра |
| Rule.Condition (для правила сервера) | D<IdP> C<IdC> | <IdP> – идентификатор параметра типовой конфигурации. <IdC> – идентификатор вычисляемого параметра |
| Rule.Condition (для правила контроллера) | D<IdP> | <IdP> – идентификатор параметра типовой конфигурации |
Если в формуле применяются логические выражения, то результатом вычисления будет значение 1 либо 0. Следует учесть, что такой вычисляемый параметр становится сигнальным.
Совет
Пример записи формулы для вычисяемых параметров (CalcParam): D1+D2
Пример условия в процедуре контроля (ProcConditions): (V+5)< 10
Пример записи формулы в условии правил (Rule): (D1+D2) < D3
Пример записи формулы в назначении уставки (Rule Action): D2-D1
D1,D2,D3 - параметры типовой конфигурации, V - обозначение параметра, для которого будет назначена процедура контроля
Встроенные функции
Платформа поддерживает ряд специальных функций, которые рассчитывают интервальные приращения относительно текущего значения измеряемого параметра. В качестве точек отсчета могут указываться текущие, либо скользящие временные периоды: сутки, неделя, месяц, квартал, год.
Для задания такого вычисляемого параметра используются следующие формулы, приведенные ниже, в которых используется следующий формат:
<Имя функции>(DR<IdP>),
где:
- <IdP> – идентификатор измеряемого параметра (DeviceParamId);
- DR – префикс ссылки на измеряемый параметр.
Формулы для задания вычисляемого параметра
| Функция | Тип источника | Пример |
|---|---|---|
| AGG30 | Приращение значения с начала текущей 30 минуты | AGG30(DR1) |
| AGG60 | Приращение значения с начала текущей 60 минуты | AGG60(DR1) |
| AGGD | Приращение значения с начала текущих суток | AGGD(DR1) |
| AGGW | Приращение значения с начала текущей недели | AGGW(DR1) |
| AGGM | Приращение значения с начала текущего месяца | AGGM(DR1) |
| AGGQ | Приращение значения с начала текущего квартала | AGGQ(DR1) |
| AGGY | Приращение значения с начала текущего года | AGGY(DR1) |
| Скользящие интервалы: | ||
| AGGLD | Приращение значения от текущего времени минус сутки | AGGLD(DR1) |
| AGGLW | Приращение значения от текущего времени минус неделя | AGGLW(DR1) |
| AGGLM | Приращение значения от текущего времени минус месяц | AGGLM(DR1) |
| AGGLY | Приращение значения от текущего времени минус год | AGGLY(DR1) |
Результат расчета вышеперечисленных функций зависит от типа (характера поведения) параметра: сигнальный, измеряемый, накопительный (счетчик). Формулы расчета функций приведены в таблице ниже.
Формулы расчета функций
| Описание способа получения значений параметра | Устанавливаемое значение | Разрешенные типы измеряемых параметров |
|---|---|---|
| Текущее значение измеряемого параметра, полученное от контроллера | Pi = Vi | Параметры всех типов |
| Текущее приращение значения параметра относительно выбранной точки отсчета | Pi = Vi – Bi | Только параметры типа 3 (нарастающий итог) |
| Pi = ∑ Vk + Vi | Только параметры типа 4 (счетчик импульсов) |
где:
- Pi – значения каждого входного параметра;
- Vi – текущее значение измеряемого параметра;
- Bi – значения параметра в выбранной точке отсчета;
- Vk – все достоверные значения параметра, начиная с выбранной точки отсчета, исключая текущее значение.
Специальные функции
Ниже приведены специальные функции, которые используются для расчета изменений параметров.
| Функция | Тип источника | Пример |
|---|---|---|
| VALUE_PREV | Предыдущее значение параметра. Для числовых типов возвращает как число, для остальных как строку. Для null значений возвращает null | VALUE_PREV(DR1) |
| VALUE_DELTA | разница между текущим и предыдущим значением | VALUE_DELTA(DR1) |
| VALUE_DERIVATIVE | скорость изменения значения (производная, разница значений деленная на разницу времени в секундах) | VALUE_DERIVATIVE(DR1) |
Пояснение к VALUE_DELTA
если время хотя бы одно из времен (time, prevTime) не определено (null) - возвращает 0
если время значения и время предыдущего значения совпадают - возвращает 0
для числовых типов это разница между числовыми значениями, текущее минус предыдущее
Примеры (value - prevValue):
(10 - null) = (10 - 0) = 10.
(null - 10) = (0 - 10) = -10
(null - null) = 0
для строковых типов, возвращает 1 если строки разные, 0 если строки одинаковые (null строки заменяются пустыми)
для геозон тоже как строка
Пояснение к VALUE_DERIVATIVE
для числовых типов вычисляется по формуле (value - prevValue) / (timeSec (sec) - prevTime (sec))
в случае если (time = prevTime) возвращает 0
для числовых типов значения/предыдущие значения null заменяются на 0, для строковых на пустую строку (аналогично VALUE_DELTA)
для строковых типов, возвращает 1 если строки разные, 0 если строки одинаковые, разницу во времени не учитывает.
для геозон как строка
Логические операции
Для логических выражений используются те же операции (см. выше), но результатом операций являются значения TRUE или FALSE.
В качестве аргумента входящего значения параметров в логических выражениях платформы используется символ V.
Особенности записи логического выражения
| Тип выражения | Пример выражения | Описание |
|---|---|---|
| Простое выражение | V>=10 && V<=20 | Допустимое выражение, обрабатываемое интерпретатором |
| 10<=V<=20 | Недопустимое выражение; интерпретатор не обработает данную запись | |
| Сложное выражение | (V>=10 && V<=20) || (V>=50 && V<=80) | Допустимое выражение |
| (V/10+V*2)/100>=10 | Допустимое выражение | |
| (Dx1 > YY ? Dx2 : Dx3) | Если параметр Dx1 > YY, то вычисляемый параметр равен Dx2, в противном случае Dx3 |
Математические операции
Описание математических операций
| Функция | Описание |
|---|---|
| Math.abs(x) | Возвращает абсолютное значение числа |
| Math.acos(x) | Возвращает арккосинус числа |
| Math.acosh(x) | Возвращает гиперболический арккосинус числа |
| Math.asin(x) | Возвращает арксинус числа |
| Math.asinh(x) | Возвращает гиперболический арксинус числа |
| Math.atan(x) | Возвращает арктангенс числа |
| Math.atanh(x) | Возвращает гиперболический арктангенс числа |
| Math.atan2(y, x) | Возвращает арктангенс от частного своих аргументов |
| Math.cbrt(x) | Возвращает кубический корень числа |
| Math.ceil(x) | Возвращает наименьшее целое число, большее, либо равное указанному числу |
| Math.clz32(x) | Возвращает количество ведущих нулей 32-битного целого числа |
| Math.cos(x) | Возвращает косинус числа |
| Math.cosh(x) | Возвращает гиперболический косинус числа |
| Math.exp(x) | Возвращает Ex , где x — аргумент, а E — число Эйлера (2,718…), основание натурального логарифма |
| Math.expm1(x) | Возвращает exp(x), из которого вычли единицу |
| Math.floor(x) | Возвращает наибольшее целое число, меньшее, либо равное указанному числу |
| Math.fround(x) | Возвращает ближайшее число с плавающей запятой одинарной точности, представляющее это число |
| Math.hypot([x[, y[, …]]]) | Возвращает квадратный корень из суммы квадратов своих аргументов |
| Math.imul(x) | Возвращает результат умножения 32-битных целых чисел |
| Math.log(x) | Возвращает натуральный логарифм числа (loge , также известен как ln) |
| Math.log1p(x) | Возвращает натуральный логарифм числа 1 + x (loge , также известен как ln) |
| Math.log10(x) | Возвращает десятичный логарифм числа |
| Math.log2(x) | Возвращает двоичный логарифм числа |
| Math.max([x[, y[, …]]]) | Возвращает наибольшее число из своих аргументов |
| Math.min([x[, y[, …]]]) | Возвращает наименьшее число из своих аргументов |
| Math.pow(x, y) | Возвращает основание в степени экспоненты, то есть, значение выражения основание экспонента |
| Math.random() | Возвращает псевдослучайное число в диапазоне от 0 до 1 |
| Math.round(x) | Возвращает значение числа, округлённое до ближайшего целого |
| Math.sign(x) | Возвращает знак числа, указывающий, является ли число положительным, отрицательным или нулём |
| Math.sin(x) | Возвращает синус числа |
| Math.sinh(x) | Возвращает гиперболический синус числа |
| Math.sqrt(x) | Возвращает положительный квадратный корень числа |
| Math.tan(x) | Возвращает тангенс числа |
| Math.tanh(x) | Возвращает гиперболический тангенс числа |
| Math.trunc(x) | Возвращает целую часть числа, убирая дробные цифры |
Геодезические функции
Платформа поддерживает возможность расчета расстояния геоточки до геозоны, либо нахождения в геозоне. Фукнция возвращает метры.
Формат формулы:GEO_DISTANCE(V,Z<id>), где
- V - формальное обозначение значения параметра;
- id - идентификатор геозоны из справочника геозон;
Примеры использования в КП
"GEO_DISTANCE(V, Z2) > 100" - геопараметр удалился от геозоны более 100 метров.
"GEO_DISTANCE(V, Z2) == 0" - геопараметр находится внутри интересующей геозоны.Функции вычисления группового статуса
Часто требуется определять худший статус у группы параметров, либо считать количество статусов у группы. Для рассчета таких показателей необходимо использовать функции вычисления группового статуса:
WORST_STATUS(XID)
Возвращает идентификатор худшего статуса среди измеряемых и вычисляемых параметров, размещенных в зоне с указанным идентификатором с учетом контроллера параметров. Заблокированные параметры не участвуют в определении.
XID - идентификатор зоны (Zone.id) с префиксом X, пример X15
SEVERITY_TALLY(SEVERITY, XID)
Возвращает количество измеряемых и вычисляемых параметров в зоне контроллера, находящихся в статусе severity. Заблокированные параметры не участвуют в определении.
SEVERITY - значение статусов: [NORMAL, WARNING, CRITICAL]. Можно передать идентификатором SEVERITY_TALLY(3, X15) или строкой названия константы SEVERITY_TALLY('CRITICAL', X15).
XID - идентификатор зоны (Zone.id) с префиксом X, пример X15.
Инфо
В функции SEVERITY_TALLY допускается использовать только три указанных выше статуса.
WORST_STATUS_GLOBAL- Возвращает идентификатор худшего статуса среди измеряемых и вычисляемых параметров всех контроллеров размещенных в зоне с указанным идентификатором. Заблокированные параметры не участвуют в определении.
Семантика вызова такая же как у оригинальных функций, переменные те же (идентификаторы зон), пример: WORST_STATUS_GLOBAL (X25)SEVERITY_TALLY_GLOBAL- Возвращает количество измеряемых и вычисляемых параметров в зоне для всех контроллеров, находящихся в статусе severity. Заблокированные параметры не участвуют в определении.
Семантика вызова такая же как у оригинальных функций/ Различаются лишь способы подсчета статусов. Не ограничиваются контроллером вычисляемого параметра, а вычисляются для всех параметров всех контроллеров которые связаны с указанной зоной, т.е. глобально.
Инжененрные функции автоматического управления
PID-регулятор
PID-регулятор (пропорционально-интегрально-дифференцирующий регулятор) — алгоритм в системах автоматического управления, который поддерживает заданный параметр (температуру, давление, скорость, уровень) на нужном уровне с высокой точностью и плавностью.
Реализован классический вариант, когда пользователь может опеределить все три части регулятора:
-P (Пропорциональная составляющая): реагирует на текущую ошибку. Чем больше отклонение от нормы, тем сильнее воздействие (например, больше тепла или выше обороты мотора). Если ошибка равна нулю, эта часть тоже равна нулю.Если использовать только P, система почти всегда стабилизируется с небольшой статической ошибкой (недолет или перелет).
-I (Интегральная составляющая): накапливает ошибку со временем. Она нужна, чтобы убрать мелкие, но постоянные отклонения (статическую ошибку), с которыми не справляется одна лишь пропорциональная часть. Если система долго не может достичь цели (ошибка не равна нулю), интегральная составляющая накапливает «недовольство» и начинает все сильнее давить на систему, устраняя статическую ошибку.
Может вызвать перерегулирование (слишком сильный разгон) и эффект «интегрального насыщения».
-D (Дифференциальная составляющая): реагирует на скорость изменения ошибки (предсказывает её поведение). Она работает как тормоз: гасит резкие скачки и предотвращает раскачивание системы при приближении к цели.

Регулятор работает с непрерывными аналоговыми величинами, которые:
- измеряются с постоянной частотой и имеют метки времени;
- плавно реагируют на управляющее воздействие (нет больших запаздываний);
- имеют уставку (setpoint), от которой считается ошибка.
Примеры: температура, давление, расход, влажность, концентрация CO2, уровень жидкости, обороты/скорость, напряжение, скорость нагрева.
Не подходит для:
- дискретных/булевых величин (вкл/выкл, нет ошибки-уставки в смысле непрерывного сигнала);
- процессов с большим транспортным запаздыванием (нужен более сложный регулятор или предиктор);
- сильно нелинейных объектов без настройки по рабочим точкам (потребует gain scheduling).
Реализованы функции:
PID_RECENT (PARAMREF, SETPOINT, KP, KI, KD)
PID_RECENT_LIMITED(PARAMREF, SETPOINT, KP, KI, KD, outputMin, outputMax)Аргументы функций:
- PARAMREF ссылка на параметр, как в аналогичных других функциях (DR - измеряемые, CR - вычисляемые)
- SETPOINT - устанавливаемое значение, цель
- KP, KI, KD - коэффициенты пропорциональной, интегральной и дифференциальной части
- outputMin, outputMax (только в функции PID_RECENT_LIMITED) - ограничения накопления интегральной части (анти-виндап).
Функции можно использовать в выражении Действий при оформлении Правил в типовых и глобальных правилах. Схема как это должно работать: задаем в правиле уставку параметра, в выражении уставки определяем функцию регулятора, уставка пытается установить результат регулятора.
Функции реализованы по формуле PID регулятора, но имеют одну особенность. Интегральная часть не накапливается бесконечно, а использует последние 20 значений (выбирает значения за последние три часа, берет последние 20 из них).
Мерой времени являются секунды. Больший период, например сутки может привести к перенакоплению интегральной части. Поэтому достаточно вычислять так называемый скользящий интеграл по набору последних значений.
Функция PID_RECENT_LIMITED имеет дополнительные параметры для ограничения накопления интегральной части (outputMin, outputMax). Они нужны для так называемого "анти-виндап", перенакопления. Работают они как ограничения, когда интегральная сумма становится больше outputMax она приравнивается к outputMax. Когда меньше outputMin - соответственно приравнивается к нему.
Примеры коэффициентов для функций
Типовые регулируемые величины: температура приточного/вытяжного воздуха, температура в помещении, статическое давление в воздуховоде, расход воздуха, CO2, влажность. Подходящие коэффициенты:
- Температура (медленная)
- Kp 2-10
- Ki 0.1-0.5
- Kd 0 (не нужна)
- Давление/расход (быстрая)
- Kp 5-20
- Ki 0.5-2
- Kd 0.1-0.5
- CO2 (очень медленная)
- Kp 1-5
- Ki 0.01-0.1
- Kd 0 (не нужна)
Температура — самый частый случай: достаточно ПИ (Kd = 0), т.к. производная на шумных термодатчиках даёт дрожание клапана.
Давление/расход — динамика быстрее, Kd иногда помогает демпфировать перерегулирование.