`AutomaticPipelineExecutionContext` 本身不会造成等待。它只是一个参数对象,用来把以下信息统一传给流水线阶段

发布时间:2026/10/24 3:54:36
`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 吹扫完成标志位 != 5

2. 扫码失败后的退料等待

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)

真正需要检查的是:

  1. PLC 是否满足初始上料条件;
  2. PlcPollingTimeoutMs = 3000_000是否误设置成了 50 分钟;
  3. 扫码失败后是否进入了ScanFailureUnloadAsync;
  4. 是否因为CancellationToken.None持续等待现场取料;
  5. 日志中是否出现以下关键记录:
初始上料许可等待PLC条件 等待取料许可 取料完成条件

建议暂时保留AutomaticPipelineExecutionContext,它只是框架封装。应先在LoadWorker前后增加日志,确认具体卡在“上料许可、扫码、退料”哪一步,而不是删除 Context。