using DataEntity; using DataEntity.Share; using DataRWDAL; using DriverLib.Engine; using System; using System.Collections.Generic; using System.Linq; using System.Xml; using XCommon; using XCommon.Log; using XCore; using XCoreBLL; using XHandler.Controls.Run.Com; using XHandler.View; using XImagingXhandler.XDAL; using DataCalcDAL; using System.Configuration; using HxEnum; using XHandler.Class.DataEx; using NPOI.SS.Formula.Eval; using DataEntity.Rack; using static HxEnum.OperationTypeEnum; using System.Reflection; using XHandler.View.MethodProperty; using MySqlX.XDevAPI.Common; using XImaging.Automation.Service.Interface; using System.Windows; using System.Collections.ObjectModel; namespace XHandler.Controls { /// /// 文件转板执行 /// public class FileMoveLabwareControl { string strCurrentCulture = ""; WellCalc wellCalc = new WellCalc(); LatticeBll latticeBll = new LatticeBll(); FileMoveLabwareBll fileMoveLabwareBll = new FileMoveLabwareBll(); public RunWnd launchView = null; LiquidAccuracyBll liquidAccuracyBll = new LiquidAccuracyBll(); WellCalcOfGripper wellCalcOfGripper= new WellCalcOfGripper(); GripTransportBll gripTransportBll=new GripTransportBll(); public FileMoveLabwareControl(string strCurrentCulture) { this.strCurrentCulture = strCurrentCulture; } #region 执行文件转板,返回结果字符串 /// /// 执行文件转板,返回结果字符串 /// /// 板位节点信息 /// 装载方法属性节点对象 /// z轴安全距离 /// 0:连接谁;1:仿真 /// public bool ExecuteFileMoveLabware(XmlNode xmlEnv, XmlNode methodNode, float zAxisVal, bool isSimulator) { bool result = true; HxResult ret = new HxResult(); if (launchView._cancelSource.IsCancellationRequested) { result = false; return result; } #region Start Log if (strCurrentCulture.Equals("zh-CN")) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strStart.ToString()); } else { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】start:"); } #endregion #region 数据准备 var platformNodeList = xmlEnv.SelectNodes("platform"); MethodFileMoveLabware methodFileMoveLabware = fileMoveLabwareBll.GenerateMethodFileMoveLabwareDataByXmlNode(methodNode); int recordAllCount = methodFileMoveLabware.transferDataTable.Rows.Count; // 文件记录总数 int recordIndex = 0; // 循环控制总的切分次数 TipsTable tipsTable = new TipsTable(); // 执行的孔数据对象 #endregion #region 数据检查 //只有选择夹爪臂才可以执行转板 if (methodFileMoveLabware == null) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.RunFileMoveLiquidResource.strFileMoveLiquidDataCheckError.ToString()); result = false; return result; } else { if (methodFileMoveLabware.armText.Equals("夹爪臂")) { } else { if (strCurrentCulture.Equals("zh-CN")) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.RunFileMoveLabwareResource.strFileMoveLabwareArmError.ToString()); LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.RunFileMoveLabwareResource.strFileMoveLabwareArmError.ToString()); } else { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】selected arm of device isn't support pick board."); LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】selected arm of device isn't support pick board."); } result = false; return result; } } #endregion bool shakerExecuteFinish=false;// 震荡位是否执行过 #region 数据执行 while (recordIndex < recordAllCount) { #region 抓板处理过程 string sourceLattice = methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickLattice].ToString(); string globalVariableValue = ""; globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, sourceLattice); if (!string.IsNullOrEmpty(globalVariableValue)) { sourceLattice = globalVariableValue; } XmlNode srcPlatformNode = ComUtility.GetXmlNodeByBoardName(xmlEnv.SelectNodes("platform"), sourceLattice); if (srcPlatformNode == null&& !sourceLattice.Equals("P0")) { if (strCurrentCulture.Equals("zh-CN")) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunFileMoveLabwareResource.strFileMoveLabwareOfLatticeError.ToString()); } else { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLabware.name + "】progress: the lattice of pick board is wrong! please check!"); } result = false; return result; } else { string sourceWell = methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickWell].ToString(); string sourceColumn = methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickColumn].ToString(); globalVariableValue = ""; globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, sourceWell); if (!string.IsNullOrEmpty(globalVariableValue)) { sourceWell = globalVariableValue; } globalVariableValue = ""; globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, sourceColumn); if (!string.IsNullOrEmpty(globalVariableValue)) { sourceColumn = globalVariableValue; } // 获取当前台面的夹爪坐标 List gripperCoordinates = new List(); GripperCoordinate gripperCoordinate = new GripperCoordinate(); Labware labwares = new Labware(); Lattice slattice = new Lattice(); string srcLatticeId = "0"; if (sourceColumn == "请选择" && sourceWell == "请选择") { if (strCurrentCulture.Equals("zh-CN")) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunFileMoveLabwareResource.strFileMoveLabwareSettingPickCol.ToString()); } else { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLabware.name + "】progress: the column or well on picking lattice is wrong! please check!"); } result = false; return result; } else { Labware centrifugalLabware = new Labware(); if (sourceLattice.Equals("P0")) { gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Convert.ToInt32(methodFileMoveLabware.armValue), sourceLattice); gripperCoordinate = gripperCoordinates.SingleOrDefault(x => x.lattice_num.Equals(sourceLattice)); string srcLabwareId = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateLabwareFromdb(gripperCoordinate.gripper_lattice_id).labware_id.ToString();//获取夹爪关联的耗材Id; labwares = LabwareDB.GetLabware(srcLabwareId); slattice.lattice_num = "P0"; //关联孔位的耗材对象 ObservableCollection labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labwares.labware_id); var targetWellOnLattice = labwareWellInfoList.SingleOrDefault(x => x.labware_well_name.Equals(sourceWell)); if (targetWellOnLattice != null) { centrifugalLabware = LabwareDB.GetLabware(targetWellOnLattice.well_labware_id); } } else { XmlNode srcXml = srcPlatformNode.SelectSingleNode("labware[@id='" + srcPlatformNode.SelectNodes("labware").Count + "']"); string srcLabwareId = srcXml.SelectSingleNode("labware_id").InnerText; srcLatticeId = srcPlatformNode.SelectSingleNode("lattice_id").InnerText;//被截掉"P"的板位编号名 if (srcLatticeId == "1") { MethodShake methodShake = new MethodShake(); methodShake.modeVal = 1; methodShake.shakeMoveSpeed = 50; methodShake.shakeMoveAngle = 230; launchView.SetWaitOne();//暂停 if (!shakerExecuteFinish) { ret = new ShakerBll().ExecuteShake(methodShake, isSimulator); if (ret.Result != ResultType.Success) { if (strCurrentCulture.Equals("zh-CN")) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunShakeResource.strShakeMoveFailed.ToString() + ret.AlarmInfo); LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunShakeResource.strShakeMoveFailed.ToString() + ret.AlarmInfo); } else { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】progress: shake was failed! Error info:" + ret.AlarmInfo); LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】progress: shake was failed! Error info:" + ret.AlarmInfo); } result = false; return result; } shakerExecuteFinish = true; } } Lattice srcLattice = null; TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断 int armId = Shared.DeviceArmList.FirstOrDefault(x => x.arm_type.Equals(1)).device_arm_id; if (tabletopTemplate == null) { srcLattice = LatticeDB.GetLatticeDataByIdFromdb("P" + srcLatticeId, Convert.ToInt32(armId), Shared.SoftwareInformation.software_device_number); } else { srcLattice = LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb("P" + srcLatticeId, Convert.ToInt32(armId), Shared.SoftwareInformation.software_device_number, tabletopTemplate.tabletopid); } labwares = LabwareDB.GetLabware(srcLabwareId); // 获取当前台面的板子的坐标 slattice = DataRWDAL.LatticeDB.GetLatticeDataByIdFromdb(srcLattice.lattice_id); List dtWells = ControlCom.GenerateWellCoordinate(labwares, slattice); //板位孔坐标数据集 // 获取当前台面的夹爪坐标 gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Convert.ToInt32(methodFileMoveLabware.armValue), srcLattice.lattice_num); gripperCoordinate = gripperCoordinates.SingleOrDefault(x => x.lattice_num.Equals(slattice.lattice_num)); //离心管耗材对象 if (labwares.labware_tubeshelf_type == 1) { //关联孔位的耗材对象 ObservableCollection labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labwares.labware_id); var targetWellOnLattice = labwareWellInfoList.SingleOrDefault(x => x.labware_well_name.Equals(sourceWell)); if (targetWellOnLattice != null) { centrifugalLabware = LabwareDB.GetLabware(targetWellOnLattice.well_labware_id); } } else { centrifugalLabware = ControlCom.GetCentrifugalLabwer(labwares.piled_script); } } //以孔位为目标抓取 if (sourceWell != "请选择") { //转化成夹爪板位 List gripperCoordinateForWells = wellCalcOfGripper.GetReallyWellsLabwareCoordinatesOnLattice(labwares, gripperCoordinate); GripperCoordinateForWell gripperPickCoordinateForWell = null; gripperPickCoordinateForWell = gripperCoordinateForWells.SingleOrDefault(t => t.lattice_num.Equals(slattice.lattice_num) && t.gripper_model.Equals(Convert.ToInt32(methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickDirect])) && t.wellname.Equals(sourceWell)); int pickPart = 0; pickPart = Convert.ToInt32(methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickPart]); GripTransportMParam gripTransportMParam = new GripTransportMParam(); // 判断当前的形式和角度 gripTransportMParam.xAxisVal = (float)gripperPickCoordinateForWell.lattice_X + (float)labwares.gripper_x_offset; gripTransportMParam.yAxisVal = (float)gripperPickCoordinateForWell.lattice_Y + (float)labwares.gripper_y_offset; gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z + (float)labwares.gripper_z_offset; #region 耗材总高度 float labwareMainHeight = 0.0f; float heightOfBottomLabware = 0f;//要抓的那层的底部离板位的平面距离 //按设定的层次抓耗材 if (methodFileMoveLabware.transportMode == (int)GripTransportModeEnum.TransportAll) { if (labwares.labware_tubeshelf_type == 0) { if (centrifugalLabware.lid_in_radius < 10d) { labwareMainHeight = (float)Convert.ToDouble(centrifugalLabware.labware_height); } else { labwareMainHeight = (float)Convert.ToDouble(centrifugalLabware.labware_height); } } else { labwareMainHeight = (float)Convert.ToDouble(centrifugalLabware.labware_height); } } else if (methodFileMoveLabware.transportMode == (int)GripTransportModeEnum.TransportExceptOne)//总高度要增加最底层的高度 { var latticeDes = xmlEnv.SelectSingleNode("platform[lattice_id=" + ControlCom.GetLatticeId(Convert.ToInt32(slattice.lattice_num), false) + "]/labware[@id=1]"); Labware bottomLabware = new Labware(); if (latticeDes != null) { bottomLabware = LabwareDB.GetLabware(latticeDes.SelectSingleNode("labware_id").InnerText); heightOfBottomLabware = (float)Convert.ToDouble(bottomLabware.piled_height); } if (labwares.labware_tubeshelf_type == 0) { if (centrifugalLabware.lid_in_radius < 10d) { labwareMainHeight = (float)Convert.ToDouble(centrifugalLabware.labware_height) + heightOfBottomLabware; } else { labwareMainHeight = (float)Convert.ToDouble(centrifugalLabware.labware_height) + heightOfBottomLabware; } } else { labwareMainHeight = (float)Convert.ToDouble(labwares.labware_height) + heightOfBottomLabware; } } else if (methodFileMoveLabware.transportMode == (int)GripTransportModeEnum.TransportCount) { XmlNodeList labwareNode = xmlEnv.SelectNodes("platform[lattice_id=" + ControlCom.GetLatticeId(Convert.ToInt32(slattice.lattice_num), false) + "]/labware"); int countOfLabware = labwareNode.Count; int loopCount = countOfLabware - methodFileMoveLabware.transportCount + 1; for (int i = 1; i <= loopCount; i++) { Labware bottomLabware = new Labware(); var latticeDes = xmlEnv.SelectSingleNode("platform[lattice_id=" + ControlCom.GetLatticeId(Convert.ToInt32(slattice.lattice_num), false) + "]/labware[@id=" + (i).ToString() + "]"); if (latticeDes != null) { bottomLabware = LabwareDB.GetLabware(latticeDes.SelectSingleNode("labware_id").InnerText); heightOfBottomLabware += (float)Convert.ToDouble(bottomLabware.piled_height); } } if (labwares.labware_tubeshelf_type == 0) { if (centrifugalLabware.lid_in_radius < 10d) { labwareMainHeight = (float)Convert.ToDouble(centrifugalLabware.labware_height) + heightOfBottomLabware; } else { labwareMainHeight = (float)Convert.ToDouble(centrifugalLabware.labware_height) + heightOfBottomLabware; } } else { labwareMainHeight = (float)Convert.ToDouble(labwares.labware_height) + heightOfBottomLabware; } } #endregion if (pickPart == 0) //抓底部 { gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z - heightOfBottomLabware; gripTransportMParam.zAxisVal = gripTransportMParam.zAxisVal - heightOfBottomLabware - 1f; } else if (pickPart == 1) //抓顶部 { if (srcLatticeId == "1") { if (centrifugalLabware.lid_in_radius < 10d) { if (sourceLattice.Equals("P0")) { gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z - labwareMainHeight + (float)centrifugalLabware.gripper_z_offset + 8f; } else { gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z + (float)labwares.gripper_z_offset - labwareMainHeight + (float)centrifugalLabware.gripper_z_offset + 13f; } } else { gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z + (float)labwares.gripper_z_offset - labwareMainHeight + (float)centrifugalLabware.gripper_z_offset; } } else { if (centrifugalLabware.lid_in_radius < 10d) { if (sourceLattice.Equals("P0")) { gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z + (float)labwares.gripper_z_offset - labwareMainHeight + (float)centrifugalLabware.gripper_z_offset+12f; } else { gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z + (float)labwares.gripper_z_offset - labwareMainHeight + (float)centrifugalLabware.gripper_z_offset + 0f; } } else { gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z + (float)labwares.gripper_z_offset - labwareMainHeight + (float)centrifugalLabware.gripper_z_offset; } } } gripTransportMParam.angleVal = (float)gripperPickCoordinateForWell.gripper_rotational; gripTransportMParam.basezAxisVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["zAxisSafeVal"]); gripTransportMParam.squeezeVal = (float)gripperPickCoordinateForWell.squeezeVal; gripTransportMParam.spreadVal = (float)gripperPickCoordinateForWell.spreadVal; gripTransportMParam.gripSpeed = (float)gripperPickCoordinateForWell.gripSpeed; gripTransportMParam.gripModel = Convert.ToInt32(methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickDirect]); gripTransportMParam.gripState = 1; // 请求夹爪的状态:1:向内夹紧;2:向外张开 gripTransportMParam.gripperpowerVal = (float)gripperPickCoordinateForWell.gripperpowerVal; gripTransportMParam.objectWidth = (float)Convert.ToDouble(gripperPickCoordinateForWell.objectwidth); //调用抓取方法 launchView.SetWaitOne();//暂停 ret = gripTransportBll.ExecuteGripTransportPick(gripTransportMParam, isSimulator); string log = string.Empty; if (ret.Result != ResultType.Success) { if (strCurrentCulture.Equals("zh-CN")) { log = string.Format("【{0}】>Xhandler: 【{1}】{2}{3}{4}.{5}{6} of {7}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, Properties.MachineRunResource.strProgress, Properties.GripTransportResource.strPickError, ret.AlarmInfo, Properties.Resources.strBoardPosition, sourceWell, slattice.lattice_num); launchView.AddLogs(log); } else { log = string.Format("【{0}】>Xhandler: 【{1}】progress: the action of pick is fail! error information:{2}.lattice:{3}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, ret.AlarmInfo, sourceWell, slattice.lattice_num); launchView.AddLogs(log); } OperateDialog plsConfirmOper = null; Application.Current.Dispatcher.Invoke(new Action(() => { plsConfirmOper = new OperateDialog(strCurrentCulture.Equals("zh-CN") ? Properties.GripTransportResource.strPickFailWhatToDo : "The action of pick was fail! What do you want to do?"); plsConfirmOper.ShowDialog(); })); if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Retry) // 重试 { return ExecutePickAgain(methodFileMoveLabware, recordIndex, labwares, sourceWell, heightOfBottomLabware, slattice, gripTransportMParam, isSimulator); } else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Cancel) // 终止 { result = false; return result; } else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Continue) // 跳过 { result = true; return result; } } else { if (strCurrentCulture.Equals("zh-CN")) { log = string.Format("【{0}】>Xhandler: 【{1}】{2}{3}{4}{5} of {6}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, Properties.MachineRunResource.strProgress, Properties.GripTransportResource.strPickOk, Properties.Resources.strBoardPosition, slattice.lattice_num, sourceWell); launchView.AddLogs(log); } else { log = string.Format("【{0}】>Xhandler: 【{1}】progress: the action of pick is success! lattice:{2}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, slattice.lattice_num, sourceWell); launchView.AddLogs(log); } } } else //以板列为目标抓取 { } } } #endregion #region 放板处理过程 string targetLattice = methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.placeLattice].ToString(); globalVariableValue = ""; globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetLattice); if (!string.IsNullOrEmpty(globalVariableValue)) { targetLattice = globalVariableValue; } XmlNode tarPlatformNode = ComUtility.GetXmlNodeByBoardName(xmlEnv.SelectNodes("platform"), targetLattice); if (tarPlatformNode == null&&!targetLattice.Equals("P0")) { if (strCurrentCulture.Equals("zh-CN")) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunFileMoveLabwareResource.strFileMoveLabwareOfLatticeError.ToString()); } else { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLabware.name + "】progress: the lattice of place board is wrong! please check!"); } result = false; return result; } else { List gripperCoordinates = new List(); GripperCoordinate gripperCoordinate = new GripperCoordinate(); Labware labwares = new Labware(); Lattice slattice = new Lattice(); string tarLatticeId = "0"; string targetWell = methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.placeWell].ToString(); string targetColumn = methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.placeColumn].ToString(); globalVariableValue = ""; globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetWell); if (!string.IsNullOrEmpty(globalVariableValue)) { targetWell = globalVariableValue; } globalVariableValue = ""; globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetColumn); if (!string.IsNullOrEmpty(globalVariableValue)) { targetColumn = globalVariableValue; } if (targetColumn == "请选择" && targetWell == "请选择") { if (strCurrentCulture.Equals("zh-CN")) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunFileMoveLabwareResource.strFileMoveLabwareSettingPlaceCol.ToString()); } else { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLabware.name + "】progress: the column or well on placing lattice is wrong! please check!"); } result = false; return result; } else { Labware centrifugalTargetLabware = new Labware(); if (targetLattice.Equals("P0")) { gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Convert.ToInt32(methodFileMoveLabware.armValue), targetLattice); gripperCoordinate = gripperCoordinates.SingleOrDefault(x => x.lattice_num.Equals(targetLattice)); string tarLabwareId = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateLabwareFromdb(gripperCoordinate.gripper_lattice_id).labware_id.ToString();//获取夹爪关联的耗材Id; labwares = LabwareDB.GetLabware(tarLabwareId); slattice.lattice_num = "P0"; //关联孔位的耗材对象 ObservableCollection labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labwares.labware_id); var targetWellOnLattice = labwareWellInfoList.SingleOrDefault(x => x.labware_well_name.Equals(targetWell)); if(targetWellOnLattice!=null) { centrifugalTargetLabware = LabwareDB.GetLabware(targetWellOnLattice.well_labware_id); } } else { XmlNode tarXml = tarPlatformNode.SelectSingleNode("labware[@id='" + tarPlatformNode.SelectNodes("labware").Count + "']"); string tarLabwareId = tarXml.SelectSingleNode("labware_id").InnerText; tarLatticeId = tarPlatformNode.SelectSingleNode("lattice_id").InnerText;//被截掉"P"的板位编号名 if (tarLatticeId == "1") { MethodShake methodShake = new MethodShake(); methodShake.modeVal = 1; methodShake.shakeMoveSpeed = 50; methodShake.shakeMoveAngle = 230; launchView.SetWaitOne();//暂停 if (!shakerExecuteFinish) { ret = new ShakerBll().ExecuteShake(methodShake, isSimulator); if (ret.Result != ResultType.Success) { if (strCurrentCulture.Equals("zh-CN")) { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunShakeResource.strShakeMoveFailed.ToString() + ret.AlarmInfo); LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunShakeResource.strShakeMoveFailed.ToString() + ret.AlarmInfo); } else { launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】progress: shake was failed! Error info:" + ret.AlarmInfo); LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLabware.name + "】progress: shake was failed! Error info:" + ret.AlarmInfo); } result = false; return result; } shakerExecuteFinish = true; } } Lattice tarLattice = null; TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断 int armId = Shared.DeviceArmList.FirstOrDefault(x => x.arm_type.Equals(1)).device_arm_id; if (tabletopTemplate == null) { tarLattice = LatticeDB.GetLatticeDataByIdFromdb("P" + tarLatticeId, Convert.ToInt32(armId), Shared.SoftwareInformation.software_device_number); } else { tarLattice = LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb("P" + tarLatticeId, Convert.ToInt32(armId), Shared.SoftwareInformation.software_device_number, tabletopTemplate.tabletopid); } labwares = LabwareDB.GetLabware(tarLabwareId); // 获取当前台面的板子的坐标 slattice = DataRWDAL.LatticeDB.GetLatticeDataByIdFromdb(tarLattice.lattice_id); if (labwares.labware_tubeshelf_type == 1) { //关联孔位的耗材对象 ObservableCollection labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labwares.labware_id); var targetWellOnLattice = labwareWellInfoList.SingleOrDefault(x => x.labware_well_name.Equals(targetWell)); if (targetWellOnLattice != null) { centrifugalTargetLabware = LabwareDB.GetLabware(targetWellOnLattice.well_labware_id); } } else { //离心管耗材对象 centrifugalTargetLabware = ControlCom.GetCentrifugalLabwer(labwares.piled_script); } } ////离心管耗材对象 //Labware centrifugalTargetLabware = ControlCom.GetCentrifugalLabwer(labwares.piled_script); //求出目标板位上的现有耗材总高度 float labwareMainHeight = 0.0f; float heightOfBottomLabware = 0f;//要抓的那层的底部离板位的平面距离 XmlNodeList labwareNode = xmlEnv.SelectNodes("platform[lattice_id=" + slattice.lattice_num.Substring(1) + "]/labware"); int countOfLabware = labwareNode.Count; int loopCount = countOfLabware; for (int i = 1; i <= loopCount; i++) { Labware bottomLabware = new Labware(); var latticeDes = xmlEnv.SelectSingleNode("platform[lattice_id=" + slattice.lattice_num.Substring(1) + "]/labware[@id=" + (i).ToString() + "]"); if (latticeDes != null) { bottomLabware = LabwareDB.GetLabware(latticeDes.SelectSingleNode("labware_id").InnerText); heightOfBottomLabware += (float)Convert.ToDouble(bottomLabware.piled_height); } } if (labwares.labware_tubeshelf_type == 0) { if (centrifugalTargetLabware.lid_in_radius < 10d) { labwareMainHeight = (float)Convert.ToDouble(centrifugalTargetLabware.labware_height); } else { labwareMainHeight = (float)Convert.ToDouble(centrifugalTargetLabware.labware_height); } } else { labwareMainHeight = (float)Convert.ToDouble(centrifugalTargetLabware.labware_height) + heightOfBottomLabware; } // 获取当前台面的夹爪坐标 gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Convert.ToInt32(methodFileMoveLabware.armValue), slattice.lattice_num); gripperCoordinate = gripperCoordinates.SingleOrDefault(x => x.lattice_num.Equals(slattice.lattice_num)); //以孔位为目标放置 if (targetWell != "请选择") { //转化成夹爪板位 List gripperCoordinateForWells = wellCalcOfGripper.GetReallyWellsLabwareCoordinatesOnLattice(labwares, gripperCoordinate); GripperCoordinateForWell gripperPlaceCoordinateForWell = null; gripperPlaceCoordinateForWell = gripperCoordinateForWells.SingleOrDefault(t => t.lattice_num.Equals(slattice.lattice_num) && t.gripper_model.Equals(Convert.ToInt32(methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.placeColumn])) && t.wellname.Equals(targetWell)); GripTransportMParam gripTransportMParam = new GripTransportMParam(); // 判断当前的形式和角度 gripTransportMParam.xAxisVal = (float)gripperPlaceCoordinateForWell.lattice_X + (float)labwares.gripper_x_offset; gripTransportMParam.yAxisVal = (float)gripperPlaceCoordinateForWell.lattice_Y + (float)labwares.gripper_y_offset; gripTransportMParam.zAxisVal = (float)gripperPlaceCoordinateForWell.lattice_Z + (float)labwares.gripper_z_offset; if (tarLatticeId == "1") { //if (centrifugalTargetLabware.lid_in_radius < 10d) //{ gripTransportMParam.zAxisVal = (float)gripperPlaceCoordinateForWell.lattice_Z - labwareMainHeight; //} } else { if (centrifugalTargetLabware.lid_in_radius < 10d) { if (targetLattice.Equals("P0")) { gripTransportMParam.zAxisVal = (float)gripperPlaceCoordinateForWell.lattice_Z - labwareMainHeight + (float)centrifugalTargetLabware.gripper_z_offset+8f; } else { gripTransportMParam.zAxisVal = (float)gripperPlaceCoordinateForWell.lattice_Z - labwareMainHeight + (float)centrifugalTargetLabware.gripper_z_offset - 10f; } } else { gripTransportMParam.zAxisVal = (float)gripperPlaceCoordinateForWell.lattice_Z - labwareMainHeight + (float)centrifugalTargetLabware.gripper_z_offset-3f; } } gripTransportMParam.angleVal = (float)gripperPlaceCoordinateForWell.gripper_rotational; gripTransportMParam.basezAxisVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["zAxisSafeVal"]); gripTransportMParam.squeezeVal = (float)gripperPlaceCoordinateForWell.squeezeVal; gripTransportMParam.spreadVal = (float)gripperPlaceCoordinateForWell.spreadVal; gripTransportMParam.gripSpeed = (float)gripperPlaceCoordinateForWell.gripSpeed; gripTransportMParam.gripModel = Convert.ToInt32(methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickDirect]); gripTransportMParam.gripState = 2; // 请求夹爪的状态:1:向内夹紧;2:向外张开 gripTransportMParam.gripperpowerVal = (float)gripperPlaceCoordinateForWell.gripperpowerVal; gripTransportMParam.objectWidth = (float)Convert.ToDouble(gripperPlaceCoordinateForWell.objectwidth); //调用抓取方法 launchView.SetWaitOne();//暂停 ret = gripTransportBll.ExecuteGripTransportPlace(gripTransportMParam, isSimulator); string log = string.Empty; if (ret.Result != ResultType.Success) { if (strCurrentCulture.Equals("zh-CN")) { log = string.Format("【{0}】>Xhandler: 【{1}】{2}{3}{4}.{5}{6} of {7}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, Properties.MachineRunResource.strProgress, Properties.GripTransportResource.strPlacekError, ret.AlarmInfo, Properties.Resources.strBoardPosition, targetWell, slattice.lattice_num); launchView.AddLogs(log); } else { log = string.Format("【{0}】>Xhandler: 【{1}】progress: the action of pick is fail! error information:{2}.lattice:{3}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, ret.AlarmInfo, targetWell, slattice.lattice_num); launchView.AddLogs(log); } OperateDialog plsConfirmOper = null; Application.Current.Dispatcher.Invoke(new Action(() => { plsConfirmOper = new OperateDialog(strCurrentCulture.Equals("zh-CN") ? Properties.GripTransportResource.strPlaceFailWhatToDo : "The action of pick was fail! What do you want to do?"); plsConfirmOper.ShowDialog(); })); if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Retry) // 重试 { return ExecutePlaceAgain(methodFileMoveLabware, recordIndex, labwares, targetWell, heightOfBottomLabware, slattice, gripTransportMParam, isSimulator); } else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Cancel) // 终止 { result = false; return result; } else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Continue) // 跳过 { result = true; return result; } } else { if (strCurrentCulture.Equals("zh-CN")) { log = string.Format("【{0}】>Xhandler: 【{1}】{2}{3}{4}{5} of {6}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, Properties.MachineRunResource.strProgress, Properties.GripTransportResource.strPlaceOk, Properties.Resources.strBoardPosition, slattice.lattice_num, targetWell); launchView.AddLogs(log); } else { log = string.Format("【{0}】>Xhandler: 【{1}】progress: the action of pick is success! lattice:{2}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, slattice.lattice_num, targetWell); launchView.AddLogs(log); } } } else //以板列为目标抓取 { } } } #endregion recordIndex = recordIndex + 1; } #endregion return result; } #endregion #region 抓板失败后循环函数 public bool ExecutePickAgain(MethodFileMoveLabware methodFileMoveLabware,int recordIndex, Labware labwares,string sourceWell,float heightOfBottomLabware, Lattice slattice, GripTransportMParam pickMParam, bool isSimulator) { HxResult ret = null; bool result = true; List gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Convert.ToInt32(methodFileMoveLabware.armValue), slattice.lattice_num); GripperCoordinate gripperCoordinate = gripperCoordinates.SingleOrDefault(x => x.lattice_num.Equals(slattice.lattice_num)); //转化成夹爪板位 List gripperCoordinateForWells = wellCalcOfGripper.GetReallyWellsLabwareCoordinatesOnLattice(labwares, gripperCoordinate); GripperCoordinateForWell gripperPickCoordinateForWell = gripperCoordinateForWells.SingleOrDefault(t => t.lattice_num.Equals(slattice.lattice_num) && t.gripper_model.Equals(Convert.ToInt32(methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickDirect])) && t.wellname.Equals(sourceWell)); GripTransportMParam gripTransportMParam = new GripTransportMParam(); gripTransportMParam.xAxisVal = pickMParam.xAxisVal; gripTransportMParam.yAxisVal = pickMParam.yAxisVal; gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z - heightOfBottomLabware; gripTransportMParam.zAxisVal = gripTransportMParam.zAxisVal - heightOfBottomLabware - 1f; gripTransportMParam.angleVal = pickMParam.angleVal; gripTransportMParam.basezAxisVal = pickMParam.basezAxisVal; gripTransportMParam.squeezeVal = (float)gripperPickCoordinateForWell.squeezeVal; gripTransportMParam.spreadVal = (float)gripperPickCoordinateForWell.spreadVal; gripTransportMParam.gripSpeed = (float)gripperPickCoordinateForWell.gripSpeed; gripTransportMParam.gripModel = pickMParam.gripModel; gripTransportMParam.gripState = 1; // 请求夹爪的状态:1:向内夹紧;2:向外张开 gripTransportMParam.gripperpowerVal = (float)gripperPickCoordinateForWell.gripperpowerVal; gripTransportMParam.objectWidth = (float)Convert.ToDouble(gripperPickCoordinateForWell.objectwidth); //调用抓取方法 launchView.SetWaitOne();//暂停 ret = gripTransportBll.ExecuteGripTransportPick(gripTransportMParam, isSimulator); string log = string.Empty; if (ret.Result != ResultType.Success) { if (strCurrentCulture.Equals("zh-CN")) { log = string.Format("【{0}】>Xhandler: 【{1}】{2}{3}{4}.{5}{6} of {7}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, Properties.MachineRunResource.strProgress, Properties.GripTransportResource.strPickError, ret.AlarmInfo, Properties.Resources.strBoardPosition, sourceWell, slattice.lattice_num); launchView.AddLogs(log); } else { log = string.Format("【{0}】>Xhandler: 【{1}】progress: the action of pick is fail! error information:{2}.lattice:{3} well:{4}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, ret.AlarmInfo, sourceWell, slattice.lattice_num,sourceWell); launchView.AddLogs(log); } OperateDialog plsConfirmOper = null; Application.Current.Dispatcher.Invoke(new Action(() => { plsConfirmOper = new OperateDialog(strCurrentCulture.Equals("zh-CN") ? Properties.GripTransportResource.strPickFailWhatToDo : "The action of pick was fail! What do you want to do?"); plsConfirmOper.ShowDialog(); })); if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Retry) // 重试 { return ExecutePickAgain(methodFileMoveLabware, recordIndex, labwares, sourceWell, heightOfBottomLabware, slattice, pickMParam, isSimulator); } else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Cancel) // 终止 { result = false; return result; } else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Continue) // 跳过 { result = true; return result; } } else { if (strCurrentCulture.Equals("zh-CN")) { log = string.Format("【{0}】>Xhandler: 【{1}】{2}{3}{4}{5} of {6}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, Properties.MachineRunResource.strProgress, Properties.GripTransportResource.strPickOk, Properties.Resources.strBoardPosition,slattice.lattice_num,sourceWell); launchView.AddLogs(log); } else { log = string.Format("【{0}】>Xhandler: 【{1}】progress: the action of pick is success! lattice:{2} well:{3}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, slattice.lattice_num, sourceWell); launchView.AddLogs(log); } } return result; } #endregion #region 放板失败后循环函数 public bool ExecutePlaceAgain(MethodFileMoveLabware methodFileMoveLabware, int recordIndex, Labware labwares, string targetWell, float heightOfBottomLabware, Lattice slattice, GripTransportMParam pickMParam, bool isSimulator) { HxResult ret = null; bool result = true; List gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Convert.ToInt32(methodFileMoveLabware.armValue), slattice.lattice_num); GripperCoordinate gripperCoordinate = gripperCoordinates.SingleOrDefault(x => x.lattice_num.Equals(slattice.lattice_num)); //转化成夹爪板位 List gripperCoordinateForWells = wellCalcOfGripper.GetReallyWellsLabwareCoordinatesOnLattice(labwares, gripperCoordinate); GripperCoordinateForWell gripperPickCoordinateForWell = gripperCoordinateForWells.SingleOrDefault(t => t.lattice_num.Equals(slattice.lattice_num) && t.gripper_model.Equals(Convert.ToInt32(methodFileMoveLabware.transferDataTable.Rows[recordIndex][methodFileMoveLabware.pickDirect])) && t.wellname.Equals(targetWell)); GripTransportMParam gripTransportMParam = new GripTransportMParam(); gripTransportMParam.xAxisVal = pickMParam.xAxisVal; gripTransportMParam.yAxisVal = pickMParam.yAxisVal; gripTransportMParam.zAxisVal = (float)gripperPickCoordinateForWell.lattice_Z - heightOfBottomLabware; gripTransportMParam.zAxisVal = gripTransportMParam.zAxisVal - heightOfBottomLabware - 1f; gripTransportMParam.angleVal = pickMParam.angleVal; gripTransportMParam.basezAxisVal = pickMParam.basezAxisVal; gripTransportMParam.squeezeVal = (float)gripperPickCoordinateForWell.squeezeVal; gripTransportMParam.spreadVal = (float)gripperPickCoordinateForWell.spreadVal; gripTransportMParam.gripSpeed = (float)gripperPickCoordinateForWell.gripSpeed; gripTransportMParam.gripModel = pickMParam.gripModel; gripTransportMParam.gripState = 1; // 请求夹爪的状态:1:向内夹紧;2:向外张开 gripTransportMParam.gripperpowerVal = (float)gripperPickCoordinateForWell.gripperpowerVal; gripTransportMParam.objectWidth = (float)Convert.ToDouble(gripperPickCoordinateForWell.objectwidth); //调用抓取方法 launchView.SetWaitOne();//暂停 ret = gripTransportBll.ExecuteGripTransportPick(gripTransportMParam, isSimulator); string log = string.Empty; if (ret.Result != ResultType.Success) { if (strCurrentCulture.Equals("zh-CN")) { log = string.Format("【{0}】>Xhandler: 【{1}】{2}{3}{4}.{5}{6} of {7}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, Properties.MachineRunResource.strProgress, Properties.GripTransportResource.strPlacekError, ret.AlarmInfo, Properties.Resources.strBoardPosition, targetWell, slattice.lattice_num); launchView.AddLogs(log); } else { log = string.Format("【{0}】>Xhandler: 【{1}】progress: the action of pick is fail! error information:{2}.lattice:{3} well:{4}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, ret.AlarmInfo, targetWell, slattice.lattice_num, targetWell); launchView.AddLogs(log); } OperateDialog plsConfirmOper = null; Application.Current.Dispatcher.Invoke(new Action(() => { plsConfirmOper = new OperateDialog(strCurrentCulture.Equals("zh-CN") ? Properties.GripTransportResource.strPlaceFailWhatToDo : "The action of pick was fail! What do you want to do?"); plsConfirmOper.ShowDialog(); })); if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Retry) // 重试 { return ExecutePlaceAgain(methodFileMoveLabware, recordIndex, labwares, targetWell, heightOfBottomLabware, slattice, pickMParam, isSimulator); } else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Cancel) // 终止 { result = false; return result; } else if (plsConfirmOper != null && plsConfirmOper.OperMark == NodeOperationTypeEnum.Continue) // 跳过 { result = true; return result; } } else { if (strCurrentCulture.Equals("zh-CN")) { log = string.Format("【{0}】>Xhandler: 【{1}】{2}{3}{4}{5} of {6}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, Properties.MachineRunResource.strProgress, Properties.GripTransportResource.strPlaceOk, Properties.Resources.strBoardPosition, slattice.lattice_num, targetWell); launchView.AddLogs(log); } else { log = string.Format("【{0}】>Xhandler: 【{1}】progress: the action of pick is success! lattice:{2} well:{3}", DateTime.Now.ToString("HH:mm:ss:fff"), methodFileMoveLabware.name, slattice.lattice_num, targetWell); launchView.AddLogs(log); } } return result; } #endregion } }