虚拟计算表达式实践
# 虚拟计算表达式实践
# 配置入口指引
所有表达式配置均需通过以下路径进入:
进入「设备管理」菜单
选择目标设备 → 点击「遥测编辑」
滑动至页面底部 → 展开「高级设置」区域



⚠️ 特别提示:
✓ 本文后续所有操作均默认在该位置进行,不再重复说明路径
✓ 不同版本的界面布局可能存在细微差异,请认准「遥测量编辑界面」
# 常量值配置
在参数表达式编辑区域,用户可直接输入自定义常量值。 如:设置当前温湿度#1的温度固定为25
示例演示

实时同步效果
配置完成后,设备列表将自动同步显示已配置的常量参数

# 运算符表达式配置
📘【运算符优先级规范说明】
运算符分类定义
一元运算符(单目运算符)
• 符号集:
-(取负)、~(按位取反)、!(逻辑非)• 特性:仅作用于单个操作数,优先级高于所有二元运算符
二元运算符(双目运算符)
• 符号集:
*、/、%、+、-、<、>、<=、>=、==、!=、&、^、&&、|• 特性:连接两个操作数进行运算,优先级按类别区分
优先级执行规范
- 绝对优先规则:• 括号内表达式始终优先计算,可嵌套使用
( ) → 强制优先级括号
- 绝对优先规则:
示例演示
一元运算符示例:

实时同步效果

二元运算符示例:

实时同步效果

注意
其他一元/二元运算与上述使用方法相同。
注意
\frac是数学符号,用于表示分数。在数学表达式中,\frac用于表示分子与分母的关系。例如,\frac{1}{2}表示二分之一等同于1/2。 命令格式:
\frac{分子}{分母}
# 三角函数表达式
# 1. 正弦函数 $sin(值)
- 输入范围:任意实数(角度默认以弧度为单位,如需角度制需转换)。
- 输出范围:[-1, 1]
- 示例:
- $sin(0) = 0

# 2. 余弦函数 $cos(值)
- 输入范围:任意实数。
- 输出范围:[-1, 1]
- 示例:
- $cos(0) = 1


# 3. 正切函数 $tan(值)
- 示例:
- $tan(\frac{π}{4}) = 1


# 4. 余割函数 $csc(值)
- 示例:
- $csc(\frac{π}{2}) = 1


# 5. 正割函数 $sec(值)
- 示例:
- $sec(0) = 1


# 6. 余切函数 $cot(值)
- 示例:
- $cot(\frac{π}{4}) = 1


# 反三角函数
# 1. 反正弦函数 asin(值)
- 输入范围:[-1, 1]
- 示例:
- asin(1) = \frac{π}{2}
# 2. 反余弦函数 acos(值)
- 输入范围:[-1, 1]
- 输出范围:[0, π](主值范围)
- 示例:
- acos(-1) = π


# 3. 反正切函数 atan(值)
- 输入范围:任意实数。
- 示例:
- atan(1) = \frac{π}{4}


# 双曲函数
# 1. 双曲正弦函数 $sinh(值)
- 输入范围:任意实数。
- 示例:
- $sinh(0) = 0


# 2. 双曲余弦函数 $cosh(值)
- 输入范围:任意实数。
- 示例:
- $cosh(0) = 1


# 3. 双曲正切函数 $tanh(值)
- 输入范围:任意实数。
- 输出范围:$(-1, 1)
- 示例:
- $tanh(0) = 0


# 函数表达式
# 绝对值函数 abs(值)
- 输入范围
- 任意实数(正数、负数、零)
- 示例
- 基础计算
- abs(5) = 5
- abs(-3.2) = 3.2
- abs(0) = 0


# 平方根函数 $sqrt(值)
- 输出范围
- 若输入合法,输出为 $\geq 0 的实数。
示例
基础计算
- $sqrt(4) = 2(因为 $2^2 = 4)
- $sqrt(0.25) = 0.5(因为 $0.5^2 = 0.25)
边界值
- $sqrt(0) = 0
- $sqrt(1) = 1


# 向上取整函数 $ciel(值)
- 输入范围
- 任意双精度浮点数(正数、负数、零、小数)
- 输出范围
- 整数(输出类型可能为
int,long等,依编程语言而定)
示例
基础计算
- $ciel(3.2) = 4(大于3.2的最小整数)
- $ciel(-1.7) = -1(大于-1.7的最小整数,注意负数方向)
- $ciel(5) = 5(输入为整数时直接返回自身)
边界值
- $ciel(0.0) = 0
- $ciel(-0.0) = -0(部分语言中-0.0与0.0等价)


