LMES 出站采集逻辑详解
1. 引言
1.1. 文档目的
本文档旨在详细阐述 LMES 系统中“出站采集”功能的内部实现逻辑、技术架构和业务流程。主要面向技术开发、实施顾问及高级运维人员,帮助他们深入理解该功能模块,以便进行二次开发、系统配置和问题排查。
1.2. 适用范围
本文档适用于 LMES 制造执行系统,特别是与生产执行和流程管理相关的模块。
1.3. 核心概念定义
- 出站 (Outbound): 在 MES 中,指出一个产品或载具完成在某个工位的加工、检验等所有预定操作,即将离开该工位的业务节点。
- 采集 (Collection): 指在生产过程中,从设备(如 PLC)、传感器、扫码枪或操作员界面等来源获取数据的动作。
- 流程引擎 (Process Engine): 一种用于自动化和管理业务流程的核心技术组件。在本系统中,它通过解析预定义的流程图(PFD 文件),动态地执行、协调和监控出站过程中的每一步活动。
2. PLC交互时序图
下图清晰地展示了LMES与PLC在一次典型的出站流程中的详细交互顺序,包括了信号的触发、数据的读写以及最终的复位过程。
2.1. 核心交互原则:谁触发,谁复位
LMES与PLC之间的信号交互严格遵循“谁触发,谁复位”的原则。这意味着,一个信号由哪一方发起(例如,从0变为1),那么在交互完成后,也应由同一方负责将其恢复到初始状态(从1变回0 )。
- PLC触发:
Outbound_FinishedSignal由PLC置为1来启动流程,因此在收到LMES的完成信号后,也必须由PLC将其复位为0。 - LMES触发:
Outbound_CompletedSignal由LMES置为1来通知PLC处理完毕,因此在监听到PLC已复位Outbound_FinishedSignal后,也必须由LMES将其复位为0。
这个原则确保了每次交互都是一个完整的“握手”过程,避免了信号状态的混乱。
3. 流程核心变量详解
下表列出了在 10003.xml 流程模板中定义的 逻辑变量标识。这些标识是流程内部使用的标准名称。它们并非直接对应PLC地址,而是需要通过 工艺管理 -> 工位配置 界面,与CMS基座中预先定义好的 变量(Variable) 进行绑定。最终的PLC地址是在CMS基座的变量中进行配置的。
| 逻辑标识 (Logical Identifier) | 数据类型 (Data Type) | 读/写 (R/W) | 说明 (Description) |
|---|---|---|---|
Outbound_FinishedSignal | int | 读 | PLC通知LMES加工完成的触发信号,值为1时启动流程。PLC处理完后需复位为0。 |
Outbound_SerialNumberVariable | string | 读/写 | 用于传递产品序列号。LMES读取或在关联查询后写回。 |
Outbound_MaterialVariable | string | 读 | 当“条码获取方式”为物料关联时,LMES从此变量读取物料码。 |
Outbound_TrayVariable | string | 读 | 当“条码获取方式”为托盘关联时,LMES从此变量读取托盘码。 |
Outbound_QualityVariable | string | 读 | 当“合格判断方式”包含PLC判断时,LMES从此变量读取PLC给出的原始加工结果。 |
Outbound_ResultVariable | string | 写 | LMES向PLC下发最终的合格判断结果(例如 "1" 代表OK, "2" 代表NG)。 |
Outbound_CompletedSignal | int | 写 | LMES通知PLC出站流程已处理完成的信号。 |
Outbound_FinishVariable | int | 写 | LMES向PLC下发本次出站的最终结果代码(详见下文定义)。 |
Outbound_Description | string | 写 | 当出站发生异常或有需要时,LMES向PLC下发具体的文本说明。 |
4. 业务逻辑与配置指南
4.1. 业务处理顺序
在接收到PLC的Outbound_FinishedSignal=1信号后,LMES内部严格按照以下顺序执行业务逻辑:
- 出站初始化 (
OutboundInitializeActivity): 准备流程环境,加载产品上下文。 - 参数采集 (
ParameterCollectActivity): 从PLC一次性读取所有需要的工艺参数和质量信号。 - 合格判断 (
...QualificationJudgmentActivity): 这是核心决策步骤。- PLC判断: 直接采信
Outbound_QualityVariable的值。 - 本机判断: 将采集的参数与配方规格进行比较。
- 综合判断: 同时执行以上两种判断,结果取最严苛的。
- PLC判断: 直接采信
- 参数存储 (
ParameterSaveActivity): 将所有采集的数据、判断结果存入数据库,形成追溯记录。 - 物料记录 (
MaterialUsageRecordActivity): 记录本次生产所消耗的物料。 - 结果下发: 将
Outbound_FinishVariable等结果变量的值写入PLC。
4.2. 相关模 块配置
要正确配置一个出站流程,需要在以下几个模块中进行设置:
- 流程管理 (
FlowManagement):- 流程定义文件 (
10003_1.pfd): 定义了出站业务逻辑的执行顺序、条件和活动。此文件为系统的核心模板,通常由研发人员维护。 - 流程变量配置文件 (
10003.xml): 定义了流程所需的 逻辑变量标识。此文件也是系统的核心模板,通常由研发人员维护。
- 流程定义文件 (
- 工艺管理 (
ProcessManagement):- 工位配置: 这是最关键的实施配置环节。在此处,需要将流程模板中定义的 逻辑变量标识 (如
Outbound_FinishedSignal) 与CMS基座中已定义好的 变量(Variable) 进行绑定。LMES本身不直接配置PLC地址,而是通过引用这些基座变量来间接实现与设备的通信。 - 定义工位需要采集哪些过程参数 (
ParameterCollectActivity会读取这些配置)。 - 定义工位有哪些不良原因及其对应的PLC信号 (
PLCQualificationJudgmentActivity会使用这些配置)。
- 工位配置: 这是最关键的实施配置环节。在此处,需要将流程模板中定义的 逻辑变量标识 (如
- 配方管理 (
FormulaManagement):- 定义产品在某个工位的工艺参数标准(如上下限),这是
LocalQualificationJudgmentActivity进行本机判断的依据。
- 定义产品在某个工位的工艺参数标准(如上下限),这是
- 物料管理 (
MaterialManagement):- 定义产品的BOM清单,
MaterialUsageRecordActivity会依据此清单记录物料消耗。
- 定义产品的BOM清单,
5. 流程详解
本章节将完全依据流程图,对出站采集的核心逻辑进行详细解析。
5.1. 启动 --> 完工信号监听
- 描述: 流程启动后,进入等待状态,持续监听PLC的
Outbound_FinishedSignal变量。当该变量值变为1时,流程被激活。 - 实现: 由框架的
VariableMonitorActivity活动完成。
5.2. 条码获取方式 (条件分支)
- 描述: 流程根据
Outbound_ObtainBarcodeType配置决定如何获取产品码。 - 分支 1 (方式=1): 直接从
Outbound_SerialNumberVariable读取产品码。 - 分支 2 (方式=2): 读取
Outbound_MaterialVariable中的物料码,通过MaterialAssociationActivity关联查询出产品码,再通过VariableWriteActivity将产品码下发回PLC。 - 分支 3 (方式=3): 读取
Outbound_TrayVariable中的托盘码,通过TrayAssociationActivity关联查询出产品码,再通过VariableWriteActivity将产品码下发回PLC。
5.3. 出站初始化
- 描述: 在获取到产品标识后,进行统一的初始化操作。如果在此阶段发生异常(如产品码为空),流程将直接跳转到“出站结果下发”步骤,并写入错误代码。如果正常,则继续。
- 实现:
OutboundInitializeActivity(业务活动)。
5.4. 过程参数采集 & 合格判断
- 描述: 首先,通过
ParameterCollectActivity从PLC批量读取所有预设的过程参数。然后,根据QualifiedJudgmentType配置进入不同的判断分支。 - 分支 1 (方式=1):
PLCQualificationJudgmentActivity直接采信PLC的判断结果。 - 分支 2 (方式=2):
LocalQualificationJudgmentActivity在MES内部根据配方规格进行比较判断。 - 分支 3 (方式=3):
CompositeQualificationJudgmentActivity结合前两种方式进行综合判断。
5.5. 过程参数存储
- 描述: 所有分支的判断结果最终都汇集于此。
ParameterSaveActivity将采集到的所有数据和判断结果存入数据库, 形成追溯记录。此步骤完成后,会并行触发(SplitAND)后续的“出站结果下发”和“物料使用记录”。 - 实现:
ParameterSaveActivity(业务活动)。
5.6. 物料使用记录
- 描述: 与结果下发并行执行,
MaterialUsageRecordActivity负责记录本次生产所消耗的物料信息。 - 实现:
MaterialUsageRecordActivity(业务活动)。
5.7. 出站结果下发
- 描述: 将最终结果下发给PLC,并通知SOP系统。此步骤完成后,同样会并行触发(SplitAND)“完工信号复位监听”和“SOP出站通知”。
- 实现: 由框架的
VariableWriteActivity活动完成结果下发。
5.8. SOP出站通知
- 描述: 与信号复位监听并行执行,
SopControlActivity将出站事件通知给SOP显示终端。 - 实现:
SopControlActivity(业务活动)。
5.9. 完工信号复位监听 & 出站完成
- 描述: 这是流程的最后阶段。LMES通过
VariableMonitorActivity等待PLC将Outbound_FinishedSignal复位为0,这标志着PLC已确认收到出站结果。 - 复位加工结果: 如果合格判断方式不是单纯的PLC判断(方式!=1),LMES会通过
VariableWriteActivity主动将Outbound_ResultVariable也复位为0。 - 出站完成: 最后,LMES通过
VariableWriteActivity将Outbound_CompletedSignal等信号变量复位为0,使整个工位恢复到待机状态,准备迎接下一个产品。
5.10. 结束
- 描述: 流程正常结束。
- 实现: 由框架的
EndActivity活动标记。
6. 核心业务活动实现细节
本章节旨在为二次开发或深度配置人员提供出站流程核心活动的内部实现细节。值得注意的是,在所有工序流程相关的活动中,可以通过 Flow.DataItems.ApplicationData as ProcessModel 来获取当前工位的完整配置信息。
6.1. OutboundInitializeActivity
- 流程定义(PFD)名称:
出站初始化 - 核心职责: 为出站流程准备好所有必要的上下文数据。
- 实现细节:
- 重置状态: 进入活动时,会首先清空/重置本次出站相关的流程变量,如
OutboundDescriptionValue和OutboundFinishSignal。 - 获取产品码: 检查
FlowItemCollection.SerialNumber是否存在。如果为空(例如,上游的关联查询失败),则会立即设置一个错误结果(如NoProductEntry),并终止后续正常流程。 - 加载上下文: 如果产品码存在,活动会智能地加载该产品的完整上下文。它首先检查当前流程实例中是否已包含工单 (
OrderModel)、产品型号 (ProductModel) 等信息(通常由进站流程传入)。如果不存在,它会调用GetProductionAsync方法,从数据库中查询该产品码最后一次的生产记录,并以此来恢复其工单、产品型号、进站时间等关键信息。
- 重置状态: 进入活动时,会首先清空/重置本次出站相关的流程变量,如
- 关键上下文变量:
- 读:
SerialNumber,TrayCodeAssociationDescriptionValue,MaterialCodeAssociationDescriptionValue - 写:
OutboundFinishSignal,OutboundDescriptionValue,OrderModel,ProductModel,InboundEntryTime
- 读:
- 二次开发/配置建议: 此活动是流程的基础,通常无需修改。但理解其上下文加载机制(优先使用当前流程数据,其次查询历史记录)对于排查问题至关重要。
6.2. ParameterCollectActivity
- 流程定义(PFD)名称:
过程参数采集 - 核心职责: 从PLC批量读取所有与本次出站相关的变量值。
- 实现细节:
- 构建变量列表: 活动会动态构建一个需要读取的PLC变量地址列表 (
varNames)。这个列表的数据来源是高度可配置的,它会聚合以下所有点位:- 工位配置中定义的过程参数 (
ProcessParameters)。 - 工位配置中定义的物料参数 (
MaterialParameters)。 - 配方中定义的配方参数 (
FormulaParameters),包括下发和监视变量。 - 流程中硬编码需要的一些特殊变量,如
Outbound_QualityVariable。
- 工位配置中定义的过程参数 (
- 批量读取: 构建完列表后,它会调用
IFlowVariableService.ReadValueAsync服务,向数据采集模块发起一次性的批量读取请求。 - 存入上下文: 将返回的包含所有变量值的字典(
IReadOnlyDictionary<string, IVariableValue>)整体存入流程上下文Flow.DataItems[FlowItemCollection.ParameterCollectData]中,供后续活动使用。
- 构建变量列表: 活动会动态构建一个需要读取的PLC变量地址列表 (
- 关键上下文变量:
- 读:
ApplicationData(获取ProcessModel) - 写:
ParameterCollectData
- 读:
- 二次开发/配置建议: 此活动完全由配置驱动。如果需要采集一个新的PLC点位作为过程参数, 只需在工艺管理中添加相应的参数定义即可,无需任何代码改动。
6.3. ...QualificationJudgmentActivity (合格判断系列)
PLCQualificationJudgmentActivity(流程定义(PFD)名称:PLC合格判断):- 核心职责: 完全依赖设备自身的判断结果。
- 实现细节: 逻辑最简单。它直接从
ParameterCollectData中获取Outbound_QualityVariable的值。如果值为1或true,则判定为合格。如果为2或false,则会进一步调用GetUnqualifiedReasons方法,检查工位配置中的不良原因变量,找出具体是哪个不良信号被触发。
LocalQualificationJudgmentActivity(流程定义(PFD)名称:本地合格判断):- 核心职责: 在MES内部完成质量判断。
- 实现细节: 逻辑最复杂。它会:
- 获取当前产品的配方版本 (
FormulaVersionModel)。 - 遍历工位配置中所有的过程参数。
- 对于每个参数,在配方版本中查找其对应的规格(
lower,upper)。 - 将
ParameterCollectData中的实际值与规格进行比较。 - 任何一个参数超差,都会将最终结果置为不合格,并记录下超差的参数名作为原因。
- 扩展点: 此活 动会调用
ILocalJudgmentStrategy接口的实现,允许开发人员通过依赖注入的方式,插入自定义的、非标准(例如需要复杂计算)的合格判断逻辑。
- 获取当前产品的配方版本 (
CompositeQualificationJudgmentActivity(流程定义(PFD)名称:综合合格判断):- 核心职责: 结合PLC和MES的判断结果。
- 实现细节: 它不包含独立逻辑,而是依次调用
PLCJudgmentAsync和LocalJudgmentAsync两个方法,然后将两个结果进行“与”操作。只有两者都为合格时,最终结果才为合格。
- 关键上下文变量:
- 读:
ParameterCollectData,OrderModel,ProductModel,FormulaApplyModel - 写:
QualityResultValue,QualityResultReason
- 读:
- 二次开发/配置建议: 对于复杂的质量判断需求,最佳实践是实现
ILocalJudgmentStrategy接口,而不是直接修改活动代码。
6.4. ParameterSaveActivity
- 流程定义(PFD)名称:
过程参数存储 - 核心职责: 组装并持久化本次出站的完整追溯记录。
- 实现细节:
- 数据聚合: 这是活动的核心。它从
Flow.DataItems中收集所有必要的信息,包括:产品码、工单、产品型号、进站时间、完成时间、最终合格判断结果、不合格原因、操作员,以及ParameterCollectData中的所有过程参数和物料参数。 - 构建模型: 将聚合的数据统一组装成一个
TraceModel对象。 - 处理特殊逻辑: 它会检查SOP的交互结果,并判断本次追溯的数据类型(
TraceDataType),例如是否为点检数据。 - 存入上下文: 将构建完成的
TraceModel对象存回Flow.DataItems[FlowItemCollection.TraceModel],以便后续的MaterialUsageRecordActivity等活动可以获取到完整的追溯信息。
- 数据聚合: 这是活动的核心。它从
- 关键上下文变量:
- 读:
ApplicationData,OrderModel,ProductModel,ParameterCollectData,QualityResultValue,QualityResultReason,InboundEntryTime - 写:
TraceModel
- 读:
- 二次开发/配置建议: 如果需要为追溯记录增加额外的自定义字段,最推荐的方式是将其添加到
TraceModel.ExtraProperties字典中。这可以在此活动之前通过一个简单的自定义活动实现,或者直接修改此活动来添加。