Редактор формул

Общие принципы

В ПО ПРОСТОР применяется объектно-ориентированный подход при моделировании объектов и описании применяемых к ним дорасчетов. Объекты информационной модели могут быть вложены друг в друг друга, образуя деревья. Дорасчет может считать 1 скрипт и формулу (можно записать расчет нескольких сигналов через “;”). Дорасчет привязывается к объекту инф.модели. В результате могут быть рассчитаны сигналы, которые относятся к этому объекту или лежат на нижних уровнях дерева информационной модели. К одному объекту могут крепится несколько дорасчетов. Если для одинаковых объектов требуется производить одинаковые расчеты, используя одни и те же сигналы, то создается один дорасчет и связывается с каждым объектом, по которому необходимо производить расчет.

Дорасчеты описываются во вкладке «Расчеты и отчеты». В поле «алгоритм» можно загружать готовые lua-скрипты, при этом будут испольняться и те скрипты, что написаны пользователем в явном виде и те, что сгенерированы автоматически из формулы. В поле «Формула» можно записывать формулы. Правила написания формул будут изложены ниже.

На вкладке «Модель станции» у объектов в поле «Связи» можно найти и отредактировать все дорасчеты, которые привязаны и обрабатываются по данному объекту.

Правила написания формул

  1. Текущим уровнем считается уровень объекта, к которому крепится дорасчет.
  2. Если нам надо посчитать или использовать сигнал на 1 уровень ниже, чем текущий, то в формуле просто необходимо написать название данного сигнала (например Power = )

  1. Если нам надо посчитать или использовать сигнал на 2 уровня ниже, чем текущий, то необходимо прописать путь к нему, как в примере (GT1//Power = )

  1. Если на 3 уровня ниже, то как в примере и при увеличение уровней логика описания пути будет сохраняться (уровень вниз не ограничен)
(GT1//Power//PowerASUmain = )
  1. Логика описания какие именно сигналы используются для получения результатов дорасчетов сохраняется. Пример
(Power = if(GT1//Power//PowerSOTIres, GT1//Power//PowerSOTIres))
  1. Для дорасчета можно использовать сигналы родительского объекта. Синтаксис: …//имя_сигнала. Пример:
Test12 = 16 * ...//Freq1

Результатом дорасчета не может быть сигнал родителя объекта.

  1. Формула всегда должна быть оформлена следующим образом: Рассчитываемое значение = формула расчета. Есть возможность расчета нескольких формул, тогда синтаксис должен быть такой формула; формула; формула. Пример
(Test6 = Power + 15; GT1//Test7 = if(GT1//Power//PowerSOTIres, GT1//Power//PowerSOTIres); PT1//Freq//Test8 = PT1//Power//PowerSOTImain / Power)
  1. В настоящий момент реализованы следующие арифметические операции (+-*/ и скобки) все остальное оставляем на доработку, когда будет договор, пример формулы для проверки
Test1 = (16 * 3 * (47 - 19))/27

результат константа 49.7 с меткой времени расчета пишется в redis ts Test1:id_объекта и в stream по id объекта

  1. Разделителем для чисел с плавающей запятой является десятичная точка . Пример
(Test15 = (2.1 * 3.6 + (27 -18)) / 37)
  1. Проверка арифметических действий над сигналами. Пример
PT1//Freq//Test4 = (PT1//Power//PowerSOTImain + 3 * (47 - Freq)) / Power

Результат на уровень Freq в PT1 будет записан сигнал Test4 со значением в районе 0.5

  1. Сигнал считается достоверным, если он поступает (мы можем получить его значение (метка времени, значение)) и актуален (отстает от текущего времени менее чем на 10 секунд(пока зашито, можно и нужно дорабатывать)).
  2. Если для операций +- встречаются недостоверные сигналы, то они просто не учитываются, как слагаемые. Если недостоверные сигналы встречаются для */, то операция считается недействительной и будет игнорироваться, пока все множители не станут достоверными.
  3. Для возможности выбора одного сигнала из нескольких реализован условный оператор if со следующим синтаксисом: if(условие, значение(условие истинно), значение (условие ложно, может быть пропущено)). Пример:
GT1//Test5 = if(GT1//Power//PowerSOTIres, GT1//Power//PowerSOTIres, 20)
  1. Все логические операторы описанные ниже должны использоваться только для написаний условий оператора if.
  2. Если необходимо проверить, что сигнал достоверен достаточно написать следующим образом: if(имя сигнала, значение). Пример:
Test10 = if(PT1//Power//PowerSOTImain, PT1//Power//PowerSOTImain) + Freq
  1. Реализована базовая логика операторы и(and) или(or) отрицание(! при использовании отрицания сингнал необходимо заключать в скобки пример
!(GT1//Power//PowerSOTIres))

Эти операторы могут применяться к сигналам (комбинациям сигналов, комбинациям условий) для проверки их достоверности. Пример

Test11 = if(!(GT1//Power//PowerSOTIres) or GT1//Freq//FreqSOTIres, Freq * Power, 12)) 
  1. Реализованы базовые операторы сравнения: `>; >=; <; 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`) в формулах пока не обрабатывается. Формулы должны быть записаны в одну строку.