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