Выражения - функции, операторы и константы

From Центр документации - ТМИУС КП


Описание

Для дорасчёта значений сигналов структуры, а также формирования расчетных сигналов необходимо вводить выражения в параметр «Выражение» компонента «Сигнал».

Если выражение пустое, то дорасчет не выполняется. Для «сигнала» типа «ТУ – команда» выражение является условием выдачи команды (для выдачи команды должно выполняться условие и от источника должна поступить команда).

Приоритет операций выражения определяется стандартными арифметическими правилами – круглые скобки (), умножение выполняется раньше сложения и т.д. Разделитель операндов «запятая» , , десятичный разделитель «точка» . .

Дорасчет может быть простым (инверсия, коэффициенты, различные функции cos, sin, abs и т.д.) и сложным (сложные выражения с участием большого количества сигналов). Расчетный сигнал сам в свою очередь может участвовать в любых выражениях.

Для участия в выражении значения сигнала, который дорасчитывается используется функция self().

Выражение можно разделить на несколько шагов точкой с запятой ;. При этом каждый шаг будет изменять значение сигнала, которое будет извлекаться функцией self() на следующем шаге.

Пример

Выражение self()*10+5 можно разделить на два шага: self()*10; self()+5;

Операторы

Логические

! (НЕ), and (И), or (ИЛИ), xor (исключающее ИЛИ)

Сравнения

<= (меньше либо равно), >= (больше либо равно), != (неравно), == (равно), > (больше), < (меньше).

Арифметические

+ (сложение), - (вычитание), * (умножение), / (деление), ^ (возведение в степень), % (деление по модулю – остаток от деления целого числа на другое целое число).

Другие

$ – оператор достоверности, возвращает 0, если значение x недостоверно (присутствуют атрибуты _aBAD или _aUNC), иначе возвращает значение x.

Внимание! Результат оператора or содержит атрибуты первого неравного нулю аргумента (проверка аргументов на неравенство нулю выполняется слева направо).

Примеры

$ka_1 – возвращает 0, если значение ka_1 недостоверно, иначе возвращается значение ka_1;

$AND(ka_1,ka_2,ka_3) – возвращает 0, если значение функции AND недостоверно, иначе возвращается значение функции AND;

$(ka_1 and ka_2 and ka_3) – аналогично AND;

$OR(ka_1,ka_2,ka_3) – возвращает 0, если значение функции OR недостоверно, иначе возвращается значение функции OR;

$(ka_1 or ka_2 or ka_3) – аналогично OR;

Внимание! Выражения $AND(ka_1,ka_2,ka_3) и AND($ka_1,$ka_2,$ka_3) эквивалентны, но выражения $OR(ka_1,ka_2,ka_3) и OR($ka_1,$ka_2,$ka_3) не эквивалентны. Так как результат функции OR и оператора or содержит атрибуты первого неравного нулю аргумента.

Функции

expr-произвольное выражение

sin(expr) – синус;

cos(expr) – косинус;

tan(expr) – тангенс;

asin(expr) – арксинус;

acos(expr) – арксосинус;

atan(expr) –арктангенс;

sinh(expr) – гиперболический синус;

cosh(expr) – гиперболический косинус;

tanh(expr) – гиперболический тангенс;

asinh(expr) – гиперболический арксинус;

acosh(expr) – гиперболический арккосинус;

atanh(expr) – гиперболический арктангенс;

log2(expr) – логарифм по модулю 2;

log10(expr) – логарифм по модулю 10;

ln(expr) – натуральный логарифм;

exp(expr) – экспонента;

sqrt(expr) – квадратный корень;

sign(expr) – сигнальная функция: -1 если expr<0, 1 если expr>0; 0 если expr=0;

rint(expr) – округление до ближайшего целого;

abs(expr) – абсолютное значение;

if(expr, then, else) – если expr равно 0, то результат равен else, иначе результат равен then;

sum(expr1, expr2...exprN) – сумма всех аргументов;

avg(expr1, expr2...exprN) – среднее значение всех аргументов;

min(expr1, expr2...exprN) – минимальное значение из всех аргументов;

