HMI 配方管理
配方(Recipe)是 Darra HMI 的核心工艺数据管理功能,用于在 HMI 界面上创建、编辑、存储、下发一组工艺参数。操作员无需接触 PLC 程序即可快速切换产品规格。
本文档聚焦 HMI 侧的配方操作。PLC 侧配方引擎的详细参考见 PLC 配方管理。
配方概念
配方 = 一组命名的工艺参数集合。每个配方项绑定一个 PLC 变量地址,激活配方时将参数值写入对应的 PLC 地址。
配方组: "焊接参数"
├── 配方: "碳钢 3mm"
│ ├── 焊接电流: 180A → DB1.SetCurrent
│ ├── 焊接电压: 22V → DB1.SetVoltage
│ ├── 送丝速度: 8.5m/min → DB1.WireSpeed
│ ├── 行走速度: 600mm/min → DB1.TravelSpeed
│ └── 气体流量: 15L/min → DB1.GasFlow
│
├── 配方: "不锈钢 2mm"
│ ├── 焊接电流: 120A
│ └── ...
│
└── 配方: "铝合金 4mm"
└── ...
| 概念 | 说明 |
|---|---|
| 配方组 (Group) | 按工艺分类的配方集合(如焊接组、切割组) |
| 配方 (Recipe) | 一组命名的工艺参数集合 |
| 配方项 (Item) | 单个参数,绑定到 PLC 变量地址 |
| 激活配方 | 当前生效的配方,参数已下载到 PLC |
HMI 配方编辑器
配方面板
HMI 提供内置的配方面板(<darra-recipe-panel> 控件),支持完整的配方管理操作:
<darra-recipe-panel
group="焊接参数"
recipe="碳钢_3mm"
show-history="true"
show-compare="true"
></darra-recipe-panel>
| 属性 | 默认值 | 说明 |
|---|---|---|
group | '' | 默认选中的配方组 |
recipe | '' | 默认选中的配方名 |
show-history | true | 显示版本历史 |
show-compare | false | 显示版本对比按钮 |
readonly | false | 是否只读(不显示编辑按钮) |
height | auto | 面板高度 |
配方编辑器界面
配方面板由以下区域组成:
┌──────────────────────────────────────────────────────┐
│ 配方组 ▼ [焊接参数] 搜索... [+ 新建] │
├──────────────────────┬───────────────────────────────┤
│ 配方列表 │ 配方参数编辑 │
│ │ │
│ ● 碳钢 3mm (激活) │ 参数名 值 单位 │
│ ○ 不锈钢 2mm │ 焊接电流 180.0 A │
│ ○ 铝合金 4mm │ 焊接电压 22.0 V │
│ │ 送丝速度 8.5 m/min │
│ │ 行走速度 600.0 mm/min │
│ │ 气体流量 15.0 L/min │
│ │ │
│ │ [下发] [编辑] [历史] [对比] │
└──────────────────────┴───────────────────────────────┘
通过脚本操作配方
// 获取配方列表
const recipes = Darra.getRecipes({ group: '焊接参数' })
// [{ name: '碳钢 3mm', group: '焊接参数', version: 'v4' }, ...]
// 加载配方(下发到 PLC)
Darra.loadRecipe('焊接参数', '碳钢_3mm')
// 获取当前激活的配方
const active = Darra.getActiveRecipe()
// { group: '焊接参数', recipe: '碳钢_3mm', loadedAt: 1721894400000 }
// 保存当前参数为配方
Darra.saveRecipe('焊接参数', '碳钢_3mm_v5', {
description: '优化送丝速度',
reason: '试焊调整'
})
配方数据绑定
绑定到 Darra 变量
每个配方项通过 var 属性绑定到 PLC 变量:
<!-- 在 HMI 页面中绑定配方参数显示 -->
<darra-numeric var="DB1.SetCurrent" format="0.0" unit="A"></darra-numeric>
<darra-numeric var="DB1.SetVoltage" format="0.0" unit="V"></darra-numeric>
配方激活时自动将存储的值写入这些变量,绑定的控件自动更新。
使用配方表达式
在 HMI 脚本中读取配方绑定变量的值:
// 读取当前激活的配方参数
const current = Darra.readVariable('DB1.SetCurrent')
const voltage = Darra.readVariable('DB1.SetVoltage')
// 计算并显示功率
const power = current * voltage
document.getElementById('power-display').textContent = power.toFixed(1) + ' W'
从 HMI 下发配方
手动下发
操作员在配方面板中选择配方,点击"下发"按钮。系统执行:
- 校验:检查当前机器状态(安全条件)
- 写入:将配方参数写入绑定的 PLC 变量
- 验证:回读 PLC 变量值确认写入成功
- 记录:写入审计日志
脚本触发下发
// 根据产品编码自动选择配方
const productCode = Darra.readVariable('DB1.ProductCode')
let recipeName
switch (productCode) {
case 1: recipeName = '碳钢_3mm'; break
case 2: recipeName = '不锈钢_2mm'; break
case 3: recipeName = '铝合金_4mm'; break
default: Darra.showToast('未知产品编码', { type: 'error' }); return
}
Darra.loadRecipe('焊接参数', recipeName)
.then(() => Darra.showToast(`配方 ${recipeName} 已加载`, { type: 'success' }))
.catch(err => Darra.showToast(`配方加载失败: ${err}`, { type: 'error' }))
下发安全条件
配方下发前 HMI 自动检查:
| 条件 | 说明 |
|---|---|
| 机器状态 | 必须在待机或停止状态,运行中禁止下发 |
| 参数范围 | 所有参数值在合法范围内(rMinValue ~ rMaxValue) |
| 用户权限 | 当前用户有配方的激活权限 |
| 互锁条件 | 无正在执行的关键工艺步骤 |
配方版本管理
版本自动记录
每次配方修改自动生成新版本:
配方: 碳钢_3mm
├── v1 2026-07-20 10:00 wang (初始版本)
├── v2 2026-07-21 14:30 li (调整电流 180→185A)
├── v3 2026-07-22 09:15 wang (调整送丝速度 8.5→9.0)
└── v4 2026-07-23 10:32 wang (当前版本, 电流微调 185→182A)
查看版本历史
const history = Darra.getRecipeHistory('焊接参数', '碳钢_3mm')
// [
// { version: 'v4', modifiedAt: ..., modifier: 'wang', comment: '电流微调' },
// { version: 'v3', modifiedAt: ..., modifier: 'wang', comment: '调整送丝速度' },
// ...
// ]
版本对比
const diff = Darra.compareRecipeVersions('焊接参数', '碳钢_3mm', 'v2', 'v4')
// [
// { field: '焊接电流', old: 185, new: 182, unit: 'A' },
// { field: '送丝速度', old: 8.5, new: 9.0, unit: 'm/min' }
// ]
HMI 内置版本对比视图:
<darra-recipe-compare
group="焊接参数"
recipe="碳钢_3mm"
left-version="v2"
right-version="v4"
></darra-recipe-compare>
回滚
// 回滚到指定版本
Darra.rollbackRecipe('焊接参数', '碳钢_3mm', 'v3')
回滚操作也会生成一个新版本(v5),保留完整的操作轨迹。
配方导入/导出
导出配方
// 导出单个配方为 JSON
const json = Darra.exportRecipe('焊接参数', '碳钢_3mm', 'json')
// 导出整个配方组为 CSV
const csv = Darra.exportRecipeGroup('焊接参数', 'csv')
// 触发浏览器下载
const blob = new Blob([csv], { type: 'text/csv' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = '焊接参数_碳钢_3mm.csv'
a.click()
导入配方
// 从 JSON 导入配方
Darra.importRecipe(jsonData, {
overwrite: false, // 已存在时不覆盖
validate: true // 导入前校验参数范围
})
支持的格式
| 格式 | 说明 | 适用场景 |
|---|---|---|
| JSON | 完整结构,含版本历史 | 备份、系统间迁移 |
| CSV | 仅参数值,无版本信息 | Excel 批量编辑 |
| 项目文件 | 随 .dplc 项目保存 | 项目分发 |
权限控制
| 操作 | 所需角色 |
|---|---|
| 查看配方 | 操作员 / 工程师 / 管理员 |
| 激活/下发配方 | 操作员 / 工程师 / 管理员 |
| 修改配方参数 | 工程师 / 管理员 |
| 创建新配方 | 工程师 / 管理员 |
| 删除配方 | 管理员 |
| 导入配方 | 管理员 |
| 导出配方 | 工程师 / 管理员 |
角色配置在 设置 → 用户管理 → 配方权限 中管理。
审计日志
所有配方操作自动记录审计日志,可在 HMI 中查看:
const auditLogs = Darra.getRecipeAuditLog({
group: '焊接参数',
startTime: Date.now() - 7 * 86400000, // 最近7天
limit: 100
})
审计日志包含:时间、用户、操作类型、配方名、修改的字段、旧值、新值、原因。
审计日志不可修改,只能追加。日志文件位于 %AppData%/DarraPLC/audit/recipe_YYYYMMDD.log。
配方配方切换时序
推荐的 HMI 配方激活流程:
操作员选择配方
│
▼
1. 检查机器状态 ──→ 非待机 → 提示"机器忙,不能换型"
│
▼ (待机)
2. 参数校验 ──→ 非法值 → 提示"参数超出范围"
│
▼ (合法)
3. 写入 PLC 变量
│
▼
4. 回读验证 ──→ 不一致 → 提示"写入验证失败,请重试"
│
▼ (一致)
5. 记录审计日志
│
▼
6. 更新 HMI 显示
最佳实践
- 配方参数统一用 REAL:便于跨系统转换,精度足够
- 范围校验必开:每项设置 Min/Max,防止误输入危险值
- 按工艺分组:焊接组 / 切割组 / 打磨组分开管理
- 命名规范化:
材料_厚度_操作(如碳钢_3mm_焊接) - 关键配方锁定:调试稳定后在配方属性中勾选"锁定",禁止普通用户改动
- 版本号嵌入批次记录:生产报表中带上配方版本号,便于质量问题追溯
- 定期备份导出:配方是核心工艺资产,建议每周导出 JSON 备份
排错表
| 问题 | 原因 | 解决 |
|---|---|---|
| 配方下发不生效 | PLC 变量地址绑定错误 | 核对配方项中的变量地址与 PLC 程序一致 |
| 参数值被拒绝 | 超出合法范围 | 检查 Min/Max 设置 |
| HMI 看到的值与配方不一致 | 配方尚未激活 | 确认已点击"下发"按钮 |
| 版本历史为空 | 项目刚创建 | 创建配方后修改一次即生成 v2 |
| 导入失败 | JSON 格式不匹配 | 用 Darra.exportRecipe 导出模板,按模板修改 |