Browse Source

添加项目文件。

wangshuo 4 days ago
parent
commit
ba17c892ab
100 changed files with 1092 additions and 0 deletions
  1. 108 0
      Docs/ARCHITECTURE.md
  2. 100 0
      Docs/DEVICE_FLOW.md
  3. 247 0
      Docs/EXPERIENCE.md
  4. 173 0
      Docs/NIGHT_LOG.md
  5. 143 0
      Docs/PRODUCTION_FLOW.md
  6. 18 0
      ExE/win-x64/AppData.dat
  7. 4 0
      ExE/win-x64/AwakenGPUToolLog.txt
  8. 234 0
      ExE/win-x64/Calibration/Calib_20260908_094954/Calib_20260908_094954.json
  9. 3 0
      ExE/win-x64/Calibration/CalibrationList.json
  10. 34 0
      ExE/win-x64/Config/SystemConfiguration.json
  11. 10 0
      ExE/win-x64/Products/产品1/flows.meta.json
  12. 3 0
      ExE/win-x64/Products/产品1/global_vars.json
  13. 15 0
      ExE/win-x64/Products/产品1/product.json
  14. BIN
      ExE/win-x64/Products/产品1/流程1.aas
  15. BIN
      ExE/win-x64/Runtime/Basler.Pylon.dll
  16. BIN
      ExE/win-x64/Runtime/DryIoc.dll
  17. BIN
      ExE/win-x64/Runtime/GxIAPINET.dll
  18. BIN
      ExE/win-x64/Runtime/Halcon23.11/halcon.dll
  19. BIN
      ExE/win-x64/Runtime/Halcon23.11/halcondotnet.dll
  20. BIN
      ExE/win-x64/Runtime/Halcon23.11/hdevenginedotnet.dll
  21. BIN
      ExE/win-x64/Runtime/HandyControl.dll
  22. BIN
      ExE/win-x64/Runtime/HslCommunication.dll
  23. BIN
      ExE/win-x64/Runtime/MVSDK_Net.dll
  24. BIN
      ExE/win-x64/Runtime/MahApps.Metro.IconPacks.Core.dll
  25. BIN
      ExE/win-x64/Runtime/MahApps.Metro.IconPacks.Material.dll
  26. BIN
      ExE/win-x64/Runtime/MathNet.Numerics.dll
  27. BIN
      ExE/win-x64/Runtime/MessagePack.Annotations.dll
  28. BIN
      ExE/win-x64/Runtime/MessagePack.dll
  29. BIN
      ExE/win-x64/Runtime/Microsoft.Bcl.AsyncInterfaces.dll
  30. BIN
      ExE/win-x64/Runtime/Microsoft.Extensions.Logging.Abstractions.dll
  31. BIN
      ExE/win-x64/Runtime/Microsoft.NET.StringTools.dll
  32. BIN
      ExE/win-x64/Runtime/Microsoft.Xaml.Behaviors.dll
  33. BIN
      ExE/win-x64/Runtime/MvCamCtrl.Net.dll
  34. BIN
      ExE/win-x64/Runtime/MvCameraAcqTool.dll
  35. BIN
      ExE/win-x64/Runtime/MySqlConnector.dll
  36. BIN
      ExE/win-x64/Runtime/NLog.dll
  37. BIN
      ExE/win-x64/Runtime/Newtonsoft.Json.dll
  38. BIN
      ExE/win-x64/Runtime/OpenCvSharp.dll
  39. BIN
      ExE/win-x64/Runtime/OpenCvSharpExtern.dll
  40. BIN
      ExE/win-x64/Runtime/Plugins/CodeForge.dll
  41. BIN
      ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.Detection.dll
  42. BIN
      ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.ImageProcessing.dll
  43. BIN
      ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.Logic.dll
  44. BIN
      ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.Measurement.dll
  45. BIN
      ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.dll
  46. BIN
      ExE/win-x64/Runtime/Plugins/HalconPlugins/halcondotnet.dll
  47. BIN
      ExE/win-x64/Runtime/Plugins/Plugins.Feeder.dll
  48. BIN
      ExE/win-x64/Runtime/Plugins/Plugins.Script.dll
  49. BIN
      ExE/win-x64/Runtime/Plugins/Plugins.Standard.dll
  50. BIN
      ExE/win-x64/Runtime/Plugins/Plugins.Vm.dll
  51. BIN
      ExE/win-x64/Runtime/Plugins/Plugins.Vpp.dll
  52. BIN
      ExE/win-x64/Runtime/Plugins/VmPlugins/Plugins.Vm.Module.dll
  53. BIN
      ExE/win-x64/Runtime/Plugins/VppPlugins/Plugins.Vpp.Detection.dll
  54. BIN
      ExE/win-x64/Runtime/Plugins/VppPlugins/Plugins.Vpp.Measurement.dll
  55. BIN
      ExE/win-x64/Runtime/Prism.DryIoc.Wpf.dll
  56. BIN
      ExE/win-x64/Runtime/Prism.Wpf.dll
  57. BIN
      ExE/win-x64/Runtime/Prism.dll
  58. BIN
      ExE/win-x64/Runtime/PropertyGridLib.dll
  59. BIN
      ExE/win-x64/Runtime/SciCamera.Net.dll
  60. BIN
      ExE/win-x64/Runtime/System.Buffers.dll
  61. BIN
      ExE/win-x64/Runtime/System.Collections.Immutable.dll
  62. BIN
      ExE/win-x64/Runtime/System.Data.SQLite.dll
  63. BIN
      ExE/win-x64/Runtime/System.Diagnostics.DiagnosticSource.dll
  64. BIN
      ExE/win-x64/Runtime/System.IO.Pipelines.dll
  65. BIN
      ExE/win-x64/Runtime/System.Memory.dll
  66. BIN
      ExE/win-x64/Runtime/System.Numerics.Vectors.dll
  67. BIN
      ExE/win-x64/Runtime/System.Runtime.CompilerServices.Unsafe.dll
  68. BIN
      ExE/win-x64/Runtime/System.Text.Encodings.Web.dll
  69. BIN
      ExE/win-x64/Runtime/System.Text.Json.dll
  70. BIN
      ExE/win-x64/Runtime/System.Threading.Tasks.Extensions.dll
  71. BIN
      ExE/win-x64/Runtime/TeamAAS.Camera.dll
  72. BIN
      ExE/win-x64/Runtime/TeamAAS.Communication.dll
  73. BIN
      ExE/win-x64/Runtime/TeamAAS.Core.dll
  74. BIN
      ExE/win-x64/Runtime/TeamAAS.Database.dll
  75. BIN
      ExE/win-x64/Runtime/TeamAAS.Feeder.dll
  76. BIN
      ExE/win-x64/Runtime/TeamAAS.FlowEngine.dll
  77. BIN
      ExE/win-x64/Runtime/TeamAAS.Global.dll
  78. BIN
      ExE/win-x64/Runtime/TeamAAS.Motion.dll
  79. BIN
      ExE/win-x64/Runtime/TeamAAS.Robot.dll
  80. BIN
      ExE/win-x64/Runtime/TeamAAS.Vision.dll
  81. BIN
      ExE/win-x64/Runtime/Vm4.4/PropertyGrid.dll
  82. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.AppData.dll
  83. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.CalibGuide.dll
  84. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.CodeCompletion.dll
  85. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.CommonData.dll
  86. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.Compress.dll
  87. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.Controls.dll
  88. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.Core.dll
  89. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.CostomDialog.dll
  90. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.ExtensionMethod.dll
  91. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.ExternalCall.dll
  92. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.Framework.Container.dll
  93. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.ModuleControl.dll
  94. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.PcUI.dll
  95. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.PlatformSDKCS.dll
  96. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.UnRedo.dll
  97. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.User.dll
  98. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.Util.dll
  99. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.Utility.dll
  100. BIN
      ExE/win-x64/Runtime/Vm4.4/VM.WatchDog.dll

+ 108 - 0
Docs/ARCHITECTURE.md

@@ -0,0 +1,108 @@
+# 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<T>/GetDevice<T>/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<T>/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。

+ 100 - 0
Docs/DEVICE_FLOW.md