max(expr1, expr2...exprN) – максимальное значение из всех аргументов.

Другие функции

self() – функция «свое значение» - участие в выражении идентификатора сигнала, который дорасчитывается,

например:

!self() – инверсия сигнала («!» – оператор логического «НЕ»);

self() – эквивалент пустого выражения;

52,12*self() – применение масштабного коэффициента;

self() or ka_1 and !ka_2 – логическое выражение.

key( if0, if1 ) – функция «уставка», key( if0, if1 ) аналогично if( if0, 0, if(if1,1,self()) );

если if0 != 0, то результат 0,

если if1 != 0, то результат 1.

Пример выражения управления обогревом: >20 отключить, <15 включить:

key( t > 20, t < 15 )


round(x,p) – округление x до p знаков после запятой;

ceil( x ) – меньшее целое, большее чем x;

floor( x ) – большее целое, меньшее чем x;

AND(x1,x2,x3,...) – логическая операция И для всех аргументов, аналогично: x1 and x2 and x3;

OR(x1,x2,x3,...) – логическая операция ИЛИ для всех аргументов, аналогично: x1 or x2 or x3;

bit(X,p) – проверить в (извлечь из) X бит номер р (0 до 31);

если бит p равен 1, то результат 1,

если бит p равен 0, то результат 0.

Пример проверки бита 0 в reg_1: bit(reg_1,0).


ibit(b0,b1,b2,...,b31) – сборка целого числа из битов, все 32 бита указывать необязательно – можно указать первые несколько битов;

Пример: ibit(ts_1, 0, ts_2, $ts_3, 1, ts_4 or ts_5)


byte(X,p) – извлечь из X байт номер р (0 до 3);

Пример извлечения байта 2 из reg_1: byte(reg_1,2)


ibyte(b0,b1,b2,b3) – сборка целого числа из байтов, все 4 байта указывать необязательно – можно указать первые;

Пример, аналог переменной _HOURMIN: ibyte(_MIN,_HOUR)


word(X,p) – извлечь из X слово (два байта) номер р (0 до 1);

Пример извлечения младшего слова из reg_1: word(reg_1,0)


iword(w0,w1) – сборка целого числа из слов;

Пример: iword(reg_1,reg_2)


TU(tu0,tu1) – функция для условия выполнения команды (применять только для сигналов типа ТУ),

tu0 – условие команды «отключить», если аргумент tu0!= 0, то команду «отключить» (0) можно подать,

tu1 – условие команды «включить», если аргумент tu1!= 0, то команду «включить» (1) можно подать.

Выражение -аналог: (!self() and tu0) or (self() and tu1).

Примеры:

TU($tu0, $tu1) – команда будет подана только, если условия достоверны;

TU(1,tu1) – отключать можно всегда, а включать по условию tu1.

TU1( условие ВКЛ ) аналог TU( 1, условие ВКЛ )

TU0( условие на ОТКЛ ) аналог TU( условие ОТКЛ, 1)

filtr( max, min ) –значение помечается как недостоверное новое значение при выходе за границы, где:

max – максимальное значение,

min – минимальное значение (необязательный параметр).

Выражение-аналог: aset(max<self() or self()<min, _aBAD, self())

Примеры:

q_1*10; filtr(50,10)

filtr(50)+2


ignor( max, min ) – игнорировать новое значение при выходе за границы, где:

max – максимальное значение,

min – минимальное значение (необязательный параметр).

Выражение-аналог: if(max<self() or self()<min, old(), self())

Примеры:

q_1*10; ignor(50,10);

ignor(50)+2

old() – старое (предыдущее) значение сигнала.

Пример (аналог функции ignor(50,10)): if(50<self() or self()<10, old(), self())

Дополнительные функции для выражений с двухпозиционными сигналами

ts2( НР, НЗ, sec ) – двухпозиционный сигнал из двух однопозиционных сигналов, где sec – необязательный таймаут переключения;

tson( ts2 ) – нормальноразомкнутый (НР) сигнал из двухпозиционного сигнала;

tsof( ts2 ) – нормальнозамкнутый (НЗ) сигнал из двухпозиционного сигнала;

