TapProject / Aging.Infrastructure / DeviceBroker

仪器调用程序结构
与类调用说明

根据源码梳理测试动作如何到达驱动、驱动如何访问物理通道、结果怎样返回;区分当前实现与 V3.1 目标设计。

D:\TestPlatform\TapProject离线 HTML2026-11-09不使用 OpenTAP 原生 Instrument
10 个章节

01 结论与阅读边界

仪器访问主链路:测试动作 → 类型化服务/自动化门面 → 资源授权与操作租约 → DeviceService → DeviceManager → IDeviceDriver → Transport → 仪器或 DeviceBroker。返回结果沿反方向逐层包装,最终由测试步骤保存结果并生成 Verdict。

OpenTAP 接入约束:本系统不实现原生 Instrument。未来仪器类 StepType 只继承 TestStep,在 Run() 调用系统服务。该接入点属于目标方案;当前 TapProject 可直接追踪的自动化示例主要位于 IntegrationTest UI,不能据此认为生产 OpenTAP 插件已接通。
连接与租约不同:步骤租约是短期资源授权,物理连接由唯一 I/O 宿主持有。V3.1 规定驱动注册后连接、HostReady 前就绪检查;当前代码仍有首次 I/O 才连接的路径。

代码事实 源码已有。 V3.1 目标 设计要求。 缺口 尚需实现或验证。

02 分层与类职责

层类 / 接口职责与调用关系状态
测试入口TestStep保存逻辑设备/Slot、通道和工艺参数;调用服务、发布结果、设置 Verdict。不连接物理设备,不创建厂家 SDK。计划接入
类型化 APIICanBusService / CanBusService校验 CAN 帧、编码命令、解析读回。单次调用走 Facade;多操作可借用 Lease。已有实现
自动化门面IAutoDeviceFacade / AutoDeviceFacade单次 Reserve→Execute→Release,或 Acquire 后由 Lease.Dispose 释放预约。已有实现
Slot 服务PowerSupplyService、SlotDeviceMappingResolver按 Slot+Capability 解析端点/资源键,完成电源设定、测量、状态查询。已有实现
设备执行服务IDeviceService / DeviceService查驱动、校验 Owner、取得单次操作租约、调用 Driver 并包装结果。已有实现
资源授权IResourceManager、Owner Token、Operation LeaseOwner Reservation 覆盖步骤作用域;Operation Lease 覆盖一次 I/O 片段,两者不可混为一谈。已有接口
驱动管理IDeviceManager / DeviceManager按 DeviceId 保存 Driver、缓存状态、提供连接/断开 API。RegisterDriver() 只注册,不自动 Connect。已有实现
驱动创建/协议DriverFactory、IDeviceDriver、CanDeviceDriver、SCPI/ModBus/S7 adapters按 transport 创建驱动并封装协议交互;Serial 分支尚未实现。部分实现
传输与宿主ICanTransport、NodeChannelTransport、BrokerRpcTransport、BrokerServer区分 Local 通道与 Broker IPC;Broker 宿主持有其配置下真实驱动。已有实现
依赖方向:StepType → 稳定服务 API/client → 服务实现 → 资源/设备管理契约 → Driver 契约 → Transport。上层不要 new 厂家 SDK、直连 IP/串口或依赖 Broker 私有实现。

03 CAN 单次调用:每条操作单独预约

示例:ICanBusService.SendFrameAsync(deviceId, frameId, data)。

1
TestStep 或当前测试 UI

提供逻辑 deviceId、CAN ID 和数据字节。TestStep 是预期接入点;当前可查到的自动化调用入口主要在 IntegrationTest 的 AutoRunBtn_Click。

2
CanBusService.SendFrameAsync(deviceId,...)

校验帧 ID/长度,编码为 SEND 命令,调用 AutoDeviceFacade.ExecuteAsync。

3
AutoDeviceFacade.ExecuteAsync()

创建 Owner,按当前实现申请 ResourceKey(deviceId, Generic);委托 DeviceService,finally 中释放预约。

4
DeviceService.ExecuteCommandAsync()

通过 DeviceManager 找 Driver,验证 Generic 资源 Owner,取得一次 Operation Lease,然后调用驱动。

5
IDeviceDriver → CanDeviceDriver → ICanTransport

当前 CAN Driver 在 Send/Query 前运行 EnsureConnectedAsync;未连接时第一次 I/O 会建连。

6
NodeChannelTransport 或 BrokerRpcTransport → 返回

