Выражения - функции, операторы и константы
Описание
Для дорасчёта значений сигналов структуры, а также формирования расчетных сигналов необходимо вводить выражения в параметр «Выражение» компонента «Сигнал».
Если выражение пустое, то дорасчет не выполняется. Для «сигнала» типа «ТУ – команда» выражение является условием выдачи команды (для выдачи команды должно выполняться условие и от источника должна поступить команда).
Приоритет операций выражения определяется стандартными арифметическими правилами – круглые скобки ()
, умножение выполняется раньше сложения и т.д. Разделитель операндов «запятая» ,
, десятичный разделитель «точка» .
.
Дорасчет может быть простым (инверсия, коэффициенты, различные функции 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, атрибут удаляет);
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.