From 559890c482f5973f06aafdfec9550fee5ba3c7f2 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 17:02:15 +0800
Subject: [PATCH] feat: CAN 模拟器 TCP 化 + 多设备并发调试 + 后台生命周期管理

---
 docs/仪器调用程序结构与类调用说明.html |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git "a/docs/\344\273\252\345\231\250\350\260\203\347\224\250\347\250\213\345\272\217\347\273\223\346\236\204\344\270\216\347\261\273\350\260\203\347\224\250\350\257\264\346\230\216.html" "b/docs/\344\273\252\345\231\250\350\260\203\347\224\250\347\250\213\345\272\217\347\273\223\346\236\204\344\270\216\347\261\273\350\260\203\347\224\250\350\257\264\346\230\216.html"
new file mode 100644
index 0000000..ba9525e
--- /dev/null
+++ "b/docs/\344\273\252\345\231\250\350\260\203\347\224\250\347\250\213\345\272\217\347\273\223\346\236\204\344\270\216\347\261\273\350\260\203\347\224\250\350\257\264\346\230\216.html"
@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>浠櫒璋冪敤绋嬪簭缁撴瀯涓庣被璋冪敤璇存槑</title>
+<style>
+:root{--navy:#112e45;--blue:#176b87;--ink:#1b2e3b;--muted:#506576;--line:#d9e2e8;--bg:#edf2f4;--green:#e4f3ec;--amber:#fff3d8;--red:#fbe9e7}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.7 "Segoe UI","Microsoft YaHei",sans-serif}.layout{display:grid;grid-template-columns:245px minmax(0,1fr);min-height:100vh}.side{position:sticky;top:0;height:100vh;overflow:auto;background:var(--navy);color:#edf5f8;padding:22px 16px}.brand{font-weight:800;font-size:17px}.side small{display:block;color:#aec5d0;margin:5px 0 18px}.side a{display:block;color:#d5e6ec;text-decoration:none;padding:6px 9px;border-radius:6px;font-size:13px}.side a:hover{background:#1b435d}main{max-width:1250px;width:100%;margin:auto;padding:26px 32px 55px}.hero{color:white;background:linear-gradient(125deg,#112e45,#176b87);padding:32px 36px;border-radius:16px}.hero h1{font-size:32px;line-height:1.25;margin:8px 0}.hero p{color:#d7eaf0;max-width:850px}.pill{display:inline-block;border:1px solid #71a3b5;border-radius:18px;padding:2px 10px;margin:4px 5px 0 0;font-size:12px}.toolbar{display:flex;gap:9px;margin:13px 0;align-items:center}.toolbar input{flex:1;min-width:200px;padding:10px;border:1px solid var(--line);border-radius:8px;font:inherit}.toolbar button{border:0;background:var(--navy);color:white;padding:10px 13px;border-radius:8px}.count{font-size:12px;color:var(--muted)}section{background:white;border:1px solid var(--line);border-radius:13px;padding:24px 28px;margin:15px 0;scroll-margin-top:14px}h2{margin:0 0 13px;color:var(--navy);font-size:22px}h3{color:#17536d;font-size:17px;margin:20px 0 7px}p{margin:8px 0}.tag{display:inline-block;padding:1px 7px;border-radius:5px;font-size:11px;font-weight:bold}.fact{background:var(--green);color:#247455}.target{background:var(--amber);color:#946313}.risk{background:var(--red);color:#9d3939}.note{padding:12px 14px;border-left:4px solid var(--blue);background:#edf7f9;border-radius:0 8px 8px 0;margin:12px 0}.warn{border-left-color:#c7871e;background:#fff8e8}.danger{border-left-color:#b74444;background:#fff0ee}table{border-collapse:collapse;width:100%;font-size:13px;margin:10px 0 16px}th,td{text-align:left;vertical-align:top;border-bottom:1px solid var(--line);padding:8px 9px}th{background:#edf3f6;color:#24495d}tr:hover td{background:#f8fbfc}code{background:#edf2f4;color:#183e55;padding:1px 4px;border-radius:3px;font:12px Consolas,monospace;overflow-wrap:anywhere}.path{font:12px Consolas,monospace;color:#435c6a;overflow-wrap:anywhere}.call{display:grid;grid-template-columns:34px 1fr;gap:10px;padding:11px 7px;border-bottom:1px solid var(--line)}.call:last-child{border:0}.num{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;background:#d8eef2;color:#12526b;font-weight:bold}.call strong{color:#173f55}.call p{font-size:13px;color:var(--muted);margin:2px 0}.cols{display:grid;grid-template-columns:1fr 1fr;gap:12px}.card{border:1px solid var(--line);border-radius:9px;padding:15px;background:#fbfdfe}.card h3{margin:0 0 6px}@media(max-width:820px){.layout{display:block}.side{position:static;height:auto}.side nav{display:grid;grid-template-columns:1fr 1fr}main{padding:14px}.hero{padding:23px}.hero h1{font-size:27px}section{padding:18px}.cols{grid-template-columns:1fr}table{display:block;overflow:auto}}@media print{body{background:white}.layout{display:block}.side,.toolbar{display:none}.hero{print-color-adjust:exact}.hero,section{break-inside:avoid}}
+</style></head><body><div class="layout">
+<aside class="side"><div class="brand">TESTPLATFORM<br>浠櫒璋冪敤缁撴瀯</div><small>绫昏亴璐� 路 璋冪敤椤哄簭 路 鐢熷懡鍛ㄦ湡</small><nav>
+<a href="#summary">01 缁撹涓庤竟鐣�</a><a href="#layers">02 绫昏亴璐e垎灞�</a><a href="#can">03 CAN 鍗曟璋冪敤</a><a href="#lease">04 浣滅敤鍩熺绾�</a><a href="#power">05 鐢垫簮 Slot 璋冪敤</a><a href="#broker">06 Broker 璋冪敤</a><a href="#startup">07 鍚姩涓庤繛鎺�</a><a href="#result">08 缁撴灉涓庨敊璇�</a><a href="#gaps">09 寰呭畬鍠勯」</a><a href="#sources">10 婧愮爜瀹氫綅</a></nav></aside>
+<main><header class="hero"><div>TapProject / Aging.Infrastructure / DeviceBroker</div><h1>浠櫒璋冪敤绋嬪簭缁撴瀯<br>涓庣被璋冪敤璇存槑</h1><p>鏍规嵁婧愮爜姊崇悊娴嬭瘯鍔ㄤ綔濡備綍鍒拌揪椹卞姩銆侀┍鍔ㄥ浣曡闂墿鐞嗛�氶亾銆佺粨鏋滄�庢牱杩斿洖锛涘尯鍒嗗綋鍓嶅疄鐜颁笌 V3.1 鐩爣璁捐銆�</p><span class="pill">D:\TestPlatform\TapProject</span><span class="pill">绂荤嚎 HTML</span><span class="pill">2026-11-09</span><span class="pill">涓嶄娇鐢� OpenTAP 鍘熺敓 Instrument</span></header>
+<div class="toolbar"><input id="filter" type="search" placeholder="绛涢�夋湰椤垫枃瀛楋細渚嬪 CanBusService銆佺绾︺�丅roker"><button id="reset">娓呴櫎绛涢��</button><span id="count" class="count">10 涓珷鑺�</span></div>
+<section id="summary"><h2>01銆�缁撹涓庨槄璇昏竟鐣�</h2><p>浠櫒璁块棶涓婚摼璺細<strong>娴嬭瘯鍔ㄤ綔 鈫� 绫诲瀷鍖栨湇鍔�/鑷姩鍖栭棬闈� 鈫� 璧勬簮鎺堟潈涓庢搷浣滅绾� 鈫� DeviceService 鈫� DeviceManager 鈫� IDeviceDriver 鈫� Transport 鈫� 浠櫒鎴� DeviceBroker</strong>銆傝繑鍥炵粨鏋滄部鍙嶆柟鍚戦�愬眰鍖呰锛屾渶缁堢敱娴嬭瘯姝ラ淇濆瓨缁撴灉骞剁敓鎴� Verdict銆�</p><div class="note"><b>OpenTAP 鎺ュ叆绾︽潫锛�</b>鏈郴缁熶笉瀹炵幇鍘熺敓 <code>Instrument</code>銆傛湭鏉ヤ华鍣ㄧ被 StepType 鍙户鎵� <code>TestStep</code>锛屽湪 <code>Run()</code> 璋冪敤绯荤粺鏈嶅姟銆傝鎺ュ叆鐐瑰睘浜庣洰鏍囨柟妗堬紱褰撳墠 TapProject 鍙洿鎺ヨ拷韪殑鑷姩鍖栫ず渚嬩富瑕佷綅浜� IntegrationTest UI锛屼笉鑳芥嵁姝よ涓虹敓浜� OpenTAP 鎻掍欢宸叉帴閫氥��</div><div class="note warn"><b>杩炴帴涓庣绾︿笉鍚岋細</b>姝ラ绉熺害鏄煭鏈熻祫婧愭巿鏉冿紝鐗╃悊杩炴帴鐢卞敮涓� I/O 瀹夸富鎸佹湁銆俈3.1 瑙勫畾椹卞姩娉ㄥ唽鍚庤繛鎺ャ�丠ostReady 鍓嶅氨缁鏌ワ紱褰撳墠浠g爜浠嶆湁棣栨 I/O 鎵嶈繛鎺ョ殑璺緞銆�</div><p><span class="tag fact">浠g爜浜嬪疄</span> 婧愮爜宸叉湁銆傘��<span class="tag target">V3.1 鐩爣</span> 璁捐瑕佹眰銆傘��<span class="tag risk">缂哄彛</span> 灏氶渶瀹炵幇鎴栭獙璇併��</p></section>
+<section id="layers"><h2>02銆�鍒嗗眰涓庣被鑱岃矗</h2><table><thead><tr><th>灞�</th><th>绫� / 鎺ュ彛</th><th>鑱岃矗涓庤皟鐢ㄥ叧绯�</th><th>鐘舵��</th></tr></thead><tbody>
+<tr><td>娴嬭瘯鍏ュ彛</td><td><code>TestStep</code></td><td>淇濆瓨閫昏緫璁惧/Slot銆侀�氶亾鍜屽伐鑹哄弬鏁帮紱璋冪敤鏈嶅姟銆佸彂甯冪粨鏋溿�佽缃� Verdict銆備笉杩炴帴鐗╃悊璁惧锛屼笉鍒涘缓鍘傚 SDK銆�</td><td><span class="tag target">璁″垝鎺ュ叆</span></td></tr>
+<tr><td>绫诲瀷鍖� API</td><td><code>ICanBusService / CanBusService</code></td><td>鏍¢獙 CAN 甯с�佺紪鐮佸懡浠ゃ�佽В鏋愯鍥炪�傚崟娆¤皟鐢ㄨ蛋 Facade锛涘鎿嶄綔鍙�熺敤 Lease銆�</td><td><span class="tag fact">宸叉湁瀹炵幇</span></td></tr>
+<tr><td>鑷姩鍖栭棬闈�</td><td><code>IAutoDeviceFacade / AutoDeviceFacade</code></td><td>鍗曟 Reserve鈫扙xecute鈫扲elease锛屾垨 Acquire 鍚庣敱 Lease.Dispose 閲婃斁棰勭害銆�</td><td><span class="tag fact">宸叉湁瀹炵幇</span></td></tr>
+<tr><td>Slot 鏈嶅姟</td><td><code>PowerSupplyService</code>銆�<code>SlotDeviceMappingResolver</code></td><td>鎸� Slot+Capability 瑙f瀽绔偣/璧勬簮閿紝瀹屾垚鐢垫簮璁惧畾銆佹祴閲忋�佺姸鎬佹煡璇€��</td><td><span class="tag fact">宸叉湁瀹炵幇</span></td></tr>
+<tr><td>璁惧鎵ц鏈嶅姟</td><td><code>IDeviceService / DeviceService</code></td><td>鏌ラ┍鍔ㄣ�佹牎楠� Owner銆佸彇寰楀崟娆℃搷浣滅绾︺�佽皟鐢� Driver 骞跺寘瑁呯粨鏋溿��</td><td><span class="tag fact">宸叉湁瀹炵幇</span></td></tr>
+<tr><td>璧勬簮鎺堟潈</td><td><code>IResourceManager</code>銆丱wner Token銆丱peration Lease</td><td>Owner Reservation 瑕嗙洊姝ラ浣滅敤鍩燂紱Operation Lease 瑕嗙洊涓�娆� I/O 鐗囨锛屼袱鑰呬笉鍙贩涓轰竴璋堛��</td><td><span class="tag fact">宸叉湁鎺ュ彛</span></td></tr>
+<tr><td>椹卞姩绠$悊</td><td><code>IDeviceManager / DeviceManager</code></td><td>鎸� DeviceId 淇濆瓨 Driver銆佺紦瀛樼姸鎬併�佹彁渚涜繛鎺�/鏂紑 API銆�<code>RegisterDriver()</code> 鍙敞鍐岋紝涓嶈嚜鍔� Connect銆�</td><td><span class="tag fact">宸叉湁瀹炵幇</span></td></tr>
+<tr><td>椹卞姩鍒涘缓/鍗忚</td><td><code>DriverFactory</code>銆�<code>IDeviceDriver</code>銆�<code>CanDeviceDriver</code>銆丼CPI/ModBus/S7 adapters</td><td>鎸� transport 鍒涘缓椹卞姩骞跺皝瑁呭崗璁氦浜掞紱Serial 鍒嗘敮灏氭湭瀹炵幇銆�</td><td><span class="tag fact">閮ㄥ垎瀹炵幇</span></td></tr>
+<tr><td>浼犺緭涓庡涓�</td><td><code>ICanTransport</code>銆�<code>NodeChannelTransport</code>銆�<code>BrokerRpcTransport</code>銆�<code>BrokerServer</code></td><td>鍖哄垎 Local 閫氶亾涓� Broker IPC锛汢roker 瀹夸富鎸佹湁鍏堕厤缃笅鐪熷疄椹卞姩銆�</td><td><span class="tag fact">宸叉湁瀹炵幇</span></td></tr></tbody></table><div class="note">渚濊禆鏂瑰悜锛歋tepType 鈫� 绋冲畾鏈嶅姟 API/client 鈫� 鏈嶅姟瀹炵幇 鈫� 璧勬簮/璁惧绠$悊濂戠害 鈫� Driver 濂戠害 鈫� Transport銆備笂灞備笉瑕� new 鍘傚 SDK銆佺洿杩� IP/涓插彛鎴栦緷璧� Broker 绉佹湁瀹炵幇銆�</div></section>
+<section id="can"><h2>03銆�CAN 鍗曟璋冪敤锛氭瘡鏉℃搷浣滃崟鐙绾�</h2><p>绀轰緥锛�<code>ICanBusService.SendFrameAsync(deviceId, frameId, data)</code>銆�</p>
+<div class="call"><div class="num">1</div><div><strong>TestStep 鎴栧綋鍓嶆祴璇� UI</strong><p>鎻愪緵閫昏緫 deviceId銆丆AN ID 鍜屾暟鎹瓧鑺傘�俆estStep 鏄鏈熸帴鍏ョ偣锛涘綋鍓嶅彲鏌ュ埌鐨勮嚜鍔ㄥ寲璋冪敤鍏ュ彛涓昏鍦� IntegrationTest 鐨� AutoRunBtn_Click銆�</p></div></div>
+<div class="call"><div class="num">2</div><div><strong>CanBusService.SendFrameAsync(deviceId,...)</strong><p>鏍¢獙甯� ID/闀垮害锛岀紪鐮佷负 SEND 鍛戒护锛岃皟鐢� AutoDeviceFacade.ExecuteAsync銆�</p></div></div>
+<div class="call"><div class="num">3</div><div><strong>AutoDeviceFacade.ExecuteAsync()</strong><p>鍒涘缓 Owner锛屾寜褰撳墠瀹炵幇鐢宠 <code>ResourceKey(deviceId, Generic)</code>锛涘鎵� DeviceService锛宖inally 涓噴鏀鹃绾︺��</p></div></div>
+<div class="call"><div class="num">4</div><div><strong>DeviceService.ExecuteCommandAsync()</strong><p>閫氳繃 DeviceManager 鎵� Driver锛岄獙璇� Generic 璧勬簮 Owner锛屽彇寰椾竴娆� Operation Lease锛岀劧鍚庤皟鐢ㄩ┍鍔ㄣ��</p></div></div>
+<div class="call"><div class="num">5</div><div><strong>IDeviceDriver 鈫� CanDeviceDriver 鈫� ICanTransport</strong><p>褰撳墠 CAN Driver 鍦� Send/Query 鍓嶈繍琛� EnsureConnectedAsync锛涙湭杩炴帴鏃剁涓�娆� I/O 浼氬缓杩炪��</p></div></div>
+<div class="call"><div class="num">6</div><div><strong>NodeChannelTransport 鎴� BrokerRpcTransport 鈫� 杩斿洖</strong><p>Local 璧� NodeChannelTransport锛汢roker 璧板懡鍚嶇閬� RPC 鍒� DeviceBroker銆傜粨鏋滃洖鍒� DeviceService锛屽啀鐢� CanBusService 杞负 bool 鎴栧抚 DTO銆�</p></div></div><div class="note warn">鍗曟璋冪敤浼氶噴鏀捐祫婧愰绾︼紝涓嶄唬琛ㄨ皟鐢� DeviceManager.Disconnect銆侰AN driver/transport 鍙户缁寔鏈夊凡寤虹珛鐨勮繛鎺ワ紱棣栨 I/O 鎸夐渶寤鸿繛鏄幇鐘讹紝涓嶆槸 V3.1 鍚姩寤鸿繛鐩爣銆�</div></section>
+<section id="lease"><h2>04銆�浣滅敤鍩熺绾︼細涓�涓� Step 鍐呭娆℃搷浣�</h2><ol><li><code>AutoDeviceFacade.AcquireAsync(deviceId, stepName)</code> 棰勭害璧勬簮骞惰繑鍥� <code>IAutoDeviceLease</code>銆�</li><li>璋冪敤 <code>CanBusService.SendFrameAsync(lease,...)</code>銆�<code>ReceiveFrameAsync(lease)</code> 绛夐噸杞姐��</li><li>CanBusService 濮旀墭 Lease.Execute/Query锛汚utoDeviceLease 杩涘叆 DeviceService锛屾瘡娆� I/O 鍐嶅彇寰� Operation Lease銆�</li><li>姝ラ缁撴潫 Dispose Lease锛岄噴鏀惧灞傞绾︼紱涓嶄細绛変环璋冪敤 Driver.Disconnect銆�</li></ol><div class="note">澶栧眰 Reservation 琛ㄧず姝ラ褰撳墠鑾峰噯浣跨敤璁惧锛汷peration Lease 琛ㄧず鍏蜂綋鍛戒护/鍝嶅簲鐗囨姝e湪鎵ц銆傚叡浜墿鐞嗕細璇濆畨鍏ㄤ覆琛岃繕渚濊禆璧勬簮绠$悊鍣�/SessionGate 鐨勫疄闄呴攣鑼冨洿銆�</div></section>
+<section id="power"><h2>05銆�鐢垫簮 Slot 璋冪敤锛氶�昏緫浣嶇疆鏄犲皠鍒拌澶�</h2><ol><li><code>PowerSupplyService.ConfigureAsync(slotId, command, owner, ct)</code> 鎺ユ敹 Slot銆佺洰鏍囧�煎拰 Owner銆�</li><li><code>SlotDeviceMappingResolver.ResolveEndpoint(slotId, PowerSupply)</code> 瑙f瀽璁惧銆侀�氶亾鍜岃祫婧愰敭銆�</li><li>PowerSupplyService 楠岃瘉璧勬簮鎺堟潈骞跺彇寰� Operation Lease銆�</li><li>浠� <code>DeviceManager.GetDriver(endpoint.DeviceId)</code> 鍙� Driver锛屽彂 SCPI 璁剧疆骞舵煡璇㈣鍥炪��</li><li>杩斿洖 <code>PowerOperationResult</code>锛氬疄娴嬪�笺�佸師濮嬪搷搴斻�侀敊璇爜銆佽�楁椂銆�</li></ol><div class="note warn">CAN Facade 褰撳墠鐢宠 <code>deviceId:Generic</code>锛涚數婧愭湇鍔℃寜 Slot 鏄犲皠璧勬簮閿巿鏉冿紝鍙兘缁嗗寲鍒伴�氶亾銆係tep 涓嶅簲鑷鐚滄祴 Owner/ResourceKey锛涢渶缁熶竴 typed API 鎴栭�氶亾绾� lease 鍚堢害銆�</div></section>
+<section id="broker"><h2>06銆�Broker 璋冪敤閾撅細瀹㈡埛绔唬鐞嗕笉鎸佹湁瀹炵墿</h2><div class="cols"><div class="card"><h3>瀹㈡埛绔晶</h3><p>Bootstrapper 涓� Broker 閰嶇疆鍒涘缓璁惧浠g悊 Driver锛屾敞鍏� BrokerRpcTransport锛涗笟鍔″眰浠嶈皟鐢ㄥ悓涓�绫诲瀷鍖� API銆�</p></div><div class="card"><h3>Broker 瀹夸富</h3><p>BrokerServer 鎸佹湁鐪熷疄閰嶇疆鍜岀湡瀹� Driver锛屽湪璁惧 gate 涓墽琛岃姹傘�傜墿鐞� socket/涓插彛/SDK 浼氳瘽鍙綊鍞竴 I/O 瀹夸富銆�</p></div></div><div class="call"><div class="num">1</div><div><strong>BrokerRpcTransport</strong><p>鎶� SEND/QUERY 缂栨垚鎿嶄綔鐮佸拰 payload锛屾惡甯� DeviceId銆乧lient instance銆侀厤缃� Hash銆�</p></div></div><div class="call"><div class="num">2</div><div><strong>BrokerClientChannel</strong><p>寤虹珛/澶嶇敤鍛藉悕绠¢亾锛孒ello 鎻℃墜锛岀敤 CorrelationId 鍏宠仈璇锋眰鍝嶅簲骞惰缃瓑寰呮湡闄愩��</p></div></div><div class="call"><div class="num">3</div><div><strong>BrokerServer</strong><p>澶勭悊 CONNECT/SEND/QUERY/STATUS锛涙寜闇�鍒涘缓鐪熷疄 Driver銆佽繛鎺ュ苟鎵ц銆�</p></div></div><div class="call"><div class="num">4</div><div><strong>鐪熷疄 Driver 鈫� 鐗╃悊 Transport 鈫� 浠櫒</strong><p>Broker 杩斿洖鐘舵�佷笌璇诲洖锛屼唬鐞嗘竻鐞嗕紶杈撳皝瑁呭悗浜ゅ洖鏈嶅姟灞傘��</p></div></div><div class="note danger">Broker 涓嶅彲杈炬椂锛孴estStep 涓嶅彲鑷鍒囨崲鍒� Local 鐩磋繛鍚屼竴浠櫒锛屽惁鍒欏彲鑳藉舰鎴愬悓涓�涓� PhysicalSessionKey 鐨勫弻涓绘帶鍒躲�傚啓鍛戒护宸叉彁浜や絾瓒呮椂锛屽簲瑙嗕负 Unknown锛屽厛璇诲洖/鎭㈠锛屼笉鐩茬洰閲嶅彂銆�</div></section>
+<section id="startup"><h2>07銆�鍚姩涓庤繛鎺ョ敓鍛藉懆鏈燂細鎺ュ彛瀛樺湪涓嶄唬琛ㄨ嚜鍔ㄦ墽琛�</h2><table><thead><tr><th>鐜妭</th><th>褰撳墠婧愮爜浜嬪疄</th><th>V3.1 鐩爣 / 宸窛</th></tr></thead><tbody>
+<tr><td>鍩虹璁炬柦瑁呴厤</td><td>Bootstrapper 鍒涘缓 ResourceManager銆丏eviceManager銆丏eviceService銆丳owerSupplyService銆丄utoFacade銆丆anBusService銆�</td><td>宸叉悳绱㈠埌鐨� Bootstrapper 璋冪敤鐐瑰湪 Plugin.IntegrationTest锛涙湭鎹纭鐢熶骇涓荤▼搴忓惎鍔ㄥ凡鎺ュ叆銆�</td></tr>
+<tr><td>Local 娉ㄥ唽</td><td><code>LoadDevicesFromConfig()</code> 璇诲彇鏄犲皠浣嗗垱寤烘湰鍦� Driver 浠嶄负 TODO銆�</td><td>鎸夌敓鏁堥厤缃鍙栭┍鍔ㄥ畾涔夈�佹牳瀵瑰敮涓�瀹夸富鍚庢敞鍐屻��</td></tr>
+<tr><td>Driver 娉ㄥ唽</td><td>DeviceManager.RegisterDriver 鍐欏瓧鍏�/鍒濆鐘舵��/浜嬩欢璁㈤槄锛屼笉鎵ц Connect銆�</td><td>娉ㄥ唽鍚庣敱瀹夸富杩炴帴鏈涓昏澶囧苟妫�鏌� Ready銆�</td></tr>
+<tr><td>CAN 杩炴帴</td><td>CanDeviceDriver 棣栨 Send/Query 鏃� EnsureConnectedAsync銆�</td><td>HostReady 鍓嶅缓杩炲苟鍋ュ悍妫�鏌ワ紝涓嶈棣栨娴嬭瘯鍔ㄤ綔鎵挎媴杩炴帴銆�</td></tr>
+<tr><td>Broker 杩炴帴</td><td>瀹㈡埛绔敞鍐屼唬鐞嗭紱BrokerServer 鍦� CONNECT 鎴栭娆℃搷浣滄椂鍙垱寤�/杩炴帴鐪熷疄 Driver銆�</td><td>鐪熷疄鐗╃悊杩炴帴鐣欏湪 Broker 瀹夸富锛屼唬鐞嗗彧鍋� IPC銆�</td></tr>
+<tr><td>SCPI 杩炴帴</td><td>褰撳墠 ScpiDriverAdapter.ConnectAsync 浼氬彂閫� <code>*RST</code>銆�</td><td>鑷姩杩炴帴鍓嶆媶鍑� Reset锛汣onnect 鍙缓閾惧苟杩涜鏃犲壇浣滅敤鎺㈡祴銆�</td></tr>
+<tr><td>姝ラ缁撴潫</td><td>Dispose 閲婃斁璧勬簮棰勭害锛屼笉绛変簬 DeviceManager.Disconnect銆�</td><td>杩炴帴鐢卞涓绘寔鏈夛紝姝ラ缁撴潫涓嶆柇寮�銆�</td></tr>
+<tr><td>鍏抽棴/閲嶅惎</td><td>DeviceManager 鏈夊崟璁惧 Connect/Disconnect锛涙湭瑙佸畬鏁寸粺涓�鐢熷懡鍛ㄦ湡鍗忚皟銆�</td><td>鍏抽棴闇�鎺掔┖銆佸畨鍏ㄥ鐞嗐�佽鍥炲悗鏂紑锛涢噸鍚繘鍏ユ仮澶嶉棬绂侊紝鍐嶅彂甯� HostReady銆�</td></tr></tbody></table><div class="note">寤鸿 DeviceManager 绠$悊椹卞姩瀹炰緥鍜屽崟璁惧杩炴帴锛涘涓荤骇 DeviceService 鎴栫嫭绔嬭繛鎺ュ崗璋冨櫒璐熻矗娉ㄥ唽鍚庢壒閲忚繛鎺ャ�佹眹鎬� Connected/Ready銆佸け璐ラ殧绂汇�佹湁搴忓叧闂�備笉瑕佸湪姣忎釜 Run() 涓� Connect/Disconnect銆�</div></section>
+<section id="result"><h2>08銆�缁撴灉涓庨敊璇竟鐣�</h2><table><thead><tr><th>灞�</th><th>杩斿洖鍊�</th><th>鍒ゅ畾杈圭晫</th></tr></thead><tbody><tr><td>Driver</td><td>鍘熷鍝嶅簲銆佺姸鎬併�佸紓甯�/杩炴帴浜嬩欢銆�</td><td>涓嶆槸 DUT Pass/Fail銆�</td></tr><tr><td>DeviceService</td><td><code>DeviceCommandResult</code>锛氭垚鍔熴�佽鍥炪�侀敊璇爜/淇℃伅銆佸欢杩熴��</td><td>鍛戒护浜ゆ崲鎴愬姛涓嶄竴瀹氱瓑浜庡伐鑹哄悎鏍笺��</td></tr><tr><td>CanBusService</td><td>鍙戦�� bool銆佹帴鏀� CanFrameData銆�</td><td>鐢熶骇 Step 搴斾繚鐣欏彲璇婃柇閿欒锛岄伩鍏嶅彧鏈� bool銆�</td></tr><tr><td>PowerSupplyService</td><td>PowerOperationResult锛氬疄娴嬪�笺�佸師濮嬪搷搴斻�侀敊璇�佸欢杩熴��</td><td>鐢变笟鍔℃楠ゆ寜闄愬�煎垽瀹氥��</td></tr><tr><td>TestStep</td><td><span class="tag target">鐩爣</span>璁板綍杈撳叆/璇绘暟/鍗曚綅/闄愬��/鑰楁椂骞惰 Verdict銆�</td><td>璁惧鏁呴殰閫氬父涓烘墽琛� Error锛涙祴閲忚秴闄愭墠鏄伐鑹� Fail锛涚粨鏋� Unknown 瑕佹仮澶嶏紝涓嶇洸鐩噸鍙戙��</td></tr></tbody></table></section>
+<section id="gaps"><h2>09銆�寤鸿浼樺厛瀹屽杽鐨勬帴鍙h竟鐣�</h2><ol><li>缁� TestStep 鎻愪緵绋冲畾 client API 涓� DTO锛涘 OpenTAP Engine 涓� Aging.Infrastructure 妗嗘灦涓嶅吋瀹癸紝鐢ㄧ増鏈寲 IPC銆�</li><li>鎶� Bootstrapper 鎺ュ叆鐢熶骇缁勫悎鏍癸紝鍔犺浇瀹屾暣閰嶇疆銆侀┍鍔ㄥ畾涔夊強 Local/Broker 褰掑睘銆�</li><li>瀹炵幇娉ㄥ唽鍚庤繛鎺ュ崗璋冦�佸仴搴锋鏌ャ�丠ostReady 闂ㄧ銆佹湁闄愰噸璇曞拰鏁呴殰闅旂銆�</li><li>缁熶竴 CAN銆佺數婧愮瓑鏈嶅姟鐨� Owner銆丼lot銆丆hannel銆丷esourceKey 鐢宠鏂瑰紡銆�</li><li>鎶� SCPI <code>*RST</code>銆佽緭鍑鸿缃�佸畨鍏ㄥ姩浣滀粠 Connect 鎷嗕负鏄惧紡鍙楁帶鎿嶄綔銆�</li><li>纭鍏变韩 PhysicalSession 涓婄殑鎿嶄綔閿佽鐩栧畬鏁� I/O 鐗囨锛屽苟瀹氫箟瓒呮椂/Unknown 璇箟銆�</li></ol><div class="note danger">璇佹嵁杈圭晫锛氭湰鏂囦负婧愮爜闈欐�侀槄璇诲拰 V3.1 璁捐瀵圭収锛屾病鏈夎繍琛屼华鍣ㄣ�佹ā鎷熷櫒鎴栨暣绔欏簲鐢ㄣ�傝嚜鍔ㄨ繛鎺ャ�丠ostReady 鍜屾仮澶嶉棬绂佸潎鏍囦负鐩爣锛屼笉鏄凡楠屾敹浜嬪疄銆�</div></section>
+<section id="sources"><h2>10銆�婧愮爜瀹氫綅</h2><table><thead><tr><th>绫诲瀷</th><th>鏂囦欢</th><th>鏌ョ湅鍐呭</th></tr></thead><tbody>
+<tr><td>鍚姩/娉ㄥ唽</td><td class="path">D:\TestPlatform\TapProject\Aging.Infrastructure\InfrastructureBootstrapper.cs</td><td>Initialize銆丩oadDevicesFromConfig銆丷egisterBrokeredDrivers銆丷egisterDevice</td></tr>
+<tr><td>闂ㄩ潰/绉熺害</td><td class="path">D:\TestPlatform\TapProject\Aging.Infrastructure\Services\AutoDeviceFacade.cs</td><td>Execute/Query銆丄cquire銆丄utoDeviceLease.Dispose</td></tr>
+<tr><td>CAN API</td><td class="path">D:\TestPlatform\TapProject\Aging.Infrastructure\Services\CanBusService.cs</td><td>绫诲瀷鍖栬皟鐢ㄣ�佸懡浠ょ紪鐮併�佺绾﹂噸杞�</td></tr>
+<tr><td>鎵ц/绠$悊</td><td class="path">D:\TestPlatform\TapProject\Aging.Infrastructure\Services\DeviceService.cs<br>D:\TestPlatform\TapProject\Aging.Infrastructure\Core\DeviceManager.cs</td><td>鏉冮檺楠岃瘉銆佹搷浣滅绾︺�丏river 娉ㄥ唽涓庤繛鎺ョ姸鎬�</td></tr>
+<tr><td>鐢垫簮</td><td class="path">D:\TestPlatform\TapProject\Aging.Infrastructure\Services\PowerSupplyService.cs<br>D:\TestPlatform\TapProject\Aging.Infrastructure\Services\SlotDeviceMappingResolver.cs</td><td>Slot 鏄犲皠鍜岀數婧愬姩浣�</td></tr>
+<tr><td>椹卞姩/浼犺緭</td><td class="path">D:\TestPlatform\TapProject\Aging.Infrastructure\Drivers\DriverFactory.cs<br>D:\TestPlatform\TapProject\Aging.Infrastructure\Drivers\CanDeviceDriver.cs<br>D:\TestPlatform\TapProject\Aging.Infrastructure\Drivers\BrokerRpcTransport.cs<br>D:\TestPlatform\TapProject\Aging.Infrastructure\Broker\BrokerClientChannel.cs</td><td>Driver 鍒涘缓銆佹寜闇�寤鸿繛銆丅roker RPC</td></tr>
+<tr><td>Broker 瀹夸富</td><td class="path">D:\TestPlatform\TapProject\DeviceBroker\BrokerServer.cs</td><td>鐪熷疄 Driver 鍒涘缓銆佽繛鎺ュ拰 I/O</td></tr>
+<tr><td>褰撳墠鑷姩鍖栫ず渚�</td><td class="path">D:\TestPlatform\TapProject\Plugin.IntegrationTest\MainWindow.xaml.cs</td><td>InitializeAutoServices銆丷egisterCanDriver銆丄utoRunBtn_Click</td></tr>
+<tr><td>鐩爣璁捐</td><td class="path">D:\06-浜у搧寮�鍙慭18-鑸遍┚鎺у埗鍣ㄨ�佸寲璁惧\Local + DeviceBroker 娣峰悎鏋舵瀯璇︾粏璁捐璇存槑涔� V3.1.html</td><td>绗� 23 绔狅細鍚姩杩炴帴銆丠ostReady銆佹仮澶嶃�佸叧闂笌 SCPI</td></tr></tbody></table></section>
+<footer style="text-align:center;color:#657987;font-size:12px;padding:17px">浠櫒璋冪敤绋嬪簭缁撴瀯涓庣被璋冪敤璇存槑 路 鏈湴婧愮爜闈欐�佹⒊鐞� 路 2026-11-09</footer></main></div>
+<script>const f=document.getElementById('filter'),ss=[...document.querySelectorAll('main section')],c=document.getElementById('count');function go(){let q=f.value.trim().toLowerCase(),n=0;for(const s of ss){let ok=!q||s.innerText.toLowerCase().includes(q);s.hidden=!ok;if(ok)n++}c.textContent=n+' / '+ss.length+' 涓珷鑺�'}f.addEventListener('input',go);document.getElementById('reset').onclick=()=>{f.value='';go();f.focus()};</script></body></html>
\ No newline at end of file

--
Gitblit v1.9.1