计算 Tag:把现有实时值组合成可发布的只读结果

# 本地 IO 输入 hq://io/<io-domain-id>/<device-uid>/<tag-uid> # 已发布计算 Tag 输入 hq://calc/<runtime-unit-id>/<calculated-tag-uid> 步骤 2:编写表达式 表达式支持数值和布尔常量、算术、比较、逻辑、条件选择,以及 if 和 abs。别名就是表达式中的变量,拼写必须与输入列表一致。

计算 Tag

计算 Tag: 计算 Tag:把现有实时值组合成可发布的只读结果

计算 Tag 在当前 Runtime Unit 内由服务端求值,适合把一个或多个已存在的实时值组合成数字或布尔结果。它不连接 PLC、不写回输入,也不执行脚本;定义、发布、启用和运行诊断彼此分离,便于审核和稳定运行。

先判断是否适合使用

  • 适合:功率换算、单位换算、运行条件组合、联锁状态判断和简单条件选值。
  • 结果类型只支持 numberboolean
  • 输入只支持当前 Runtime Unit 的本地 IO TagRef,或已经发布的计算 TagRef。
  • 不支持远端输入、时间窗口、Average / Min / Max / Counter、Link 或脚本执行。
  • 第一阶段的运行值在计算 Tag 管理页和专用值接口中查看;不要假定它已经进入普通 Tag、画面、报警、趋势或 IO State API 的消费链路。

步骤 1:新建定义并添加输入

  1. 进入“Tag 管理 → 计算 Tag”,选择新建。
  2. 填写稳定且有业务含义的 Code,例如 <calculated-tag-code>,并选择结果类型。
  3. 为每个输入填写语义明确的别名,例如 line_voltageline_currentpower_factor
  4. 从目录选择规范 TagRef,并声明输入值类型。单个定义最多 32 个输入。
# 本地 IO 输入
hq://io/<io-domain-id>/<device-uid>/<tag-uid>

# 已发布计算 Tag 输入
hq://calc/<runtime-unit-id>/<calculated-tag-uid>

步骤 2:编写表达式

表达式支持数值和布尔常量、算术、比较、逻辑、条件选择,以及 ifabs。别名就是表达式中的变量,拼写必须与输入列表一致。

  • 算术:+ - * / %
  • 比较:== != < <= > >=
  • 逻辑:&& || !
  • 条件:condition ? yes : noif(condition, yes, no)
  • 函数:abs(value)
# 三相设备的业务功率换算示例
line_voltage * line_current * power_factor / 1000

# 运行允许状态
run_command && !fault_active

# 带条件的轴功率估算
if(motor_running && motor_speed > 0, abs(motor_torque) * motor_speed / 9550, 0)

步骤 3:验证、保存、发布和启用

表达式最大 2048 bytes,最多 256 个 AST 节点、32 层深度和 512 个求值步骤。应把一个定义保持在清晰、可审核的业务计算范围内。

  1. 先执行服务端验证,检查别名、类型、引用、语法和成本预览。
  2. 验证通过后保存草稿;草稿可以继续编辑,不会自动进入运行状态。
  3. 发布生成不可变 generation,记录本次投入运行的确定版本。
  4. 确认发布版本正确后启用,再查看运行值、质量、求值时间和诊断信息。

质量传播与错误处理

输入质量会传播到结果。逻辑短路和条件表达式只传播实际执行分支所使用输入的质量。除零、模零或产生非有限数时,结果质量显示 calculation_error;应先检查诊断,再修改草稿并发布新的 generation。

按职责分配权限

生产项目宜把编辑、发布和启用分配给相应职责,至少确保发布前有人复核输入、表达式和结果类型。

  • calculated-tag:view:查看定义、运行值和诊断。
  • calculated-tag:manage:新建和编辑草稿。
  • calculated-tag:publish:发布不可变 generation。
  • calculated-tag:enable:启用或停用运行版本。