Редактор формул
Общие принципы
В ПО ПРОСТОР применяется объектно-ориентированный подход при моделировании объектов и описании применяемых к ним дорасчетов. Объекты информационной модели могут быть вложены друг в друг друга, образуя деревья. Дорасчет может считать 1 скрипт и формулу (можно записать расчет нескольких сигналов через “;”). Дорасчет привязывается к объекту инф.модели. В результате могут быть рассчитаны сигналы, которые относятся к этому объекту или лежат на нижних уровнях дерева информационной модели. К одному объекту могут крепится несколько дорасчетов. Если для одинаковых объектов требуется производить одинаковые расчеты, используя одни и те же сигналы, то создается один дорасчет и связывается с каждым объектом, по которому необходимо производить расчет.
Дорасчеты описываются во вкладке «Расчеты и отчеты». В поле «алгоритм» можно загружать готовые lua-скрипты, при этом будут испольняться и те скрипты, что написаны пользователем в явном виде и те, что сгенерированы автоматически из формулы. В поле «Формула» можно записывать формулы. Правила написания формул будут изложены ниже.
На вкладке «Модель станции» у объектов в поле «Связи» можно найти и отредактировать все дорасчеты, которые привязаны и обрабатываются по данному объекту.
Правила написания формул
- Текущим уровнем считается уровень объекта, к которому крепится дорасчет.
- Если нам надо посчитать или использовать сигнал на 1 уровень ниже, чем текущий, то в формуле просто необходимо написать название данного сигнала (например Power = )
- Если нам надо посчитать или использовать сигнал на 2 уровня ниже, чем текущий, то необходимо прописать путь к нему, как в примере (GT1//Power = )
- Если на 3 уровня ниже, то как в примере и при увеличение уровней логика описания пути будет сохраняться (уровень вниз не ограничен)
(GT1//Power//PowerASUmain = )
- Логика описания какие именно сигналы используются для получения результатов дорасчетов сохраняется. Пример
(Power = if(GT1//Power//PowerSOTIres, GT1//Power//PowerSOTIres))
- Для дорасчета можно использовать сигналы родительского объекта. Синтаксис: …//имя_сигнала. Пример:
Test12 = 16 * ...//Freq1
Результатом дорасчета не может быть сигнал родителя объекта.
- Формула всегда должна быть оформлена следующим образом: Рассчитываемое значение = формула расчета. Есть возможность расчета нескольких формул, тогда синтаксис должен быть такой формула; формула; формула. Пример
(Test6 = Power + 15; GT1//Test7 = if(GT1//Power//PowerSOTIres, GT1//Power//PowerSOTIres); PT1//Freq//Test8 = PT1//Power//PowerSOTImain / Power)
- В настоящий момент реализованы следующие арифметические операции (+-*/ и скобки) все остальное оставляем на доработку, когда будет договор, пример формулы для проверки
Test1 = (16 * 3 * (47 - 19))/27
результат константа 49.7 с меткой времени расчета пишется в redis ts Test1:id_объекта и в stream по id объекта
- Разделителем для чисел с плавающей запятой является десятичная точка
.Пример
(Test15 = (2.1 * 3.6 + (27 -18)) / 37)
- Проверка арифметических действий над сигналами. Пример
PT1//Freq//Test4 = (PT1//Power//PowerSOTImain + 3 * (47 - Freq)) / Power
Результат на уровень Freq в PT1 будет записан сигнал Test4 со значением в районе 0.5
- Сигнал считается достоверным, если он поступает (мы можем получить его значение (метка времени, значение)) и актуален (отстает от текущего времени менее чем на 10 секунд(пока зашито, можно и нужно дорабатывать)).
- Если для операций +- встречаются недостоверные сигналы, то они просто не учитываются, как слагаемые. Если недостоверные сигналы встречаются для */, то операция считается недействительной и будет игнорироваться, пока все множители не станут достоверными.
- Для возможности выбора одного сигнала из нескольких реализован условный оператор if со следующим синтаксисом: if(условие, значение(условие истинно), значение (условие ложно, может быть пропущено)). Пример:
GT1//Test5 = if(GT1//Power//PowerSOTIres, GT1//Power//PowerSOTIres, 20)
- Все логические операторы описанные ниже должны использоваться только для написаний условий оператора
if. - Если необходимо проверить, что сигнал достоверен достаточно написать следующим образом: if(имя сигнала, значение). Пример:
Test10 = if(PT1//Power//PowerSOTImain, PT1//Power//PowerSOTImain) + Freq
- Реализована базовая логика операторы и(
and) или(or) отрицание(!при использовании отрицания сингнал необходимо заключать в скобки пример
!(GT1//Power//PowerSOTIres))
Эти операторы могут применяться к сигналам (комбинациям сигналов, комбинациям условий) для проверки их достоверности. Пример
Test11 = if(!(GT1//Power//PowerSOTIres) or GT1//Freq//FreqSOTIres, Freq * Power, 12))
- Реализованы базовые операторы сравнения: `>; >=; <; 49.975) and !(PT1//Power//PowerSOTIres), Freq 10, Power 1.1)
18. При использовании логики и операторов сравнения необходимо быть аккуратным с написанием формул. ТАК НЕ БУДЕТ РАБОТАТЬ
Test21 = if(Freq > 49.975 and !(PT1//Power//PowerSOTIres), Freq 10, Power 1.1)
Точнее результата от работы формулы не будет так как не ясен порядок выполнения операций > и and. Вот правильный пример формулы
Test21 = if((Freq > 49.975) and !(PT1//Power//PowerSOTIres), Freq 10, Power 1.1)
19. Символ переноса (`n`) в формулах пока не обрабатывается. Формулы должны быть записаны в одну строку. 



