`AutomaticPipelineExecutionContext` 本身不会造成等待。它只是一个参数对象,用来把以下信息统一传给流水线阶段
AutomaticPipelineExecutionContext本身不会造成等待。它只是一个参数对象,用来把以下信息统一传给流水线阶段:
Product Stage CancellationToken TestPassed当前代码:
varcontext=newAutomaticPipelineExecutionContext(product,AutomaticPipelineStage.Loading,linkedCancellation.Token);AutomaticPipelineStageResultresult=await_handlers.ExecuteAsync(context);实际执行过程是:
LoadWorker -> ExecuteAsync(context) -> _handlers.LoadAsync(product, token) -> StationMaterialService.LoadAsync -> LoadProduct.StartAsync -> 等待 PLC 上料条件 -> 扫码也就是说,它和之前的逻辑本质等价:
LoadProductResultresult=await_handlers.LoadAsync(product,linkedCancellation.Token);ExecuteAsync只是多做了两件事:
1.根据 Stage 选择对应的业务委托2.将 ProcessStepResult 转换成 AutomaticPipelineStageResult不会增加 PLC 等待,也不会增加扫码等待。
真正可能造成等待的位置有以下几个。
1. 初始上料条件等待时间过长
LoadProduct.cs中:
privateconstintPlcPollingTimeoutMs=3000_000;这等于:
3,000,000 毫秒 = 3,000 秒 = 50 分钟因此如果以下任意条件不满足,LoadProduct.StartAsync最长可能等待 50 分钟:
允许上料标志位 = true 上料位载盘检测 = true 吹扫完成标志位 != 52. 扫码失败后的退料等待
StationMaterialService.LoadAsync中,如果已经取得部分 SN:
if(result.RequiresUnloading){awaitScanFailureUnloadAsync(productCodes,...,CancellationToken.None);}此时会继续等待:
允许取料 器件被取走 光幕恢复 上料位对应光电无料 载盘仍在位取料等待最长可能达到 100 分钟。这是为了防止器件已经放入设备却被取消后遗留现场。
3.linkedCancellation只是合并取消信号
CancellationTokenSource.CreateLinkedTokenSource(cancellationToken,product.LoadCancellationToken);它表示以下任意一个取消,都会触发当前上料流程取消:
整条流水线停止 当前产品的上料请求被取消但取消是否立即生效,取决于LoadProduct内部是否正确使用该 Token。它本身不会主动阻塞。
4. 当前和旧逻辑的真正区别
旧逻辑:
LoadProductResultresult=await_handlers.LoadAsync(product,token);当前逻辑:
AutomaticPipelineStageResultresult=await_handlers.ExecuteAsync(context);当前逻辑只是把返回值包装成:
AutomaticPipelineStageResult其内部的:
LegacyResult仍然保存原来的:
LoadProductResult因此,单纯改回旧写法不能解决等待问题。
结论:
问题不在:
AutomaticPipelineExecutionContext也不在:
_handlers.ExecuteAsync(context)真正需要检查的是:
- PLC 是否满足初始上料条件;
PlcPollingTimeoutMs = 3000_000是否误设置成了 50 分钟;- 扫码失败后是否进入了
ScanFailureUnloadAsync; - 是否因为
CancellationToken.None持续等待现场取料; - 日志中是否出现以下关键记录:
初始上料许可等待PLC条件 等待取料许可 取料完成条件建议暂时保留AutomaticPipelineExecutionContext,它只是框架封装。应先在LoadWorker前后增加日志,确认具体卡在“上料许可、扫码、退料”哪一步,而不是删除 Context。