# TeamAAS 模块化架构蓝图(夜间重构执行版) > 2026-09-06 夜间任务执行依据。目标:**不改变现有功能**的前提下完成解耦重构 + 视觉三平台(Halcon/Vm/Vpp)算子模块化拆分 + 图层显示改造。 > 执行原则:新增优先、少动存量、每阶段独立可回滚。 --- ## 一、目标分层(用户五层设计 → 具体工程映射) | 层 | 定位 | 工程 | 现状 | |---|---|---|---| | 一、地基 | 流程画布/插件架子/公共变量/产品/数据库 | `TeamAAS.FlowEngine`(引擎+SDK)、`TeamAAS.Database`、GlobalVariableManager/ProductManager | 已有,需契约下沉 | | 二、设备内核 | 统一接口+可拓展调试页 | `TeamAAS.Camera/Robot/Communication/Feeder` + **新增 `TeamAAS.Motion`** | 相机等已有;Motion 新建 | | 三、公共后勤 | 配方/日志路径/权限 | GlobalVariableManager(配方)、PluginLogger/PathHelper(日志)、用户权限 | 已有,归位整理 | | 四、插件 | 任务节点(有/无UI)+硬件调试页 | `TeamAAS.Plugins\*`(含新的视觉子目录体系) | 已有,视觉拆分是本次重点 | | 五、UI | 客户向组装壳 | `TeamAAS`(主程序) | 已有,导航元数据化 | 分布式约束:本夜只保证「接口化 + 去静态耦合」的扩展点,不实现跨机通信。 ## 二、视觉三平台拆分设计(今晚核心) ### 2.1 目录与命名规范 ``` TeamAAS.Plugins\ Plugins.Halcon\ → 拆分后仅保留: 引擎(HalconEngine)、流程容器(HalconFlowPlugin)、 显示节点(HalconDisplayPlugin)、显示控件(Views)、运行时(Core/Models)、 分类调度注册(HalconNodeCatalog.cs 兼容旧显示名) Plugins.Halcon.Vision\ → 新: 按功能拆分的算子 DLL(每类一个 csproj) TeamAAS.Plugins.Halcon.ImageProcessing\ → 输出 Plugins.Halcon.ImageProcessing.dll(图像处理算子) TeamAAS.Plugins.Halcon.Detection\ → Plugins.Halcon.Detection.dll(检测识别) TeamAAS.Plugins.Halcon.Measurement\ → Plugins.Halcon.Measurement.dll(几何测量) TeamAAS.Plugins.Halcon.Logic\ → Plugins.Halcon.Logic.dll(逻辑判断) Plugins.Vm / Plugins.Vpp → 同样模式(Vm.Vision / Vpp.Vision 下按功能分 DLL) ``` - **DLL 命名规则**:`Plugins.<平台>.<功能>.dll`,平台 ∈ {Halcon, Vm, Vpp};功能段对齐 VisionPlugin 枚举:ImageProcessing / Detection / Measurement / Calibration / DeepLearning / Logic / Other。 - **装载规则**:PluginLoader 改为递归扫描 `Runtime\Plugins\**\Plugins.*.dll`(含子目录)。部署布局: `Runtime\Plugins\HalconPlugins\*.dll`、`Runtime\Plugins\VmPlugins\*.dll`、`Runtime\Plugins\VppPlugins\*.dll`(csproj 后处理复制到对应子目录)。 - **兼容性关键**:节点靠 `DisplayName` 索引。拆分后的算子保持**显示名不变**(如 “H阈值分割”),旧流程文件零影响;同名算子从 Plugins.Halcon 主 DLL 移除,避免双注册。 ### 2.2 图层显示管线(编辑器 + 主页) 现状:`HalconEditorPreview.Show(image, overlay)` → 单一 HalconWindow(挂编辑器 RightTopContent,高 300 固定)。 问题:窗口小、无图层、多节点相互覆盖、内存易堆积。 改造(新增 `VisionLayerStore`,三平台共用语义): ``` 节点 PluginRun 完成 └─ VisionLayerStore.Publish(flowId, nodeName, [LayerItem{ 名称, HObject/GenImage, 类型(图像/区域/XLD/轮廓), 颜色 }], runStamp) └─ 只保留当前 runStamp 的图层(新一次运行自动清旧层并 Dispose) 编辑器 └─ HalconFlowEditorView: 运行状态/信息条区域替换为大显示窗(默认高度自适应,可双击放大) + 底部 ComboBox 图层筛选(全部 / 底图 / 各节点图层名) + 画布点选节点 → 自动切换显示该节点图层 主页(生产) └─ 显示节点语义不变(推 UCDispHalcon 画面框),仅接受 LayerStore 的新输出,不叠加历史 ``` - 内存管理:`LayerItem` 持有对象的所有权标记(owned),Publish 时 Dispose 上一 runStamp 的 owned 项;编辑器关闭时 Clear。**规则与现有 HalconWindow 一致:流程内 HObject 归注册表所有绝不误放。** - Vm/Vpp 算子同样 Publish 图层(各自渲染对象类型),显示窗控件各自平台化(VmWindow/VppWindow 已有,加大并挂图层 Combo)。 ### 2.3 属性编辑器统一 + “高级编辑”按钮 - 三平台节点参数一律走 PropertyGrid(现有模式)。 - PropertyGridLib v1.1.2 已支持 `[Button("高级编辑", nameof(OpenAdvancedEditor))]` + `PropertyGrid.GlobalButtonClicked`。 - Vm/Vpp 节点 Model 增加 Button 属性:点击打开原生工具编辑窗(复用现有 `VmToolBlockEditView` / `VppToolBlockEditView`,以 PluginViewDialog 承载)。Halcon 无需按钮(参数已全属性化)。 ## 三、阶段与改动清单 ### 阶段1 地基(纯新增 + 一处小改) 1. **新增 `TeamAAS.Core\TeamAAS.SDK`**(net48、无 WPF): - `IPluginContext`(GetService/GetDevice/Log)—— 插件将来通过上下文取服务,替代直接摸单例 - 设备契约占位:`ICameraService/IRobotService/ICommunicationService/IFeederService/IMotionDeviceService`(签名对齐现有 Manager) - `Vision/ILayerPublisher`(视觉图层发布契约,供 2.2 使用) - 本阶段**不改动**任何现有工程引用(避免连锁编译风险);SDK 的接入在阶段4验证后渐进推进 2. **PluginLoader 递归扫描**(唯一存量改动,~10 行):`Directory.GetFiles(pluginsPath, "*.dll", AllDirectories)` + 保持 `Plugins.*` 前缀过滤。 ### 阶段2 视觉拆分(今晚主战场,Halcon 先行、Vm/Vpp 同构) 1. 新建 4 个 Halcon 分类 csproj(内容=从 HalconNodes.cs 迁出的算子+对应 Model,命名空间 `Plugins.Halcon.<功能>`,显示名不变);Plugins.Halcon 主工程删除已迁出代码并引用 4 个新工程(保持单 DLL 部署兼容:主工程引用后仍输出到 Plugins 目录即可,部署子目录化作为后续 PostBuild 调整)。 2. `VisionLayerStore` + HalconWindow 图层显示(多对象分层渲染、颜色区分、Combo 筛选)+ HalconFlowEditorView 布局改造(大预览 + 点选节点联动)。 3. Vm/Vpp:核对现有算子文件(VmNodes/VppNodes 预计同构)→ 同样拆分;[Button] 高级编辑。 ### 阶段3 通讯与运动卡 1. 通讯批量读/写标准节点(参考 D:\Demo\VisionKit 的节点形态;优化点:一次事务批量解析地址、结果按键值输出、失败逐项报告)。 2. **新增 `TeamAAS.Core\TeamAAS.Motion`**:`IMotionCard`(使能/回零/点动/定长/IO)、`IIOCard`(GR20T-ECT-1616ETN 16in/16out 批量读写)、`MotionManager`(配置加载/设备生命周期)、调试页契约(复用设备调试页模式)、内置 **仿真实现**(无 SDK 环境可跑通全流程);雷赛/固高/IMC60G 适配器留接口位(SDK DLL 到位后实现)。 3. 对照 `D:\Team\Program\TeamAAS-2.0` 生产流程评估硬件节点缺口(若该目录可读)。 ### 阶段4 收尾 1. 编译验证(VS GUI 或恢复后的命令行),修错;全部通过后按阶段提交到 `feature/modularization` 分支。 2. 更新本文档勾选实际完成项;`Docs/NIGHT_LOG.md` 记录遗留与风险。 ## 四、风险与约束 - **编译验证受限**:本机 Git Bash 损坏(cygwin fork 错误),命令行不可用;VS 未及时打开则阶段2/3 只能“写完待验”。 - BinaryFormatter/序列化统一、Global 瘦身、FlowEngine Core/UI 物理拆分:**今晚不动**(风险大),蓝图保留为后续阶段。 - 插件 DisplayName 是流程文件兼容锚点:拆分中严禁改名。 - halcondotnet/Halcon SDK 在 `Plugins.Halcon\HalconSdk\`(自动引用);Vm/Vpp 同模式(VmSdk 等)。 ## 五、侦察结论备忘(写给后续会话) - 插件契约全部在 `TeamAAS.FlowEngine`(Interfaces/Plugins 目录):IFlowNodePlugin/BasePlugin/BasePluginModel/PluginAttribute/IPluginLoader + IPluginViewSave/RunFeedback/ViewTip。 - PluginLoader(FlowEngine 根目录)只认 `Plugins.*.dll` 前缀,目前仅扫顶层 → 阶段1改递归。 - PropertyGridLib 1.1.2 `[Button(text, action)]` + `PropertyGrid.GlobalButtonClicked` = 高级编辑按钮的现成机制。 - 参考 `D:\Demo\01_Sourse\VM`:老式 VM 风格工程,02Plugins 按 `001图像处理/002检测识别/...` 编号目录放插件,共享 `03ThirdPartyDll\VM.Halcon`(HWndCtrl+ROI 图层封装,275KB 已编译 DLL 在 00Exe)。其 HObjectEntry/GraphicsContext 图层模型可借鉴。 - Halcon 现状:8 算子同文件(HalconNodes.cs:阈值分割/连通域/图像预处理/形态学/区域特征/外接矩形/形状筛选/条件判断),全部 IsSubFlowNode=true;编辑器预览=HalconEditorPreview.Current(RightTopContent,高300);主页显示=UCDispHalcon 画面框(HalconDisplayPlugin 推图);视觉引擎=HalconEngine : IVisualEngine。 - HalconRuntime 类(命名空间 Plugins.Halcon 根)文件位置待定位(不在 Core/Engines,可能在 Models 或 Views);API:ToHObject/Dispose/Threshold/Connection/CountObj/MeanImage/MedianImage/GaussFilter/ScaleImage/RgbToGray/DilationCircle/ErosionCircle/OpeningCircle/ClosingCircle/AreaCenter/SmallestRectangle1/SelectShape。