Forráskód Böngészése

fix(d2-02-t3): path B中心DB缺失时回退硬件EEPROM读(保健壮性,避免中心0扫错区)

huangjie 2 napja
szülő
commit
23bb0899eb
1 módosított fájl, 14 hozzáadás és 6 törlés
  1. 14 6
      ivf_tl_operate_2.0/control/ivf_tl_Com/HouseBin.cs

+ 14 - 6
ivf_tl_operate_2.0/control/ivf_tl_Com/HouseBin.cs

@@ -1577,23 +1577,31 @@ namespace ivf_tl_Com
                         try
                         {
                             // 自动对焦重构 Task2.2:读 per-well 运动范围(半幅)+中心(DB),逐 well 注入引擎。
-                            //   中心 = DB 该 well 的水平电机位/E方清晰位(取代原硬件 EEPROM 回读 + 引擎固定 90000);
+                            //   中心 = DB 该 well 的水平电机位/E方清晰位(取代原引擎固定 90000);
                             //   半幅/曝光 = well 级覆盖→设备级默认→引擎默认(由 FocusRangeResolver 就近解析)。
                             var range = ReadWellFocusRange(well);
+                            // DB优先 + 硬件兜底:DB 中心缺失(未同步/≤0,path A :1519 用 eepromClearPosition>0 守,证明 0 是真实可能状态)时
+                            //   回退老 path B 的硬件 EEPROM 回读,避免中心=0 导致 Z 粗扫落到 [0,VHalf]、错过真实焦面(~88000)而该 well 静默对焦失败。
+                            int hCenter = range.HCenter > 0 ? range.HCenter : Math.Max(0, lease.Serial.ReadWellHorizontalPosWait(well));
+                            int vCenter = range.VCenter > 0 ? range.VCenter : Math.Max(0, lease.Serial.ReadWellFocusZeroWait(well));
+                            if (range.HCenter <= 0 || range.VCenter <= 0)
+                            {
+                                HouseLogEvent?.Invoke(House.houseSn, DateTime.Now, $"[{House.houseSn}][{this.PortName}][本地对焦:{well}号well DB清晰位/水平位未同步(H={range.HCenter},V={range.VCenter}),回退硬件EEPROM读 H={hCenter},V={vCenter}]", LogEnum.HouseInfo);
+                            }
                             var engine = new CalibrationEngine(lease.Serial, lease.Camera)
                             {
                                 Log = msg => HouseLogEvent?.Invoke(House.houseSn, DateTime.Now, $"[{House.houseSn}][{this.PortName}][本地对焦]{msg}", LogEnum.HouseInfo),
                                 HFineRange = range.HHalf,        // 水平微调半幅(围绕 HCenter)
-                                ZCoarseCenter = range.VCenter,   // Z 粗扫中心=该 well 清晰位(DB eeprom_clear_position),取代引擎固定 90000
+                                ZCoarseCenter = vCenter,         // Z 粗扫中心=该 well 清晰位(DB优先,缺失回退硬件),取代引擎固定 90000
                                 ZCoarseHalf = range.VHalf,       // Z 粗扫半幅
                                 ExpLo = range.ExpLo,             // 曝光二分下限
                                 ExpHi = range.ExpHi,             // 曝光二分上限
                             };
                             // CalibrateWell 的两参语义(已核 CalibrationEngine):
-                            //   eepromHPos → 水平居中扫描中心(初始移位 + ScanForCenter 中心);传 DB 水平位 range.HCenter
-                            //   eepromZ    → 引擎当前未使用(Z 粗扫中心取字段 ZCoarseCenter,已上面设为 range.VCenter);
-                            //                仍传 DB 清晰位 range.VCenter 占位,避免硬件回读且语义一致。
-                            var wc = engine.CalibrateWell(well, Math.Max(0, range.HCenter), Math.Max(0, range.VCenter));
+                            //   eepromHPos → 水平居中扫描中心(初始移位 + ScanForCenter 中心);传 hCenter(DB优先,缺失回退硬件)
+                            //   eepromZ    → 引擎当前未使用(Z 粗扫中心取字段 ZCoarseCenter,已上面设为 vCenter);
+                            //                仍传 vCenter 占位,语义一致。
+                            var wc = engine.CalibrateWell(well, hCenter, vCenter);
                             if (wc == null)
                             {
                                 HouseLogEvent?.Invoke(House.houseSn, DateTime.Now, $"[{House.houseSn}][{this.PortName}][{well}号well本地对焦无结果,跳过该well]", LogEnum.HouseInfo);