|
|
@@ -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);
|