仪器调用程序结构
与类调用说明
根据源码梳理测试动作如何到达驱动、驱动如何访问物理通道、结果怎样返回;区分当前实现与 V3.1 目标设计。
D:\TestPlatform\TapProject离线 HTML2026-11-09不使用 OpenTAP 原生 Instrument01 结论与阅读边界
仪器访问主链路:测试动作 → 类型化服务/自动化门面 → 资源授权与操作租约 → DeviceService → DeviceManager → IDeviceDriver → Transport → 仪器或 DeviceBroker。返回结果沿反方向逐层包装,最终由测试步骤保存结果并生成 Verdict。
Instrument。未来仪器类 StepType 只继承 TestStep,在 Run() 调用系统服务。该接入点属于目标方案;当前 TapProject 可直接追踪的自动化示例主要位于 IntegrationTest UI,不能据此认为生产 OpenTAP 插件已接通。代码事实 源码已有。 V3.1 目标 设计要求。 缺口 尚需实现或验证。
02 分层与类职责
| 层 | 类 / 接口 | 职责与调用关系 | 状态 |
|---|---|---|---|
| 测试入口 | TestStep | 保存逻辑设备/Slot、通道和工艺参数;调用服务、发布结果、设置 Verdict。不连接物理设备,不创建厂家 SDK。 | 计划接入 |
| 类型化 API | ICanBusService / 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 Lease | Owner 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 宿主持有其配置下真实驱动。 | 已有实现 |
03 CAN 单次调用:每条操作单独预约
示例:ICanBusService.SendFrameAsync(deviceId, frameId, data)。
提供逻辑 deviceId、CAN ID 和数据字节。TestStep 是预期接入点;当前可查到的自动化调用入口主要在 IntegrationTest 的 AutoRunBtn_Click。
校验帧 ID/长度,编码为 SEND 命令,调用 AutoDeviceFacade.ExecuteAsync。
创建 Owner,按当前实现申请 ResourceKey(deviceId, Generic);委托 DeviceService,finally 中释放预约。
通过 DeviceManager 找 Driver,验证 Generic 资源 Owner,取得一次 Operation Lease,然后调用驱动。
当前 CAN Driver 在 Send/Query 前运行 EnsureConnectedAsync;未连接时第一次 I/O 会建连。
Local 走 NodeChannelTransport;Broker 走命名管道 RPC 到 DeviceBroker。结果回到 DeviceService,再由 CanBusService 转为 bool 或帧 DTO。
04 作用域租约:一个 Step 内多次操作
AutoDeviceFacade.AcquireAsync(deviceId, stepName)预约资源并返回IAutoDeviceLease。- 调用
CanBusService.SendFrameAsync(lease,...)、ReceiveFrameAsync(lease)等重载。 - CanBusService 委托 Lease.Execute/Query;AutoDeviceLease 进入 DeviceService,每次 I/O 再取得 Operation Lease。
- 步骤结束 Dispose Lease,释放外层预约;不会等价调用 Driver.Disconnect。
05 电源 Slot 调用:逻辑位置映射到设备
PowerSupplyService.ConfigureAsync(slotId, command, owner, ct)接收 Slot、目标值和 Owner。SlotDeviceMappingResolver.ResolveEndpoint(slotId, PowerSupply)解析设备、通道和资源键。- PowerSupplyService 验证资源授权并取得 Operation Lease。
- 从
DeviceManager.GetDriver(endpoint.DeviceId)取 Driver,发 SCPI 设置并查询读回。 - 返回
PowerOperationResult:实测值、原始响应、错误码、耗时。
deviceId:Generic;电源服务按 Slot 映射资源键授权,可能细化到通道。Step 不应自行猜测 Owner/ResourceKey;需统一 typed API 或通道级 lease 合约。06 Broker 调用链:客户端代理不持有实物
客户端侧
Bootstrapper 为 Broker 配置创建设备代理 Driver,注入 BrokerRpcTransport;业务层仍调用同一类型化 API。
Broker 宿主
BrokerServer 持有真实配置和真实 Driver,在设备 gate 中执行请求。物理 socket/串口/SDK 会话只归唯一 I/O 宿主。
把 SEND/QUERY 编成操作码和 payload,携带 DeviceId、client instance、配置 Hash。
建立/复用命名管道,Hello 握手,用 CorrelationId 关联请求响应并设置等待期限。
处理 CONNECT/SEND/QUERY/STATUS;按需创建真实 Driver、连接并执行。
Broker 返回状态与读回,代理清理传输封装后交回服务层。
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。 |
08 结果与错误边界
| 层 | 返回值 | 判定边界 |
|---|---|---|
| Driver | 原始响应、状态、异常/连接事件。 | 不是 DUT Pass/Fail。 |
| DeviceService | DeviceCommandResult:成功、读回、错误码/信息、延迟。 | 命令交换成功不一定等于工艺合格。 |
| CanBusService | 发送 bool、接收 CanFrameData。 | 生产 Step 应保留可诊断错误,避免只有 bool。 |
| PowerSupplyService | PowerOperationResult:实测值、原始响应、错误、延迟。 | 由业务步骤按限值判定。 |
| TestStep | 目标记录输入/读数/单位/限值/耗时并设 Verdict。 | 设备故障通常为执行 Error;测量超限才是工艺 Fail;结果 Unknown 要恢复,不盲目重发。 |
09 建议优先完善的接口边界
- 给 TestStep 提供稳定 client API 与 DTO;如 OpenTAP Engine 与 Aging.Infrastructure 框架不兼容,用版本化 IPC。
- 把 Bootstrapper 接入生产组合根,加载完整配置、驱动定义及 Local/Broker 归属。
- 实现注册后连接协调、健康检查、HostReady 门禁、有限重试和故障隔离。
- 统一 CAN、电源等服务的 Owner、Slot、Channel、ResourceKey 申请方式。
- 把 SCPI
*RST、输出设置、安全动作从 Connect 拆为显式受控操作。 - 确认共享 PhysicalSession 上的操作锁覆盖完整 I/O 片段,并定义超时/Unknown 语义。
10 源码定位
| 类型 | 文件 | 查看内容 |
|---|---|---|
| 启动/注册 | D:\TestPlatform\TapProject\Aging.Infrastructure\InfrastructureBootstrapper.cs | Initialize、LoadDevicesFromConfig、RegisterBrokeredDrivers、RegisterDevice |
| 门面/租约 | D:\TestPlatform\TapProject\Aging.Infrastructure\Services\AutoDeviceFacade.cs | Execute/Query、Acquire、AutoDeviceLease.Dispose |
| CAN API | D:\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.cs | InitializeAutoServices、RegisterCanDriver、AutoRunBtn_Click |
| 目标设计 | D:\06-产品开发\18-舱驾控制器老化设备\Local + DeviceBroker 混合架构详细设计说明书 V3.1.html | 第 23 章:启动连接、HostReady、恢复、关闭与 SCPI |