4. 配方建模实战

在FactoryTalk Batch中,配方不是一张静态的工艺卡片,而是一套分层的、可参数化的生产指令集合。Recipe Editor(配方编辑器)是构建这套指令的核心工具,它把ISA-88标准中的主配方(Master Recipe)、控制配方(Control Recipe)以及配方参数、公式和设备要求串联成一个可执行的整体。本节以一个“双组分液体混合”场景为例,完整走一遍从建模到生成控制配方的过程。

一、先理解配方层级与Recipe Editor的对应关系

ISA-88把配方分为四个层次:通用配方(General Recipe)、现场配方(Site Recipe)、主配方(Master Recipe)和控制配方(Control Recipe)。在FactoryTalk Batch的实际工程中,最常操作的是后两者。主配方是“模板级”的工艺定义,它规定了要做什么、按什么顺序做、需要哪些设备能力,但不绑定具体设备;控制配方则是主配方在某一批次执行时,结合具体设备、具体参数值实例化出来的“执行副本”。

Recipe Editor中的主配方由若干Procedure(过程)组成,每个Procedure下挂Unit Procedure(单元过程),再往下是Operation(操作)和Phase(阶段)。Phase是真正与设备交互的最小逻辑单元,比如“加料”“搅拌”“升温”“排料”。设备要求(Equipment Requirement)则通过Unit Requirement和Phase Class的绑定关系,告诉Batch引擎“这个配方需要一台具备搅拌和加热能力的反应釜”。

主配方 → 控制配方:层级结构与参数实例化 主配方 Master Recipe(模板) Procedure:混合生产 包含加料、搅拌、排料三个单元过程 Unit Procedure:反应釜操作 设备要求:搅拌 + 加热 + 称重 Operation:配料与混合 参数:A料量、B料量、搅拌转速、时间 Phase:加A料 Add_A Phase:加B料 Add_B Phase:搅拌 Mix Phase:排料 Discharge 配方参数与公式 Batch_Size = 1000 kg(批次总量) A_Ratio = 0.6,B_Ratio = 0.4 A_Amount = Batch_Size × A_Ratio = 600 kg 实例化 绑定设备 控制配方 Control Recipe(实例) 批次号:BATCH-2024-001 绑定设备:R-101 反应釜 设备能力校验通过 搅拌 ✓ 加热 ✓ 称重 ✓ 参数已解析为具体值 A_Amount = 600 kg,B_Amount = 400 kg 加A料 600 kg 目标值已写入 加B料 400 kg 目标值已写入 搅拌 300 rpm 持续 15 min 排料至储罐 T-201 执行时参数快照 Batch_Size = 1000 kg(本批次实际值) A_Amount = 600 kg,B_Amount = 400 kg 搅拌转速 = 300 rpm,时间 = 15 min

二、创建主配方的关键步骤

打开Recipe Editor后,第一步是新建一个主配方,命名建议采用“产品名_工艺类型”的格式,例如“MixProduct_Blend”。接着在Procedure层级下添加Unit Procedure,此时需要指定Unit Requirement——这是设备要求的核心。Unit Requirement不是具体设备名,而是一组能力标签,比如“具备搅拌能力”“具备加热能力”“具备称重能力”。Batch引擎在运行时会在设备模型中查找满足这些能力的Unit,找到后才允许执行。

在Unit Procedure下继续添加Operation和Phase。Phase的命名要与Phase Class对应,Phase Class定义了该阶段可以接受的参数类型和数量。例如“Add_A”这个Phase Class可能定义了“目标重量”“加料速率”“快加/慢加切换点”三个参数。在Recipe Editor中,每个Phase实例都要填写这些参数的值或公式。

三、配方参数与公式的配置方法

配方参数是主配方中可变的输入量,公式则定义了参数之间的计算关系。在Recipe Editor的Parameters视图中,可以定义参数名、数据类型、默认值、上下限和工程单位。以双组分混合为例,定义以下参数:

  • Batch_Size:批次总量,REAL类型,默认1000,单位kg,范围500~2000。
  • A_Ratio:A组分比例,REAL类型,默认0.6,无量纲,范围0.1~0.9。
  • B_Ratio:B组分比例,REAL类型,默认0.4,无量纲,范围0.1~0.9。
  • Mix_Speed:搅拌转速,REAL类型,默认300,单位rpm,范围100~600。
  • Mix_Time:搅拌时间,REAL类型,默认15,单位min,范围5~30。

