可以精简,而且很有必要。但不建议把所有状态压成一个枚举,因为自动模式允许“测试位测试中”与“上料位等待/扫码”并行,单一 `Running` 会丢失业务语义
可以精简,而且很有必要。但不建议把所有状态压成一个枚举,因为自动模式允许“测试位测试中”与“上料位等待/扫码”并行,单一Running会丢失业务语义。
目前 StationControlViewModel.cs 约 3136 行,混合了九类职责:
- WPF 展示与按钮绑定
- 模式初始化、硬件连接
- 开批、结批
- 半自动测试
- 自动流水线协调
- PLC 实时采集与报警处理
- 自动上料许可边沿处理
- 数据文件持久化
- EAP 指令适配
最明显的状态重复
| 当前状态 | 建议 |
|---|---|
IsBatchButtonEnabled、IsPrepareButtonEnabled、IsStopButtonEnabled、IsResetButtonEnabled | 不应分别存储,改为由按钮策略统一计算 |
StationButtonState加四个按钮布尔值 | 两套状态同时维护,容易被异步流程覆盖 |
_automaticAllowLoading、_lastObservedAllowLoading、_automaticLoadStartReleased、_automaticLoadPermitPending、_pendingAutomaticLoadSource、_retryAutomaticLoadAfterReset | 应合并为AutomaticLoadPermitState对象 |
LotId、配方、路径、测试员、SubLot、治具码、BatchContext | 应合并为BatchSession,批次关闭时只释放一个对象 |
_workflowCancellation同时参与初始化、半自动流程、EAP 流程 | 取消源所有权不清晰,应按操作建立独立OperationScope |
StationStatus与EnvironmentData.StationDatas[StationNo].StationStatus | 是双数据源风险;当前文件内主要写的是EnvironmentData,但主页仍读取 ViewModel 的StationStatus,可能出现展示不一致 |
其中最后一项值得优先处理。主页在 MaxWellHomeViewModel.cs 读取station.StationStatus,但当前 ViewModel 内部主要更新的是EnvironmentData,这会形成“真实状态已变、界面副本未同步”的隐患。
建议保留的独立状态轴
不要合成一个大枚举,建议保留四个正交状态:
运行模式:关闭 / 自动 / 半自动 / 手动 批次状态:未开批 / 开批中 / 已开批 / 结批中 安全状态:正常 / 停止中 / 等待复位 / 复位中 / 故障 生产状态:无在制品 / 半自动流程中 / 自动流水线有在制品按钮不再由流程直接赋四个 bool,而是由一个纯规则统一计算:
ButtonAvailability = ButtonPolicy.Evaluate( 运行模式, 批次状态, 安全状态, 生产状态, 是否允许上料, 是否有操作权限);这样ApplyButtonState可以被替换为单一状态迁移方法,避免初始化、实时采集、停止、流水线完成回调相互覆盖按钮状态。
建议的拆分方向
StationControlViewModel
只保留绑定属性、命令入口、弹窗和状态展示。StationModeCoordinator
承担当前约 2318-2630 行的模式切换、按需连接硬件、初始化、负载板检查。StationBatchCoordinator
承担开批、结批、批次会话创建、失败回滚。复用已有BatchLifecycleService。StationWorkflowCoordinator
承担半自动流程与自动流水线回调。自动流水线本体已经在AutomaticStationPipeline,不必重写。StationRealtimeCoordinator
承担实时采集决策、报警、PLC 上料许可、工位物料状态。底层已有AutomaticRealtimeAcquisitionService,这里只需把 UI 协调移出 ViewModel。EapStationFacade
承担当前约 3054 行之后的 StartLot、EndLot、SOT、Reset、EOT 适配,不让 EAP 协议细节进入 UI 类。
低风险精简顺序
- 先抽取
BatchSession与AutomaticLoadPermitState,不改变流程。 - 把四个按钮 bool 改为由
ButtonPolicy计算。 - 统一
StationStatus的唯一数据源,建议以工站运行时状态对象为源,再同步EnvironmentData。 - 将 EAP 方法移到 Facade。
- 最后抽取模式初始化与实时采集协调器。
这样可显著降低StationControlViewModel复杂度,同时不破坏自动模式的并行流水线、PLC 联锁和停止取消机制。本次仅完成分析,未修改代码。
可以,而且可以在不改变现有业务流程的前提下逐步精简。
当前复杂的根因不是代码量本身,而是同一个类同时维护“批次、模式、按钮、自动上料许可、流水线、实时采集、EAP、数据保存”。精简重点应是收拢状态和拆职责,不能只删注释或合并方法。
建议先做三项,收益最高、风险最低:
合并批次字段为
BatchSession
将LotId、配方、路径、测试员、SubLotID、治具码、BatchContext收入一个批次对象。开批创建,结批/失败直接清空,避免几十处单独赋值和遗漏。合并自动上料字段为
AutomaticLoadPermitState
当前允许上料、上升沿、待消费、同步放行、复位重试等多个字段,可变为一个对象,统一暴露:ObserveAllowLoading()、ReleaseAfterBatchStart()、TryConsume()、ResetForNextBatch()。
这会明显简化实时采集和准备按钮代码。四个按钮改为计算结果
IsBatchButtonEnabled、IsPrepareButtonEnabled、IsStopButtonEnabled、IsResetButtonEnabled不再在各流程中分别写值。
改为由“模式、批次、安全、在制品、PLC允许上料、权限”统一计算,避免初始化、停止、退料完成、结批等异步回调互相覆盖。
后续再按职责拆出:
StationModeCoordinator:模式切换、按需连接、初始化。StationBatchCoordinator:开批、结批、回滚。StationRealtimeCoordinator:4.3 实时采集、报警、上料许可。StationWorkflowCoordinator:半自动、自动流水线协调。EapStationFacade:StartLot、EndLot、SOT 等协议适配。
StationControlViewModel最终只保留界面绑定、命令入口和弹窗,代码通常可从 3000 多行降到约 600-900 行,业务流程仍保留在独立服务中,后续新增工站业务或 PLC 联锁也更容易定位。