跳到主要内容

配方管理

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) 中操作:

  1. 新建配方组: 按工艺类型创建分组
  2. 定义配方项: 添加参数并绑定到 PLC 变量 (M 区地址)
  3. 设置参数值: 为每个配方填写具体参数值
  4. 设置范围: 为每个配方项定义合法值范围 (最小值/最大值)
变量绑定

配方项直接绑定 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 备份
  • 关键配方锁定: 调试稳定后锁定, 禁止普通用户改动
  • 版本号嵌入日志: 产品批次记录时带上当前配方版本号, 便于追溯

相关文档