Определение
В общем случае выражение — это построенная по принятым в информатике и математике правилам комбинация констант, каналов, алгоблоков, идентификаторов алгоблоков, возможно, с использованием круглых скобок, соединенных знаками операций.
Использование
Выражение в пользовательских подпрограммах заключаются в квадратные скобки и могут использоваться:
•или как аргумент(ы) стандартных алгоблоков, например: B20 = RESULT(AO1.1; [(AO2.1 + AO2.2) / 2]; 0)
•или как отдельные строки кода, например: B20 = [AI1.1 + AI1.2 + SQRT(AI1.3)]
Состав
В общем случае в выражениях могут присутствовать:
•знаки математических операций (+, –, *, /); •знаки сравнений (>, <, >=, <=, ==); •унарные операции: отрицание (!) и смена знака (–); •знаки логических операций: И (&&) и ИЛИ (||); •константы (например, 0; 1; 45,2; 1e-5; 1e4); обеспечивается точность при значениях от ±1х10-5 до ±1х105; •каналы (например, AI1.1, DI3.8, AO1.1, DO2.5) или их пользовательские идентификаторы; •идентификаторы алгоблоков; •круглые скобки; •стандартные алгоблоки (см. следующий подраздел). Алгоблоки, доступные для использования в выражениях
Перечень стандартных алгоблоков, доступных для использования в выражениях, приведен в таблице ниже.
Таблица. Стандартные алгоблоки, доступные для использования в выражениях
Наименование
|
Количество аргументов
|
Пример
|
ABS
|
1
|
B10 = [ABS(AI1.1 - 10) + ABS(B1)]
|
ALARM
|
2—4
|
B10 = [ALARM(0; B1; 5; AO1.1) || ALARM(1; B2; 7; AO1.2)]
|
AND
|
1—32
|
B10 = [AI1.1 * AND(DI1.1; B1; DO1.1; 1)]
|
ASK_LIM
|
2—3
|
B10 = [MAX(ASK_LIM(8; AI1.1); 0)]
|
BREAK
|
1—32
|
B10 = [BREAK(DI1.1; AI1.1; AO1.1) + BREAK(DO1.1)]
|
CALL
|
1—32
|
B10 = [CALL(MY_PROG1; 2) + CALL(MY_PROG2; AI1.1; AO1.1)]
|
CHANNEL_STATE
|
2
|
B10 = IF([CHANNEL_STATE(AI1.1; 1)]; AI1.1; 0)
|
COS
|
1
|
B10 = [RESULT(AO1.2; 50 + 50 * COS(AO1.1))]
B20 = RESULT(AO1.3; [50 + 50 * COS(AO1.1 + 1)]; 0)
|
DELAY
|
3
|
B10 = [DELAY(DELAY(DI1.1; 20; 1); 20; 0)]
B20 = DELAY([DELAY(DI1.2; 20; 1)]; 20; 0)
|
DIFF
|
2
|
B10 = IF([DIFF(AI1.1; 600) > 10]; 1; 0)
|
DOWN_HYSTER
|
2—3
|
B10 = IF([UP_HYSTER(AI1.1; AO1.1; 0,5) + DOWN_HYSTER(AI1.1; AO1.2; 0,5) >= 1]; 10; 5)
|
DSC_PACK
|
1—32
|
B10 = [DSC_PACK(OR(DI2.1; DI2.2; DU2.3); AND(DI3.1; DI3.2); DI1.1; DI1.2; DI1.3)]
|
EQ
|
2
|
B10 = [EQ(AO1.1; AO1.2) || (AO2.1 == AO2.2)]
|
EXP
|
1
|
B10 = [1 + EXP(AO1.1) / 2]
|
FORCE_OFF
|
2
|
B10 = IF([FORCE_OFF(DI1.1; 50)]; AO1.1; 0)
|
FRN
|
2
|
B10 = RESULT(AO1.1; [AO1.1 + MAX(FRN(DI1.1; 1); 0)]; 0)
|
FRQ
|
2—4
|
B10 = [FRQ(20; 20) * 50]
|
GET_FIRST
|
3—32
|
B10 = RESULT(AO1.1; [GET_FIRST(DI1.1; DI1.2; DI1.3; DI1.4; DO1.1)])
|
GET_INFO
|
2
|
B10 = RESULT(AO1.1; [GET_INFO(AI1.1; 1)])
B20 = RESULT(AO1.2; [GET_INFO(AI1.1; 2)])
|
GT
|
2
|
B10 = RESULT(DO1.1; [GT(AO1.1; AO1.2) || LT(AO2.1; AO2.2)])
|
GTE
|
2
|
B10 = RESULT(DO1.1; [GTE(AO1.1; AO1.2) && LTE(AO2.1; AO2.2)])
|
ID_STATE
|
2
|
B100 = IF([ID_STATE(B10; 1) && ID_STATE(B20; 1)]; 4; 8)
|
IDIV
|
2
|
B10 = RESULT(AO1.1; [IDIV(AI1.1; AO1.1)])
|
IF
|
2—3
|
B10 = RESULT(AO1.1; [IF(AO1.1 > 6,2815; 0; AO1.1 + 0,001)])
B20 = IF([FORCE_OFF(DI1.1; 50)]; AO2.1; 0)
B30 = IF([UP_HYSTER(AI1.1; AO3.1; 0,5) + DOWN_HYSTER(AI1.2; AO3.2; 0,5) >= 1]; 10; 5)
|
IMP
|
1
|
B10 = RESULT(AO1.1; [AO1.1 + MAX(IMP(AI1.1); 0) / 5000])
|
INT
|
1
|
B10 = [INT(AI1.1) + INT(AI1.2)]
|
IREM
|
2
|
B10 = IF([IREM(AI1.1; AO1.1)]; AO2.1; -1)
|
IS_BIT
|
2
|
B10 = RESULT(DO1.1; [IS_BIT(SYS_ERROR(); 1)])
|
LN
|
1
|
B10 = [(LN(AI1.1) + LN(AO1.1)) / 2]
|
LT
|
2
|
B10 = RESULT(DO1.1; [GT(AO1.1; AO1.2) || LT(AO2.1; AO2.2)])
|
LTE
|
2
|
B10 = RESULT(DO1.1; [GTE(AO1.1; AO1.2) && LTE(AO2.1; AO2.2)])
|
MAX
|
1—32
|
B10 = RESULT(AO1.1; [AO1.1 + MAX(FRN(DI1.1; 1); 0)]; 0)
|
MEAN_SEL
|
2—32
|
B10 = RESULT(AO1.1; [MEAN_SEL(AI1.1; AI2.1; AI3.1)])
|
MEDIAN_SEL
|
3—32
|
B10 = RESULT(AO1.1; [MEDIAN_SEL(AI1.1; AI2.1; AI3.1; AI4.1)])
|
MEMORY
|
3
|
B10 = RESULT(DO1.1; [MEMORY(OR(DI1.1; 0); 0; DO1.1)])
|
MIN
|
1—32
|
B10 = RESULT(AO1.1; [MIN(AI1.1; 100)])
|
MOD_STATE
|
1
|
B10 = [MOD_STATE(1) == 1 && MOD_STATE(2) == 1 && MOD_STATE(3) == 1 ]
|
NODE_STATE
|
1—2
|
B10 = [NODE_STATE(0) == 2 || [NODE_STATE(1) == 2 || [NODE_STATE(2) == 2 || [NODE_STATE(3) == 2]
|
OR
|
1—32
|
B10 = [OR(DI1.1; DI1.2; DI1.3) && OR(DI2.1; DI2.2)]
|
PRIO_SEL
|
2—32
|
B10 = RESULT(AO1.1; [PRIO_SEL(AI1.1; AI2.1; AI3.1)])
|
PWR
|
2
|
B10 = RESULT(AO2.1; [PWR(AO1.1; AO1.2) + 1])
|
RAW_VALUE
|
1
|
B10 = IF([RAW_VALUE(AI1.1) <= 4,05]; 0; AI1.1)
|
REG_GETPAR
|
2
|
B10 = IF([REG_GETPAR(REG1; 1)]; [REG_GETPAR(REG1; 2)]; [REG_GETPAR(REG1; 3)])
|
RESULT
|
2—3
|
B10 = RESULT(AO1.1; [IF(AO1.1 > 6,2815; 0; AO1.1 + 0,001)])
B20 = [RESULT(AO1.2; 50 + 50 * COS(AO1.1))]
B30 = RESULT(AO1.3; [50 + 50 * COS(AO1.1 + 1)]; 0)
B40 = RESULT(AO3.1; [AO3.1 + MAX(FRN(DI1.1; 1); 0)]; 0)
|
SIGN
|
1
|
B10 = [SIGN(AO1.1) + DI1.1]
|
SIN
|
1
|
B10 = [RESULT(AO1.2; 50 + 50 * SIN(AO1.1))]
B20 = RESULT(AO1.3; [50 + 50 * SIN(AO1.1 + 1)]; 0)
|
SQR
|
1
|
B10 = [SQRT(SQR(AO1.1) + SQR(AO1.2))]
|
SQRT
|
1
|
B10 = [SQRT(SQR(AO1.1) + SQR(AO1.2))]
|
STAGE_STATE
|
1
|
B10 = [FRN(STAGE_STATE(2) == 2; 1)]
|
SYS_ERROR
|
0
|
B10 = RESULT(DO1.1; [IS_BIT(SYS_ERROR(); 1)])
|
SYS_TIME
|
1
|
B10 = [FRN(SYS_TIME(3) == 16; 1)]
|
TBL_APPROX
|
2
|
B10 = [TBL_APPOX(TBL1; AO1.1) + TBL_APPOX(TBL2; AO1.1)]
|
TBL_SEL
|
2
|
B10 = [(TBL_SEL(TBL1; 0) + TBL_SEL(TBL1; 1)) / 2]
|
TIMER
|
1
|
B10 = RESULT(AO1.1; [TIMER(DI1.1) / 10])
|
TRC
|
1
|
B10 = RESULT(AO1.1; [(AO1.1 + 0,001) * (1 - TRC(AO1.1 / 6,2815))]; 0)
|
TRG
|
2—3
|
B10 = [TRG(DI1.1; DI2.1) || TRG(DI1.2; DI2.2)]
|
UP_HYSTER
|
2—3
|
B10 = IF([UP_HYSTER(AI1.1; AO1.1; 0,5) + DOWN_HYSTER(AI1.1; AO1.2; 0,5) >= 1]; 10; 5)
|
VALVE
|
4
|
B10 = RESULT(AO1.1; [VALVE(DO1.1; DI1.1; DI1.2; 30)])
|
Дополнительные примеры выражений
b10 = result(do1.1; [0,2 + 0,4])
b20 = [(3 > 2) || (2 < 3)]
b30 = [(3 >= 2) && (2 <= 3)]
b40 = [(2 == 2) || (2 == 3)]
b50 = add([b60 + b70 + b80]; 5; ~b10)
b60 = if([10 >= b60 + do1.1]; [10 + 20]; [trc(13 / 2) + 1])
b70 = if([10 < b60 + do1.1]; [10 + 20]; [trc(13 / 2) + 1])
b80 = [min(1; 2; 3) + max(1; 2; 3)]
b90 = [trg(di1.1; DI1.2)]
b100 = result(ao1.1; [if(ao1.1 > 6,2815; 0; ao1.1 + 0,001)])
b110 = result(ao1.2; [50 + 50 * sin(ao1.1)])
b120 = call(myProg; [b10 + 1]; [b20 / 100]; 0)
b130 = [-(!(0,05 + 0,04))]
b140 = [!(-5)]
b150 = [-(!0)]
b260 = [2 + 2 / 3 * 3 - 1]
|