ts2not() – инверсия двухпозиционного сигнала. Применять только, когда требуется инвертировать для передачи двухпозиционный сигнал, принятый по протоколу МЭК-870-5-101 или МЭК-870-5-104. Функция гарантирует правильную передачу неопределенного (00) и аварийного (11) состояний сигнала.

Выражение аналог: if(aget(_aUNC,self()),self(),!self())

Дополнительные функции для выражений с задержкой значений сигналов

pause( sec, vl ) - пауза sec значения vl - возвращает старое значение, пока пауза не истечет;

pause1( sec, vl ) - пауза 1 – возвращает 0 во время паузы, после паузы возвращает значение != 0;

pause0( sec, vl ) - пауза 0 – возвращает 1 во время паузы, после паузы возвращает 0;

Пример: проверка достоверности двухпозиционного сигнала (положения КА) с таймером на переключение 10 секунд:

!((tson( ts2 ) and tsof( ts2 )) or pause1(10, !tson( ts2 ) and !tsof( ts2 )))

это выражение заменяет функция

rel( sec, ts2 ) - проверка достоверности двухпозиционного сигнала (положения КА) ts2 с паузой на переключение sec секунд.

Внимание! Только одна функция с паузой может быть в выражении. Что бы обойти это ограничение, необходимо использовать расчетные сигналы. Например, для логики блокировки необходимо в отдельном разделе создать расчетные сигналы проверки достоверности двухпозиционного сигнала всех КА, которые участвуют в логике деблокировки.

Дополнительные функции для доступа к атрибутам сигналов

aget( attr, vl ) – проверить атрибут, возвращает 1, если атрибут присутствует, пример: aget(_aUNC,ts_1)

aset( <условие>, attr, vl ) – изменить атрибут (условие != 0, атрибут устанавливает; условие == 0, атрибут удаляет);

Пример:

Замена любого флага NT или BAD на BAD aset(aget(_aNT+_aBAD,self()) !=0,_aBAD, self())


aadd( attr, vl ) – установить атрибут;

adel( attr, vl ) – удалить атрибут.

Константы

_pi – число Пи

_e – число e (число Эйлера)

_calct – цикл дорасчета в миллисекундах

Константы – атрибуты сигналов

_aUNC – неопределенное положение двухпозиционного сигнала;

_aCALC – расчетный сигнал;

_aUSE – сигнал привязан к источнику;

_aBLOCK – значение сигнала заблокировано от изменения источником.

Константы – атрибуты сигналов (атрибуты, аналогичные атрибутам протокола МЭК-870-50-101:

_aOV – переполнение;

_aBL или _aHAND – значение ручное;

_aSB или _aREPL – значение замещено;

_aNT или _aOLD – значение устарело;

_aIV или _aBAD – значение недостоверное (первичный сбор информации не выполнялся).

Системные переменные

_DB_DISK_FREE – свободное место диска (в мегабайтах), на котором хранятся файлы баз данных (журнал событий, архивы измерений и д.р.);

_DBTS – сигнал исправности журнала событий;

_DBTI – сигнал исправности архива измерений;

_CPU – загрузка процессора;

_GPS – исправность GPS;

_SAT – сколько cпутников видно;

_SAT_USE – сколько спутников используется;

_REG – регистрация (1 - выполнена, 0 – нет регистрации);

_RESERVE – резервный (1 – работает резервный, 0 – основной или без резерва).

Переменные системного времени:

_YEAR – год полный, например 2014;

_MONTH – месяц;

_DAY – день;

_HOUR – час;

_MIN – минута;

_SEC – секунда;

_wDAY – день недели;

_mSEC – миллисекунда;

_year – год кратко, например 14;

_MONTHDAY – месяц – старший байт, день – младший байт;

_HOURMIN – час – старший байт, минута – младший байт;

_mSECmin – миллисекунды в минуте (_SEC*1000 + _mSEC).

Переменные _year, _MONTHDAY, _HOURMIN, _mSECmin могу применяться для синхронизации времени в устройствах, например, Sepam 80 по протоколу Modbus.