# 向下取整函数 $floor(值)
- 输入范围
- 任意双精度浮点数(正数、负数、零、小数)
- 输出范围
- 整数(输出类型可能为
int,long等,依编程语言而定)
示例
基础计算
- $floor(3.8) = 3(小于3.8的最大整数)
- $floor(-1.2) = -2(小于-1.2的最大整数,注意负数方向)
- $floor(5) = 5(输入为整数时直接返回自身)
边界值
- $floor(0.0) = 0
- $floor(-0.0) = -0(部分语言中-0.0与0.0等价)


# 指数函数 $exp(值)
定义 返回自然常数 $e$(约等于 2.71828)的「值」次方,即 $e^{值}$。数学上表示为 $\exp(值)。
输入范围
- 任意实数(正数、负数、零)
- 输出范围
- 正实数(输出 > 0)
- 示例 基础计算
- $exp(1) = e^1 ≈ 2.71828
- $exp(0) = e^0 = 1
- $exp(-2) = e^{-2} ≈ 0.13534


# 以10为底的对数函数 $log10(值)
- 定义 返回一个正实数「值」的以10为底的对数,即求解方程 $10^x = 值$ 中的 $x$。数学上表示为 $\log_{10}(值) 或 $\lg(值)。
2 .输入范围
- 值 $> 0(输入必须为正实数,否则无定义)
3.输出范围
- 任意实数($输出 \in (-\infty, +\infty))
- 示例 基础计算
- $log10(100) = 2(因为 $10^2 = 100)
- $log10(0.1) = -1(因为 $10^{-1} = 0.1)
- $log10(1) = 0(因为 $10^0 = 1)


# 自然对数函数 $log(值)
定义 返回一个正实数「值」的自然对数,即以数学常数 $e$(约等于 2.71828)为底的对数,求解方程 $e^x = 值$ 中的 $x$。数学上表示为 $\ln(值) 或 $\log_e(值)。
输入范围
- 值 $> 0(输入必须为正实数,否则无定义)
- 输出范围
- 任意实数($输出 \in (-\infty, +\infty))
- 示例 基础计算
- $log(1) = 0(因为 $e^0 = 1)
- $log(e) = 1(因为 $e^1 = e)
- $log(e^2) = 2(直接利用指数与对数的互逆性)
- $log(10) ≈ 2.3026(非整数结果)


# 以2为底的对数函数 $log(值, 2)
定义 返回一个正实数「值」的以2为底的对数,即求解方程 $2^x = 值$ 中的 $x$。数学上表示为 $\log_2(值),部分编程语言中需明确指定底数(如
log(值, 2))。输入范围
- 值 $> 0(输入必须为正实数,否则无定义)
- 底数:此处固定为2(若底数可变,需满足底数 $> 0 且 $\neq 1)
- 输出范围
- 任意实数($输出 \in (-\infty, +\infty))
- 示例 基础计算
- $log(8, 2) = 3(因为 $2^3 = 8)
- $log(1, 2) = 0(因为 $2^0 = 1)
- $log(0.5, 2) = -1(因为 $2^{-1} = 0.5)


# 设备表达式配置
# 测点值计算表达式解析与示例
核心函数说明
this- 代表当前测点的实时值(最新采样值)
- 示例:
this = 25.3(当前温度值)
old- 代表上一次采样周期的测点值
- 示例:
old = 24.8(上一周期温度值)
$C1(设备号, 测点号)- 跨设备测点引用函数,返回指定设备的实时测点值
- 示例:
$C1(2, 2)表示获取2号设备第2号测点的实时值
表达式示例解析 目标公式:
(this * 100 + $C1(2, 2)) / 2
计算逻辑:
取当前测点值
this并乘以100
(如this = 30→30 * 100 = 3000)获取2号设备2号测点的实时值
(假设$C1(2,2) = 50)将两者相加后除以2
((3000 + 50) / 2 = 1525)