@@ -0,0 +1,100 @@
+# 设备交互与标定体系(对照 TeamAAS-2.0 生产版)
+
+> 依据:对 `D:\Team\Program\TeamAAS-2.0`(在产程序)与 `D:\Program\TeamAAS`(本程序)的逐文件源码核对。
+> 结论先行:**机器人/相机/Feeder/吸气 的协议与流程已同源移植,标定向导结构与 2.0 对齐**;
+> 遗留问题 = VppCalibrationPage 游离计算器 + 2.0 已有的 Feeder 背光联动/畸变校正未移植。
+
+---
+
+## 一、机器人 TCP 协议(逐条核对 ✅ 全部实现)
+
+文件:`TeamAAS.Core\TeamAAS.Robot\Core\Robots\EpsonRobot.cs`(同步 + Async 双版本)
+连接层:`RobotTcpClient.cs`——客户端/服务端双角色、结束符(CR/LF/CRLF)分帧、断线重连;
+配置存 `Config\Robots.json`(IP/Port/ConnectType/Terminator/Encoding)。
+应答确认模式:发送后等待回显(`rev.Contains("命令字")` 即成功,5s 超时)。
+
+| 上位机发送 | 机器人回显 | 实现状态 | 备注 |
+|---|---|---|---|
+| `Motor,1` | `Motor` | ✅ | 使能 |
+| `Power,1` | `Power` | ✅ | 伺服上电 |
+| `Reset` | `Reset` | ✅ | 复位报警 |
+| `Speed,100` | `Speed` | ✅ | PTP 速度 |
+| `Accel,100,100` | `Accels` | ✅ | PTP 加速度(双参数) |
+| `Speeds,100` | `Speeds` | ✅ | 直线速度 |
+| `Accels,100,100` | `Accels` | ✅ | 直线加速度 |
+| `Speedfactor,100` | `Speedfactor` | ✅ | 全局速度倍率 |
+| `Go,X,Y,Z,U,V,W,0,0,0` | `Go` | ✅ | PTP 点位(Hand,Local,Tool 九段) |
+| `Jump,X,...,LimZ` | `Jump` | ✅ | 门型拾放(末尾多 LimZ) |
+| `Move,X,...` | `Move` | ✅ | 直线插补 |
+| `SFree` / `SLock` | 同名 | ✅ | 刹车释放/锁定 |
+| `Jog,axis,d` | `Jog` | ✅ | 点动 |
+| `Joint,joint,d` | — | ✅(表外补充) | 关节点动 |
+| `SetTool,i,x,y` | `SetTool` | ✅ | 设置工具坐标 |
+| `SelectTool,i` | — | ✅(表外补充) | 切换工具号 |
+| `CalibParame,0,0,0,0,0,0,0,0` | `CalibParame` | ✅ | 8 参数:{夹爪类型(Suction/Clamp)},{吸气IO},{吹气IO},{Speed},{Accel},{Power},{吸真空延时},{破真空延时} |
+| `CalibMotion,X,Y,Z,U,V,W,0,0,0` | `CalibMotion` | ✅ | 标定点位动作(末尾多 LimZ) |
+| `CalibOutIO,1` | `CalibOutIO` | ✅ | 控制夹爪/吸嘴(吸气=1,放开=0) |
+| `GetRobotPos` | `GetRobotPos,X,Y,Z,U,V,W,Hand,Local,Tool` | ✅ | 回包解析为 RPoint 坐标对象 |
+
+> 吸气/真空设计:**由机器人侧程序执行 IO**,上位机只下发 IO 位号与延时(CalibParame)+ 开关指令(CalibOutIO)。
+> 流程画布层暂无"机器人指令"节点(指令调用集中在标定向导)——需要时按通讯节点模式补一个。
+
+---
+
+## 二、相机安装方式(CameraMount)与交互差异
+
+文件依据:2.0 `Enums\CameraMount.cs`、`Services\CameraCalibrationService.cs`(九点循环 L1116-1240)、
+`Services\CalibrationService.cs\ConvertPixelToPosition`(L224-312)。我们的 `CameraCalibrationService` /
+`CalibrationStore` 已移植同款分支。
+
+| 安装方式 | 物理含义 | 标定取点动作 | 运行时像素→机器人换算 | 工具坐标步骤 |
+|---|---|---|---|---|
+| **FixedDown 固定向下** | 相机架工位上方不动,机械手吸标定块在下方走位 | **防遮挡舞蹈**(每点):走到点 i → 关吸气放下块 → 退回待机点让出视野 → 拍照 → 走回点 i → 开吸气吸回;九点后回待机 | 仿射矩阵直出机器人坐标 → ComputeTool 转工具坐标;角度符号取反 | 需要(FixedDownCameraTool 分支) |
+| **FixedUp 固定向上** | 相机朝上(供料背光板下),机械手举块到相机上方 | 走到点 i(带 Z)→ 直接拍照 | 仿射直出 → 转工具坐标 | 需要(FixedUpCameraTool 分支) |
+| **MobileJ2** | 相机装 J2 臂随臂下移 | 走到点 i → 拍照 | 仿射直出 → 转工具坐标,角度取反 | 需要 |
+| **MobileJ4** | 相机装末端腕(眼在手,随 U 轴转) | **先走中心点记 Mark 点(工具坐标系)**;九点矩阵 = Mark点 − (点i − 点1 位移)(把 Mark 拉回相机中心) | 仿射偏移 + **按机器人当前 U 轴构造旋转矩阵修正** + 当前位姿叠加 | 需要(J4MovingDownCameraTool 分支) |
+| **MobileDown_XYPlatform** | 相机装 XY 龙门模组下移 | 同 J4 偏移换算(Mark=中心点) | 同 J4 但**旋转角恒 0**(模组不旋转) | **跳过** |
+| **None 独立相机** | 手动示意的独立相机 | 手动 | 手动 | 不适用 |
+
+**共同前置(旋转预备标定)**:机械手走 P0、P0+X、P0+Y 三点各拍一张 → Gram-Schmidt 求图像系↔机器人系
+旋转矩阵 + mm/像素比例;九点机器人坐标先经该矩阵逆变换对齐坐标轴,再进仿射求解
+(2.0 用 OpenCvSharp `EstimateAffine2D`;我们用正规方程+高斯消元,数学等价)。
+运行时通用入口:`CalibrationStore.ConvertPixelToPosition(pixel, robotCur, calib, brand)`;Schneider 品牌 U 轴取反。
+
+---
+
+## 三、相机 / Feeder / 通讯交互流程对照
+
+| 主题 | TeamAAS-2.0(生产) | 本程序 | 兼容结论 |
+|---|---|---|---|
+| **相机** | 7 品牌(海康 MVS 为主/Basler/大恒/大华/OPT/Cognex/UVC),软触发+连续采集(无硬触发),全链路 ICogImage,`CameraConfiguration.cfg` | 同款海康/大华已移植(MvCamCtrl.Net 原生),Basler/大恒/OPT/UVC 在列;图像用**自研 GenImage** 统一载体(含 Metadata),`Config\Cameras.json` | 同源;GenImage 经 GenImageConverter 转各平台,载体设计更通用 |
+| **Feeder** | 独立类库 `Team.FFFeederService`:TEAM(TCP `{K1}` 背光/`{UV1}` 振动/`{HC}` 停止/方向 `{CA~CI}ms`)+ Afag aflex;**自带环形背光,标定拍照前开灯** | TeamFeeder 同款 TCP ASCII 命令 + `FeederPlugin` 流程节点(配方 `Config\Feeder_recipes.json`) | 同源;**缺标定向导的开背光联动** |
+| **吸气/真空** | 机器人侧执行:CalibParame 下发 IO 位+延时,CalibOutIO 开关 | 同(PickInfo:Inhal/Blow + WaitSuction/WaitBlow) | ✅ 一致 |
+| **通讯** | 每类设备独立 `.cfg`(JSON)+ 设置页对话框(AddRobot/AddCamera…)+ Service 工厂(Dictionary<Guid,实例>)+ SendThenResponse/事件;另硬编码 BgCommunicate/BgModbusTcp 后台通道;PLC 三菱/OPC UA | `[Communication]` 特性扫描(TcpClient/TcpServer/Serial/Udp/Web + HslCommunication PLC),统一 `Config\Communications.json`,`CommunicationManager.GetByName`,流程节点**批量读取/批量写入**(公式绑定),FlowRunner 订阅 `DataReceivedEvent` 心跳触发产品 | **我们的模式更可扩展**(加协议=加一个类);2.0 的 Settings 添加对话框值得移植 |
+
+---
+
+## 四、标定体系评估(双轨问题)
+
+**正式路径(唯一消费方)**:标定向导(7 步:基础设置→视觉与相机→示教点位→工具坐标TCP→九点标定→验证→完成,XY 模组跳第 3 步)
+→ `CameraCalibrationService` → `CalibrationStore`(`Calibration\<名称>.json`,运行时 `ConvertPixelToPosition` 消费)。✅ 与 2.0 对齐。
+
+**游离路径(问题所在)**:`Plugins.Vpp\Views\VppCalibrationPage`——引擎嵌入向导第 1 步右侧的
+"标定图像操作区",实为手动计算器(载本机图片、手填九点表、自算仿射),**结果只进文本框、不落盘、不进 CalibrationStore**。
+→ 这就是用户困惑的"视觉与相机右边为什么有九点标定"。
+
+**改造决定**:VppCalibrationPage 重构为向导的**实时取图面板**(相机画面 + Mark 点叠加),
+删除独立九点表/计算逻辑——标定计算只走 CalibrationStore 单一路径。
+
+**对标 2.0 尚缺**:① 标定拍照前 Feeder 开背光联动;② 棋盘格畸变校正(CogCalibCheckerboardTool);
+③ 相机曝光/增益在标定流程内的下发页(部分已有)。
+
+---
+
+## 五、待办(按优先级)
+
+1. VppCalibrationPage → 实时取图面板改造(删双轨);
+2. 标定向导补 Feeder 背光联动 + 畸变校正;
+3. 移植 2.0 的设置页添加对话框(AddRobot/AddCamera/AddFeeder 样式)补齐设备管理 UI;
+4. 流程画布补"机器人指令"节点(指令下拉 + 参数公式绑定,按通讯节点模式);
+5. 实施类任务批量派发高级工程师 agent,本侧做架构与验收。

+ 247 - 0
Docs/EXPERIENCE.md