Local 走 NodeChannelTransport;Broker 走命名管道 RPC 到 DeviceBroker。结果回到 DeviceService,再由 CanBusService 转为 bool 或帧 DTO。

单次调用会释放资源预约,不代表调用 DeviceManager.Disconnect。CAN driver/transport 可继续持有已建立的连接;首次 I/O 按需建连是现状,不是 V3.1 启动建连目标。

04 作用域租约:一个 Step 内多次操作

  1. AutoDeviceFacade.AcquireAsync(deviceId, stepName) 预约资源并返回 IAutoDeviceLease。
  2. 调用 CanBusService.SendFrameAsync(lease,...)、ReceiveFrameAsync(lease) 等重载。
  3. CanBusService 委托 Lease.Execute/Query;AutoDeviceLease 进入 DeviceService,每次 I/O 再取得 Operation Lease。
  4. 步骤结束 Dispose Lease,释放外层预约;不会等价调用 Driver.Disconnect。
外层 Reservation 表示步骤当前获准使用设备;Operation Lease 表示具体命令/响应片段正在执行。共享物理会话安全串行还依赖资源管理器/SessionGate 的实际锁范围。

05 电源 Slot 调用:逻辑位置映射到设备

  1. PowerSupplyService.ConfigureAsync(slotId, command, owner, ct) 接收 Slot、目标值和 Owner。
  2. SlotDeviceMappingResolver.ResolveEndpoint(slotId, PowerSupply) 解析设备、通道和资源键。
  3. PowerSupplyService 验证资源授权并取得 Operation Lease。
  4. 从 DeviceManager.GetDriver(endpoint.DeviceId) 取 Driver,发 SCPI 设置并查询读回。
  5. 返回 PowerOperationResult:实测值、原始响应、错误码、耗时。
CAN Facade 当前申请 deviceId:Generic;电源服务按 Slot 映射资源键授权,可能细化到通道。Step 不应自行猜测 Owner/ResourceKey;需统一 typed API 或通道级 lease 合约。

06 Broker 调用链:客户端代理不持有实物

客户端侧

Bootstrapper 为 Broker 配置创建设备代理 Driver,注入 BrokerRpcTransport;业务层仍调用同一类型化 API。

Broker 宿主

BrokerServer 持有真实配置和真实 Driver,在设备 gate 中执行请求。物理 socket/串口/SDK 会话只归唯一 I/O 宿主。

1
BrokerRpcTransport

把 SEND/QUERY 编成操作码和 payload,携带 DeviceId、client instance、配置 Hash。

2
BrokerClientChannel

建立/复用命名管道,Hello 握手,用 CorrelationId 关联请求响应并设置等待期限。

3
BrokerServer

处理 CONNECT/SEND/QUERY/STATUS;按需创建真实 Driver、连接并执行。

4
真实 Driver → 物理 Transport → 仪器

Broker 返回状态与读回,代理清理传输封装后交回服务层。

Broker 不可达时,TestStep 不可自行切换到 Local 直连同一仪器,否则可能形成同一个 PhysicalSessionKey 的双主控制。写命令已提交但超时,应视为 Unknown,先读回/恢复,不盲目重发。

07 启动与连接生命周期:接口存在不代表自动执行

环节当前源码事实V3.1 目标 / 差距
基础设施装配Bootstrapper 创建 ResourceManager、DeviceManager、DeviceService、PowerSupplyService、AutoFacade、CanBusService。已搜索到的 Bootstrapper 调用点在 Plugin.IntegrationTest;未据此确认生产主程序启动已接入。
Local 注册LoadDevicesFromConfig() 读取映射但创建本地 Driver 仍为 TODO。按生效配置读取驱动定义、核对唯一宿主后注册。
Driver 注册DeviceManager.RegisterDriver 写字典/初始状态/事件订阅,不执行 Connect。注册后由宿主连接本宿主设备并检查 Ready。
CAN 连接CanDeviceDriver 首次 Send/Query 时 EnsureConnectedAsync。HostReady 前建连并健康检查,不让首次测试动作承担连接。
Broker 连接客户端注册代理;BrokerServer 在 CONNECT 或首次操作时可创建/连接真实 Driver。真实物理连接留在 Broker 宿主,代理只做 IPC。
SCPI 连接当前 ScpiDriverAdapter.ConnectAsync 会发送 *RST。自动连接前拆出 Reset;Connect 只建链并进行无副作用探测。
步骤结束Dispose 释放资源预约,不等于 DeviceManager.Disconnect。连接由宿主持有,步骤结束不断开。
关闭/重启DeviceManager 有单设备 Connect/Disconnect;未见完整统一生命周期协调。关闭需排空、安全处理、读回后断开;重启进入恢复门禁,再发布 HostReady。
建议 DeviceManager 管理驱动实例和单设备连接;宿主级 DeviceService 或独立连接协调器负责注册后批量连接、汇总 Connected/Ready、失败隔离、有序关闭。不要在每个 Run() 中 Connect/Disconnect。