注意
this和old这两个关键字只对真实设备的表达式有用,虚拟设备或者其它场合下的表达式这两个关键字无意义。
# 设备实时状态函数 $E(设备号)
函数定义 $E(2) 用于获取指定设备的实时通讯与运行状态,返回整数型状态码。该函数是设备健康监测的核心接口,广泛应用于工业监控、物联网平台及自动化控制场景。
状态码解析表
| 返回值 | 状态名称 | 含义说明 | 典型场景与操作建议 |
|---|---|---|---|
| 0 | 不通讯 | 设备无数据响应(物理连接中断/电源故障/协议不匹配) | ▸ 检查网络链路 ▸ 验证设备供电 ▸ 重启通讯模块 |
| 1 | 通讯正常 | 数据链路畅通,设备在线(无业务级报警) | ▸ 常规监控状态 ▸ 可进行参数读取操作 |
| 2 | 有报警 | 设备检测到业务异常(传感器越限/机械故障/安全门开启) | ▸ 触发声光报警 ▸ 推送通知至运维人员 ▸ 启动应急预案 |
| 3 | 正在进行设置 | 设备处于参数配置模式(禁止业务操作) | ▸ 暂停生产流程 ▸ 显示配置进度条 ▸ 设置超时重试机制 |
| 4 | 正在初始化 | 设备启动自检流程(硬件检测/固件加载/服务启动) | ▸ 显示初始化进度 ▸ 禁止外部干预 ▸ 超时自动复位 |
| 5 | 撤防 | 安全系统解除警戒(门禁开放/报警抑制) | ▸ 记录撤防操作日志 ▸ 联动视频监控 ▸ 设置撤防时效 |


# $C(2,1) 表示设备下1号测点实时模拟量(包括单位)
测点实时模拟量函数 $C(2,1) 使用指南
函数定义 $C(设备号, 测点号) 用于获取指定设备下测点的实时模拟量值,返回值包含数值与物理单位(如 25.3°C、101.3kPa)。该函数是工业数据采集的核心接口,支持跨设备数据联动与单位感知计算。


# $C1(设备号,测点号) 表示设备下1号测点实时模拟量(不包括单位)
测点实时模拟量函数 $C1(2,1) 使用指南
函数定义 $C1(设备号, 测点号) 用于获取指定设备下测点的实时模拟量值,仅返回纯数值(如 25.3、101.3),不包含物理单位信息。该函数适用于需要原始数值进行计算的场景,与 $C() 函数形成互补。


# 测点元数据函数 $C2(设备号,测点号)
使用指南
函数定义 $C2(设备号, 测点号) 用于获取指定设备下测点的实时模拟量值,返回包含测点名称与物理单位的元数据信息(如 "反应釜温度(°C)")。该函数为数据消费端提供完整的测点上下文,适用于需要人机交互的显示场景。


# ASC(设备号,测点号) 表示设备 下1号测点的实时状态(显示0-1)
测点实时状态函数 ASC(2,1) 使用指南
函数定义 ASC(设备号, 测点号) 用于获取指定设备下测点的实时数字量状态,返回值以布尔型整数表示(0 表示关闭/非激活状态,1 表示开启/激活状态)。该函数专注于二进制状态监测,适用于开关量信号、数字传感器等场景。
返回值解析
| 返回值 | 状态含义 | 典型场景 |
|---|---|---|
| 0 | 非激活状态 | 阀门关闭、传感器未触发、继电器断开 |
| 1 | 激活状态 | 阀门开启、红外探测触发、安全门开启 |


# 测点名称函数 $X(设备号, 遥信号)
函数定义 $X(设备号, 测点号) 用于获取指定设备下测点的实时模拟量名称(纯文本标识),不包含数值与单位信息。该函数专注于提供测点的语义化标识,适用可读标签的显示场景。


# $X1(设备号,遥信号) 表示设备下1号测点的实时模拟量(不包括测点名称)
配置参考

# 遥信报警状态函数 ASX(设备号, 遥信号)
函数定义 ASX(设备号, 遥信号) 用于获取指定设备下遥信测点的实时报警状态,当测点处于报警状态时返回 True,否则返回 False。该函数专注于二进制报警信号监测,适用于开关量报警、数字传感器异常检测等场景。
# 返回值解析
| 返回值 | 状态含义 | 典型场景 |
|---|---|---|
| True | 报警激活状态 | 烟雾探测器触发、电机过载、安全门非法开启 |
| False | 正常状态 | 系统运行正常、传感器未检测到异常 |


# 资产维保状态函数 $Z(ZCID)
函数定义 $Z(ZCID) 用于查询指定资产的维保过期天数,若资产存在且维保过期则返回正整数天数,若资产不存在返回 false。该函数是资产管理系统的核心接口,支持设备全生命周期管理。
# 返回值解析
| 返回值类型 | 示例值 | 含义说明 | 典型处理逻辑 |
|---|---|---|---|
| 正整数 | 15 | 维保已过期15天(需立即处理) | 触发维护工单、红色警示标记 |
false | - | 资产不存在或ID无效 | 记录错误日志、提示用户检查资产编码 |



