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
|
{
|
/// <summary>
|
/// 文件转板执行
|
/// </summary>
|
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 执行文件转板,返回结果字符串
|
/// <summary>
|
/// 执行文件转板,返回结果字符串
|
/// </summary>
|
/// <param name="xmlEnv">板位节点信息</param>
|
/// <param name="methodNode">装载方法属性节点对象</param>
|
/// <param name="zAxisVal">z轴安全距离</param>
|
/// <param name="isSimulator">0:连接谁;1:仿真</param>
|
/// <returns></returns>
|
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<GripperCoordinate> gripperCoordinates = new List<GripperCoordinate>();
|
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<LabwareWellInfo> 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<TipsTable> 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<LabwareWellInfo> 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<GripperCoordinateForWell> 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<GripperCoordinate> gripperCoordinates = new List<GripperCoordinate>();
|
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<LabwareWellInfo> 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<LabwareWellInfo> 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<GripperCoordinateForWell> 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<GripperCoordinate> 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<GripperCoordinateForWell> 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<GripperCoordinate> 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<GripperCoordinateForWell> 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
|
}
|
}
|