2.2 AOE基本表达式
低代码控制器采用基于AOE事件驱动的控制方式,在利用AOE网络进行控制策略设计时,所涉及的基本语法介绍如下。
赋值
AOE可以直接将某一数值或表达式赋给某个变量。赋值号为冒号:
或等号=
,推荐使用冒号:
,赋值顺序为将赋值号右边的值赋给左边。
相关示例如下:
#示例1:直接将值1赋给变量State_POINT
State_POINT: 1;
#示例2:将由变量Cartset_POINT与Cart_POINT组成的表达式的值赋给变量ECar
Ecar: Cartset_POINT - Cart_POINT;
基本数值运算
AOE可完成的基本数值运算及涉及的运算符如下表所示。
名称 | 运算符 |
---|---|
四则运算 | + - * / |
关系运算 | < <= > >= == != |
逻辑运算 | && || |
取余运算 | % |
幂运算 | ^ |
位运算 | & | ^^ ~ << >> @ |
相关示例如下:
#示例3:简单四则运算
Iout: Iout + Igain * Ecarn1 * Ts;
#示例4:多种运算混合
Ilimout: (Iout <= Iuplim && Iout >= Idownlim) * Iout + (Iout > Iuplim) * Iuplim + (Iout < Idownlim) * Idownlim;
内置函数
AOE内置多种常用数学函数及实用时间获取函数,可通过向括号内传入参数进行直接调用,支持的函数及其具体功能如下表所示。
函数 | 功能 |
---|---|
abs() | 求绝对值 |
sqrt() | 求平方根 |
exp() | 求以e为底的指数 |
ln()、log10() | 求自然对数(以e为底)、求常用对数(以10为底) |
sin()、cos()、tan() | 正弦函数、余弦函数、正切函数,单位为弧度 |
asin()、acos()、atan() | 反正弦函数、反余弦函数、反正切函数 |
sinh()、cosh()、tanh() | 双曲正弦函数、双曲余弦函数、双曲正切函数 |
asinh()、acosh()、atanh() | 反双曲正弦函数、反双曲余弦函数、反双曲正切函数 |
floor() | 向下取整,即取不大于传入参数的最大整数 |
ceil() | 向上取整,即取不小于传入参数的最小整数 |
round() | 将传入参数进行四舍五入 |
signum() | 符号函数,指出参数正负号,若为正则返回1;零返回0;负返回-1 |
atan2() | 计算方位角,弧度表示 |
max()、min() | 求多个参数的最大值/最小值,参数用“,”分隔 |
rand() | 输出[0,1)之间的随机数 |
rand2(a,b) | 输出[a,b)之间的随机数 |
indexOfYear()、Year() | 返回日期的年 |
indexOfMonth()、Month() | 返回日期的月 |
indexOfWeekday()、Weekday() | 返回日期的星期几,星期一至星期日分别为1-7 |
indexOfDay()、Day() | 返回日期的日 |
indexOfHour()、Hour() | 返回时间的小时,从当天0点算起 |
indexOfMinute()、Minute() | 返回时间的分钟,从当天0点算起 |
indexOfSecond()、Second() | 返回时间的秒,从当天0点算起 |
now() | 返回当前13位时间戳 |
TotalMemory() | 返回总内存大小 |
UsedMemory() | 返回已使用内存大小 |
UsedMemorySelf() | 返回程序本身已使用内存大小 |
MemUsage() | 返回内存使用率 |
MemUsageSelf() | 返回程序本身内存使用率 |
TotalSwap() | 返回总Swap大小 |
UsedSwap() | 返回已使用Swap大小 |
CpuUsage() | 返回Cpu使用率 |
CpuUsageSelf() | 返回程序本身Cpu使用率 |
TotalSpace() | 返回总空间大小 |
UsedSpace() | 返回已使用空间大小 |
DiskUsage() | 返回已使用磁盘率 |
TotalReceived() | 返回总接收数据量 |
TotalTransmitted() | 返回总发送数据量 |
注:indexOfYear()等时间相关函数中,index不区分大小写。
数字表示约定
AOE支持的数学常数和数字表示约定如下表。
圆周率 | pi | |
自然常数 | e | |
科学计数法 | 1e-2 1E-3 |
测点值及采样时间相关表达式
注:以下以点号为1234,别名为POINT_EXAMPLE的测点为例。
若在前后几次采样中,测点值都相同,那么测点的变化可以指代两种情况,一种是指值的变化,只有值发生改变时,才认为测点发生了变化;另一种是无论值是否变化,只要进行一次采样,就认为测点发生了变化(更新)。这里对可能产生的歧义做一个说明。
- 一、默认情况下,按第二种方式判别测点的变化。
别名_t
表示最近一次的采样时间。别名_dt
是指最近一次采样和上一次采样的时间间隔,别名_err
是指这一次采样和上一次采样的测点值之差,别名_ddt
指测点值变化率。
在这几个值的计算中,都是将当前采样的时间和值与上一次采样得到的时间和值进行对比。举一个例子,假设通讯通道每隔 1s 获取一次数据,各个值列表如下:
本次采样时间 | 1ms | 2ms | 3ms | 4ms | 5ms | 6ms | 7ms | 8ms | 9ms |
---|---|---|---|---|---|---|---|---|---|
本次采样值 | 11 | 12 | 13 | 14 | 14 | 14 | 14 | 15 | 16 |
上次时间 | 0 | 1 | 2 | 3 | 4 | 4 | 4 | 4 | 8 |
上次值 | 0 | 11 | 12 | 13 | 14 | 14 | 14 | 14 | 15 |
t | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
dt | 1 | 1 | 1 | 1 | 1 | 2 | 3 | 4 | 1 |
err | 11 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
界面显示时间 | 1 | 2 | 3 | 4 | 4 | 4 | 4 | 8 | 9 |
界面显示的值 | 11 | 12 | 13 | 14 | 14 | 14 | 14 | 15 | 16 |
- 二、若希望测点值变化时,才认为是测点发生变化,则将测点变化条件设置为
测点_err!=0
。
别名_t
仍表示最近一次的采样时间。别名_dt
是指最近一次采样和上一次发生值变化的采样的时间间隔,别名_err
是指这一次采样和上一次发生值变化的采样的测点值之差,别名_ddt
指测点值变化率。仍然是上述例子,在这个设定下,各个值列表如下:
本次采样时间 | 1ms | 2ms | 3ms | 4ms | 5ms | 6ms | 7ms | 8ms | 9ms |
---|---|---|---|---|---|---|---|---|---|
本次采样值 | 11 | 12 | 13 | 14 | 14 | 14 | 14 | 15 | 16 |
上次时间 | 0 | 1 | 2 | 3 | 4 | 4 | 4 | 4 | 8 |
上次值 | 0 | 11 | 12 | 13 | 14 | 14 | 14 | 14 | 15 |
t | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
dt | 1 | 1 | 1 | 1 | 1 | 2 | 3 | 4 | 1 |
err | 11 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
界面显示时间 | 1 | 2 | 3 | 4 | 4 | 4 | 4 | 8 | 9 |
界面显示的值 | 11 | 12 | 13 | 14 | 14 | 14 | 14 | 15 | 16 |
如果只关心测点值的改变和改变的时间间隔,则需要用上述第二种方案。
若需要分辨每次采样而不要求测点值一定发生改变,以通信成功获取测点值来作为触发aoe的条件,则需要通过别名_t
来辨别每次采样的时间,并用aoe中的变量记录上一次的采样时间,若别名_t
等于上一次采样的时间,则还没有获取新的通信数据,若别名_t
大于上一次采样的时间,则获成功取新的通信数据。
需要说明的是,上述测点是针对通信测点的采样进行阐述的,对于aoe的置点和计算点的计算也是同理的。