说明
使用$Z(ZCID)表达式后修改档案信息后需要重启平台才能更新当前天数信息。
# 逻辑函数
# 条件判断函数 $iif(a, b, c)
定义
根据条件 a 的布尔值,返回 b(若 a 为 true)或 $c$(若 a 为 false)。等效于三元运算符 a ? b : c,是 if-else 逻辑的简洁表达形式。
输入范围
- a:布尔表达式(如
x > 0、is_valid)或可隐式转换为布尔值的类型(如数字0/非0、字符串空检查) - b:条件为真时返回的值(任意类型)
- $c$:条件为假时返回的值(任意类型,需与 b 类型兼容或可隐式转换)
输出范围
- 返回 b 或 $c$ 的值,类型取决于输入参数(如数字、字符串、对象等)
示例
- 基础计算
- $iif(5 > 3, "Yes", "No") = "Yes"$
- $iif(0, "True", "False") = "False"$(数字
0隐式转为false)


# 多条件分支函数 $case()
定义
按顺序评估多个条件-值对,返回第一个满足条件的对应值;若所有条件均不满足,则返回 else 参数指定的默认值。等效于编程中的 if-else if 链或 SQL 的 CASE 语句,支持多分支逻辑。
输入范围
- 参数结构:
$case(condition1, val1, condition2, val2, ..., else, val)condition1, condition2, ...:布尔表达式或可隐式转换为布尔值的条件val1, val2, ...:对应条件为真时返回的值(类型需兼容或可隐式转换)else:固定关键字,表示所有条件不满足时的默认值val:默认返回值(当所有条件为假时)
输出范围
- 返回第一个满足条件的
val,或else后的val(若无条件满足)
示例
基础分级判断
$case(score >= 90, "A", score >= 80, "B", score >= 60, "C", else, "D")
若score=85,返回"B";若score=50,返回"D"
类型匹配
$case(type == "admin", 1, type == "editor", 2, else, 0)
若type="guest",返回0
优先级处理
$case(urgent, "立即处理", high_priority, "2小时内", normal, "24小时内", else, "计划内")
若urgent=true,跳过后续条件直接返回"立即处理"
混合数据类型
$case(qty > 100, 0.9, qty > 50, 0.95, else, 1.0)
若qty=75,返回0.95(折扣率)


# 函数表达式配置
# 最大值函数 $max(a, b)
定义 返回两个数 a 和 b 中的较大值。若 a > b,则返回 a;否则返回 b。数学上等价于 max(a, b)。
输入范围
- a 和 b 可以是任意实数(正数、负数、零、整数、浮点数)
- 输出范围
- 返回 a 和 b 中的较大值,类型与输入一致(如整数、浮点数)
- 示例
基础计算
- $max(3, 5) = 5
- $max(-2, -7) = -2
- $max(0, 0) = 0


# 最小值函数 $min(a, b)
定义 返回两个数 a 和 b 中的较小值。若 a < b,则返回 a;否则返回 b。数学上等价于 $\min(a, b)。
输入范围
- a 和 b 可以是任意实数(正数、负数、零、整数、浮点数)
输出范围
- 返回 a 和 b 中的较小值,类型与输入一致(如整数、浮点数)
示例
- 基础计算
- $min(3, 5) = 3$
- $min(-2, -7) = -7$
- $min(0, 0) = 0


# 幂函数 $pow(a, b)
定义 返回以 a 为底数、b 为指数的幂运算结果,即计算 a^b。数学上表示为 a^b,其中 a 称为底数,b 称为指数。
输入范围
- 底数 a:任意实数(正数、负数、零、整数、浮点数)
- 指数 b:任意实数(正数、负数、零、整数、浮点数)
输出范围
- 输出为 a^b 的计算结果,类型通常为浮点数(即使输入为整数,结果也可能为浮点数)
示例
- 基础计算
- $pow(2, 3) = 8
- $pow(5, 0) = 1
- $pow(-2, 3) = -8
- $pow(2, -2) = 0.25


# 四舍五入函数 $round(a, b)
输入范围
- a:任意浮点数(正数、负数、零)
- b(可选):非负整数(指定保留的小数位数,若省略则默认为0)
输出范围
- 返回四舍五入后的浮点数或整数,类型取决于输入。
示例
- 基础计算
- $round(3.1415, 2) = 3.14(保留两位小数)
- $round(2.71828) = 3(四舍五入到整数)
- $round(-1.5) = -2(负数四舍五入)


