Skip to main content

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

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

В ПО ПРОСТОР применяется объектно-ориентированный подход при моделировании объектов и описании применяемых к ним дорасчетов. Объекты информационной модели могут быть вложены друг в друг друга, образуя деревья. Дорасчет может считать 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. Реализованы базовые операторы сравнения: >; >=; <; <=; ==; !=. При сравнении сигналов сравниваются их значения, если оба сигнала достоверны. Если один из сигналов не достоверен или оба сигнала не достоверны весь условный оператор if, где использовано данное условие игнорируется (если условие использовалось). Пример:
Test19 = if((Freq > 49.975) and !(PT1//Power//PowerSOTIres), Freq * 10, Power * 1.1)
  1. При использовании логики и операторов сравнения необходимо быть аккуратным с написанием формул. ТАК НЕ БУДЕТ РАБОТАТЬ
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)
  1. Символ переноса (\n) в формулах пока не обрабатывается. Формулы должны быть записаны в одну строку.