公式在Formula编辑区定义。例如A_Amount的计算公式为“Batch_Size * A_Ratio”,B_Amount为“Batch_Size * B_Ratio”。这里有一个工程约束需要校验:A_Ratio + B_Ratio应等于1,否则配方总量会偏离Batch_Size。可以在公式中加入校验表达式,或者在Batch执行前由操作员确认。如果配方还涉及密度换算,比如A料以体积计量而配方以重量定义,则公式中还需引入密度参数:A_Volume = A_Amount / A_Density。

公式中的参数引用必须使用Recipe Editor中定义的参数名,大小写敏感。建议在命名时统一采用“下划线分隔”的风格,避免空格和特殊字符。

四、设备要求的绑定与校验

设备要求在Unit Procedure层级通过Unit Requirement表达,在Phase层级通过Phase Class的Equipment Requirement表达。两者是“与”的关系:Unit Procedure要求反应釜具备搅拌和加热能力,Phase“Add_A”可能额外要求具备称重能力。Batch引擎在生成控制配方时,会先做设备能力匹配,匹配不通过则控制配方无法创建,并给出类似“No eligible unit found for requirement: Agitation + Heating + Weighing”的提示。

实际项目中,设备能力标签要与设备模型中的Unit Attribute严格对应。例如设备模型里定义了“Agitation”属性为True,那么Unit Requirement中就必须写“Agitation”,不能写成“Stir”或“Mix”。这种命名一致性是配方能否成功实例化的关键。

五、从主配方生成控制配方

主配方保存并发布后,在Batch Viewer或Batch Client中创建批次时,选择该主配方并指定目标设备。系统会执行以下动作:读取主配方中的参数默认值,允许操作员在允许范围内修改;根据公式计算派生参数;校验设备能力;生成控制配方实例。控制配方中每个Phase的参数值都是“快照”式的,即一旦生成,后续主配方的修改不会影响已生成的控制配方,这保证了批次执行的可追溯性。

以BATCH-2024-001为例,操作员将Batch_Size改为1000,A_Ratio保持0.6,系统自动算出A_Amount=600 kg、B_Amount=400 kg。控制配方中“Add_A”阶段的目标重量被写为600 kg,“Add_B”为400 kg,“Mix”阶段的转速为300 rpm、时间为15 min。这些值在批次执行过程中被写入PLC或Batch Phase Logic,由设备层执行。

六、一个简单混合配方的完整参数表

下表给出该混合配方在Recipe Editor中的关键配置项,可作为建模时的对照参考。表中数值均为教学示例,实际项目需根据工艺验证确定。

层级 对象名称 关键配置 示例值/要求
Procedure Blend_Production 包含单元过程 反应釜操作
Unit Procedure Reactor_Operation Unit Requirement Agitation + Heating + Weighing
Operation Dosing_Mixing 关联参数 Batch_Size, A_Ratio, B_Ratio, Mix_Speed, Mix_Time
Phase Add_A Phase Class / 参数 Add_A_Class;目标重量=A_Amount
Phase Add_B Phase Class / 参数 Add_B_Class;目标重量=B_Amount
Phase Mix Phase Class / 参数 Mix_Class;转速=Mix_Speed,时间=Mix_Time
Phase Discharge Phase Class / 参数 Discharge_Class;目标设备=T-201
公式 A_Amount 表达式 Batch_Size * A_Ratio
公式 B_Amount 表达式 Batch_Size * B_Ratio

七、建模后的验证要点

主配方创建完成后,不要直接投入生产,先做三项验证。第一,参数边界验证:把Batch_Size设为2000、A_Ratio设为0.9,检查A_Amount是否超出设备称重上限;第二,设备能力验证:故意选择一个不具备加热能力的Unit,确认Batch引擎拒绝生成控制配方并给出明确提示;第三,公式一致性验证:检查A_Ratio + B_Ratio是否恒等于1,若允许不等于1,则需确认Batch_Size的定义是“总量”还是“A+B之和”,避免执行时出现总量偏差。