using CommunityToolkit.Mvvm.Messaging; using MegaRobo.C00225155.Entities; using MegaRobo.C00225155.Entities.Entity_DB; using MegaRobo.Contract; using MegaRobo.ControlDevices; using MegaRobo.Entities; using MegaRobo.Logger; using MegaRobo.PipetteTool.HamiltonConsole.PipetteDevices.Hamilton5mlDevices; using MegaRobo.PipetteTool.HamiltonConsole.PipetteDevices.HamiltonDevices; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Xml.Linq; namespace MegaRobo.C00225155.AppServer.ExecuteWorks { /// /// 这里主要是针对配置站服务,控制1ml移液枪的逻辑 /// public partial class StationService_ReactionProcessing : StationServiceBase { /// /// 1ml枪头 Z轴初始化 /// /// private async Task GunZAxisInit_M1() { this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}Z轴初始化"); //莫名其妙的每次初始化都需要重新连接一次,不知道为什么 pipetteService_1ml.Disconnect(); await pipetteService_1ml.ConnectionAsync(); var dictResult = await pipetteService_1ml.InitZaxis(); if (!dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "00")) { string errorkey = this.GetPipetteReturnCode(dictResult.LastOrDefault().Value); this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}Z轴初始化失败,{PipetteErrorDic[errorkey]}"); } } /// /// 1ml枪头 总初始化 /// /// private async Task GunAllInit_M1() { this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}总初始化"); var dictResult = await pipetteService_1ml.InitZaxis(); if (dictResult != null) { dictResult = await pipetteService_1ml.InitPump(); } if (!dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "00")) { string errorkey = this.GetPipetteReturnCode(dictResult.LastOrDefault().Value); this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}总初始化失败,{PipetteErrorDic[errorkey]}"); } } /// /// 1ml枪头 取TIP头 /// /// private async Task GunPickUpTip_M1(double tipVolumn) { ushort tipType = 7; if (tipVolumn == 300)//300ul slim的有滤芯的、导电的枪头 { tipType = 9; } else if (tipVolumn == 50) //50ul的有滤芯的、导电的枪头 { tipType = 3; } else { tipType = 7;//1000ul的有滤芯的、导电的枪头 } this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}取Tip"); var dictResult = await pipetteService_1ml.TipInstall(tipType: tipType); await pipetteService_1ml.InitZaxis(); //Z轴带动泵模块向上运动到最高处 if (dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "00") || dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "76")) { this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}取Tip成功"); return true; } else if (!dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "00")) { string errorkey = this.GetPipetteReturnCode(dictResult.LastOrDefault().Value); WeakReferenceMessenger.Default.Send(new ConfirmMessage() { Header = $"{DeviceNames.Pipette_React_1ml}取Tip失败", Content = $"{PipetteErrorDic[errorkey]}", OkButtonContent = "继续", CancelButtonContent = "取消", }); this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}取Tip失败,{PipetteErrorDic[errorkey]}"); await GunAllInit_M1(); return false; } return false; } public async Task ZMove(uint pos) { IEnumerable pipetteIdList = new List { 1 }; pipetteIdList = pipetteService_1ml.PipetteList.Select(x => x.Id); foreach (var id in pipetteIdList) { var dictRes = await pipetteService_1ml.MoveZaxis(0, id); } } /// /// 1ml枪头 丢弃Tip头 /// /// private async Task GunDiscardTip_M1() { this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}丢Tip"); //var dictResult = await pipetteService_1ml.TipUninstall(1); //await pipetteService_1ml.InitZaxis(); //if (!dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "00")) //{ // this.Logger.LogError($"{DeviceNames.Pipette_Config_1ml}丢Tip失败,{dictResult.LastOrDefault().Value}"); //} var dictResult = await pipetteService_1ml.InitPump(); await pipetteService_1ml.InitZaxis(); if (!dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "00")) { string errorkey = this.GetPipetteReturnCode(dictResult.LastOrDefault().Value); WeakReferenceMessenger.Default.Send(new ConfirmMessage() { Header = $"{DeviceNames.Pipette_React_1ml}丢Tip失败", Content = $"{PipetteErrorDic[errorkey]}", OkButtonContent = "继续", CancelButtonContent = "取消", }); this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}丢Tip失败,{PipetteErrorDic[errorkey]}"); await GunAllInit_M1(); } } private async Task GunAbsorb_M1(string funcType, string liquidName, int tiporder, double absorbVolumn) { IList listId = new List() { 1 }; var curLiqud = await this.dataAccessService.LoadEntitiesAsync(x => x.FuncType == funcType && x.LiquidName == liquidName && (x.TipType == tiporder)); var curLiqud_M1 = curLiqud.FirstOrDefault(); curLiqud_M1.LiquidVolume = (int)Math.Abs(absorbVolumn * curLiqud_M1.Ratio); //for (int i = 1; i < 3; i++) //若吸液失败,二次吸液 { this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}开始吸液,吸液量{curLiqud_M1.LiquidVolume}ul"); var dictResult = await OnSuckFluid(pipetteService_1ml, listId, curLiqud_M1, 1, 1); if (dictResult != null) { if (dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "00")) { this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}吸液成功"); await pipetteService_1ml.InitZaxis(); } else { string errorkey = this.GetPipetteReturnCode(dictResult.LastOrDefault().Value); this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}吸液失败,{PipetteErrorDic[errorkey]}"); WeakReferenceMessenger.Default.Send(new ConfirmMessage() { Header = $"{DeviceNames.Pipette_React_1ml}吸液失败", Content = $"{PipetteErrorDic[errorkey]}", OkButtonContent = "继续", CancelButtonContent = "取消", }); await pipetteService_1ml.InitZaxis(); } } else { await pipetteService_1ml.InitZaxis(); } } } /// /// 1ml枪头 分液 /// /// 液体名称 /// 分液体积 /// private async Task GunDispensing_M1(string funcType, string liquidName, int tipOrder, double volumn) { Liquid_lml_React curLiqud_M1 = new Liquid_lml_React(); IList listId = new List() { 1 }; this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}开始分液,分液量{volumn}ul"); var curLiqud = await this.dataAccessService.LoadEntitiesAsync(x => x.FuncType == funcType && x.LiquidName == liquidName && (x.TipType == tipOrder)); curLiqud_M1 = curLiqud.FirstOrDefault(); var dictResult = await OnDispenFluid(pipetteService_1ml, listId, curLiqud_M1, 100);//(uint)Math.Abs(volumn) if (!dictResult.All(x => this.GetPipetteReturnCode(x.Value) == "00")) { string errorkey = this.GetPipetteReturnCode(dictResult.LastOrDefault().Value); this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}分液失败,{PipetteErrorDic[errorkey]}"); WeakReferenceMessenger.Default.Send(new ConfirmMessage() { Header = $"{DeviceNames.Pipette_React_1ml}分液失败", Content = $"{PipetteErrorDic[errorkey]}", OkButtonContent = "继续", CancelButtonContent = "取消", }); await pipetteService_1ml.InitZaxis(); } else { this.Logger.LogInformation($"{DeviceNames.Pipette_React_1ml}分液成功"); await pipetteService_1ml.InitZaxis(); } } private async Task> OnSuckFluid(PipetteService pipetteService, IList listId, Liquid_lml_React liquidProduct, int subid, int asperIndex = 1) { IDictionary resultData; try { if (liquidProduct == null) return null; uint platformCode = (uint)liquidProduct.PlatformCode;//平台平台编号 uint liquidReagentCode = (uint)liquidProduct.LiquidParamId; //移液枪液体编号 uint vol = (uint)liquidProduct.LiquidVolume;//吸液体积 uint ge = (uint)liquidProduct.ContainerPlateIndex;//容器编号 uint lld = (uint)liquidProduct.LiqLedetec;//是否液面探测 uint pos = (uint)liquidProduct.AspireHeight; IList<(uint id, uint vol, uint lq, uint pos, uint ge, uint go, uint lb)> idArrayParams = new List<(uint id, uint vol, uint lq, uint pos, uint ge, uint go, uint lb)>(); foreach (var id in listId) { idArrayParams.Add((id, vol, liquidReagentCode, pos, ge, platformCode, lld)); } resultData = await pipetteService.SuckFluid(idArrayParams); } catch (Exception ex) { this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}吸液异常:{ex}"); throw; } return resultData; } private async Task> OnDispenFluid1(PipetteService pipetteService, IList listId, Liquid_lml_React liquidProduct, uint dispos) { IDictionary resultData = new Dictionary(); try { if (liquidProduct == null) return null; uint platformCode = (uint)liquidProduct.PlatformCode;//平台平台编号 uint liquidReagentCode = (uint)liquidProduct.LiquidParamId; //移液枪液体编号 uint vol = (uint)liquidProduct.LiquidVolume;//吸液体积 uint ge = (uint)liquidProduct.ContainerPlateIndex;//容器编号 uint lld = (uint)liquidProduct.LiqLedetec;//是否液面探测 uint pos = dispos;//吸液高度 IList<(uint id, uint vol, uint lq, uint pos, uint ge, uint go, uint lb)> idArrayParams = new List<(uint id, uint vol, uint lq, uint pos, uint ge, uint go, uint lb)>(); foreach (var id in listId) { idArrayParams.Add((id, vol, liquidReagentCode, pos, ge, platformCode, 0)); } resultData = await pipetteService.DrainageFluid(idArrayParams); } catch (Exception ex) { this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}分液异常,异常原因:{ex}"); } return resultData; } private async Task> OnDispenFluid(PipetteService pipetteService, IList listId, Liquid_lml_React liquidProduct, uint volume) { IDictionary resultData = new Dictionary(); try { if (liquidProduct == null) return null; uint platformCode = (uint)liquidProduct.PlatformCode;//平台平台编号 uint liquidReagentCode = (uint)liquidProduct.LiquidParamId;//移液枪液体编号 uint ge = (uint)liquidProduct.ContainerPlateIndex;//容器编号 uint lld = (uint)liquidProduct.LiqLedetec;//是否液面探测 uint pos = (uint)liquidProduct.DispenHeight;//分液高度 uint vol = volume; IList<(uint id, uint vol, uint lq, uint pos, uint ge, uint go, uint lb)> idArrayParams = new List<(uint id, uint vol, uint lq, uint pos, uint ge, uint go, uint lb)>(); foreach (var id in listId) { idArrayParams.Add((id, vol, liquidReagentCode, pos, ge, platformCode, 0)); } resultData = await pipetteService.DrainageFluid(idArrayParams); } catch (Exception ex) { this.Logger.LogError($"{DeviceNames.Pipette_React_1ml}分液异常,异常原因:{ex.ToString()}"); } return resultData; } } }