08 结果与错误边界

层返回值判定边界
Driver原始响应、状态、异常/连接事件。不是 DUT Pass/Fail。
DeviceServiceDeviceCommandResult:成功、读回、错误码/信息、延迟。命令交换成功不一定等于工艺合格。
CanBusService发送 bool、接收 CanFrameData。生产 Step 应保留可诊断错误,避免只有 bool。
PowerSupplyServicePowerOperationResult:实测值、原始响应、错误、延迟。由业务步骤按限值判定。
TestStep目标记录输入/读数/单位/限值/耗时并设 Verdict。设备故障通常为执行 Error;测量超限才是工艺 Fail;结果 Unknown 要恢复,不盲目重发。

09 建议优先完善的接口边界

  1. 给 TestStep 提供稳定 client API 与 DTO;如 OpenTAP Engine 与 Aging.Infrastructure 框架不兼容,用版本化 IPC。
  2. 把 Bootstrapper 接入生产组合根,加载完整配置、驱动定义及 Local/Broker 归属。
  3. 实现注册后连接协调、健康检查、HostReady 门禁、有限重试和故障隔离。
  4. 统一 CAN、电源等服务的 Owner、Slot、Channel、ResourceKey 申请方式。
  5. 把 SCPI *RST、输出设置、安全动作从 Connect 拆为显式受控操作。
  6. 确认共享 PhysicalSession 上的操作锁覆盖完整 I/O 片段,并定义超时/Unknown 语义。
证据边界:本文为源码静态阅读和 V3.1 设计对照,没有运行仪器、模拟器或整站应用。自动连接、HostReady 和恢复门禁均标为目标,不是已验收事实。

10 源码定位

类型文件查看内容
启动/注册D:\TestPlatform\TapProject\Aging.Infrastructure\InfrastructureBootstrapper.csInitialize、LoadDevicesFromConfig、RegisterBrokeredDrivers、RegisterDevice
门面/租约D:\TestPlatform\TapProject\Aging.Infrastructure\Services\AutoDeviceFacade.csExecute/Query、Acquire、AutoDeviceLease.Dispose
CAN APID:\TestPlatform\TapProject\Aging.Infrastructure\Services\CanBusService.cs类型化调用、命令编码、租约重载
执行/管理D:\TestPlatform\TapProject\Aging.Infrastructure\Services\DeviceService.cs
D:\TestPlatform\TapProject\Aging.Infrastructure\Core\DeviceManager.cs
权限验证、操作租约、Driver 注册与连接状态
电源D:\TestPlatform\TapProject\Aging.Infrastructure\Services\PowerSupplyService.cs
D:\TestPlatform\TapProject\Aging.Infrastructure\Services\SlotDeviceMappingResolver.cs
Slot 映射和电源动作
驱动/传输D:\TestPlatform\TapProject\Aging.Infrastructure\Drivers\DriverFactory.cs
D:\TestPlatform\TapProject\Aging.Infrastructure\Drivers\CanDeviceDriver.cs
D:\TestPlatform\TapProject\Aging.Infrastructure\Drivers\BrokerRpcTransport.cs
D:\TestPlatform\TapProject\Aging.Infrastructure\Broker\BrokerClientChannel.cs
Driver 创建、按需建连、Broker RPC
Broker 宿主D:\TestPlatform\TapProject\DeviceBroker\BrokerServer.cs真实 Driver 创建、连接和 I/O
当前自动化示例D:\TestPlatform\TapProject\Plugin.IntegrationTest\MainWindow.xaml.csInitializeAutoServices、RegisterCanDriver、AutoRunBtn_Click
目标设计D:\06-产品开发\18-舱驾控制器老化设备\Local + DeviceBroker 混合架构详细设计说明书 V3.1.html第 23 章:启动连接、HostReady、恢复、关闭与 SCPI