# 当前时间函数 $now()
定义
返回当前系统的日期和时间,等效于编程中的 DateTime.Now(C#)或类似功能。无需参数,直接调用即可获取实时时间戳。
输入范围
- 无参数:直接调用函数,无需输入任何值。
输出范围
- 返回当前系统的日期和时间,格式通常为
YYYY-MM-DD HH:MM:SS(具体格式依赖语言或环境)。
示例
- 基础调用
- $now() = 2025-05-06 16:18:06(假设当前时间为2025年5月6日14:30:00)


# 当前系统的日期函数$today()
函数定义
- $today()
返回当前系统的日期(不包含时间部分),等效于DateTime.Today。输出格式通常为YYYY-MM-DD。


# 最大日期函数 $maxdate()
最大日期函数 $maxdate() 使用说明
定义
返回当前系统支持的最大日期值,等效于编程中的 DateTime.MaxValue(如C#)或类似常量。该值通常表示日期类型的上限,用于初始化或边界条件判断。
输入范围
- 无参数:直接调用函数,无需输入任何值。
输出范围
- 返回系统支持的最大日期值,格式通常为
YYYY-MM-DD 23:59:59(具体值依赖语言或环境,如C#中为9999-12-31 23:59:59.9999999)。
示例
- 基础调用
- $maxdate() = 9999-12-31 23:59:59(假设系统最大日期为9999年底)


# 日期加减函数 adddays(a, b)
定义
将参数 a 转换为日期时间对象后,增加 b 天,返回新的日期时间。等效于 C# 中的 Convert.ToDateTime(a).AddDays(b),支持正向(未来日期)和负向(过去日期)天数偏移。
输入范围
- a:可转换为日期的对象(如字符串
"2025-05-06"、DateTime对象、时间戳等) - b:整数(正数表示未来天数,负数表示过去天数,0 表示原日期)
输出范围
- 返回新的
DateTime对象,格式为YYYY-MM-DD HH:MM:SS(具体格式依赖语言环境)
示例
- 基础计算
- adddays("2025-05-06", 5) = 2025-05-11
- adddays("2025-05-06", -3) = 2025-05-03
- adddays("2025-02-28", 1) = 2025-03-01(处理月末溢出)


# 月份加减函数 addmonths(a, b)
定义
将参数 a 转换为日期时间对象后,增加 b 个月,返回新的日期时间。等效于 C# 中的 Convert.ToDateTime(a).AddMonths(b),支持正向(未来月份)和负向(过去月份)偏移,自动处理月末日期溢出(如1月31日加1个月变为2月28日或29日)。
输入范围
- a:可转换为日期的对象(如字符串
"2025-05-06"、DateTime对象、时间戳等) - b:整数(正数表示未来月份,负数表示过去月份,0 表示原月份)
输出范围
- 返回新的
DateTime对象,格式为YYYY-MM-DD HH:MM:SS(具体格式依赖语言环境)
示例
- 基础计算
- addmonths("2025-05-06", 3) = 2025-08-06
- addmonths("2025-05-06", -2) = 2025-03-06
- addmonths("2025-01-31", 1) = 2025-02-28(非闰年月末调整)
- addmonths("2024-01-31", 1) = 2024-02-29(闰年月末调整)


# 年份加减函数 addyears(a, b)
定义
将参数 a 转换为日期时间对象后,增加 b 年,返回新的日期时间。等效于 C# 中的 Convert.ToDateTime(a).AddYears(b),支持正向(未来年份)和负向(过去年份)偏移,自动处理闰年及月末日期溢出(如2月29日在非闰年调整为2月28日)。
输入范围
- a:可转换为日期的对象(如字符串
"2025-05-06"、DateTime对象、时间戳等) - b:整数(正数表示未来年份,负数表示过去年份,0 表示原年份)
输出范围
- 返回新的
DateTime对象,格式为YYYY-MM-DD HH:MM:SS(具体格式依赖语言环境)
示例
- 基础计算
- addyears("2025-05-06", 3) = 2028-05-06
- addyears("2025-05-06", -2) = 2023-05-06
- addyears("2024-02-29", 1) = 2025-02-28(非闰年调整)
- addyears("2020-02-29", 4) = 2024-02-29(闰年保持)

