ARCHITECTURE.md 9.3 KB

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\*.dllRuntime\Plugins\VmPlugins\*.dllRuntime\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验证后渐进推进
    • 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.MotionIMotionCard(使能/回零/点动/定长/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。