@@ -0,0 +1,247 @@
+# TeamAAS 开发经验汇总
+
+> 面向后续维护/扩展者。先读 `Docs/ARCHITECTURE.md`(架构蓝图)与本文档;
+> 每轮迭代的详细过程见 `Docs/NIGHT_LOG.md`(追加轮①~㉒)。
+> 技术栈:.NET Framework 4.8 / WPF / Prism.DryIoc / HandyControl 3.5.1 / PropertyGridLib 1.1.2 / NLog。
+
+---
+
+## 一、软件整体框架
+
+### 1.1 五层架构(自下而上)
+
+```
+┌─────────────────────────────────────────────────────────┐
+│ 5. UI(客户交付层)                                       │
+│    TeamAAS —— 主程序壳(导航/主页/产品管理),按客户裁剪     │
+├─────────────────────────────────────────────────────────┤
+│ 4. 插件层(开放给工程师写代码的层)                         │
+│    TeamAAS.Plugins/*                                     │
+│    ├─ Plugins.Standard(逻辑/文件/通讯批量等通用节点)      │
+│    ├─ Plugins.Feeder(供料)                              │
+│    ├─ Plugins.Vpp / .Vpp.Detection / .Vpp.Measurement    │
+│    ├─ Plugins.Vm  / Plugins.Vm.Module                    │
+│    └─ Plugins.Halcon / .Halcon.{ImageProcessing,          │
+│         Detection, Measurement, Logic}                   │
+├─────────────────────────────────────────────────────────┤
+│ 3. 流程引擎 + 视觉引擎 + 设备内核(地基的核心)              │
+│    TeamAAS.FlowEngine(流程画布/执行器/插件框架/公式绑定)  │
+│    TeamAAS.VisualEngine(视觉引擎发现与切换)              │
+│    TeamAAS.{Camera,Communication,Feeder,Motion,Robot,     │
+│    Database}(设备内核,统一接口 + 调试页)                │
+├─────────────────────────────────────────────────────────┤
+│ 2. SDK / 公共(跨插件契约,只依赖无业务)                   │
+│    TeamAAS.SDK(图层总线 Vision/、设备契约 Devices/)      │
+│    TeamAAS.Global(日志/对话框/本地化/主题)               │
+│    TeamAAS.Shared                                        │
+├─────────────────────────────────────────────────────────┤
+│ 1. 宿主(ExE/win-x64 部署目录:EXE + Runtime + Config)    │
+└─────────────────────────────────────────────────────────┘
+```
+
+依赖方向永远向下:插件引用 Core(Core 聚合 SDK/Global/FlowEngine),
+SDK 不依赖任何上层;平台 SDK(Cognex/海康/HALCON)只被对应插件引用。
+
+### 1.2 运行时部署结构(ExE/win-x64)
+
+```
+ExE/win-x64/
+├─ TeamAAS.exe / .config
+├─ Config/  Products/  Recipe/  Logs/        ← 配置与数据(根目录白名单)
+└─ Runtime/                                  ← 其余全部下沉到这里
+   ├─ *.dll                                  ← 宿主/引擎/SDK 程序集
+   ├─ Plugins/                               ← 插件根(递归扫描)
+   │  ├─ Plugins.Standard.dll / Plugins.Vpp.dll / Plugins.Vm.dll / Plugins.Feeder.dll
+   │  ├─ HalconPlugins/  (Plugins.Halcon.* + halcondotnet.dll)
+   │  ├─ VppPlugins/     (Plugins.Vpp.Detection/Measurement)
+   │  ├─ VmPlugins/      (Plugins.Vm.Module)
+   │  └─ Vpp9.0/ Vm4.4/  dll/x64/          ← 平台原生/托管运行库
+```
+
+关键机制:
+- **PostBuild.ps1**(TeamAAS 工程):把生成输出搬进 Runtime;插件分类工程各自 Copy 到
+  `EXE/win-x64/Plugins/<平台目录>`,PostBuild 再整体移到 `Runtime/Plugins`。
+- **PluginLoader.LoadFrom**:递归扫描 `Runtime/Plugins/**`,只装载 `Plugins.*.dll`,同名 DLL 去重。
+- **AssemblyResolve**(App.xaml.cs):缺程序集时在 `RuntimeDir` 递归查找 —— 平台运行库
+  (Vpp9.0/Vm4.4)就位即可用,不装全局。
+- **SetupNativeDllSearchPath**:native(halcon.dll 等)指向 `Runtime/dll/x64`。
+
+### 1.3 流程引擎核心概念(TeamAAS.FlowEngine)
+
+| 概念 | 类型 | 说明 |
+|---|---|---|
+| 流程图 | `FlowGraph` | 节点+连线;组合模块持有 `SubGraph` |
+| 节点 | `FlowNode` | PluginId→插件实例;Registry=流程结果注册表 |
+| 插件契约 | `IFlowNodePlugin` | InitRun/PluginRun/DeclareOutputs/GetModel |
+| 插件基类 | `BasePlugin<TModel>` | Model 挂配置([Serializable] 随 .aas 序列化);RegistryOrDebug 取公式值 |
+| 输出声明 | `OutputField(Key, Type)` | **Key**(不是 Name)——下游公式 `&{节点.Key}` 绑定 |
+| 执行器 | `FlowExecutor` | SkipReset 保留输入变量;EndNodeEncountered 结束分支 |
+| 结果注册表 | `ResultRegistry` | SetInputVariable/GetValue;组合模块「输入.变量」注入 |
+| 序列化 | BinaryFormatter + `FlowSerializationBinder` | 跨程序集类型迁移按全名兜底解析 |
+
+### 1.4 插件开发套路(新节点 5 分钟)
+
+```csharp
+[Serializable]
+[Plugin("显示名", PluginCategory.视觉模块, typeof(MyModel), "图标Kind",
+    NodeShape = NodeCategory.Normal, IsSubFlowNode = true, VisionCategory = VisionPlugin.检测识别,
+    Description = "...")]
+public class MyPlugin : BasePlugin<MyModel>
+{
+    public override List<OutputField> DeclareOutputs() { ... }   // 输出契约(绑定树可见)
+    public override NodeRunStatus PluginRun(CancellationToken ct, out Dictionary<string, object> res) { ... }
+}
+```
+- 模型属性用 `PropertyGridLib` 特性标注([Category]/[DisplayName]/[Description]/[Button]/
+  [MultiSelect]/[NumberSlider]/[FilePath]/[CollectionEditor]/[FormulaEditor])——**属性面板零 UI 代码**;
+- 子流程专用节点加 `IsSubFlowNode = true`(主工具箱不显示,只进对应平台子流程编辑器);
+- 显示层三种形态:PropertyGrid 属性编辑 / 自定义视图(ViewType)/ 组合模块编辑器(SubGraph)。
+
+---
+
+## 二、视觉平台集成经验(三平台统一模式)
+
+### 2.1 统一模式
+每个视觉平台 = **主插件工程**(引擎/显示/工具封装/容器节点)+ **分类算子工程**(`Plugins.<平台>.<功能>`),
+部署到 `Runtime/Plugins/<平台目录>/`。编辑器 = FlowEditorView(子流程工具箱按平台过滤) + 右侧大显示窗
+(注入替换「节点信息」区)。
+
+### 2.2 VisionPro(Vpp)—— 本轮踩坑最多的平台 ⚠️
+
+**① 程序集是懒加载的**
+CogBlobTool 所在的 `Cognex.VisionPro.Blob.dll` 等,应用没显式用到之前不在 AppDomain,
+反射按名扫描永远找不到。`FindToolType/FindControlType` 找不到时先
+`EnsureCognexAssembliesLoaded()`(Assembly.Load 触发 AssemblyResolve → Runtime 递归解析)再重扫。
+**部署提醒**:`Runtime/Vpp9.0` 必须含 Blob/PMAlign/Caliper 工具程序集
+(本机安装的 `ReferencedAssemblies` 目录里有,bin 目录没有——这版很特殊)。
+
+**② 显示控件 RenderEngine 必须切 GDI**
+`CogRecordDisplay` 默认硬件加速渲染,向日葵远程/部分驱动下**整块白屏**
+(本机实测:WinForms/WPF 都正常、仅 Cog 显示白屏)。修复 = `RenderEngine = CogGDIRenderEngine(1)`。
+**注意该属性只能在句柄创建后读写**(否则 InvalidOperationException)。
+统一入口 `CogGdiRender.Apply(control)`:递归找带 RenderEngine 属性的 Cog 控件,HandleCreated 时机切换;
+动态创建的面板(如 ToolBlockEditV2 内部)用短周期 DispatcherTimer 重扫兜底。
+
+**③ CogImage8Root 悬空指针(黑图/结果恒 0 的真根因)**
+```csharp
+// 错误:包裹托管数组 + 立即解除固定 → GC 移动数组后读到悬空指针
+root.Initialize(w, h, handle.AddrOfPinnedObject(), stride, null);
+grey.SetRoot(root);   // handle.Free() 之后 → 全黑
+// 正确:走 Bitmap 拷贝路径(该版 VisionPro 无 SetRootCopier/Freeze API,编译器证实)
+using (var bmp = img.ToBitmap()) return new CogImage8Grey(bmp);
+```
+
+**④ Blob 测量是 GetMeasure 机制,不是属性**
+`CogBlobResult` 上没有 Area/CenterMassX 属性——40 项官方测量
+(CogBlobMeasureConstants:Label/Area/Perimeter/CenterMassX/Y/Inertia*/Elongation/Angle/
+Acircularity*/BoundingBox*×3 族/NotClipped)全部经 `GetMeasure(枚举)` 查询,
+且**必须在工具的 Measurements 页启用**,否则抛"测量未计算"。
+→ 终端树对这类对象注入「测量项」分支(路径 `...@Measure:Area`),取值走 GetMeasureValue。
+
+**⑤ 结果集合的数据在方法里,不在属性里**
+`CogBlobResults`(Results 的类型)**零属性**,数据全在无参方法:GetBlobs()/GetBlobMeasure(...)/
+CreateBlobImage()/GetTopLevelBlobs()...——树/路径解析必须支持「无参 Get*/Create* 方法段」,
+否则 Results 节点必然断层。
+
+**⑥ 编辑控件命名规则**:工具 `CogBlobTool` ↔ 编辑控件 `CogBlobEditV2`(**去掉 Tool**),
+且可能在不同程序集(ToolGroup.Controls)。查找按"原名+去名"两套候选、跨程序集扫描。
+
+**⑦ 预设输出终端(PresetTerminals)**
+各工具在插件类里定义「中文名 + 属性路径」的常用结果(Blob:面积1..3/重心X2 Y2/X3 Y3;
+PMAlign:第 2/3 目标 分数/位置/角度;Caliper:分数),基类自动声明为输出并每次运行赋值。
+**预设路径首次预勾选时逐条实测**(GetPathStrict 区分"路径不存在"与"值为 null"),只保留真实存在的。
+
+**⑧ 终端路径体系(三方必须一致)**
+树节点 Tag = 存储的勾选路径 = 运行取值路径。格式:方法段带 `()`、集合 `[n]`、
+测量 `@Measure:名`。`NormalizePath` 负责旧格式(属性式)一次性迁移;GetPath 解析段名时剥 `()`、
+GetMember 带"无属性时尝试同名 GetXxx() 方法"兜底。**任何一处格式漂移 = 预勾选不回显或输出 null**。
+
+### 2.3 HALCON(Halcon)—— 防御式集成
+
+- **原生运行库不可用是常态**(客户机/远程环境):`HalconWindow` 用
+  `HOperatorSet.GetSystem("version")` 探测 → 失败显示占位文案(画布/属性编辑不受影响),**绝不闪退**;
+- WPF 软件渲染环境(向日葵远程 + 双显卡)下 HSmartWindowControlWPF 渲染正常(已实测),
+  但显示 part 依赖布局完成 —— 首帧尺寸为 0 时挂 LayoutUpdated 补做适配;
+- uint2/real 图像显示前按 MinMaxGray 拉伸到 byte(HALCON 显示 uint2 的 100 ≈ 全黑);
+- Blob 测量启用对照:HALCON 是算子参数直出(阈值分割直接给区域),无 VisionPro 式测量启用问题。
+
+### 2.4 VisionMaster(Vm)—— 隔离层 + 资源守护
+
+- SDK 引用集中在 `VmSdk\`(Private=False),运行时由本机 VM 4.4 提供;所有 SDK 调用经
+  `VmRuntime` 适配层(LoadSolution/GetProcedure/SetInputs/Run/GetOutputs/GetLayers);
+- **VM 的 WPF 控件会向 Application 级资源注入字符串画刷污染 HandyControl 主题** →
+  `VmResourceGuard`(1.5s 轮询 watchdog + 主题快照急救)+ 显示端坚持用 WinForms 渲染控件;
+- 方案句柄缓存 + 路径变化自动重载;输出图层发布到 VisionLayerStore 供编辑器显示。
+
+### 2.5 远程/显卡环境的两个全局坑(已修复并记录)
+
+1. **所有 WPF 程序白屏** = WPF 硬件加速在远程会话失败 →
+   `HKCU\Software\Microsoft\AvalonGraphics\DisableHWAcceleration=1`(仅 WPF 软渲染,无需重启)。
+   还原:`reg delete ... /v DisableHWAcceleration /f`。彻底解决 = 升级显卡驱动/向日葵。
+2. **Cognex 显示白屏**(WPF 正常、仅 Cog 黑/白)= 同一类远程渲染问题 → RenderEngine 切 GDI(见 2.2②)。
+
+---
+
+## 三、编辑器显示/输出体系(Vpp/Halcon/Vm 三编辑器)
+
+### 3.1 布局
+子流程编辑器(FlowEditorView,工具箱按平台过滤:Vision/VisionVpp/VisionVm 三种 Scope)
++ 右侧「视觉显示」面板(注入替换 FlowEditorView 的「节点信息」区,ReplaceNodeInfoPanel;
+执行历史/执行结果保留)。
+
+### 3.2 图层总线(TeamAAS.SDK.Vision)
+- 节点运行 → `VisionLayerStore.Publish(LayerPublishArgs{FlowId,NodeName,RunStamp,PreferredLayer,Layers})`;
+- RunStamp 批次整体替换防叠加;Disposer 钩子释放平台对象(HObject 等);
+- `LayerComboHelper`:BuildEntries(下拉条目)/ResolveLayers(选中层+底图回退——
+  区域类节点自动垫最近发布的图像层)/FindLatestImageLayer。
+
+### 3.3 VPP 编辑器(简化版,当前形态)
+- 显示端**永远跟随最新发布**(无筛选下拉——输出内容已在终端编辑器配置);
+- 画布点选节点 → 看该节点最新图;
+- 图层内容为 ICogRecord 时走 **CogRecordDisplay 原生渲染**(图像+图形叠加=官方观感)。
+
+---
+
+## 四、PropertyGridLib 1.1.2 使用要点(属性面板零代码的关键)
+
+| 特性 | 用途 | 备注 |
+|---|---|---|
+| `[Button("文本", nameof(方法))]` | 属性面板按钮 | 方法 public 无参/单参;**宿主方法内自己 try/catch** |
+| `[MultiSelect(typeof(Provider))]` | 多选勾选列表 | Provider : IMultiSelectProvider 返回候选项;属性 List<string> |
+| `[TypeConverter]` 标准值 | 单选下拉 | GetStandardValuesSupported=true;**不要依赖 context.Instance 是模型本体**(可能传包装项,用 PluginLoader.SelectFlow 兜底) |
+| `[CollectionEditor]` | 集合编辑弹窗 | 远程环境下弹窗可能不显示(本机实测)→ **多选优先用 [MultiSelect]** |
+| `[NumberSlider]` / `[FilePath]` / `[DirectoryPath]` | 滑块/路径 | |
+| `[FormulaEditor(typeof(Provider))]` | 公式绑定 | FormulaBound<T> 属性 |
+
+坑:
+- **[NonSerialized] 字段的初始化器在 BinaryFormatter 反序列化时不执行**(不走构造器)
+  ——所有"运行时注入的委托"必须在使用处判空并给默认实现(NativeEditorOpener 教训);
+- 重写基类属性访问修饰符要一致(protected virtual → public override 会 CS0507);
+- 集合编辑器弹窗在部分远程环境不显示 → 复杂选择改用 MultiSelect 或专用按钮+自绘弹窗。
+
+---
+
+## 五、调试心法(本项目反复验证有效的套路)
+
+1. **最小程序隔离**:疑难显示问题先做 10 行最小复现程序(csc 直编 + PrintWindow 截图),
+   把"环境问题"和"代码问题"一刀切开——本轮 VPP 白屏/HALCON 黑屏都是这样定位的;
+2. **日志先行**:AppLogger 覆盖插件加载/执行失败/模块实例化失败;
+   AssemblyScanner 实例化失败从静默改为告警后,"引擎没起来"类问题一眼可见;
+3. **反射实证**:不确定第三方 API 时,PowerShell 反射列出真实成员(注意挂 AssemblyResolve
+   且防递归栈溢出)——CogBlobMeasureConstants/GetMeasure 就是这么发现的;
+4. **编码坑**:PowerShell 跑中文 ps1 必须 ASCII 或 BOM;cmd 批处理路径反斜杠;
+   元数据字符串是 UTF-16(字节搜索中文串要转 UTF-16 序列);
+5. **编译**:Git Bash 不可用时的替代链 = node_repl → 写 build.cmd → cmd /c 后台执行 → 轮询
+   result.txt;MSBuild 路径用 vswhere/目录探测(VS 18 Insiders);
+6. **每次改完必做**:构建 → 产物时间戳/符号校验 → 重启程序。
+
+---
+
+## 六、遗留事项 / 下一步建议
+
+- git 分支提交(shell 恢复后 `git checkout -b feature/modularization`,工作区改动全量入库);
+- `ExE.zip`(167MB,用户自建)确认后删除;
+- Vp 预设终端按需扩充(每个工具先在原生界面启用对应 Measurements);
+- FindCircle/FindLine 暂无额外预设;PMAlign 多目标预设引用 Results[1..2],越界输出 null 属正常;
+- Halcon/VM 编辑器若也要"去筛选下拉、跟随最新运行",参照 VppFlowEditorView 简化版套用;
+- 部署清单:Vpp9.0 必须含 Blob/PMAlign/Caliper 工具程序集;桌面副本记得同步重打包。

+ 173 - 0
Docs/NIGHT_LOG.md

@@ -0,0 +1,173 @@
+# 夜间任务进度日志(NIGHT_LOG)
+
+> 会话中断后接续本任务时:先读本文件 + `Docs/ARCHITECTURE.md`,从「待续」小节继续。
+> **最终状态:✅ 全解决方案编译通过(MSBuild CLI,BUILD_OK)。三平台子流程容器(Halcon/VPP/VM)+ 闪退修复全部落地;功能运行时验证待人工进行。**
+
+## 第二晚追加轮(09-06 早晨)
+1. **Halcon 流程编辑器闪退修复(根因:本机缺 HALCON 原生运行库)**
+   - 现象:打开 Halcon流程 → `DllNotFoundException: 无法加载 DLL"halcon"`(HSmartWindowControlWPF.OnRender 首帧触发 HHandleBase 静态构造;首次异常被吞、二次渲染异常直接致命闪退)。桌面副本同样有 Runtime\dll\x64\halcon.dll 但 HALCON 原生运行时是 DLL 家族,孤立拷贝无效。
+   - 修复:HalconWindow.xaml 移除 XAML 声明式 `HSmartWindowControlWPF`,改为 code-behind **防御式创建**:先 `HOperatorSet.GetSystem("version")` 原生探测,可用才创建控件并挂事件/右键菜单;不可用显示"HALCON 原生运行库不可用"占位提示(画布/属性编辑不受影响,进程不闪退)。右键菜单 MyMenu 一并改为代码构建。
+2. **VPP流程 / VM流程 容器节点(与 Halcon流程 完全同构)**
+   - `Plugins.Vpp\VppFlowNodes.cs`:VppFlowPlugin + VppFlowModel/VppFlowInput/VppFlowOutput + **VppEditorPreview**(BeginRunCycle 换 RunStamp+ClearAll;Show 发布图层)。
+   - `Plugins.Vm\VmFlowNodes.cs`:VmFlowPlugin + VmFlowModel/VmFlowInput/VmFlowOutput(镜像;VM 图层发布留待 VmWindow.RefreshImage 平台对象对接)。
+   - 编辑器视图 `Plugins.Vpp\Views\VppFlowEditorView.*`(大显示窗=VppWindow(1)+RefreshImageDisplay(ICogImage))、`Plugins.Vm\Views\VmFlowEditorView.*`(大显示窗=VmWindow);左侧画布工具箱分别用 `FlowToolboxScope.VisionVpp/VisionVm`;均实现 IPluginViewSave/IPluginRunFeedback/IPluginViewTip + ParentGroupModel 注入(子节点公式树可见 &{输入.*})。
+3. **工具箱平台隔离**:`FlowToolboxScope` 增加 `VisionVpp=2/VisionVm=3`;`FlowEditorViewModel.InitCommands` 子流程工具箱按 `IsSubFlowNode && Group=={Halocn模块|Vpp模块|Vm模块}` 过滤后按 VisionPlugin 分组——**各平台算子互不串台**;`OpenNodeEditor` 的 keepParent(保留容器输入变量)推广到全部平台子流程。
+4. **算子迁移子流程**:VpBlob分析/Vp模板匹配/Vp卡尺测量/Vp找圆/Vp找直线 与 VM模块 全部 `IsSubFlowNode=true`(不再出现在主流程工具箱,只在各自平台子流程内;旧流程已放置的节点不受影响)。Vp 算子运行后经 `VppEditorPreview.Show(Model, cogImage)` 发布输入图像图层(GenImage→CogImage 只转一次,喂图/发布共用)。
+5. **可诊断性**:`AssemblyScanner.CreateInstances` 实例化失败从静默改为 AppLogger.Warning("模块 xxx 实例化失败,已跳过")——直接暴露"引擎没起来/主页画面空白"这类静默降级的原因。
+6. **编译方式升级**:Git Bash 仍损坏;改用 node_repl→cmd 批处理直接调 `C:\Program Files\Microsoft Visual Studio\18\Insiders\MSBuild\Current\Bin\MSBuild.exe TeamAAS.sln /p:Configuration=Debug /p:Platform=x64`(BUILD_OK),不再依赖 VS GUI。首轮 4 处 CS0246 FormulaBound(缺 `using PropertyGridLib.Controls;`)已修复。
+7. **部署清理**:删除过期重复副本 `Runtime\Plugins\Plugins.Halcon.dll`(09-04 旧版,会因同名去重抢先加载、使闪退修复失效);保留 `HalconPlugins\` 内最新版。删除杂物 `EXE\win-x64\AwakenGPUToolLog.txt`、`EXE\win-x64\images_v2.db`(仓库根目录已干净;`ExE.zip`(167MB, 当日) 疑似用户打包桌面副本用,未动)。
+
+## 第二晚追加轮②(09-06 上午):视觉显示框位置调整
+- **三个平台子流程编辑器(Halcon/VPP/VM)统一布局调整**:视觉显示框从"编辑器外挂的独立 420px 列"移入 FlowEditorView **右侧面板内**——整区替换「节点信息」(名称/类型/状态/耗时),「执行历史」「执行结果」保留在下方;画布因此占满剩余宽度。
+- 实现:FlowEditorView.xaml 的「节点信息」Border 包进 `ContentControl x:Name=NodeInfoSlot` 插槽 + 新 API `ReplaceNodeInfoPanel(UIElement)`(null=恢复默认,仅影响本实例);三个编辑器 XAML 把视觉面板(视觉显示标题+图层 ComboBox+大显示窗+运行状态行)定义为折叠的 `VisionPanel`,**构造函数里** `EditorRoot.Children.Remove(VisionPanel)` 后注入(渲染前完成,无闪烁),面板 MinHeight=320、宽度随右侧面板列(320 起,画布分隔条可拖宽)。
+- 编译 BUILD_OK(MSBuild CLI),产物符号已核实(ReplaceNodeInfoPanel/VisionPanel 进入 TeamAAS.FlowEngine.dll 与三平台插件 DLL)。
+
+## 故障记录(09-06):本机所有 WPF 程序打开空白 —— 已定位并修复
+- **现象**:向日葵远程操作本机时,所有 C#/WPF 程序打开后窗口空白(非 WPF 程序正常)。
+- **根因**:WPF 硬件加速(DirectX)在该环境渲染失败——本机为 Legion 双显卡(AMD 780M 空载 + RTX 4060 出图)+ 向日葵虚拟显示驱动 OrayIddDriver 的组合;与删除的工程文件无关(未动过任何系统环境)。
+- **修复**:注册表 `HKCU\Software\Microsoft\Avalon.Graphics` 新建 DWORD `DisableHWAcceleration=1`(仅 WPF 改用软件渲染,即时生效、无需重启)。已启动 TeamAAS 截屏验证渲染正常。
+- **还原方式**:`reg delete "HKCU\Software\Microsoft\Avalon.Graphics" /v DisableHWAcceleration /f`
+- **彻底解决(可选)**:升级 NVIDIA 显卡驱动(当前 566.26/2024-11)与向日葵客户端;本地(非远程)使用时理论上可还原此开关对比验证。
+
+## 追加轮③(09-06 上午):图层筛选实时切换 + 图层级选项设计
+- **修复"切换不实时"根因**:每次图层发布都会重建下拉项,旧实现用**索引**恢复选中——ItemsSource 一换 SelectedIndex 变 -1,选中被静默重置回「最新运行」,点选的节点显示立刻被冲掉。现改为按 **(节点名, 图层名) 值** 保留选中(三平台编辑器统一)。
+- **图层级选项设计(SDK 新增 LayerComboHelper/LayerComboEntry,三平台共用)**:下拉三级结构——「最新运行」(最后一次发布整体)/「节点名」(该节点底图+全部叠加)/「 └ 图层名」(图层级)。**图层级显示语义**:图像层单独显示;区域/轮廓等叠加层**自动附带该节点的原图底图**(ResolveLayers:底图=该节点首个图像层)——用户看到的是"原图上的高亮区域",直观可理解。状态行显示 `节点 · 图层 · #批次`。
+- 图层发布名改短:`节点名.图像/.区域` → `图像`/`区域`(节点归属由条目结构表达,不再冗余前缀)。
+- 画布点选 → 定位该节点条目(无图层回落「最新运行」)→ 同步下拉+实时刷新;正在看某节点时该节点重新发布会原地刷新。
+
+## 追加轮④(09-06 上午):四项反馈修复
+1. **VPP 窗体白屏根因定位与修复**:最小对照程序实测——WinForms 原生控件正常、WPF 正常、**仅 Cognex 显示控件白屏**;`CogRecordDisplay.RenderEngine` 默认硬件加速渲染在本机(向日葵远程+显卡环境)不 painting,切 **GDI 渲染引擎**(`CogRenderEngineConstants.CogGDIRenderEngine=1`)立即恢复。注意该属性**只能在句柄创建后读写**(否则抛 InvalidOperationException)。落地 `Plugins.Vpp\Views\CogGdiRender.cs`(递归扫描容器内所有 Cog 显示控件、HandleCreated 时机切换):VppWindow(主页+VPP流程编辑器显示)直接 Apply;ToolBlockEdit(工具块编辑器,内部面板动态创建)用 600ms×40 次定时器重扫兜底。
+2. **Halcon 筛选不生效根因修复**:编辑器曾把预览窗挂到 `HalconEditorPreview.Current` 经典通路,每个算子跑完直接推图**覆盖**图层筛选结果 → 已移除该挂接(图层总线为唯一显示驱动);区域类算子(形状筛选/连通域/形态学)发布时无底图 → `LayerComboHelper` 增加底图回退:节点没发过图像层时取**全流程最近发布的图像层**垫底("区域附带原图",不再黑底孤立区域)。
+3. **Halcon 高级编辑体系(普通编辑/高级编辑两级)**:新增 `HalconOperatorModelBase`([Button 高级编辑])+ `HalconToolAdvancedEditor` 专用窗体(左 PropertyGrid 参数 + 右 HalconWindow 大显示窗 + 加载测试图像注册「图像」输入变量 + 后台单步执行,执行挂当前流程注册表);8 个现有算子模型全部翻转到新基类;新增算子 **H边缘提取**(Sobel+阈值,检测识别分类)。后续新算子继承基类即自动获得高级编辑入口。
+4. **VM工具块拓展**:输出图层发布到 VisionLayerStore(VM流程编辑器视觉显示/筛选可直接查看);方案路径/流程名变化**自动重载**句柄(调试期改方案无需重启);「打开 VM 工具编辑」按钮未注入 Launcher 时兜底用系统关联调起 VisionMaster 打开方案。
+
+## 追加轮⑤(09-06 上午):VP 算子报错"未找到工具类型 CogBlobTool"
+- **根因(两层)**:① `Runtime\Vpp9.0\` 运行时目录当初只拷了 ToolBlock 需要的 DLL,**缺经典工具程序集**(Cognex.VisionPro.Blob/PMAlign/Caliper 及其 .Controls —— 它们在 VisionPro 安装的 ReferencedAssemblies 里,bin 目录没有);② VisionPro 程序集是**懒加载**的,应用没显式用到之前不在 AppDomain,反射按名扫描永远找不到。
+- **修复**:① 从 `C:\Program Files\Cognex\VisionPro\ReferencedAssemblies` 补齐 6 个 DLL 到 Vpp9.0(Blob/PMAlign/Caliper ×2 含编辑控件);② `VpToolSupport` 增加 `EnsureCognexAssembliesLoaded`(Assembly.Load 触发 AssemblyResolve → Runtime 递归解析),FindToolType/FindControlType 找不到时先预载再重扫。OpenNativeEditor 同时修复了:编辑控件与工具跨程序集查找、[NonSerialized] 委托反序列化后为 null 的兜底、内部显示控件 GDI 渲染修复。
+- **提示**:后续部署到其它机器时,Vpp9.0 目录必须包含 Blob/PMAlign/Caliper 工具程序集(或整目录从 ReferencedAssemblies 补齐),否则 Vp 算子创建工具时会报同类错误。
+
+## 追加轮⑥(09-06 晚):VP 算子联调三连修(日志实证)
+1. **工具加载已通**:18:23 起 VpBlob 正常执行("Blob 完成:数量=0")——预载+补 DLL 生效。
+2. **高级编辑仍"进不去"**:日志连发「未找到 CogBlobTool 的原生编辑控件」。两处遗漏:① 编辑控件程序集(Blob.Controls/PMAlign.Controls/Caliper.Controls)不在预载清单;② **VisionPro 编辑控件命名去掉了 "Tool"**(实际是 CogBlobEditV2 而非 CogBlobToolEditV2)——FindControlType 增加去 "Tool" 候选名。
+3. **偶发"System.Object 无法转换为 ICogImage"**:SetInputImage 重写——支持 ICogRecord 自动递归抽取其中的 ICogImage(绑定"输出图层N"类记录时可用);类型不符时抛出**带实际类型名**的明确异常,替代反射笼统报错。
+(验证提示:数量=0 属工具参数/图像内容问题,打开高级编辑调 Blob 参数即可。)
+
+## 追加轮⑦(09-06 晚):图像转换悬空指针根因 + VP 运行记录图层(VisionPro 下拉体验)
+1. **黑图/数量恒 0 的真根因**:`GenImageConverter.Grey8ToCogImage` 用 `CogImage8Root.Initialize` 包裹 GenImage.Data 托管数组后**立即解除固定**——GC 挪动/回收数组后 CogImage 读到悬空指针 → 显示黑图(有暗噪点)、Blob 数量恒 0。修复:改走 `ToBitmap() → new CogImage8Grey(bmp)` 拷贝路径(SetRootCopier/Freeze 在该版 VisionPro 中不存在,编译器证实)。
+2. **VP 运行记录图层(对齐 VisionPro 原生下拉)**:Vp 算子运行后 `CogToolBase.CreateLastRunRecord()` 把整棵记录树发布为图层(`VppEditorPreview.ShowRecord`:RecordKey 命名、ContentType 判定图像层、根记录=默认合成视图、深度限 3 层防环);编辑器图层级选中直接 `VppWindow.RefreshRecordDisplay(record)` 用 **Cognex 原生渲染**(图像+图形叠加原样呈现,如 BlobImageUnfiltered 的绿色轮廓)。ICogRecord 成员名是 RecordKey/Content/ContentType/SubRecords(无 Name)。
+3. `VppWindow.RefreshRecordDisplay` 去除每帧 GC.Collect(连续运行卡顿)。
+
+## 追加轮⑧(09-06 晚):输出图层落到节点输出 + 全记录数据可传递
+- 「输出图层」之前只影响显示、不在结果里 → 下游无法绑定。现改为:**学习到的全部记录图层都声明为节点输出**(VpToolPluginBase.DeclareOutputs 按 LastRecordKeys 逐项 OutputField;首次运行学习、随流程持久化),PluginRun 把每层记录对象写入 results(如 InputImage/BlobImage/Histogram...)——下游公式直接绑定。
+- 属性「输出图层」选定项额外以固定名**「输出图像」**暴露(绑定稳定,不随改名漂移);留空=根记录合成视图。
+- VppEditorPreview.ShowRecord 返回改为 `Dictionary<图层名, 记录对象>`(树序)。
+- 转换器「输出图层」下拉此前取不到模型:加 SelectFlow 节点兜底(PropertyGridLib 的 context.Instance 可能传包装项)。
+
+## 追加轮⑨(09-06 晚):删显示图层属性 + 结果筛选(多选)
+- **删除「输出图层(显示)」属性**(OutputLayerKey + 其 TypeConverter)——显示默认=根记录合成视图,图层传递全靠「输出图层列表」多选。
+- **新增「2.结果筛选」多选**([MultiSelect] + VpResultKeyMultiProvider,可选项=运行学习到的 LastResultKeys):Vp 工具的类型化结果(数量/分数/位置/角度...)勾哪些才往下游传;**留空=全部输出**。学习时机:每次运行后把非 图层/结果/输出图像 的键存入 LastResultKeys(随流程持久化);配置了筛选时 PluginRun 会剪裁 res,DeclareOutputs 按勾选声明(未配置=按 DeclareResultFields 全声明)。
+
+## 追加轮⑩(09-06 晚):输出终端(迁移 VisionPro「添加终端」)
+- 输出区最终形态:1.输出图层列表(多选) / 2.结果筛选(多选) / **3.输出终端(多选)**。
+- **输出终端**:勾选工具属性/结果树里的**任意项**(`Results.Count`、`Results.GetBlobs[0].CenterOfMassX`、`SearchRegion`...)作为输出终端,输出名=路径末段(重名自动 _2/_3)。可选项运行后由 `VpToolSupport.LearnTerminalPaths` 自动学习(递归公共属性、深度≤3、集合展开首元素标 [0]、封顶 80 条、跳过 Name/RunStatus/System 命名空间),随流程持久化;取值走既有 `GetPath` 反射路径解析(支持索引与 0 参方法)。OutputField 名字属性为 Key(非 Name)。
+
+## 追加轮⑪(09-06 晚):输出终端改为按钮 + 属性树弹窗(VisionPro 体验)
+- 「输出终端」由 MultiSelect 改为 **[Button「编辑输出终端」] → `VpTerminalEditorWindow` 专用弹窗**:工具对象树(属性/结果,带实时值,如 `CenterOfMassX = 123.4`;集合展开首元素标 [0];复杂对象可勾选整对象且可继续展开;深度≤4/节点≤400),勾选任意节点 → 确定 → 写回 `OutputTerminals`(作为输出终端,输出名=路径末段)。弹窗实时读工具对象(EnsureTool 兜底创建),勾选状态按已存路径回显。
+- 模型上 OutputTerminals 转 [Browsable(false)](弹窗托管),属性面板保留:1.输出图层列表(多选)/ 2.结果筛选(多选)/ 3.编辑输出终端(按钮)。
+
+## 追加轮⑫(09-06 晚):删结果筛选 + 预设输出终端(下沉基类)
+- **删除「结果筛选」**(ResultFilter/LastResultKeys/VpResultKeyMultiProvider)——有终端编辑器后冗余。
+- **预设输出终端下沉基类**:`VpToolPluginBase.PresetTerminals`(virtual,返回 VpPresetTerminal[名称,路径])——DeclareOutputs 自动声明 + PluginRun 自动赋值(GetPath 容错取 null)。全部 Vp 算子共用此封装。
+- **各工具预设**(基于 Cognex 官方文档核对):VpBlob=前 3 个 Blob 的 面积1..3/重心X2 Y2/X3 Y3(注意 Area 等测量需在原生编辑器 Measurements 页启用);VpPMAlign=第 2/3 目标的 分数/位置X/Y/角度(第 1 目标已由类型化结果覆盖);VpCaliper=分数。FindCircle/FindLine 暂无额外预设。来源:docs.cognex.com(CogPMAlignResult.GetPose/Score、CogBlobResult/Blob Measurements Tab)。
+
+## 追加轮⑬(09-06 晚):结果筛选回归(候选=类型化结果+预设终端,无需运行)
+- 「结果筛选」多选恢复,但候选升级为 **类型化结果 + 预设终端**(随所选工具变化,**无需先运行**——来自输出声明而非运行学习)。
+- 机制:`VpToolPluginBase` 实现 `IVpResultSource`(GetResultKeys=DeclareResultFields 名单 + PresetTerminals);`VpResultKeyMultiProvider` 候选=两者合集;**留空=全部输出**,勾选后 DeclareOutputs 按勾选声明、PluginRun 剪裁 res(图层/输出图像/输出终端不受筛选影响)。预设终端输出名可能与类型化结果重名(如 分数),重名项以筛选勾选为准。
+
+## 追加轮⑭(09-07):预设=预勾选终端(统一到终端树,删结果筛选)
+- **概念统一**:预设结果本来就是终端树里的节点 → 预设=**首次自动预勾选的终端**。「结果筛选」属性彻底删除(勾选管理只在终端弹窗树里)。
+- 行为:OutputTerminals 为空时(首次使用)**自动种入该工具的预设终端路径**(PluginRun 与弹窗打开两处兜底);树中预设项呈勾选态,用户可取消/增选;一旦有勾选记录就不再覆盖。输出 = 已勾选终端(输出名=路径末段)+ 类型化结果 + 图层 + 输出图像。
+- 结构:`IVpPresetSource.GetPresetPaths()`(模型实现,经 PluginLoader 按工具名反射取插件 PresetTerminals);VpToolPluginBase.PresetTerminals 改 public(接口对齐)。
+
+## 追加轮⑮(09-07):终端树完整性增强 + 预设路径实测验证
+- **"预设结果在终端树里找不到"的根因**:① Blob 的 Area/Compactness 等测量项必须在原生编辑器 Measurements 页启用,结果对象上才有这些属性(未启用=属性不存在或 null);② 旧树扫描只扫属性不扫字段、深度 3、null 直接跳过。
+- **树扫描增强**:属性+公共字段、深度 3→5、总量封顶 300、集合展开前 3 个元素(原 1 个)、标量 null 登记为有效路径。
+- **预设路径实测验证**:新增 `GetPathStrict`(区分"路径不存在"与"值为 null/空集合");首次预勾选时逐条验证,**只保留工具结果对象上真实存在的路径**——Blob 未启用测量时 Area 类预设不会出现在勾选里(启用后下次运行自动可勾)。
+- **弹窗树标量 null 可勾选**:路径有效、此刻无值的项(如未启用测量)显示 `= null` 且可勾选(输出 null),不再直接隐藏。
+
+## 追加轮⑯(09-07):Blob 测量终端(GetMeasure 机制,官方 40 项全量)
+- **反射实证**:`CogBlobResult` 上**没有 Area/CenterMassX 属性**——官方机制是 `GetMeasure(CogBlobMeasureConstants)`(40 项枚举:Label/Area/Perimeter/CenterMassX/Y/Inertia*/Elongation/Angle/Acircularity*/BoundingBox*×3族/NotClipped),未启用的测量抛 `CogBlobMeasureNotComputedException`。反射扫属性永远扫不到 → 这就是"树里找不到 Area"的真正原因。
+- **终端树注入**:弹窗树对带 `GetMeasure(枚举)` 方法的对象自动注入「测量项 (GetMeasure)」分支——40 项全量列出(未启用的标"(未启用)"但仍可勾选,勾选输出 null),路径格式 `Results.GetBlobs[0]@Measure:Area`。
+- **取值**:`VpToolSupport.GetMeasureValue`(TryParseMeasurePath 解析 @Measure: 标记 → GetPath 定位对象 → GetMeasure(枚举));PluginRun 输出环节对测量路径走专用取值。MeasureMarker 常量在 public `VpPresetTerminal` 上(分类工程可访问)。
+- **Blob 预设改测量路径**:面积1..2/重心X1 Y1/X2 Y2(GetBlobs[0..1])/周长1/圆度偏差1——注意测量需在原生编辑器 Measurements 页启用后才有数值。
+
+## 追加轮⑰(09-07):Results 节点断层修复(方法节点展开)
+- **"Results (CogBlobResults) 下面没了"的根因**:CogBlobResults 的数据全在**无参方法**里(GetBlobs()/GetBlobMeasure()/CreateBlobImage()...,属性一个都没有)——属性扫描到它必然断掉。
+- **树扫描新增方法节点**:无参 Get*/Create* 方法(排除 ToString/GetHashCode/GetType/Dispose)自动展开为子节点,显示名带 `()`(如 `GetBlobs() (CogBlobResultCollection) [3 项]`),路径按方法名(GetPath 支持无参方法调用,下游绑定同样有效);值渲染复用 WalkValue 统一管线(标量/集合/复杂对象)。树可以一路钻到与官方终端树同样的深度。
+
+
+## 追加轮⑱(09-07):预勾选回显修复(路径体系统一)
+- **"预选了但弹窗里没勾上"的根因**:预设种入的是旧属性式路径(`Results.GetBlobs[0]@Measure:Area`),新树生成方法式路径(`Results.GetBlobs()[0]...`)——字符串对不上,勾选框全空。
+- **修复(路径体系统一为树格式)**:新增 `VpToolSupport.NormalizePath`(索引段方法化:`GetBlobs[0] → GetBlobs()[0]`);① GetPresetPaths 返回前规范化;② PluginRun 对已存 OutputTerminals 做一次性规范化迁移(旧流程数据兼容);③ LearnTerminalPaths 输出统一规范化(学习清单与树一致)。树 Tag=规范化路径 → 勾选回显精确对应。
+
+## 追加轮⑳(09-07):方法段取值修复(终端输出 null 根因)
+- **"GetBlobs()[0]@Measure:Area 输出 null"根因**:GetPath 按段查成员时拿的是带 `()` 的名字(`"GetBlobs()"`)——属性/字段/方法全都查不到,中途断链返回 null。
+- **修复**:GetPath 解析段名时剥离 `()`(成员查找用裸名);GetMember 增加"属性不存在时尝试同名 GetXxx() 方法"兜底(GetBlobs/GetBlobMeasure 等);MemberExists 同步剥 `()`(严格验证不再误判)。另注意:测量值为 null 的另一情形是测量未在 Blob 原生编辑器 Measurements 页启用(GetMeasure 抛"未计算"被容错为 null)。
+
+## 追加轮㉑(09-07):树方法节点路径带括号(勾选回显最终对齐)
+- **"预设在结果里有值、弹窗里却不打勾"的根因(与⑱方向相反)**:方法节点的子路径拼接用的是不带括号的前缀(`Results.GetBlobs[0]...`),而 NormalizePath/预设存储是带括号的(`Results.GetBlobs()[0]...`)——树 Tag 与存储字符串又不一致。
+- **修复**:AddChildren 方法循环的 path 统一带 `()`(`prefix + "." + name + "()"`),其下所有子节点路径自动继承;GetPath 运行时剥 `()` 兼容两种。至此树 Tag=存储格式=取值格式,三方一致。
+
+## 追加轮㉒(09-07):VPP 编辑器显示简化(去图层筛选下拉)
+- 用户确认:输出内容已在「编辑输出终端」里配置 → 编辑器显示端不再需要图层筛选树。
+- **VppFlowEditorView 简化**:删除 视觉显示 的图层筛选下拉与全部筛选逻辑;显示端**永远跟随最新发布的图像**(任意节点发布即刷新其默认视图),画布点选节点也可直接看该节点最新图。状态行显示 `节点 · #批次`。
+- Halcon/VM 编辑器保留原图层筛选(Halcon 的 图像/区域 对照对调试有价值),如需同步简化说一声即可。
+
+## 追加轮㉓(09-08):C#脚本节点首建卡顿优化(后台编译)
+- **根因**:拖入节点 → InitRun → InitPlugin 在 **UI 线程同步**做了整条重活:CodeForge 引擎首建(Roslyn 启动)+ 添加全部 TeamAAS 程序集引用 + 完整编译脚本——首次数秒冻结。
+- **修复**:① `InitPlugin` 立即返回 true,编译转 `Task.Run` 后台(引擎预热/引用/编译全在后台,_engineGate 串行化与 PluginRun 的竞争);② 新增 `ScriptCompiler.TryGetEntry/TryCreateCached`(纯缓存查询,绝不触发编译);③ `DeclareOutputs` 只用缓存命中结果(该方法在 UI 线程被调用),未命中回空——后台编译完成后,下次打开属性/保存/运行即按脚本声明输出;④ `PluginRun` 保持同步编译(在 FlowExecutor 工作线程,不卡 UI)。WarmupEngine 公开供预热调用。
+## 待续(按优先级)
+
+## 环境说明
+- Git Bash 整夜损坏(cygwin fork 报错)→ 命令行 git/dotnet 不可用,**改动尚未提交**。
+- 编译验证:02:30 左右通过资源管理器打开了 TeamAAS.sln(VS 18 Insiders,管理员实例),用 Ctrl+Shift+B 驱动构建。
+- Git 策略执行:改动全部落在工作区、未提交(master 未被改动);shell 可用后 `git checkout -b feature/modularization` 即可把全部改动带进分支(无需合并操作)。
+
+## 编译验证结果(✅ 已确认通过)
+- 修复历程:①CS0314(SDK 泛型约束→反射闭合 IDeviceProvider<>+非泛型 GetService(Type))→ ②分类工程 halcondotnet 引用(改为显式 HintPath 引用主工程 HalconSdk\halcondotnet.dll,Private=False)→ ③HalconWindow 拖放 GetDataPresent 笔误 + HalconEditorPreview 缺 using Plugins.Halcon.Views → ④CommBatchNodes 缺 using System.ComponentModel / Plugins.Standard.Models。
+- **最终状态:VS 状态栏「生成成功」(3:04),错误 0。全部产物已核实在正确位置**:
+  - `TeamAAS.Core\TeamAAS.SDK\bin\x64\Debug\TeamAAS.SDK.dll` ✓
+  - `TeamAAS.Core\TeamAAS.Motion\bin\x64\Debug\TeamAAS.Motion.dll` ✓
+  - `EXE\win-x64\Plugins\HalconPlugins\`:Plugins.Halcon.dll、Plugins.Halcon.ImageProcessing.dll、Plugins.Halcon.Detection.dll、Plugins.Halcon.Measurement.dll、Plugins.Halcon.Logic.dll ✓(+halcondotnet.dll 随主插件复制)
+  - Plugins.Standard.dll(含新增 批量读取/批量写入 节点)✓
+
+## 已完成(全部内容)
+1. Docs/ARCHITECTURE.md —— 五层架构蓝图、视觉拆分规范(`Plugins.<平台>.<功能>.dll` + `Plugins\{HalconPlugins,VmPlugins,VppPlugins}\` 部署目录)、图层管线、迁移规则。
+2. TeamAAS.SDK 新工程:IPluginContext/ServiceRegistry(服务上下文,替代单例直连的正规渠道)、设备契约(INamedDevice/IConnectableDevice/IDeviceProvider/IDeviceDebugPageFactory)、运动契约(IMotionCard/IIOCard/AxisStatus)、视觉图层契约+总线(LayerItem/LayerPublishArgs/VisionLayerStore:RunStamp 整体替换、owned 对象释放、ClearAll)。
+3. PluginLoader 递归扫描 `Plugins\**\Plugins.*.dll`(同名 DLL 去重)。
+4. FlowSerializationBinder + FlowFileStore 挂接:旧 .aas 流程在算子跨程序集迁移后零改动可加载(全域按类型全名兜底解析)。
+5. Halcon 算子拆分为 4 个分类 DLL(类型全名/显示名不变)+ 主工程瘦身为引擎/容器/显示/运行时。
+6. Halcon 图层显示链路:算子 → HalconEditorPreview.Show(Model,…) → VisionLayerStore → HalconFlowEditorView 右侧大显示窗(VisionMaster 风格、可拖宽、随窗自适应)+ 图层筛选 ComboBox(最新运行/按节点)+ 状态行;画布点选节点联动(依赖 FlowEditorViewModel.SelectedNode 的 INPC,若未通知则 ComboBox 手动切换兜底);HalconWindow 新增图层渲染模式(多彩叠加、缩放/ROI/保存兼容、GenImage 副本自动释放);每轮容器运行 BeginRunCycle 换批次防叠加。
+7. Vm/Vpp 属性面板"高级编辑"按钮([Button] + AdvancedEditorLauncher 注入点)。
+8. TeamAAS.Motion:MotionManager(MotionDevices.json)、仿真运动卡/IO卡、通用调试页 MotionDebugView + MotionDebugPageFactory、品牌适配位(雷赛/固高/IMC60G/GR20T);已挂 Core 聚合 + App 启动 LoadConfig/退出 CloseAll + CoreManager.Motion。
+9. 通讯标准节点:Plugins.Standard 新增 **批量读取/批量写入**(CollectionEditor 点位列表、公式绑定来源、逐项错误报告、自动重连、失败策略可选);已随解决方案编译通过。
+
+## 待续(按优先级)
+0. **✅ 追加轮(凌晨):Vpp/Vm 算子级节点已落地并编译通过(生成成功 3:47)**:
+   - `Plugins.Vpp.Vision\Plugins.Vpp.Detection`:**VpBlob分析 / Vp模板匹配**;`Plugins.Vpp.Measurement`:**Vp卡尺测量 / Vp找圆 / Vp找直线**。基建=主工程新增 VpToolSupport.cs(反射创建/运行 Cog 工具、结果路径取值 Results[0].Score 等、原生编辑器 EditV2 控件 WinForms 弹出);基类 VpToolModelBase(Tool 随流程序列化不丢配置 + 输入图像绑定 + [Button]高级编辑)+ VpToolPluginBase(取图→喂图→运行→提取)。部署到 `Plugins\VppPlugins\`。✓ 产物已核实
+   - `Plugins.Vm.Vision\Plugins.Vm.Module`:**VM模块** 节点(方案/流程/结果键声明 → 运行读取模块结果 GetOutputImageV2 等;高级编辑调起 VisionMaster 客户端打开方案);VmRuntime 增加 GetModuleOutput。部署到 `Plugins\VmPlugins\`。✓ 产物已核实
+   - 注意:Vp 算子的结果字段取值路径(如 CogBlobResult.CenterOfMassX / PMAlign GetPose 等)基于 VisionPro 标准 API 反射容错取值,个别字段名如有出入只会该项输出 null,不影响节点运行——首次联调时核对日志微调即可。
+1. **运行验证**(需人工/白天):工具箱应出现 Halcon 8 算子 + Vp 5 算子 + VM模块 + 批量读/写 → 各节点建流程跑通 → 旧产品加载验证 Binder。
+2. **git 提交**:`git checkout -b feature/modularization` 分 7 段提交;删 `_explore.ps1`。
+3. **Vpp 更多算子**:按 VpToolPluginBase 模式 5 分钟一个(FindLineSwap/Clamp/Edge 等);**Vm 模块参数直读**:确认 VmSdk 模块 SetParamValue/ModuResult 键名后把常用参数提到属性面板。
+4. **VppWindow/VmWindow 显示升级** + 高级编辑按钮接线(VpToolModelBase 已自带按钮无需接线)。
+
+## 早间人工验证清单
+- [ ] 启动程序:主页"相机画面显示区"是否恢复(若仍空白 → Logs 中搜「模块扫描」:VisionPro 引擎实例化失败原因会首次被记录;桌面副本还需确认 Runtime\Vpp9.0 与 Runtime\dll 是否拷全)
+- [ ] 打开 Halcon流程 **不再闪退**(无原生库时显示区出现占位提示、画布可用)
+- [ ] 主流程工具箱出现「VPP流程」「VM流程」容器(Halcon流程 已有);双击各自进入子流程编辑器,工具箱只显示本平台算子(VPP流程内:Vp×5 按检测识别/几何测量分组;VM流程内:VM模块)
+- [ ] Halcon 子流程工具箱不再出现 Vp/VM 算子(平台隔离)
+- [ ] VPP流程 内拖 VpBlob分析 → 绑定 &{输入.图像} → 运行:右侧大显示窗出图、点节点跟随、图层 ComboBox 按节点筛选
+- [ ] 加载旧产品 流程1.aas 成功(Binder 兼容)
+- [ ] 不配置 MotionDevices.json 时启动无异常
+- [ ] git shell 可用后:`git checkout -b feature/modularization` 分段提交(全部改动仍在工作区)

+ 143 - 0
Docs/PRODUCTION_FLOW.md

@@ -0,0 +1,143 @@
+# 生产运行全流程与分支详解(对照 TeamAAS-2.0 在产实现)
+
+> 源码依据:`D:\Team\Program\TeamAAS-2.0\TeamAAS-VM\Services\RemoteCommandService.cs`(2125 行,生产核心调度)、
+> `Services\CameraCalibrationService.cs`(标定动作)、`Services\CalibrationService.cs`(运行时坐标换算)、
+> `Models\PickInfo.cs`(夹具模型)、`Team.FFFeederService`(供料器类库)。
+> 兄弟文档:`DEVICE_FLOW.md`(设备对照表)、`ARCHITECTURE.md`、`EXPERIENCE.md`。
+
+---
+
+## 一、总览:一次"视觉引导取料"的完整闭环
+
+```
+机械手到位(待拍位) ──TCP发触发命令──▶ 上位机 BgCommunicate(TcpService 监听)
+                                        │ RemoteCommandService.ExecuteAsync(指令, 回调)
+                                        ├─ 解析触发命令 → 找到对应视觉流程(Procedure)
+                                        ├─ Feeder 拍照前动作(开背光/振动, 可选)
+                                        ├─ 相机 Grab()(先应用配方曝光/增益)
+                                        ├─ 运行视觉流程(ToolBlock) → 找到工件像素坐标 X,Y,U
+                                        ├─ 标定换算 ConvertPixelToPosition → 机器人坐标 X,Y(,U)
+                                        ▼
+机械手 ◀──TCP 回复"触发命令,OK,X,Y,U" ──┘
+(机械手用坐标去抓;吸/夹 IO 由机器人程序按 CalibParame 预置的参数自持完成)
+```
+
+**核心思想**:上位机是"**应答式视觉服务器**"——机器人/PLC 发触发命令,上位机拍照算坐标回传;
+拾放动作本身由机器人程序执行,上位机不逐步遥控。
+
+---
+
+## 二、触发入口:指令-应答协议(RemoteCommandService.ExecuteAsync)
+
+1. 外部(机器人/PLC/上位系统)通过 TCP 发来一行文本,逗号分割:`触发命令[,参数...]`;
+2. `ExecuteAsync` 拆出 `triggerCommand` 与 `commandParams`;
+3. **并发防重**:`TryEnterCommandExecution`——同一触发命令上一次没跑完,直接回 `触发命令,NG`;
+4. `switch(triggerCommand)` 分发,主要内置命令:
+   - `LoadProduct,{产品名}` —— 加载产品(读产品目录下流程/配方);
+   - `GetProductName[,编号]` / `GetProductID[,产品名]` —— 产品查询;
+   - `GetToolParam,{触发命令},{工具号}` / `GetProcessParam,{触发命令}` —— 取参数;
+   - **视觉触发命令**(每个视觉流程在产品里配置了一个 `TriggerCommand`,如 `V1`)→ 走视觉任务;
+   - 清料任务(编号制,可取消)。
+5. 应答格式统一:`{触发命令},OK,{输出项}` 或 `{触发命令},NG,{原因}`。
+
+---
+
+## 三、视觉引导分支(ExecuteVisionTaskAsync)
+
+按优先级两条路:
+
+1. **脚本优先**:流程目录存在脚本文件 → `ScriptHelper.ExecuteVisionScriptingAsync`
+   (CS-Script/Roslyn 编译执行,整段流程逻辑可被工程师用 C# 接管);
+2. **内置流程**(无脚本时):
+   - 普通流程 → `ExecuteNormalVisionTaskAsync`;
+   - **Feeder 视觉流程** → `ExecuteFeederVisionTaskAsync`(见第五节)。
+
+`ExecuteNormalVisionTaskAsync` 步骤:
+1. `SetLightBeforePhoto`:按流程配置开光源/背光(可带等待延时);
+2. **拍照**:先应用产品配方的相机参数(曝光/增益;UVC 的亮度/对比度)→ `camera.Grab()`;
+   拍照失败按配置的重试上限重试;
+3. **运行视觉流程**(VisionPro ToolBlock / OCR 等);
+4. `GetVisionOutput`:按产品里配置的**输出项**收集结果——
+   - 普通项:直接输出值;
+   - **点位项(IsPointTran)**:值格式 `"x,y,u; x,y,u; ..."`(分号分多个目标),**逐点**
+     `ConvertPixelToPosition` 换算成机器人坐标(保留 3 位小数,附加字段原样带回去);
+     **移动相机(MobileJ4/XY模组)必须携带机器人当前位姿** robotPos 参与换算,否则报
+     `RobotPositionNull`;
+5. 回调应答:`{触发命令},OK,{输出1},{输出2}...`。
+
+---
+
+## 四、相机安装方式分支(标定取点 + 运行时换算)
+
+枚举:`FixedUp=0 / FixedDown=1 / MobileJ2=2 / MobileJ4=3 / MobileDown_XYPlatform=4 / None=99`。
+
+| 方式 | 物理布局 | 标定九点取点动作 | 运行时像素→机器人换算 | 工具坐标步骤 |
+|---|---|---|---|---|
+| **FixedDown** 固定向下 | 相机固定工位上方俯视,机械手吸标定块在下方走位 | **防遮挡循环**(每点):`CalibMotion(点i)` → `CalibOutIO(0)` 放下块 → `CalibMotion(Home)` 退待机 → 拍照 → `CalibMotion(点i)` 回来 → `CalibOutIO(1)` 吸回;九点完回 Home | 仿射矩阵直出机器人 mm →(带 robotCoord 时)`ToolCoord.ComputeTool` 转工具坐标;**回传角度取反** | 需要:CalibrateFixedDownCameraTool |
+| **FixedUp** 固定向上 | 相机朝上(背光板下),机械手举块到镜头上方 | `CalibMotion(点i, Z)` → 拍照(无遮挡问题) | 同 FixedDown 族(ComputeTool) | 需要:CalibrateFixedUpCameraTool |
+| **MobileJ2** | 相机装 J2 臂随臂下移 | 同上(走到点位拍照) | 仿射直出 + 转工具坐标;**角度取反** | 需要 |
+| **MobileJ4** | 相机装末端腕(眼在手,随 U 轴旋转) | **先 `CalibMotion(中心点)` 并把 Mark 点换算到工具坐标系记录**;九点矩阵 = Mark − (点i − 点1 位移)(把 Mark 拉回相机中心) | 仿射出 mm 偏移 → **按 (当前U − MarkU) 构造旋转矩阵修正偏移** → 叠加机器人当前坐标 | 需要:CalibrateJ4MovingDownCameraTool |
+| **MobileDown_XYPlatform** | 相机装 XY 龙门模组下移 | 同 J4 偏移换算(Mark=中心点,不做工具换算) | 同 J4 偏移公式但**旋转角恒 0**(模组无旋转) | **跳过** |
+| **None** 独立相机 | 手动 | 手动 | 手动 | 不适用 |
+
+**共同前置(旋转预备标定)**:机械手走 P0 / P0+X / P0+Y 各拍一张 → Gram-Schmidt 求图像系↔机器人系
+旋转矩阵 + PixelScaleX/Y(mm/px);九点机器人坐标先经该矩阵的逆变换对齐坐标轴,再进仿射求解
+(2.0 用 OpenCvSharp `EstimateAffine2D`;我们用正规方程+高斯消元,数学等价)。
+验证步骤:0.9 幅面再取 5 点 → RMSEX/RMSEY/最大偏差。
+
+---
+
+## 五、夹具分支(PickInfo:吸取 vs 夹取)
+
+模型:`PickInfo { PickPlaceModel: Suction|Clamp; Inhal: int; Blow: int; }`(+ 产品/标定里的
+`WaitSuction`/`WaitBlow` 延时)。**同一对 IO 位,两种语义**:
+
+| 夹具 | Inhal(吸气/夹紧 IO 位) | Blow(吹气/松开 IO 位) | 时序 |
+|---|---|---|---|
+| **Suction 吸取**(默认) | 吸真空电磁阀 | 破真空吹气 |到位→吸真空→等 WaitSuction→搬运输送→破真空→等 WaitBlow→放料 |
+| **Clamp 夹爪** | 夹紧电磁阀 | 松开 | 到位→夹紧→等 WaitSuction→搬运→松开→等 WaitBlow→放料 |
+
+**交互方式**:标定/建产品时用 `CalibParame,{夹具类型},{Inhal},{Blow},{Speed},{Accel},{Power},{WaitSuction},{WaitBlow}`
+**一次性下发给机器人**;生产节拍里吸/放的 IO 时序由**机器人程序自持**(上位机不逐步遥控)。
+标定向导与手动调试用 `CalibOutIO,1/0` 直接开关(向导第 2 步的「吸气/破真空」按钮即此)。
+
+---
+
+## 六、Feeder 分支(供料 + 背光联动)
+
+**控制链路**:`Team.FFFeederService` 独立类库——
+- TEAM 品牌:TouchSocket TcpClient,ASCII 大括号命令:`{K1}/{K0}` 背光开关、`{UV1}~{UV26}` 选振动组、
+  `{DV}` 保存、`{HC}` 停止、`{CA}~{CI},{毫秒}` 方向振动(前/后/左/右/斜向);振幅/频率/相位经寄存器读写
+  (平台起始地址 300、料斗 742、序列 950);断线 1s 重连。
+- Afag 品牌:aflex 协议(`SetAuxPowerOut` 背光/辅助输出,振动强度/方向/配置号读写)。
+
+**与视觉/机器人联动(生产)**:
+1. `ExecuteFeederVisionTaskAsync`:解析触发命令选项(**是否先振动 / 是否先拍照**);
+2. `ExecuteFeederForPhotoBefore`:先振动供料 + `OpenLightAsync` 开环形背光(带亮度与延时);
+3. 拍照失败按重试上限重试 → 运行视觉流程 → 输出**点位集合**(Feeder 场景常为多目标);
+4. 产品流程里 `FeederStockWork`(振动供料任务)与机器人取料节拍配合;`FeederClearWork` 清料任务
+   (配置 `Config\FeederClearanceTasksConfiguration.cfg`,支持按编号取消)。
+
+**与标定联动**:向导第 2 步「下一步」时 `Feeder.OpenLightAsync()` 开背光;九点每个点拍照前
+`OpenLight()` + 设亮度——保证背光曝光一致。
+
+---
+
+## 七、与我们的兼容映射(差距清单)
+
+| 2.0 能力 | 本程序现状 | 动作 |
+|---|---|---|
+| 机器人 TCP 协议(全指令+回显确认) | ✅ EpsonRobot 已同源实现 | 无 |
+| 相机多品牌 + 软触发 | ✅ 已移植(GenImage 载体更通用) | 无 |
+| 吸气/夹爪 PickInfo + CalibParame/CalibOutIO | ✅ 已实现 | 无 |
+| Feeder TEAM/Afag TCP + 配方 | ✅ 已实现 | 无 |
+| 标定向导 7 步 + 旋转预备标定 + 九点 + 验证 | ✅ 已移植 | 无 |
+| **RemoteCommandService(触发命令→拍照→视觉→回坐标)** | ❌ 只有 FlowRunner 心跳的简化版 | **补"视觉触发服务"**:触发命令映射到我们的流程(视觉 procedure=一条流程),跑完按输出项(点位项经标定换算)应答——完美契合我们的流程配置模式 |
+| **输出点位自动标定换算(IsPointTran)** | ❌ | 同上,作为视觉触发服务的输出选项 |
+| 设置页添加对话框(AddRobot/AddCamera/AddFeeder…) | ❌(配置文件直改) | 移植 UI |
+| 标定 Feeder 背光联动 / 畸变校正 | ❌ | 补 |
+| 移动相机换算(J4/XY 模组 robotPos 修正) | ✅ 已移植 | 无 |
+
+> 实施建议:第 1、2 行(视觉触发服务 + 点位换算输出)是"我们在流程里配置、对外当视觉服务器"的
+> 关键缺口——做好了,机器人侧协议与 2.0 完全一致,现场无需改机器人程序。
+> 该服务适配层薄、验收标准清晰,适合派高级工程师 agent 实施;架构侧由本侧验收。

+ 18 - 0
ExE/win-x64/AppData.dat

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AppData>
+  <IsNeutral>false</IsNeutral>
+  <IsUseCustomName>false</IsUseCustomName>
+  <IsUseCustomVersion>false</IsUseCustomVersion>
+  <CustomVersion>4.4.0</CustomVersion>
+  <IsUseCustomCopyright>false</IsUseCustomCopyright>
+  <IsHideWelcomePage>false</IsHideWelcomePage>
+  <IsHideGuidePage>false</IsHideGuidePage>
+  <IsHideHelp>false</IsHideHelp>
+  <IsHideLogo>false</IsHideLogo>
+  <IsHideLoginLogo>false</IsHideLoginLogo>
+  <IsHideCopyright>false</IsHideCopyright>
+  <IsHideMultiLanguage>false</IsHideMultiLanguage>
+  <IsHideGuideLine>false</IsHideGuideLine>
+  <IsHideServerAppLOGO>false</IsHideServerAppLOGO>
+  <IsRightLayout>false</IsRightLayout>
+</AppData>

+ 4 - 0
ExE/win-x64/AwakenGPUToolLog.txt

@@ -0,0 +1,4 @@
+Awake Gpu start
+GPU OK.
+vServerApp doesn't exist, GpuTool exit.
+Awake Gpu end.

+ 234 - 0
ExE/win-x64/Calibration/Calib_20260908_094954/Calib_20260908_094954.json

@@ -0,0 +1,234 @@
+{
+  "Id": "d5da2c7f-6da4-413a-906c-b2857119ec00",
+  "Name": "Calib1",
+  "DateTime": "2024-11-02T14:44:58.1596052+08:00",
+  "CameraName": "左相机",
+  "CameraID": "235e7aac-a35a-4d20-8380-4e498e8458cf",
+  "RobotId": "7f9e61fd-42d7-4d85-ae75-6e609e31cf5e",
+  "FeederId": "516d0d24-1258-4a17-aa0f-1625ad77d57c",
+  "CameraMount": 1,
+  "Pick": {
+    "PickPlaceModel": 0,
+    "Inhal": 11,
+    "Blow": 12
+  },
+  "Brightness": 29,
+  "ExposureTime": 30000.0,
+  "Gain": 0.0,
+  "CenterPoint": {
+    "Number": 0,
+    "Description": null,
+    "X": 349.109,
+    "Y": -208.093,
+    "Z": -194.833,
+    "U": -32.9108,
+    "V": 0.0,
+    "W": 0.0,
+    "Hand": 1,
+    "Local": 0,
+    "Tool": 0
+  },
+  "HomePoint": {
+    "Number": 0,
+    "Description": null,
+    "X": 379.475,
+    "Y": 162.132,
+    "Z": -31.7914,
+    "U": 75.3262,
+    "V": 0.0,
+    "W": 0.0,
+    "Hand": 1,
+    "Local": 0,
+    "Tool": 0
+  },
+  "Width": 200.0,
+  "Height": 150.0,
+  "Angle": 0.0,
+  "Tool": {
+    "Number": 0,
+    "X": 0.71235775426145087,
+    "Y": -1.2416064719936402,
+    "Z": 0.0
+  },
+  "Arm": {
+    "Number": 0,
+    "Length": 0.0,
+    "Angle": 0.0
+  },
+  "Speed": 20,
+  "Accel": 40,
+  "WaitPhoto": 200,
+  "WaitSuction": 200,
+  "WaitBlow": 800,
+  "Power": true,
+  "MarkPoint": null,
+  "CalibPoints": [
+    {
+      "Number": 1,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 274.1483,
+        "Y": -308.122437
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 2225.894,
+        "Y": 1360.805
+      }
+    },
+    {
+      "Number": 2,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 274.109,
+        "Y": -208.122452
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 2786.008,
+        "Y": 1360.425
+      }
+    },
+    {
+      "Number": 3,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 274.069733,
+        "Y": -108.122459
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 3346.887,
+        "Y": 1360.158
+      }
+    },
+    {
+      "Number": 4,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 349.069733,
+        "Y": -108.09301
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 3346.294,
+        "Y": 1781.268
+      }
+    },
+    {
+      "Number": 5,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 349.109,
+        "Y": -208.093
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 2786.048,
+        "Y": 1781.329
+      }
+    },
+    {
+      "Number": 6,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 349.1483,
+        "Y": -308.093
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 2226.327,
+        "Y": 1781.426
+      }
+    },
+    {
+      "Number": 7,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 424.1483,
+        "Y": -308.063538
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 2226.339,
+        "Y": 2201.805
+      }
+    },
+    {
+      "Number": 8,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 424.109,
+        "Y": -208.063553
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 2786.018,
+        "Y": 2201.716
+      }
+    },
+    {
+      "Number": 9,
+      "Description": null,
+      "Robot": {
+        "IsEmpty": false,
+        "X": 424.069733,
+        "Y": -108.06356
+      },
+      "Pixel": {
+        "IsEmpty": false,
+        "X": 3346.248,
+        "Y": 2201.97
+      }
+    }
+  ],
+  "RobotCameraRotationMatrix": [
+    [
+      -0.00039269787836489429,
+      0.99999992289418516
+    ],
+    [
+      0.999999922894185,
+      0.00039269787836489412
+    ]
+  ],
+  "AffineTransformationMaterial": [
+    [
+      -3.6143198841471821E-05,
+      0.17828111532852808,
+      31.576800725724663
+    ],
+    [
+      0.1785251900198136,
+      8.3037898441083288E-05,
+      -707.08240626487213
+    ]
+  ],
+  "CalibrationResult": {
+    "ScaleX": -3.6143198841471821E-05,
+    "ScaleY": 8.3037898441083288E-05,
+    "Rotate": 45.039193386736031,
+    "TranslationX": 31.576800725724663,
+    "TranslationY": -707.08240626487213,
+    "RMSX": 0.03058195970284373,
+    "RMSY": 0.044760949474671616,
+    "MaxErrorValueX": 0.046852539482301836,
+    "MaxErrorValueY": 0.044972356646240996
+  },
+  "CalibrationTestResult": {
+    "MaxErrorValueX": 0.061674255571574577,
+    "MaxErrorValueY": 0.052862600350138678,
+    "MinErrorValueX": -0.041650144393827304,
+    "MinErrorValueY": -0.044546214481258062,
+    "RMSEX": 0.041158149308754305,
+    "RMSEY": 0.0359650798823485
+  }
+}

+ 3 - 0
ExE/win-x64/Calibration/CalibrationList.json

@@ -0,0 +1,3 @@
+{
+  "aefc8815-495f-4b0e-b4ca-f72380f6855b": "Calib_20260908_094954"
+}

+ 34 - 0
ExE/win-x64/Config/SystemConfiguration.json

@@ -0,0 +1,34 @@
+{
+  "Title": "Team Vision",
+  "CompanyTitle": null,
+  "SoftwareVersion": "1.0.0.0",
+  "PluginLog": {
+    "RootPath": "Logs",
+    "CommonPattern": "{year}\\{time}.log",
+    "TaskPattern": "{year}\\{time}\\{flow}\\{task}\\{time}.log",
+    "DefaultStoreVerbosity": 2,
+    "DefaultDisplayVerbosity": 2,
+    "MaxFileMB": 10,
+    "RetentionDays": 3650
+  },
+  "Font": {
+    "TopBarHeight": 96,
+    "CenterTitleFont": 48,
+    "StatusBarHeight": 38,
+    "StatusBarFont": 16,
+    "NavButtonWidth": 88,
+    "NavButtonHeight": 80,
+    "NavButtonFont": 23,
+    "ThemeIconSize": 33,
+    "NavIconSize": 38
+  },
+  "Theme": "Light",
+  "AccentColor": "#2D6CDF",
+  "Language": "zh-CN",
+  "Vision": {
+    "EngineName": "VisionPro9.0",
+    "HomePageFrameCount": 1,
+    "HomeFrameArrange": 1,
+    "FrameNames": "\u4E3B\u753B\u9762"
+  }
+}

+ 10 - 0
ExE/win-x64/Products/产品1/flows.meta.json

@@ -0,0 +1,10 @@
+[
+  {
+    "Name": "流程1",
+    "TriggerType": 0,
+    "LoopCount": 1,
+    "CanvasWidth": 5000.0,
+    "CanvasHeight": 3500.0,
+    "LoopIntervalMs": 10
+  }
+]

+ 3 - 0
ExE/win-x64/Products/产品1/global_vars.json

@@ -0,0 +1,3 @@
+{
+  "Variables": []
+}

+ 15 - 0
ExE/win-x64/Products/产品1/product.json

@@ -0,0 +1,15 @@
+{
+  "Sequence": 0,
+  "Name": "产品1",
+  "HomeFrames": [
+    {
+      "Name": "画布1",
+      "ShowDot": true
+    }
+  ],
+  "HomeFrameArrange": 1,
+  "Description": "",
+  "HomeFrameCount": 0,
+  "HomeFrameNames": "",
+  "HomeFrameShowDot": ""
+}

BIN
ExE/win-x64/Products/产品1/流程1.aas


BIN
ExE/win-x64/Runtime/Basler.Pylon.dll


BIN
ExE/win-x64/Runtime/DryIoc.dll


BIN
ExE/win-x64/Runtime/GxIAPINET.dll


BIN
ExE/win-x64/Runtime/Halcon23.11/halcon.dll


BIN
ExE/win-x64/Runtime/Halcon23.11/halcondotnet.dll


BIN
ExE/win-x64/Runtime/Halcon23.11/hdevenginedotnet.dll


BIN
ExE/win-x64/Runtime/HandyControl.dll


BIN
ExE/win-x64/Runtime/HslCommunication.dll


BIN
ExE/win-x64/Runtime/MVSDK_Net.dll


BIN
ExE/win-x64/Runtime/MahApps.Metro.IconPacks.Core.dll


BIN
ExE/win-x64/Runtime/MahApps.Metro.IconPacks.Material.dll


BIN
ExE/win-x64/Runtime/MathNet.Numerics.dll


BIN
ExE/win-x64/Runtime/MessagePack.Annotations.dll


BIN
ExE/win-x64/Runtime/MessagePack.dll


BIN
ExE/win-x64/Runtime/Microsoft.Bcl.AsyncInterfaces.dll


BIN
ExE/win-x64/Runtime/Microsoft.Extensions.Logging.Abstractions.dll


BIN
ExE/win-x64/Runtime/Microsoft.NET.StringTools.dll


BIN
ExE/win-x64/Runtime/Microsoft.Xaml.Behaviors.dll


BIN
ExE/win-x64/Runtime/MvCamCtrl.Net.dll


BIN
ExE/win-x64/Runtime/MvCameraAcqTool.dll


BIN
ExE/win-x64/Runtime/MySqlConnector.dll


BIN
ExE/win-x64/Runtime/NLog.dll


BIN
ExE/win-x64/Runtime/Newtonsoft.Json.dll


BIN
ExE/win-x64/Runtime/OpenCvSharp.dll


BIN
ExE/win-x64/Runtime/OpenCvSharpExtern.dll


BIN
ExE/win-x64/Runtime/Plugins/CodeForge.dll


BIN
ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.Detection.dll


BIN
ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.ImageProcessing.dll


BIN
ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.Logic.dll


BIN
ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.Measurement.dll


BIN
ExE/win-x64/Runtime/Plugins/HalconPlugins/Plugins.Halcon.dll


BIN
ExE/win-x64/Runtime/Plugins/HalconPlugins/halcondotnet.dll


BIN
ExE/win-x64/Runtime/Plugins/Plugins.Feeder.dll


BIN
ExE/win-x64/Runtime/Plugins/Plugins.Script.dll


BIN
ExE/win-x64/Runtime/Plugins/Plugins.Standard.dll


BIN
ExE/win-x64/Runtime/Plugins/Plugins.Vm.dll


BIN
ExE/win-x64/Runtime/Plugins/Plugins.Vpp.dll


BIN
ExE/win-x64/Runtime/Plugins/VmPlugins/Plugins.Vm.Module.dll


BIN
ExE/win-x64/Runtime/Plugins/VppPlugins/Plugins.Vpp.Detection.dll


BIN
ExE/win-x64/Runtime/Plugins/VppPlugins/Plugins.Vpp.Measurement.dll


BIN
ExE/win-x64/Runtime/Prism.DryIoc.Wpf.dll


BIN
ExE/win-x64/Runtime/Prism.Wpf.dll


BIN
ExE/win-x64/Runtime/Prism.dll


BIN
ExE/win-x64/Runtime/PropertyGridLib.dll


BIN
ExE/win-x64/Runtime/SciCamera.Net.dll


BIN
ExE/win-x64/Runtime/System.Buffers.dll


BIN
ExE/win-x64/Runtime/System.Collections.Immutable.dll


BIN
ExE/win-x64/Runtime/System.Data.SQLite.dll


BIN
ExE/win-x64/Runtime/System.Diagnostics.DiagnosticSource.dll


BIN
ExE/win-x64/Runtime/System.IO.Pipelines.dll


BIN
ExE/win-x64/Runtime/System.Memory.dll


BIN
ExE/win-x64/Runtime/System.Numerics.Vectors.dll


BIN
ExE/win-x64/Runtime/System.Runtime.CompilerServices.Unsafe.dll


BIN
ExE/win-x64/Runtime/System.Text.Encodings.Web.dll


BIN
ExE/win-x64/Runtime/System.Text.Json.dll


BIN
ExE/win-x64/Runtime/System.Threading.Tasks.Extensions.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Camera.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Communication.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Core.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Database.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Feeder.dll


BIN
ExE/win-x64/Runtime/TeamAAS.FlowEngine.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Global.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Motion.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Robot.dll


BIN
ExE/win-x64/Runtime/TeamAAS.Vision.dll


BIN
ExE/win-x64/Runtime/Vm4.4/PropertyGrid.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.AppData.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.CalibGuide.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.CodeCompletion.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.CommonData.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.Compress.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.Controls.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.Core.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.CostomDialog.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.ExtensionMethod.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.ExternalCall.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.Framework.Container.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.ModuleControl.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.PcUI.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.PlatformSDKCS.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.UnRedo.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.User.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.Util.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.Utility.dll


BIN
ExE/win-x64/Runtime/Vm4.4/VM.WatchDog.dll


Some files were not shown because too many files changed in this diff