配方管理
Darra PLC 配方管理提供工艺参数的集中管理和批量切换能力,适用于多品种生产的参数快速切换。
核心概念
| 概念 | 说明 |
|---|---|
| 配方 (Recipe) | 一组命名的工艺参数集合 |
| 配方项 (Item) | 配方中的单个参数,绑定到 PLC 变量 |
| 配方组 (Group) | 按工艺分类的配方集合 (如焊接组、切割组) |
| 激活配方 | 当前生效的配方,参数已下载到 PLC 变量 |
配方结构
配方组: "焊接参数"
├── 配方: "碳钢 3mm"
│ ├── 焊接电流: 180A → %MD100
│ ├── 焊接电压: 22V → %MD104
│ ├── 送丝速度: 8.5m/min → %MD108
│ ├── 行走速度: 600mm/min → %MD112
│ └── 气体流量: 15L/min → %MD116
│
├── 配方: "不锈钢 2mm"
│ ├── 焊接电流: 120A
│ ├── 焊接电压: 19V
│ ├── 送丝速度: 6.0m/min
│ ├── 行走速度: 800mm/min
│ └── 气体流量: 12L/min
│
└── 配方: "铝合金 4mm"
├── 焊接电流: 200A
└── ...
创建配方
在 IDE 的配方面板 (RecipePanel) 中操作:
- 新建配方组: 按工艺类型创建分组
- 定义配方项: 添加参数并绑定到 PLC 变量 (M 区地址)
- 设置参数值: 为每个配方填写具体参数值
- 设置范围: 为每个配方项定义合法值范围 (最小值/最大值)
变量绑定
配方项直接绑定 PLC 变量地址 (如 %MD100)。加载配方时,系统将参数值写入对应的 M 区地址,PLC 程序通过读取这些地址获取当前工艺参数。
程序中使用配方
加载配方
VAR
iRecipeNo AT %MW50 : INT; // HMI 选择的配方号
bLoadRecipe AT %MX52.0 : BOOL; // HMI 加载请求
bRecipeLoaded AT %MX52.1 : BOOL; // 加载完成标志
// 配方参数 (由配方系统写入)
rWeldCurrent AT %MD100 : REAL; // 焊接电流
rWeldVoltage AT %MD104 : REAL; // 焊接电压
rWireSpeed AT %MD108 : REAL; // 送丝速度
rTravelSpeed AT %MD112 : REAL; // 行走速度
rGasFlow AT %MD116 : REAL; // 气体流量
END_VAR
// 使用配方参数
IF bRecipeLoaded THEN
SetWeldingPower(rWeldCurrent, rWeldVoltage);
SetWireFeeder(rWireSpeed);
SetTravelSpeed(rTravelSpeed);
SetGasValve(rGasFlow);
END_IF;
批量切换
通过 HMI 或 PLC 程序触发配方切换:
// 根据产品型号自动选择配方
CASE iProductType OF
1: iRecipeNo := 0; // 碳钢 3mm
2: iRecipeNo := 1; // 不锈钢 2mm
3: iRecipeNo := 2; // 铝合金 4mm
END_CASE;
bLoadRecipe := TRUE; // 触发加载
配方导入导出
| 格式 | 用途 |
|---|---|
| CSV | 批量编辑 (Excel 打开) |
| JSON | 程序化导入/导出 |
| 项目文件 | 随项目保存/加载 |
典型应用场景
焊接参数
| 配方项 | 说明 | 单位 |
|---|---|---|
| 焊接电流 | 主弧电流 | A |
| 焊接电压 | 主弧电压 | V |
| 送丝速度 | 焊丝送进速度 | m/min |
| 行走速度 | 焊枪移动速度 | mm/min |
| 气体流量 | 保护气流量 | L/min |
| 摆动幅度 | 焊枪摆动宽度 | mm |
| 摆动频率 | 焊枪摆动频率 | Hz |
工具偏移
| 配方项 | 说明 | 单位 |
|---|---|---|
| TCP X/Y/Z | 工具中心点偏移 | mm |
| TCP Rx/Ry/Rz | 工具中心点旋转 | 度 |
| 质量 | 工具质量 (重力补偿) | kg |
| 重心 X/Y/Z | 工具重心偏移 | mm |
取放偏移
| 配方项 | 说明 |
|---|---|
| 取料高度 | 取料位 Z 轴偏移 |
| 放料高度 | 放料位 Z 轴偏移 |
| 接近距离 | 预备位到目标位的距离 |
| 夹爪延时 | 夹爪动作后等待时间 |
在线切换
在线切换配方时, PLC 程序应在安全状态下 (如待机或换型间隔) 执行。运行中切换可能导致参数跳变。建议在配方加载前检查机器状态。
配方数据结构
Darra 配方系统底层结构:
TYPE ST_RecipeItem :
STRUCT
sName : STRING[64]; // 配方项名称
sAddress : STRING[16]; // 变量地址 ('%MD100')
eDataType : E_DataType; // BOOL/INT/REAL/STRING
rValue : LREAL; // 统一用 LREAL 存储
sStringVal : STRING[256]; // 字符串值
rMinValue : LREAL; // 合法下限
rMaxValue : LREAL; // 合法上限
sUnit : STRING[16]; // 工程单位
sComment : STRING[64]; // 备注
END_STRUCT;
END_TYPE
TYPE ST_Recipe :
STRUCT
sName : STRING[64];
iId : INT;
sGroup : STRING[64];
sVersion : STRING[16];
dtCreated : DT;
dtModified : DT;
sModifier : STRING[32]; // 最后修改人
iItemCount : INT;
arItems : ARRAY[0..255] OF ST_RecipeItem;
END_STRUCT;
END_TYPE
权限控制
配方的创建 / 修改 / 激活分权限:
| 操作 | 所需角色 |
|---|---|
| 查看配方 | 操作员 / 工程师 / 管理员 |
| 激活配方 | 操作员 / 工程师 / 管理员 |
| 修改配方参数 | 工程师 / 管理员 |
| 创建新配方 | 工程师 / 管理员 |
| 删除配方 | 管理员 |
| 修改配方结构 (增减项) | 管理员 |
| 导入配方 | 管理员 |
| 导出配方 | 工程师 / 管理员 |
配置位置: 设置 → 用户管理 → 配方权限。
用户登录后, 配方面板的对应按钮根据权限自动启用/禁用。
审计日志
所有配方操作自动记录审计日志:
| 字段 | 说明 |
|---|---|
| 时间 | 操作时刻 (精确到毫秒) |
| 用户 | 操作员登录账号 |
| 操作 | 创建 / 修改 / 激活 / 删除 / 导入 / 导出 |
| 配方 | 配方名称 + ID |
| 字段 | 修改的具体配方项 |
| 旧值 | 修改前的值 |
| 新值 | 修改后的值 |
| 备注 | 操作原因 (可选) |
审计日志位置: %AppData%/DarraPLC/audit/recipe_YYYYMMDD.log
日志格式 (JSON 行):
{"time":"2026-04-18T10:32:15.123","user":"wang","op":"MODIFY","recipe":"WeldParams_CarbonSteel_3mm","field":"rWeldCurrent","old":180.0,"new":185.0,"reason":"调试试焊偏大"}
{"time":"2026-04-18T10:35:42.456","user":"wang","op":"ACTIVATE","recipe":"WeldParams_CarbonSteel_3mm"}
审计日志不可修改, 只能追加。定期导出归档, 应对 FDA / GMP / ISO 9001 审计。
合规要求
医药 / 食品 / 军工等行业要求配方变更必须可追溯 (CFR 21 Part 11 / GAMP5)。Darra 审计日志满足电子签名要求:
- 用户登录采用双因素认证 (密码 + U 盾 / 生物)
- 每次修改必须填写修改原因
- 日志只增不删 + CRC 校验
- 定期导出备份, 保存年限按行业法规
联系 Darra 合规支持获取审计配置模板。
配方版本管理
每次修改自动生成新版本:
- 版本号自增 (v1, v2, v3, ...)
- 旧版本保留在历史记录
- 可回滚到任意历史版本
- 两版本可可视化对比 (逐项 diff)
配方: WeldParams_CarbonSteel_3mm
├── v1 2026-04-17 10:00 wang (初始版本)
├── v2 2026-04-17 14:30 li (调整电流)
├── v3 2026-04-18 09:15 wang (调整送丝速度)
└── v4 2026-04-18 10:32 wang (当前版本, 电流微调)
↑
[回滚到 v3] [对比 v1 vs v4]
配方切换时序
推荐的配方激活流程:
VAR
eRecipeState : E_RecipeState;
iRecipeNo : INT;
bLoadReq : BOOL;
bLoadDone : BOOL;
fbRecipeMgr : FB_RecipeManager;
END_VAR
CASE eRecipeState OF
E_RecipeState.IDLE:
IF bLoadReq THEN
// 1. 检查机器状态: 必须在待机或换型间隙
IF eMachineState = E_MachineState.IDLE THEN
eRecipeState := E_RecipeState.VALIDATE;
ELSE
sDiagMsg := '机器忙, 不能换型';
bLoadReq := FALSE;
END_IF;
END_IF;
E_RecipeState.VALIDATE:
// 2. 校验配方参数合法性
fbRecipeMgr.Validate(iRecipeNo);
IF fbRecipeMgr.bValid THEN
eRecipeState := E_RecipeState.LOADING;
ELSE
eRecipeState := E_RecipeState.ERROR;
END_IF;
E_RecipeState.LOADING:
// 3. 写入 PLC 变量
fbRecipeMgr.LoadRecipe(iRecipeNo);
IF fbRecipeMgr.bDone THEN
eRecipeState := E_RecipeState.VERIFY;
END_IF;
E_RecipeState.VERIFY:
// 4. 回读校验
fbRecipeMgr.Verify(iRecipeNo);
IF fbRecipeMgr.bOK THEN
bLoadDone := TRUE;
LogAudit('Recipe loaded', iRecipeNo);
eRecipeState := E_RecipeState.IDLE;
ELSE
eRecipeState := E_RecipeState.ERROR;
END_IF;
E_RecipeState.ERROR:
// 5. 失败回滚
sDiagMsg := '配方加载失败, 保持原配方';
IF bAck THEN
eRecipeState := E_RecipeState.IDLE;
END_IF;
END_CASE;
排错表
| 问题 | 原因 | 解决 |
|---|---|---|
| 配方加载不生效 | PLC 未同步 | 检查 FB_RecipeManager.bDone |
| 参数值超出范围 | 配方校验未开 | 检查 rMinValue/rMaxValue |
| HMI 看到的值与配方不一致 | 变量地址绑定错 | 重新绑定, 核对 %Mxxx |
| 配方丢失 | 项目未保存 | 每次修改后 Ctrl+S 或启用自动保存 |
| 审计日志无内容 | 权限未开启 | 设置 → 审计 → 启用 |
最佳实践
- 配方参数统一用 REAL: 便于跨系统转换, 精度足够
- 范围校验必开: 每项设置 Min/Max, 防止误输入危险值
- 按工艺分组: 焊接组 / 切割组 / 打磨组分开管理
- 命名规范化:
材料_厚度_操作(如碳钢_3mm_焊接) - 定期备份导出: 配方是核心工艺资产, 每周导出 JSON 备份
- 关键配方锁定: 调试稳定后锁定, 禁止普通用户改动
- 版本号嵌入日志: 产品批次记录时带上当前配方版本号, 便于追溯