using DataEntity;
|
using DataEntity.Share;
|
using DataRWDAL;
|
using DriverLib.Engine;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Collections.ObjectModel;
|
using System.Configuration;
|
using System.Linq;
|
using System.Runtime.Remoting.Channels;
|
using System.Xml;
|
using XCommon;
|
using XCommon.Log;
|
using XCore;
|
using XCoreBLL;
|
using XHandler.Controls.Run.Com;
|
using XHandler.View;
|
using XHandler.View.Liquids;
|
using XImagingXhandler.XDAL;
|
namespace XHandler.Controls
|
{
|
/// <summary>
|
/// 文件开关盖移液执行
|
/// </summary>
|
public class FileMoveLiquidControl
|
{
|
string strCurrentCulture = "";
|
WellCalc wellCalc = new WellCalc();
|
LatticeBll latticeBll = new LatticeBll();
|
FileMoveLiquidBll fileMoveLiquidBll = new FileMoveLiquidBll();
|
public RunWnd launchView = null;
|
LiquidAccuracyBll liquidAccuracyBll = new LiquidAccuracyBll();
|
PumpDispenseBll pumpDispenseBll = new PumpDispenseBll();
|
SwitchLidBll switchLidBll = new SwitchLidBll();
|
DispenseBll dispenseBll= new DispenseBll();
|
AspirateBll aspirateBll = new AspirateBll();
|
|
public FileMoveLiquidControl(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 ExecuteFileMoveLiquid(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");
|
MethodFileMoveLiquid methodFileMoveLiquid = fileMoveLiquidBll.GenerateMethodFileMoveLiquidDataByXmlNode(methodNode);
|
int recordAllCount = methodFileMoveLiquid.transferDataTable.Rows.Count; // 文件记录总数
|
int recordIndex = 0; // 循环控制总的切分次数
|
TipsTable tipsTable = new TipsTable(); // 执行的孔数据对象
|
int changeTipsMode = methodFileMoveLiquid.changeTipsMode;
|
bool bchannelTip=false;//是否更换了枪头; false: 已安装了枪头的状态;true:卸载了枪头的状态
|
bool bIsFirstDataWithZero = false;//是否是第一条为零体积的移液且没有要求更换枪头
|
#endregion
|
|
#region 数据检查
|
if (methodFileMoveLiquid == null)
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.RunFileMoveLiquidResource.strFileMoveLiquidDataCheckError.ToString());
|
result = false;
|
return result;
|
}
|
#endregion
|
|
#region 数据执行
|
//针对化学工作站,的移液枪,分别处理
|
//泵加液,没有安装枪头、卸载枪头步骤
|
if (methodFileMoveLiquid.armText.Equals("泵臂"))
|
{
|
while (recordIndex < recordAllCount)
|
{
|
string targetLattice = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.destinationLabware].ToString();
|
string globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetLattice);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
targetLattice = globalVariableValue;
|
}
|
XmlNode desPlatformNode = ComUtility.GetXmlNodeByBoardName(xmlEnv.SelectNodes("platform"), targetLattice);
|
if (desPlatformNode == null)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunFileMoveLiquidResource.strWithoutLattice.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLiquid.name + "】progress: the lattice of dispense liquid from pump is wrong! please check!");
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
|
|
XmlNode desXml = desPlatformNode.SelectSingleNode("labware[@id='" + desPlatformNode.SelectNodes("labware").Count + "']");
|
string desLabwareId = desXml.SelectSingleNode("labware_id").InnerText;
|
string desLatticeId = desPlatformNode.SelectSingleNode("lattice_id").InnerText;//被截掉"P"的板位编号名
|
|
Lattice desLattice = null;
|
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断
|
if (tabletopTemplate == null)
|
{
|
desLattice = LatticeDB.GetLatticeDataByIdFromdb("P"+ desLatticeId, Convert.ToInt32(methodFileMoveLiquid.armValue), Shared.SoftwareInformation.software_device_number);
|
}
|
else
|
{
|
desLattice = LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb("P" + desLatticeId, Convert.ToInt32(methodFileMoveLiquid.armValue), Shared.SoftwareInformation.software_device_number, tabletopTemplate.tabletopid);
|
}
|
|
Labware labwares = LabwareDB.GetLabware(desLabwareId); //目标耗材
|
|
// 获取当前台面的板子吸液列的坐标
|
Lattice slattice = DataRWDAL.LatticeDB.GetLatticeDataByIdFromdb(desLattice.lattice_id); //目标板位
|
//获取板位孔的坐标数据
|
List<TipsTable> dtWells = ControlCom.GenerateWellCoordinate(labwares, slattice); //目标板位孔坐标数据集
|
|
//根据循环处理孔位
|
string targetWell = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.destinationWell].ToString();
|
string targetVolume= methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.dpsVolume].ToString();
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetWell);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
targetWell = globalVariableValue;
|
}
|
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetVolume);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
targetVolume = globalVariableValue;
|
}
|
|
ScrewTubeCapMParam screwTubeCapMParam = new ScrewTubeCapMParam();
|
#region 判断执行开盖子
|
string dpsOpenLid = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.dpsOpenLid].ToString();
|
if (dpsOpenLid.Equals("1"))
|
{
|
// 获取当前台面的夹爪坐标
|
List<GripperCoordinate> gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Convert.ToInt32(methodFileMoveLiquid.armValue) - 1, desLattice.lattice_num);
|
|
//转化成夹爪板位
|
Lattice glattice = new Lattice();
|
glattice.lattice_X = gripperCoordinates[0].lattice_X;
|
glattice.lattice_Y = gripperCoordinates[0].lattice_Y;
|
glattice.lattice_Z = gripperCoordinates[0].lattice_Z;
|
glattice.lattice_num = gripperCoordinates[0].lattice_num;
|
glattice.lattice_id = "";
|
|
// 获取板开盖位孔的坐标数据
|
List<TipsTable> dtGripperWells = ControlCom.GenerateWellCoordinateForChemistry(labwares, glattice);
|
|
//离心管耗材对象
|
Labware centrifugalLabware = ControlCom.GetCentrifugalLabwer(labwares.piled_script);
|
|
//根据处理孔位
|
tipsTable = null;
|
tipsTable = dtGripperWells.SingleOrDefault(t => t.lattice_num.Equals(desLattice.lattice_num)
|
&& t.labware_id.Equals(desLabwareId)
|
&& t.wellname.Equals(targetWell));
|
|
|
screwTubeCapMParam.tubeRackNo = Convert.ToInt32(desLattice.lattice_num.Substring(1)); //板位号,数字部分
|
screwTubeCapMParam.tubeCol = Convert.ToInt32(targetWell.Substring(1)); //孔所在列号,数字部分
|
screwTubeCapMParam.tubeScrewPitch = (float)centrifugalLabware.well_helical_distance;//螺纹螺距
|
screwTubeCapMParam.tubeDiameter = (float)centrifugalLabware.well_mouth_out_radius * 2; //离心管主管外径
|
|
screwTubeCapMParam.tubeRow = 0;
|
|
screwTubeCapMParam.capDiameter = (float)centrifugalLabware.lid_out_radius * 2;
|
screwTubeCapMParam.capExpandDistance = (float)centrifugalLabware.upgripper_spread;
|
screwTubeCapMParam.capPushDistance = (float)centrifugalLabware.upgripper_squeeze;
|
screwTubeCapMParam.capPushForce = (float)centrifugalLabware.upgripper_power;
|
screwTubeCapMParam.capScrewAngle = new float[] { (float)centrifugalLabware.well_helical_circle * 360 };
|
screwTubeCapMParam.capScrewSpeed = (float)30;
|
screwTubeCapMParam.capScrewDistance = new float[] { (float)centrifugalLabware.well_helical_distance * (float)Math.Ceiling(centrifugalLabware.well_helical_circle) };
|
screwTubeCapMParam.slotNo = 1;
|
screwTubeCapMParam.basezAxisVal = 0;
|
|
//下夹爪
|
screwTubeCapMParam.x2AxisVal = 0;
|
screwTubeCapMParam.y2AxisVal = 0;
|
screwTubeCapMParam.tubePushDistance = (float)centrifugalLabware.downgripper_squeeze;
|
screwTubeCapMParam.tubeExpandDistance = (float)centrifugalLabware.downgripper_spread;
|
screwTubeCapMParam.tubePushForce = (float)centrifugalLabware.downgripper_power;
|
screwTubeCapMParam.isKeepLowerGripperClamped = true;
|
|
//上夹爪
|
screwTubeCapMParam.xAxisVal = tipsTable.axis_b_X;
|
screwTubeCapMParam.yAxisVal = tipsTable.axis_b_Y;
|
|
screwTubeCapMParam.zAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labwares.piled_script).labware_height) + (float)centrifugalLabware.upgripper_zoffset;//孔口
|
|
|
|
launchView.SetWaitOne();//暂停
|
ret = switchLidBll.ExecuteSwitchLid(screwTubeCapMParam, 0, isSimulator);
|
|
if (ret.Result != ResultType.Success)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to open lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to open lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to open lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to open lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
}
|
}
|
#endregion
|
|
#region 构建参数执行泵排液
|
tipsTable = null;
|
tipsTable = dtWells.SingleOrDefault(t => t.lattice_id.Equals(desLattice.lattice_id)
|
&& t.labware_id.Equals(desLabwareId)
|
&& t.wellname.Equals(targetWell));
|
|
AddLiquidMParamSH addLiquidMParamSH = new AddLiquidMParamSH();
|
addLiquidMParamSH.armId = Convert.ToInt32(methodFileMoveLiquid.armValue);
|
|
int[] channels = new int[methodFileMoveLiquid.channels.Length];
|
float[] fVolumes = new float[methodFileMoveLiquid.channels.Length];
|
float[] xVals = new float[methodFileMoveLiquid.channels.Length];
|
float[] yVals = new float[methodFileMoveLiquid.channels.Length];
|
addLiquidMParamSH.channelId = channels;
|
addLiquidMParamSH.channelCount = methodFileMoveLiquid.channels.Length;
|
Liquid liquid = null;
|
for (int i = 0; i < methodFileMoveLiquid.channels.Length; i++)
|
{
|
channels[i] = Convert.ToInt32(methodFileMoveLiquid.channels[i]);
|
fVolumes[i] = (float)Convert.ToDouble(targetVolume);
|
xVals[i] = (float)tipsTable.axis_b_X;
|
yVals[i] = (float)tipsTable.axis_b_Y;
|
|
// 液体参数
|
liquid = LiquidDB.GetALiquidFromdb(methodFileMoveLiquid.liquidpidValue);
|
|
}
|
|
addLiquidMParamSH.volume = fVolumes;
|
addLiquidMParamSH.xAxisVal = xVals;
|
addLiquidMParamSH.yAxisVal = yVals;
|
addLiquidMParamSH.zAxisVal = tipsTable.axis_b_Z;
|
addLiquidMParamSH.speed = (float)liquid.dispense_speed;
|
addLiquidMParamSH.addLiquidAfterDelay = liquid.after_dispense_delay;
|
addLiquidMParamSH.basezAxisVal = 0;
|
launchView.SetWaitOne();//暂停
|
ret = pumpDispenseBll.ExecutePumpDispense(addLiquidMParamSH, isSimulator);
|
|
if (ret.Result != ResultType.Success)
|
{
|
//添加数据进入报表
|
string channelTxt = string.Join(",", channels);
|
launchView.addDataIntoReport("泵" + channelTxt, targetVolume, new string[1] { tipsTable.wellname }, "block");//来源泵
|
launchView.addFinishDataIntoReport(tipsTable, slattice.lattice_num, targetVolume, new string[1] { tipsTable.wellname }, "block", new string[1] { "" });//目标孔
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunDispenseResource.strDispenseFail.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunDispenseResource.strDispenseFail.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress: Pump dispense was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress: Pump dispense was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
//添加数据进入报表
|
string channelTxt = string.Join(",", channels);
|
launchView.addDataIntoReport("泵"+channelTxt, targetVolume, new string[1] { tipsTable.wellname }, "pass");//来源泵
|
launchView.addFinishDataIntoReport(tipsTable, slattice.lattice_num, targetVolume, new string[1] { tipsTable.wellname },"pass",new string[1] {""});//目标孔
|
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunDispenseResource.strDispenseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunDispenseResource.strDispenseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress:Pump dispense was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress:Pump dispense was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
}
|
#endregion
|
|
#region 构建参数执行关盖
|
string dpsCloseLid = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.dpsCloseLid].ToString();
|
if (dpsCloseLid.Equals("1"))
|
{
|
launchView.SetWaitOne();//暂停
|
ret = switchLidBll.ExecuteSwitchLid(screwTubeCapMParam, 1, isSimulator);
|
if (ret.Result != ResultType.Success)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to close lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to close lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to closed lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to closed lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
}
|
}
|
#endregion
|
|
recordIndex = recordIndex + 1;
|
}
|
}
|
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.RunTransferFileResource.strAllStepsCompleted.ToString());
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.RunTransferFileResource.strAllStepsCompleted.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】All steps of " + methodFileMoveLiquid.name + " have been completed;");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】All steps of " + methodFileMoveLiquid.name + " have been completed;");
|
}
|
}
|
else
|
//非泵臂加液
|
{
|
|
while (recordIndex < recordAllCount)
|
{
|
bool currentExecuteTargetOpenLid = false;//当前是否执行过目标孔开盖
|
string volumeTxt = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.aspVolume].ToString();
|
|
string volumeVariableValue = "";
|
float aspvolume = 0f;
|
volumeVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, volumeTxt);
|
if (!string.IsNullOrEmpty(volumeVariableValue))
|
{
|
aspvolume = (float)Convert.ToInt32(volumeVariableValue);
|
}
|
else
|
{
|
aspvolume = (float)Convert.ToInt32(volumeTxt);
|
}
|
|
if (aspvolume == 0f && methodFileMoveLiquid.jump0Volume)
|
{
|
#region 执行安装枪头
|
if (recordIndex == 0)
|
{
|
if (!bIsFirstDataWithZero)
|
{
|
// 自动计算位置安装Tip
|
bool bLoadTipResult = ControlCom.LoadTipAutomation(xmlEnv.SelectNodes("platform"), methodNode,
|
isSimulator, launchView, null, 0);
|
if (!bLoadTipResult)
|
{
|
return false;
|
}
|
bchannelTip = false;
|
}
|
if (changeTipsMode == 0)
|
{
|
bIsFirstDataWithZero = true;
|
}
|
}
|
else
|
{
|
//if (changeTipsMode == 0)
|
//{
|
|
//}
|
//else
|
//{
|
// if (bchannelTip)
|
// {
|
// // 自动计算位置安装Tip
|
// bool bLoadTipResult = ControlCom.LoadTipAutomation(xmlEnv.SelectNodes("platform"), methodNode,
|
// isSimulator, launchView, null, 0);
|
// if (!bLoadTipResult)
|
// {
|
// return false;
|
// }
|
// }
|
//}
|
}
|
#endregion
|
}
|
else
|
{
|
#region 来源过程处理
|
string sourceLattice = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.sourceLabware].ToString();
|
string tipSet = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.tipSet].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)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunFileMoveLiquidResource.strWithoutAapirateOfLattice.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLiquid.name + "】progress: the lattice of aspirate liquid is wrong! please check!");
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
XmlNode srcXml = srcPlatformNode.SelectSingleNode("labware[@id='" + srcPlatformNode.SelectNodes("labware").Count + "']");
|
string srcLabwareId = srcXml.SelectSingleNode("labware_id").InnerText;
|
string srcLatticeId = srcPlatformNode.SelectSingleNode("lattice_id").InnerText;//被截掉"P"的板位编号名
|
|
Lattice srcLattice = null;
|
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断
|
if (tabletopTemplate == null)
|
{
|
srcLattice = LatticeDB.GetLatticeDataByIdFromdb("P" + srcLatticeId, Convert.ToInt32(methodFileMoveLiquid.armValue), Shared.SoftwareInformation.software_device_number);
|
}
|
else
|
{
|
srcLattice = LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb("P" + srcLatticeId, Convert.ToInt32(methodFileMoveLiquid.armValue), Shared.SoftwareInformation.software_device_number, tabletopTemplate.tabletopid);
|
}
|
|
Labware labwares = LabwareDB.GetLabware(srcLabwareId); //目标耗材
|
|
// 获取当前台面的板子吸液列的坐标
|
Lattice slattice = DataRWDAL.LatticeDB.GetLatticeDataByIdFromdb(srcLattice.lattice_id); //目标板位
|
//获取板位孔的坐标数据
|
|
|
//根据循环处理孔位
|
string sourceWell = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.sourceWell].ToString();
|
string souceVolume = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.aspVolume].ToString();
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, sourceWell);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
sourceWell = globalVariableValue;
|
}
|
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, souceVolume);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
souceVolume = globalVariableValue;
|
}
|
|
#region 执行安装枪头
|
if (recordIndex == 0)
|
{
|
// 自动计算位置安装Tip
|
bool bLoadTipResult = ControlCom.LoadTipAutomation(xmlEnv.SelectNodes("platform"), methodNode,
|
isSimulator, launchView, null, 0);
|
if (!bLoadTipResult)
|
{
|
return false;
|
}
|
bchannelTip = false;
|
}
|
else
|
{
|
if (changeTipsMode == 0)
|
{
|
|
}
|
else
|
{
|
if (bchannelTip)
|
{
|
// 自动计算位置安装Tip
|
bool bLoadTipResult = ControlCom.LoadTipAutomation(xmlEnv.SelectNodes("platform"), methodNode,
|
isSimulator, launchView, null, 0);
|
if (!bLoadTipResult)
|
{
|
return false;
|
}
|
}
|
}
|
}
|
#endregion
|
List<TipsTable> dtsrcWells = ControlCom.GenerateWellCoordinate(labwares, slattice); //目标板位孔坐标数据集
|
ScrewTubeCapMParam screwTubeCapMParam = new ScrewTubeCapMParam();
|
#region 判断执行开盖子
|
string aspOpenLid = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.aspOpenLid].ToString();
|
if (aspOpenLid.Equals("1"))
|
{
|
// 获取当前台面的夹爪坐标
|
List<GripperCoordinate> gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, 19, srcLattice.lattice_num);
|
|
//转化成夹爪板位
|
Lattice glattice = new Lattice();
|
glattice.lattice_X = gripperCoordinates[0].lattice_X;
|
glattice.lattice_Y = gripperCoordinates[0].lattice_Y;
|
glattice.lattice_Z = gripperCoordinates[0].lattice_Z;
|
glattice.lattice_num = gripperCoordinates[0].lattice_num;
|
glattice.lattice_id = "";
|
|
// 获取板开盖位孔的坐标数据
|
List<TipsTable> dtGripperWells = ControlCom.GenerateWellCoordinateForChemistry(labwares, glattice);
|
|
//离心管耗材对象
|
Labware centrifugalLabware = ControlCom.GetCentrifugalLabwer(labwares.piled_script);
|
|
//根据处理孔位
|
tipsTable = null;
|
tipsTable = dtGripperWells.SingleOrDefault(t => t.lattice_num.Equals(srcLattice.lattice_num)
|
&& t.labware_id.Equals(srcLabwareId)
|
&& t.wellname.Equals(sourceWell));
|
tipsTable.axis_b_Z = tipsTable.axis_b_Z + ControlCom.CurrentLengthOfTip;//被减的枪头要加回来
|
screwTubeCapMParam.tubeRackNo = Convert.ToInt32(srcLattice.lattice_num.Substring(1)); //板位号,数字部分
|
screwTubeCapMParam.tubeCol = Convert.ToInt32(sourceWell.Substring(1)); //孔所在列号,数字部分
|
screwTubeCapMParam.tubeScrewPitch = (float)centrifugalLabware.well_helical_distance;//螺纹螺距
|
screwTubeCapMParam.tubeDiameter = (float)centrifugalLabware.well_mouth_out_radius * 2; //离心管主管外径
|
|
screwTubeCapMParam.tubeRow = 0;
|
|
screwTubeCapMParam.capDiameter = (float)centrifugalLabware.lid_out_radius * 2;
|
screwTubeCapMParam.capExpandDistance = (float)centrifugalLabware.upgripper_spread;
|
screwTubeCapMParam.capPushDistance = (float)centrifugalLabware.upgripper_squeeze;
|
screwTubeCapMParam.capPushForce = (float)centrifugalLabware.upgripper_power;
|
screwTubeCapMParam.capScrewAngle = new float[] { (float)centrifugalLabware.well_helical_circle * 360 };
|
screwTubeCapMParam.capScrewSpeed = (float)30;
|
screwTubeCapMParam.capScrewDistance = new float[] { (float)centrifugalLabware.well_helical_distance * (float)Math.Ceiling(centrifugalLabware.well_helical_circle) };
|
screwTubeCapMParam.slotNo = 1;
|
screwTubeCapMParam.basezAxisVal = 0;
|
|
//下夹爪
|
screwTubeCapMParam.x2AxisVal = 0;
|
screwTubeCapMParam.y2AxisVal = 0;
|
screwTubeCapMParam.tubePushDistance = (float)centrifugalLabware.downgripper_squeeze;
|
screwTubeCapMParam.tubeExpandDistance = (float)centrifugalLabware.downgripper_spread;
|
screwTubeCapMParam.tubePushForce = (float)centrifugalLabware.downgripper_power;
|
screwTubeCapMParam.isKeepLowerGripperClamped = true;
|
|
//上夹爪
|
screwTubeCapMParam.xAxisVal = tipsTable.axis_b_X;
|
screwTubeCapMParam.yAxisVal = tipsTable.axis_b_Y;
|
|
screwTubeCapMParam.zAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labwares.piled_script).labware_height) + (float)centrifugalLabware.upgripper_zoffset;//孔口
|
|
|
|
launchView.SetWaitOne();//暂停
|
ret = switchLidBll.ExecuteSwitchLid(screwTubeCapMParam, 0, isSimulator);
|
tipsTable.axis_b_Z = tipsTable.axis_b_Z - ControlCom.CurrentLengthOfTip;//被加的枪头要减回来
|
if (ret.Result != ResultType.Success)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to open lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to open lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to open lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to open lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
}
|
}
|
else
|
{
|
//判断目标孔是否要开盖子,要开就先开目标孔的盖子
|
string ProtargetLattice = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.destinationLabware].ToString();
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, ProtargetLattice);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
ProtargetLattice = globalVariableValue;
|
}
|
XmlNode ProdesPlatformNode = ComUtility.GetXmlNodeByBoardName(xmlEnv.SelectNodes("platform"), ProtargetLattice);
|
if (ProdesPlatformNode == null)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunFileMoveLiquidResource.strWithoutLattice.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLiquid.name + "】progress: the lattice of dispense liquid from pump is wrong! please check!");
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
XmlNode desXml = ProdesPlatformNode.SelectSingleNode("labware[@id='" + ProdesPlatformNode.SelectNodes("labware").Count + "']");
|
string desLabwareId = desXml.SelectSingleNode("labware_id").InnerText;
|
string desLatticeId = ProdesPlatformNode.SelectSingleNode("lattice_id").InnerText;//被截掉"P"的板位编号名
|
|
Lattice desLattice = null;
|
TabletopTemplate ProtabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断
|
if (ProtabletopTemplate == null)
|
{
|
desLattice = LatticeDB.GetLatticeDataByIdFromdb("P" + desLatticeId, Convert.ToInt32(methodFileMoveLiquid.armValue), Shared.SoftwareInformation.software_device_number);
|
}
|
else
|
{
|
desLattice = LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb("P" + desLatticeId, Convert.ToInt32(methodFileMoveLiquid.armValue), Shared.SoftwareInformation.software_device_number, ProtabletopTemplate.tabletopid);
|
}
|
|
Labware Prolabwares = LabwareDB.GetLabware(desLabwareId); //目标耗材
|
|
// 获取当前台面的板子吸液列的坐标
|
Lattice Proslattice = DataRWDAL.LatticeDB.GetLatticeDataByIdFromdb(desLattice.lattice_id); //目标板位
|
//获取板位孔的坐标数据
|
List<TipsTable> dtWells = ControlCom.GenerateWellCoordinate(Prolabwares, Proslattice); //目标板位孔坐标数据集
|
|
//根据循环处理孔位
|
string targetWell = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.destinationWell].ToString();
|
string targetVolume = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.dpsVolume].ToString();
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetWell);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
targetWell = globalVariableValue;
|
}
|
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetVolume);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
targetVolume = globalVariableValue;
|
}
|
|
ScrewTubeCapMParam ProscrewTubeCapMParam = new ScrewTubeCapMParam();
|
#region 判断执行开盖子
|
string dpsOpenLid = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.dpsOpenLid].ToString();
|
if (dpsOpenLid.Equals("1"))
|
{
|
// 获取当前台面的夹爪坐标
|
List<GripperCoordinate> gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Shared.DeviceArmList.FirstOrDefault(x => x.arm_type.Equals(0)).device_arm_id, desLattice.lattice_num);
|
|
//转化成夹爪板位
|
Lattice glattice = new Lattice();
|
glattice.lattice_X = gripperCoordinates[0].lattice_X;
|
glattice.lattice_Y = gripperCoordinates[0].lattice_Y;
|
glattice.lattice_Z = gripperCoordinates[0].lattice_Z;
|
glattice.lattice_num = gripperCoordinates[0].lattice_num;
|
glattice.lattice_id = "";
|
|
// 获取板开盖位孔的坐标数据
|
List<TipsTable> dtGripperWells = ControlCom.GenerateWellCoordinateForChemistry(Prolabwares, glattice);
|
|
//离心管耗材对象
|
Labware centrifugalLabware = ControlCom.GetCentrifugalLabwer(Prolabwares.piled_script);
|
|
//根据处理孔位
|
tipsTable = null;
|
tipsTable = dtGripperWells.SingleOrDefault(t => t.lattice_num.Equals(desLattice.lattice_num)
|
&& t.labware_id.Equals(desLabwareId)
|
&& t.wellname.Equals(targetWell));
|
tipsTable.axis_b_Z = tipsTable.axis_b_Z + ControlCom.CurrentLengthOfTip;//被减的枪头要加回来
|
ProscrewTubeCapMParam.tubeRackNo = Convert.ToInt32(desLattice.lattice_num.Substring(1)); //板位号,数字部分
|
ProscrewTubeCapMParam.tubeCol = Convert.ToInt32(targetWell.Substring(1)); //孔所在列号,数字部分
|
ProscrewTubeCapMParam.tubeScrewPitch = (float)centrifugalLabware.well_helical_distance;//螺纹螺距
|
ProscrewTubeCapMParam.tubeDiameter = (float)centrifugalLabware.well_mouth_out_radius * 2; //离心管主管外径
|
|
ProscrewTubeCapMParam.tubeRow = 0;
|
|
ProscrewTubeCapMParam.capDiameter = (float)centrifugalLabware.lid_out_radius * 2;
|
ProscrewTubeCapMParam.capExpandDistance = (float)centrifugalLabware.upgripper_spread;
|
ProscrewTubeCapMParam.capPushDistance = (float)centrifugalLabware.upgripper_squeeze;
|
ProscrewTubeCapMParam.capPushForce = (float)centrifugalLabware.upgripper_power;
|
ProscrewTubeCapMParam.capScrewAngle = new float[] { (float)centrifugalLabware.well_helical_circle * 360 };
|
ProscrewTubeCapMParam.capScrewSpeed = (float)30;
|
ProscrewTubeCapMParam.capScrewDistance = new float[] { (float)centrifugalLabware.well_helical_distance * (float)Math.Ceiling(centrifugalLabware.well_helical_circle) };
|
ProscrewTubeCapMParam.slotNo = 1;
|
ProscrewTubeCapMParam.basezAxisVal = 0;
|
|
//下夹爪
|
ProscrewTubeCapMParam.x2AxisVal = 0;
|
ProscrewTubeCapMParam.y2AxisVal = 0;
|
ProscrewTubeCapMParam.tubePushDistance = (float)centrifugalLabware.downgripper_squeeze;
|
ProscrewTubeCapMParam.tubeExpandDistance = (float)centrifugalLabware.downgripper_spread;
|
ProscrewTubeCapMParam.tubePushForce = (float)centrifugalLabware.downgripper_power;
|
ProscrewTubeCapMParam.isKeepLowerGripperClamped= true;
|
|
//上夹爪
|
ProscrewTubeCapMParam.xAxisVal = tipsTable.axis_b_X;
|
ProscrewTubeCapMParam.yAxisVal = tipsTable.axis_b_Y;
|
|
ProscrewTubeCapMParam.zAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(Prolabwares.piled_script).labware_height) + (float)centrifugalLabware.upgripper_zoffset;//孔口
|
|
|
|
launchView.SetWaitOne();//暂停
|
if (!currentExecuteTargetOpenLid)
|
{
|
ret = switchLidBll.ExecuteSwitchLid(ProscrewTubeCapMParam, 0, isSimulator);
|
tipsTable.axis_b_Z = tipsTable.axis_b_Z - ControlCom.CurrentLengthOfTip;//被加的枪头要减回来
|
if (ret.Result != ResultType.Success)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + Proslattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + Proslattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to open lid was failed on " + tipsTable.wellname + " of " + Proslattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to open lid was failed on " + tipsTable.wellname + " of " + Proslattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + Proslattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + Proslattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to open lid was successful on " + tipsTable.wellname + " of " + Proslattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to open lid was successful on " + tipsTable.wellname + " of " + Proslattice.lattice_num + " lattice!");
|
}
|
currentExecuteTargetOpenLid = true;
|
}
|
}
|
}
|
#endregion
|
}
|
|
currentExecuteTargetOpenLid = true;
|
}
|
#endregion
|
|
#region 构建参数执行枪吸液
|
tipsTable = null;
|
tipsTable = dtsrcWells.SingleOrDefault(t => t.lattice_id.Equals(srcLattice.lattice_id)
|
&& t.labware_id.Equals(srcLabwareId)
|
&& t.wellname.Equals(sourceWell));
|
|
AspirateMParam aspirateMParam = this.GenerateAspirateParam(methodNode, methodFileMoveLiquid, labwares, tipsTable, (float)Convert.ToDouble(souceVolume));
|
|
launchView.UpdateLabwareWells(tipsTable, new string[] { sourceWell }, 2); // 2:正在吸液红色
|
launchView.SetWaitOne();//暂停
|
ret = aspirateBll.ExecuteAspirate(aspirateMParam, isSimulator);
|
if (ret.Result != ResultType.Success)
|
{
|
//添加数据进入报表
|
launchView.addDataIntoReport(slattice.lattice_num, souceVolume, new string[1] { sourceWell }, "block");
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunAspirateResource.strAspirateFail.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunAspirateResource.strAspirateFail.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress: Aspirate was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress: Aspirate was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
//添加数据进入报表
|
launchView.addDataIntoReport(slattice.lattice_num, souceVolume, new string[1] { sourceWell }, "pass");
|
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunAspirateResource.strAspirateSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunAspirateResource.strAspirateSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress:Aspirate was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress:Aspirate was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
}
|
#endregion
|
|
#region 构建参数执行关盖
|
string aspCloseLid = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.aspCloseLid].ToString();
|
if (aspCloseLid.Equals("1"))
|
{
|
tipsTable.axis_b_Z = tipsTable.axis_b_Z + ControlCom.CurrentLengthOfTip;//被减的枪头要加回来
|
launchView.SetWaitOne();//暂停
|
screwTubeCapMParam.isKeepLowerGripperClamped = false;
|
ret = switchLidBll.ExecuteSwitchLid(screwTubeCapMParam, 1, isSimulator);
|
if (ret.Result != ResultType.Success)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to close lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to close lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to closed lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to closed lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
}
|
}
|
#endregion
|
|
}
|
#endregion
|
|
#region 目标过程处理
|
string targetLattice = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.destinationLabware].ToString();
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetLattice);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
targetLattice = globalVariableValue;
|
}
|
XmlNode desPlatformNode = ComUtility.GetXmlNodeByBoardName(xmlEnv.SelectNodes("platform"), targetLattice);
|
if (desPlatformNode == null)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunFileMoveLiquidResource.strWithoutLattice.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】> Xhandler: 【" + methodFileMoveLiquid.name + "】progress: the lattice of dispense liquid from pump is wrong! please check!");
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
XmlNode desXml = desPlatformNode.SelectSingleNode("labware[@id='" + desPlatformNode.SelectNodes("labware").Count + "']");
|
string desLabwareId = desXml.SelectSingleNode("labware_id").InnerText;
|
string desLatticeId = desPlatformNode.SelectSingleNode("lattice_id").InnerText;//被截掉"P"的板位编号名
|
|
Lattice desLattice = null;
|
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断
|
if (tabletopTemplate == null)
|
{
|
desLattice = LatticeDB.GetLatticeDataByIdFromdb("P" + desLatticeId, Convert.ToInt32(methodFileMoveLiquid.armValue), Shared.SoftwareInformation.software_device_number);
|
}
|
else
|
{
|
desLattice = LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb("P" + desLatticeId, Convert.ToInt32(methodFileMoveLiquid.armValue), Shared.SoftwareInformation.software_device_number, tabletopTemplate.tabletopid);
|
}
|
|
Labware labwares = LabwareDB.GetLabware(desLabwareId); //目标耗材
|
|
// 获取当前台面的板子吸液列的坐标
|
Lattice slattice = DataRWDAL.LatticeDB.GetLatticeDataByIdFromdb(desLattice.lattice_id); //目标板位
|
//获取板位孔的坐标数据
|
List<TipsTable> dtWells = ControlCom.GenerateWellCoordinate(labwares, slattice); //目标板位孔坐标数据集
|
|
//根据循环处理孔位
|
string targetWell = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.destinationWell].ToString();
|
string targetVolume = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.dpsVolume].ToString();
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetWell);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
targetWell = globalVariableValue;
|
}
|
|
globalVariableValue = "";
|
globalVariableValue = ControlCom.SearchValueOfGlobalVariable(launchView, targetVolume);
|
if (!string.IsNullOrEmpty(globalVariableValue))
|
{
|
targetVolume = globalVariableValue;
|
}
|
|
ScrewTubeCapMParam screwTubeCapMParam = new ScrewTubeCapMParam();
|
#region 判断执行开盖子
|
string dpsOpenLid = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.dpsOpenLid].ToString();
|
if (dpsOpenLid.Equals("1"))
|
{
|
// 获取当前台面的夹爪坐标
|
List<GripperCoordinate> gripperCoordinates = DataRWDAL.GripperCoordinateDB.GetAGripperCoordinateFromdb(Shared.SoftwareInformation.software_information_id, Shared.DeviceArmList.FirstOrDefault(x => x.arm_type.Equals(0)).device_arm_id, desLattice.lattice_num);
|
|
//转化成夹爪板位
|
Lattice glattice = new Lattice();
|
glattice.lattice_X = gripperCoordinates[0].lattice_X;
|
glattice.lattice_Y = gripperCoordinates[0].lattice_Y;
|
glattice.lattice_Z = gripperCoordinates[0].lattice_Z;
|
glattice.lattice_num = gripperCoordinates[0].lattice_num;
|
glattice.lattice_id = "";
|
|
// 获取板开盖位孔的坐标数据
|
List<TipsTable> dtGripperWells = ControlCom.GenerateWellCoordinateForChemistry(labwares, glattice);
|
|
//离心管耗材对象
|
Labware centrifugalLabware = ControlCom.GetCentrifugalLabwer(labwares.piled_script);
|
|
//根据处理孔位
|
tipsTable = null;
|
tipsTable = dtGripperWells.SingleOrDefault(t => t.lattice_num.Equals(desLattice.lattice_num)
|
&& t.labware_id.Equals(desLabwareId)
|
&& t.wellname.Equals(targetWell));
|
tipsTable.axis_b_Z = tipsTable.axis_b_Z + ControlCom.CurrentLengthOfTip;//被减的枪头要加回来
|
screwTubeCapMParam.tubeRackNo = Convert.ToInt32(desLattice.lattice_num.Substring(1)); //板位号,数字部分
|
screwTubeCapMParam.tubeCol = Convert.ToInt32(targetWell.Substring(1)); //孔所在列号,数字部分
|
screwTubeCapMParam.tubeScrewPitch = (float)centrifugalLabware.well_helical_distance;//螺纹螺距
|
screwTubeCapMParam.tubeDiameter = (float)centrifugalLabware.well_mouth_out_radius * 2; //离心管主管外径
|
|
screwTubeCapMParam.tubeRow = 0;
|
|
screwTubeCapMParam.capDiameter = (float)centrifugalLabware.lid_out_radius * 2;
|
screwTubeCapMParam.capExpandDistance = (float)centrifugalLabware.upgripper_spread;
|
screwTubeCapMParam.capPushDistance = (float)centrifugalLabware.upgripper_squeeze;
|
screwTubeCapMParam.capPushForce = (float)centrifugalLabware.upgripper_power;
|
screwTubeCapMParam.capScrewAngle = new float[] { (float)centrifugalLabware.well_helical_circle * 360 };
|
screwTubeCapMParam.capScrewSpeed = (float)30;
|
screwTubeCapMParam.capScrewDistance = new float[] { (float)centrifugalLabware.well_helical_distance * (float)Math.Ceiling(centrifugalLabware.well_helical_circle) };
|
screwTubeCapMParam.slotNo = 1;
|
screwTubeCapMParam.basezAxisVal = 0;
|
|
//下夹爪
|
screwTubeCapMParam.x2AxisVal = 0;
|
screwTubeCapMParam.y2AxisVal = 0;
|
screwTubeCapMParam.tubePushDistance = (float)centrifugalLabware.downgripper_squeeze;
|
screwTubeCapMParam.tubeExpandDistance = (float)centrifugalLabware.downgripper_spread;
|
screwTubeCapMParam.tubePushForce = (float)centrifugalLabware.downgripper_power;
|
screwTubeCapMParam.isKeepLowerGripperClamped = true;
|
|
//上夹爪
|
screwTubeCapMParam.xAxisVal = tipsTable.axis_b_X;
|
screwTubeCapMParam.yAxisVal = tipsTable.axis_b_Y;
|
|
screwTubeCapMParam.zAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labwares.piled_script).labware_height) + (float)centrifugalLabware.upgripper_zoffset;//孔口
|
|
|
|
launchView.SetWaitOne();//暂停
|
if (!currentExecuteTargetOpenLid)
|
{
|
ret = switchLidBll.ExecuteSwitchLid(screwTubeCapMParam, 0, isSimulator);
|
tipsTable.axis_b_Z = tipsTable.axis_b_Z - ControlCom.CurrentLengthOfTip;//被加的枪头要减回来
|
if (ret.Result != ResultType.Success)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to open lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to open lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidOpenSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to open lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to open lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
currentExecuteTargetOpenLid = true;
|
}
|
}
|
}
|
#endregion
|
|
#region 构建参数执行枪排液
|
tipsTable = null;
|
tipsTable = dtWells.SingleOrDefault(t => t.lattice_id.Equals(desLattice.lattice_id)
|
&& t.labware_id.Equals(desLabwareId)
|
&& t.wellname.Equals(targetWell));
|
|
DispenseMParam dispenseMParam = this.GenerateDispenseParam(methodNode, methodFileMoveLiquid, labwares, tipsTable, (float)Convert.ToDouble(targetVolume));
|
|
launchView.UpdateLabwareWells(tipsTable, new string[] { targetWell }, 3); // 正在放液水红色
|
DateTime startTime = DateTime.Now;
|
ret = dispenseBll.ExecuteDispense(dispenseMParam, isSimulator);
|
if (ret.Result != ResultType.Success)
|
{
|
launchView.addFinishDataIntoReport(tipsTable, slattice.lattice_num, targetVolume, new string[1] { tipsTable.wellname }, "block", new string[1] { "" });//目标孔
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunDispenseResource.strDispenseFail.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunDispenseResource.strDispenseFail.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress: Dispense was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress: Dispense was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
launchView.addFinishDataIntoReport(tipsTable, slattice.lattice_num, targetVolume, new string[1] { tipsTable.wellname }, "pass", new string[1] { "" });//目标孔
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunDispenseResource.strDispenseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.RunDispenseResource.strDispenseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress:Dispense was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】progress:Dispense was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
}
|
#endregion
|
|
#region 构建参数执行关盖
|
string dpsCloseLid = methodFileMoveLiquid.transferDataTable.Rows[recordIndex][methodFileMoveLiquid.dpsCloseLid].ToString();
|
if (dpsCloseLid.Equals("1"))
|
{
|
tipsTable.axis_b_Z = tipsTable.axis_b_Z + ControlCom.CurrentLengthOfTip;//被减的枪头要加回来
|
launchView.SetWaitOne();//暂停
|
screwTubeCapMParam.isKeepLowerGripperClamped = false;
|
if (currentExecuteTargetOpenLid)
|
{
|
ret = switchLidBll.ExecuteSwitchLid(screwTubeCapMParam, 1, isSimulator);
|
if (ret.Result != ResultType.Success)
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseFailed.ToString() + ret.AlarmInfo + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to close lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress: switch to close lid was failed on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice! Error info:" + ret.AlarmInfo);
|
}
|
result = false;
|
return result;
|
}
|
else
|
{
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】" + Properties.MachineRunResource.strProgress.ToString() + Properties.SwitchLidResource.strSwitchLidCloseSuccess.ToString() + " 孔 " + tipsTable.wellname + " 板位 " + slattice.lattice_num);
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to closed lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodNode.SelectSingleNode("name").InnerText + "】progress:switch to closed lid was successful on " + tipsTable.wellname + " of " + slattice.lattice_num + " lattice!");
|
}
|
}
|
}
|
}
|
#endregion
|
|
#region 构建参数执行卸载枪头
|
|
if (changeTipsMode == 0)//不卸载
|
{
|
|
}
|
else if (changeTipsMode == 1)//根据文件内容卸载
|
{
|
if (tipSet.Equals("1"))
|
{
|
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
|
unloadTipsControl.launchView = launchView;
|
bool bUnloadResult = unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, methodNode, isSimulator);
|
if (!bUnloadResult)
|
{
|
result = false;
|
return result;
|
}
|
launchView.currentIsLoadingTips = false;
|
bchannelTip = true;
|
}
|
else
|
{
|
|
}
|
}
|
else if (changeTipsMode == 2 || recordIndex == recordAllCount - 1)//最后一次都要下载枪头
|
{
|
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
|
unloadTipsControl.launchView = launchView;
|
bool bUnloadResult = unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, methodNode, isSimulator);
|
if (!bUnloadResult)
|
{
|
result = false;
|
return result;
|
}
|
launchView.currentIsLoadingTips = false;
|
launchView.currentLengthOfTip = 0f;
|
bchannelTip = true;
|
bIsFirstDataWithZero = false;
|
}
|
|
if ((recordIndex == recordAllCount - 1) && changeTipsMode != 2)
|
{
|
UnloadTipsControl unloadTipsControl = new UnloadTipsControl(Shared.SoftwareInformation.currentculture);
|
unloadTipsControl.launchView = launchView;
|
bool bUnloadResult = unloadTipsControl.ExecuteUnloadTipsInToTrash(platformNodeList, methodNode, isSimulator);
|
if (!bUnloadResult)
|
{
|
result = false;
|
return result;
|
}
|
launchView.currentIsLoadingTips = false;
|
bchannelTip = true;
|
bIsFirstDataWithZero = false;
|
}
|
#endregion
|
|
}
|
#endregion
|
}
|
|
recordIndex = recordIndex + 1;
|
}
|
|
if (strCurrentCulture.Equals("zh-CN"))
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.RunTransferFileResource.strAllStepsCompleted.ToString());
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】" + Properties.RunTransferFileResource.strAllStepsCompleted.ToString());
|
}
|
else
|
{
|
launchView.AddLogs("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】All steps of " + methodFileMoveLiquid.name + " have been completed;");
|
LoggerRunHelper.InfoLog("【" + DateTime.Now.ToString("HH:mm:ss:fff") + "】>Xhandler: 【" + methodFileMoveLiquid.name + "】All steps of " + methodFileMoveLiquid.name + " have been completed;");
|
}
|
}
|
|
|
#endregion
|
|
return result;
|
}
|
#endregion
|
|
#region 吸液参数对象构建
|
public AspirateMParam GenerateAspirateParam(XmlNode methodNode, MethodFileMoveLiquid methodFileMoveLiquid,
|
Labware labware, TipsTable tipsTable, float pVolume)
|
{
|
#region 数据准备
|
string liquididText = methodFileMoveLiquid.liquididText;
|
string liquididValue = methodFileMoveLiquid.liquididValue;
|
string liquidrangeidText = methodFileMoveLiquid.liquidrangeidText;
|
string liquidrangeidValue = methodFileMoveLiquid.liquidrangeidValue;
|
string liquidpidText = methodFileMoveLiquid.liquidpidText;
|
string liquidpidValue = methodFileMoveLiquid.liquidpidValue;
|
|
bool enableLiquidSensor = methodFileMoveLiquid.enableLiquidSensor;
|
int liquidSensorCount = Convert.ToInt32(methodFileMoveLiquid.liquidSensorCount);
|
double liquidSensorDistance = Convert.ToDouble(methodFileMoveLiquid.liquidSensorDistance);
|
double liquidSensorEndDistance = Convert.ToDouble(methodFileMoveLiquid.liquidSensorEndDistance);
|
double liquidSensorSpeed = Convert.ToDouble(methodFileMoveLiquid.liquidSensorSpeed);
|
double liquidSensorRadio = Convert.ToDouble(methodFileMoveLiquid.liquidSensorRadio);
|
string liquidSensorDisIdText = methodFileMoveLiquid.liquidSensorDisIdText;
|
double liquidSensorDisIdValue = methodFileMoveLiquid.liquidSensorDisIdValue;
|
bool enableLiquidFollow = methodFileMoveLiquid.enableLiquidFollow;
|
int liquidFollowType = Convert.ToInt32(methodFileMoveLiquid.liquidFollowType);
|
string liquidFollowTypeName = methodFileMoveLiquid.liquidFollowTypeName;
|
double liquidFollowSpeed = Convert.ToDouble(methodFileMoveLiquid.liquidFollowSpeed);
|
double liquidFollowDistance = Convert.ToDouble(methodFileMoveLiquid.liquidFollowDistance);
|
double liquidFollowArea = Convert.ToDouble(methodFileMoveLiquid.liquidFollowArea);
|
bool enableMixFollow = methodFileMoveLiquid.enableMixFollow;
|
string channelNums = string.Join(",", methodFileMoveLiquid.channels);
|
|
int[] chs = new int[methodFileMoveLiquid.channels.Length];
|
for (int m = 0; m < methodFileMoveLiquid.channels.Length; m++)
|
{
|
chs[m] = methodFileMoveLiquid.channels[m];
|
}
|
string[] wellnames = new string[methodFileMoveLiquid.channels.Length];
|
string[] indexLC = new string[methodFileMoveLiquid.channels.Length];
|
string[] tagCodeLC = new string[methodFileMoveLiquid.channels.Length];
|
float zAxisVals = 0f;
|
float pVolmunVals = 0f;
|
#endregion
|
|
// 液体参数
|
Liquid liquid = LiquidDB.GetALiquidFromdb(liquidpidValue);
|
|
AspirateMParam aspirateMParam = new AspirateMParam();
|
//aspirateMParam.channelCount = methodFileMoveLiquid.channels.Length;
|
//aspirateMParam.channelId = chs;
|
aspirateMParam.afterAirDelay = (int)liquid.after_aspirate_delay;
|
aspirateMParam.armId = Convert.ToInt32(methodFileMoveLiquid.armValue);
|
aspirateMParam.aspirateAcceleration = (float)liquid.aspirate_acceleration;
|
aspirateMParam.aspirateDeceleration = (float)liquid.aspirate_deceleration;
|
aspirateMParam.aspirateDelay = (int)liquid.aspirate_delay;
|
aspirateMParam.aspirateEnterSpeed = (float)liquid.aspirate_enter_speed;
|
aspirateMParam.aspirateOutSpeed = (float)liquid.aspirate_out_speed;
|
aspirateMParam.aspirateSpeed = (float)liquid.aspirate_speed;
|
aspirateMParam.basezAxisVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["zAxisSafeVal"]);
|
aspirateMParam.beforeAirDelay = (int)liquid.before_aspirate_delay;
|
|
#region 后吸空气
|
if ((float)liquid.after_aspirate_volume == 0f)
|
{
|
aspirateMParam.isAfterAir = false;
|
}
|
else
|
{
|
aspirateMParam.isAfterAir = true;
|
aspirateMParam.afterAirpAxisVal = (float)liquid.after_aspirate_volume;
|
}
|
#endregion
|
|
#region 前吸空气
|
if (liquid.before_aspirate_volume == 0d)
|
{
|
aspirateMParam.isBeforeAir = false;
|
}
|
else
|
{
|
aspirateMParam.isBeforeAir = true;
|
aspirateMParam.beforeAirpAxisVal = (float)liquid.before_aspirate_volume;
|
}
|
#endregion
|
|
aspirateMParam.liquidVolumeType = (int)Convert.ToInt32((liquid.liquid_volume_type != null ? "1" : liquid.liquid_volume_type));
|
//aspirateMParam.wellzAxisVal = (float)liquid.well_top_length; // 孔位平面的z轴
|
if (labware.labware_type_id.Equals("4"))
|
{
|
if (labware.labware_tubeshelf_type == 1)
|
{
|
ObservableCollection<LabwareWellInfo> labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labware.labware_id);
|
LabwareWellInfo currentWellInfo = labwareWellInfoList.FirstOrDefault(x => x.labware_well_name.Equals(tipsTable.wellname));
|
aspirateMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id).labware_height);
|
}
|
else
|
{
|
aspirateMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height);
|
}
|
}
|
else
|
{
|
aspirateMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)labware.well_height);// - (float)liquid.well_top_length);
|
}
|
#region 碰壁
|
if (liquid.dispense_is_knock_wall == 0)
|
{
|
aspirateMParam.isKnockWall = false;
|
}
|
else
|
{
|
aspirateMParam.isKnockWall = true;
|
aspirateMParam.knockDirection = (int)liquid.knock_direction;
|
aspirateMParam.knockSpeed = Convert.ToInt32(liquid.knock_speed);
|
aspirateMParam.knockWallDelay = (int)liquid.knock_wall_delay;
|
aspirateMParam.knockWellxOryAxisVal = (float)liquid.knock_wall_length;
|
aspirateMParam.knockWellzAxisVal = (float)liquid.knock_well_height;
|
}
|
#endregion
|
|
aspirateMParam.isSurvey = false;// enableLiquidSensor;
|
if (aspirateMParam.isSurvey == true)
|
{
|
if (labware.labware_type_id.Equals("4"))
|
{
|
if (labware.labware_tubeshelf_type == 1)
|
{
|
ObservableCollection<LabwareWellInfo> labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labware.labware_id);
|
LabwareWellInfo currentWellInfo = labwareWellInfoList.FirstOrDefault(x => x.labware_well_name.Equals(tipsTable.wellname));
|
|
aspirateMParam.surveyInitzVal = tipsTable.axis_b_Z - ((float)DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id).labware_height - (float)liquidSensorDistance);
|
aspirateMParam.surveyMaxzVal = tipsTable.axis_b_Z - ((float)DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id).labware_height - (float)liquidSensorEndDistance);
|
aspirateMParam.surveySpeed = (float)liquidSensorSpeed;
|
|
aspirateMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id).labware_height);
|
aspirateMParam.wellBottomzAxisVal = tipsTable.axis_b_Z;
|
}
|
else
|
{
|
Labware centrifugalLabware = ControlCom.GetCentrifugalLabwer(labware.piled_script);
|
aspirateMParam.surveyInitzVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height - (float)liquidSensorDistance);
|
aspirateMParam.surveyMaxzVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height - (float)liquidSensorEndDistance);
|
aspirateMParam.surveySpeed = (float)liquidSensorSpeed;
|
|
aspirateMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height);
|
aspirateMParam.wellBottomzAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height - (float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_height);
|
}
|
|
aspirateMParam.surveyFailHandleType = Convert.ToInt32(liquidSensorDisIdValue);
|
if (enableLiquidFollow)
|
{
|
aspirateMParam.followupType = liquidFollowType;
|
aspirateMParam.followupSpeed = (float)liquidFollowSpeed;
|
aspirateMParam.followupDistance = (float)liquidFollowDistance;
|
float area = 0.0f;
|
if (labware.well_shape == (int)WellSharpe.Round)
|
{
|
area = (float)(Math.PI * (float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_mouth_radius * (float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_mouth_radius);
|
}
|
else if (labware.well_shape == (int)WellSharpe.Rectangle)
|
{
|
area = (float)((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_top_x * (float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_top_y);
|
}
|
aspirateMParam.sectionalArea = area;
|
aspirateMParam.isMixFollowup = enableMixFollow;
|
}
|
else
|
{
|
|
}
|
}
|
else
|
{
|
//aspirateMParam.surveyRetryCount = liquidSensorCount;
|
aspirateMParam.surveyInitzVal = tipsTable.axis_b_Z - ((float)labware.well_height - (float)liquidSensorDistance);
|
aspirateMParam.surveyMaxzVal = tipsTable.axis_b_Z - ((float)labware.well_height - (float)liquidSensorEndDistance);
|
aspirateMParam.surveySpeed = (float)liquidSensorSpeed;
|
//aspirateMParam.surveyCoefficient =;
|
aspirateMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)labware.well_height);// - (float)liquid.well_top_length);
|
aspirateMParam.wellBottomzAxisVal = tipsTable.axis_b_Z;
|
aspirateMParam.surveyFailHandleType = Convert.ToInt32(liquidSensorDisIdValue);
|
if (enableLiquidFollow)
|
{
|
//aspirateMParam.followupType = liquidFollowType;
|
aspirateMParam.followupSpeed = (float)liquidFollowSpeed;
|
aspirateMParam.followupDistance = (float)liquidFollowDistance;
|
float area = 0.0f;
|
if (labware.well_shape == (int)WellSharpe.Round)
|
{
|
area = (float)(Math.PI * labware.well_mouth_radius * labware.well_mouth_radius);
|
}
|
else if (labware.well_shape == (int)WellSharpe.Rectangle)
|
{
|
area = (float)(labware.well_top_x * labware.well_top_y);
|
}
|
aspirateMParam.sectionalArea = area;
|
aspirateMParam.isMixFollowup = enableMixFollow;
|
}
|
else
|
{
|
|
}
|
}
|
}
|
else
|
{
|
|
}
|
|
aspirateMParam.isMix = methodFileMoveLiquid.baspMix;
|
if (aspirateMParam.isMix)
|
{
|
aspirateMParam.mixAspiratePositionValue = Convert.ToInt32(methodFileMoveLiquid.aspmixAspiratePositionValue);
|
aspirateMParam.mixAspiratePositionText = methodFileMoveLiquid.aspmixAspiratePositionText;
|
if (aspirateMParam.mixAspiratePositionValue == 0)//liquid
|
{
|
|
}
|
else if (aspirateMParam.mixAspiratePositionValue == 1)//top
|
{
|
aspirateMParam.mixAspirateDistance = ((float)labware.well_height - (float)methodFileMoveLiquid.aspmixAspirateDistance);
|
}
|
else if (aspirateMParam.mixAspiratePositionValue == 2)//bottom
|
{
|
aspirateMParam.mixAspirateDistance = (float)methodFileMoveLiquid.aspmixAspirateDistance;
|
}
|
aspirateMParam.mixAspirateSpeed = (float)Convert.ToDouble(methodFileMoveLiquid.aspmixAspirateSpeed);
|
aspirateMParam.mixDispensePositionValue = Convert.ToInt32(methodFileMoveLiquid.aspmixDispensePositionValue);
|
aspirateMParam.mixDispensePositionText = methodFileMoveLiquid.aspmixDispensePositionText;
|
if (aspirateMParam.mixDispensePositionValue == 0)//liquid
|
{
|
|
}
|
else if (aspirateMParam.mixDispensePositionValue == 1)//top
|
{
|
aspirateMParam.mixDispenseDistance = ((float)labware.well_height - (float)methodFileMoveLiquid.aspmixDispenseDistance);
|
}
|
else if (aspirateMParam.mixDispensePositionValue == 2)//bottom
|
{
|
aspirateMParam.mixDispenseDistance = (float)methodFileMoveLiquid.aspmixDispenseDistance;
|
}
|
aspirateMParam.mixDispenseSpeed = (float)Convert.ToDouble(methodFileMoveLiquid.aspmixDispenseSpeed);
|
|
aspirateMParam.mixvolume = (float)methodFileMoveLiquid.aspmixvolume;
|
aspirateMParam.mixCount = methodFileMoveLiquid.aspmixcount;
|
|
}
|
else
|
{
|
aspirateMParam.isMix = false;
|
aspirateMParam.mixAspirateDistance = 0;
|
aspirateMParam.mixAspirateSpeed = 100;
|
aspirateMParam.mixDispenseDistance = 0;
|
aspirateMParam.mixDispenseSpeed = 100;
|
aspirateMParam.mixvolume = 0;
|
aspirateMParam.mixCount = 0;
|
aspirateMParam.mixzAxisVal = 0f;
|
}
|
aspirateMParam.zAxisVal = zAxisVals;
|
aspirateMParam.pAxisVal = pVolmunVals;
|
|
|
float pVolumnVas = 0f;
|
for (int k = 0; k < methodFileMoveLiquid.channels.Length; k++)
|
{
|
pVolumnVas = pVolume; // 体积
|
if (k == 0)
|
{
|
aspirateMParam.xAxisVal = tipsTable.axis_b_X;
|
aspirateMParam.yAxisVal = tipsTable.axis_b_Y;
|
}
|
|
// 孔位平面的z轴
|
float zVal = aspirateMParam.wellzAxisVal;//tipsTableRemoteArrayList[n][k].axis_b_Z + ControlCom.CurrentLengthOfTipOffSetVal;
|
//aspirateMParam.wellzAxisVal = zVal - (float)labware.well_height;
|
|
#region 孔位的z轴
|
if (liquid.aspirate_position_type == 0)
|
{
|
}
|
else if (liquid.aspirate_position_type == 1)
|
{
|
zVal = zVal + (float)Convert.ToDouble(liquid.aspirate_well_bottom_length);
|
}
|
else if (liquid.aspirate_position_type == 2)
|
{
|
//zVal = aspirateMParam.wellzAxisVal + (float)liquid.aspirate_well_bottom_length;
|
if (labware.labware_type_id.Equals("4"))
|
{
|
if(labware.labware_tubeshelf_type==1)
|
{
|
ObservableCollection<LabwareWellInfo> labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labware.labware_id);
|
LabwareWellInfo currentWellInfo = labwareWellInfoList.FirstOrDefault(x => x.labware_well_name.Equals(tipsTable.wellname));
|
Labware currentWellLabware = DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id);
|
zVal = tipsTable.axis_b_Z - (float)Convert.ToDouble(liquid.aspirate_well_bottom_length) - ((float)currentWellLabware.labware_height- (float)currentWellLabware.well_height);
|
}
|
else
|
{
|
zVal = tipsTable.axis_b_Z - (float)Convert.ToDouble(liquid.aspirate_well_bottom_length) - ControlCom.CalculateWellBottomThickness(labware.piled_script);
|
}
|
}
|
else
|
{
|
zVal = tipsTable.axis_b_Z - (float)Convert.ToDouble(liquid.aspirate_well_bottom_length);
|
}
|
}
|
zAxisVals = zVal < 0 ? 0 : zVal;
|
#endregion
|
aspirateMParam.mixzAxisVal = (float)Convert.ToDouble(aspirateMParam.zAxisVal);
|
wellnames[k] = tipsTable.wellname; // 孔位
|
|
// 精度校准后的体积
|
LiquidAccuracy liquidAccuracy = liquidAccuracyBll.GetLiquidAccuracyFromdb(Convert.ToInt32(liquidrangeidValue), Convert.ToInt32(aspirateMParam.armId), Convert.ToDouble(pVolume), liquididValue);
|
double targetVolume = liquidAccuracyBll.CalculateAspirateParamVolume(Convert.ToDouble(pVolumnVas), liquidAccuracy);
|
pVolmunVals = (float)targetVolume == 0f ? 20f : (float)targetVolume;
|
}
|
|
aspirateMParam.mixzAxisVal = zAxisVals;
|
aspirateMParam.zAxisVal = zAxisVals;
|
aspirateMParam.pAxisVal = pVolmunVals;
|
return aspirateMParam;
|
}
|
#endregion
|
|
#region 放液参数对象构建
|
public DispenseMParam GenerateDispenseParam(XmlNode methodNode, MethodFileMoveLiquid methodFileMoveLiquid,
|
Labware labware, TipsTable tipsTable, float pVolume)
|
{
|
#region 数据准备
|
string liquididText = methodFileMoveLiquid.liquididText;
|
string liquididValue = methodFileMoveLiquid.liquididValue;
|
string liquidrangeidText = methodFileMoveLiquid.liquidrangeidText;
|
string liquidrangeidValue = methodFileMoveLiquid.liquidrangeidValue;
|
string liquidpidText = methodFileMoveLiquid.liquidpidText;
|
string liquidpidValue = methodFileMoveLiquid.liquidpidValue;
|
|
bool enableLiquidSensor = methodFileMoveLiquid.enableLiquidSensor;
|
int liquidSensorCount = Convert.ToInt32(methodFileMoveLiquid.liquidSensorCount);
|
double liquidSensorDistance = Convert.ToDouble(methodFileMoveLiquid.liquidSensorDistance);
|
double liquidSensorEndDistance = Convert.ToDouble(methodFileMoveLiquid.liquidSensorEndDistance);
|
double liquidSensorSpeed = Convert.ToDouble(methodFileMoveLiquid.liquidSensorSpeed);
|
double liquidSensorRadio = Convert.ToDouble(methodFileMoveLiquid.liquidSensorRadio);
|
string liquidSensorDisIdText = methodFileMoveLiquid.liquidSensorDisIdText;
|
double liquidSensorDisIdValue = methodFileMoveLiquid.liquidSensorDisIdValue;
|
bool enableLiquidFollow = methodFileMoveLiquid.enableLiquidFollow;
|
int liquidFollowType = Convert.ToInt32(methodFileMoveLiquid.liquidFollowType);
|
string liquidFollowTypeName = methodFileMoveLiquid.liquidFollowTypeName;
|
double liquidFollowSpeed = Convert.ToDouble(methodFileMoveLiquid.liquidFollowSpeed);
|
double liquidFollowDistance = Convert.ToDouble(methodFileMoveLiquid.liquidFollowDistance);
|
double liquidFollowArea = Convert.ToDouble(methodFileMoveLiquid.liquidFollowArea);
|
bool enableMixFollow = methodFileMoveLiquid.enableMixFollow;
|
string channelNums = string.Join(",", methodFileMoveLiquid.channels);
|
|
int[] chs = new int[methodFileMoveLiquid.channels.Length];
|
for (int m = 0; m < methodFileMoveLiquid.channels.Length; m++)
|
{
|
chs[m] = methodFileMoveLiquid.channels[m];
|
}
|
string[] wellnames = new string[methodFileMoveLiquid.channels.Length];
|
string[] indexLC = new string[methodFileMoveLiquid.channels.Length];
|
string[] tagCodeLC = new string[methodFileMoveLiquid.channels.Length];
|
float zAxisVals = 0f;
|
float pVolmunVals = 0f;
|
#endregion
|
|
// 液体参数
|
Liquid liquid = LiquidDB.GetALiquidFromdb(liquidpidValue);
|
|
DispenseMParam dispenseMParam = new DispenseMParam();
|
//dispenseMParam.channelCount = methodFileMoveLiquid.channels.Length;
|
//dispenseMParam.channelId = chs;
|
dispenseMParam.afterAirDelay = (int)liquid.after_dispense_delay;
|
dispenseMParam.armId = Convert.ToInt32(methodFileMoveLiquid.armValue);
|
dispenseMParam.dispenseAcceleration = (float)liquid.dispense_acceleration;
|
dispenseMParam.dispenseDeceleration = (float)liquid.dispense_deceleration;
|
dispenseMParam.dispenseDelay = (int)liquid.dispense_delay;
|
dispenseMParam.dispenseEnterSpeed = (float)liquid.dispense_enter_speed;
|
dispenseMParam.dispenseOutSpeed = (float)liquid.dispense_out_speed;
|
dispenseMParam.dispenseSpeed = (float)liquid.dispense_speed;
|
dispenseMParam.basezAxisVal = (float)Convert.ToDouble(ConfigurationManager.AppSettings["zAxisSafeVal"]);
|
dispenseMParam.beforeAirDelay = (int)liquid.before_dispense_delay;
|
|
#region 后吸空气
|
if ((float)liquid.after_dispense_volume == 0f)
|
{
|
dispenseMParam.isAfterAir = false;
|
}
|
else
|
{
|
dispenseMParam.isAfterAir = true;
|
dispenseMParam.afterAirpAxisVal = (float)liquid.after_dispense_volume;
|
}
|
#endregion
|
|
#region 前吸空气
|
if (liquid.before_dispense_volume == 0d)
|
{
|
dispenseMParam.isBeforeAir = false;
|
}
|
else
|
{
|
dispenseMParam.isBeforeAir = true;
|
dispenseMParam.beforeAirpAxisVal = (float)liquid.before_dispense_volume;
|
}
|
#endregion
|
|
//dispenseMParam.liquidVolumeType = (int)Convert.ToInt32((liquid.liquid_volume_type != null ? "1" : liquid.liquid_volume_type));
|
//dispenseMParam.wellzAxisVal = (float)liquid.well_top_length; // 孔位平面的z轴
|
if (labware.labware_type_id.Equals("4"))
|
{
|
if (labware.labware_tubeshelf_type == 1)
|
{
|
ObservableCollection<LabwareWellInfo> labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labware.labware_id);
|
LabwareWellInfo currentWellInfo = labwareWellInfoList.FirstOrDefault(x => x.labware_well_name.Equals(tipsTable.wellname));
|
dispenseMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id).labware_height);
|
}
|
else
|
{
|
dispenseMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height);
|
}
|
}
|
else
|
{
|
dispenseMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)labware.well_height);// - (float)liquid.well_top_length);
|
}
|
#region 碰壁
|
if (liquid.dispense_is_knock_wall == 0)
|
{
|
dispenseMParam.isKnockWall = false;
|
}
|
else
|
{
|
dispenseMParam.isKnockWall = true;
|
dispenseMParam.knockDirection = (int)liquid.knock_direction;
|
dispenseMParam.knockSpeed = (float)liquid.knock_speed;
|
dispenseMParam.knockWallDelay = (int)liquid.knock_wall_delay;
|
dispenseMParam.knockWellxOryAxisVal = (float)liquid.knock_wall_length;
|
dispenseMParam.knockWellzAxisVal = (float)liquid.knock_well_height;
|
}
|
#endregion
|
|
dispenseMParam.isSurvey = false;// enableLiquidSensor;
|
if (dispenseMParam.isSurvey == true)
|
{
|
if (labware.labware_type_id.Equals("4"))
|
{
|
if (labware.labware_tubeshelf_type == 1)
|
{
|
ObservableCollection<LabwareWellInfo> labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labware.labware_id);
|
LabwareWellInfo currentWellInfo = labwareWellInfoList.FirstOrDefault(x => x.labware_well_name.Equals(tipsTable.wellname));
|
dispenseMParam.surveyInitzVal = tipsTable.axis_b_Z - ((float)DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id).labware_height - (float)liquidSensorDistance);
|
dispenseMParam.surveyMaxzVal = tipsTable.axis_b_Z - ((float)DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id).labware_height - (float)liquidSensorEndDistance);
|
dispenseMParam.surveySpeed = (float)liquidSensorSpeed;
|
|
dispenseMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id).labware_height);
|
dispenseMParam.wellBottomzAxisVal = tipsTable.axis_b_Z;
|
}
|
else
|
{
|
Labware centrifugalLabware = ControlCom.GetCentrifugalLabwer(labware.piled_script);
|
dispenseMParam.surveyInitzVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height - (float)liquidSensorDistance);
|
dispenseMParam.surveyMaxzVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height - (float)liquidSensorEndDistance);
|
dispenseMParam.surveySpeed = (float)liquidSensorSpeed;
|
|
dispenseMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height);
|
dispenseMParam.wellBottomzAxisVal = tipsTable.axis_b_Z - ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).labware_height - (float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_height);
|
}
|
|
dispenseMParam.surveyFailHandleType = Convert.ToInt32(liquidSensorDisIdValue);
|
if (enableLiquidFollow)
|
{
|
dispenseMParam.followupType = liquidFollowType;
|
dispenseMParam.followupSpeed = (float)liquidFollowSpeed;
|
dispenseMParam.followupDistance = (float)liquidFollowDistance;
|
float area = 0.0f;
|
if (labware.well_shape == (int)WellSharpe.Round)
|
{
|
area = (float)(Math.PI * (float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_mouth_radius * (float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_mouth_radius);
|
}
|
else if (labware.well_shape == (int)WellSharpe.Rectangle)
|
{
|
area = (float)((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_top_x * (float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_top_y);
|
}
|
dispenseMParam.sectionalArea = area;
|
dispenseMParam.isMixFollowup = enableMixFollow;
|
}
|
else
|
{
|
|
}
|
}
|
else
|
{
|
//dispenseMParam.surveyRetryCount = liquidSensorCount;
|
dispenseMParam.surveyInitzVal = tipsTable.axis_b_Z - ((float)labware.well_height - (float)liquidSensorDistance);
|
dispenseMParam.surveyMaxzVal = tipsTable.axis_b_Z - ((float)labware.well_height - (float)liquidSensorEndDistance);
|
dispenseMParam.surveySpeed = (float)liquidSensorSpeed;
|
//aspirateMParam.surveyCoefficient =;
|
dispenseMParam.wellzAxisVal = tipsTable.axis_b_Z - ((float)labware.well_height);// - (float)liquid.well_top_length);
|
dispenseMParam.wellBottomzAxisVal = tipsTable.axis_b_Z;
|
dispenseMParam.surveyFailHandleType = Convert.ToInt32(liquidSensorDisIdValue);
|
if (enableLiquidFollow)
|
{
|
//dispenseMParam.followupType = liquidFollowType;
|
dispenseMParam.followupSpeed = (float)liquidFollowSpeed;
|
dispenseMParam.followupDistance = (float)liquidFollowDistance;
|
float area = 0.0f;
|
if (labware.well_shape == (int)WellSharpe.Round)
|
{
|
area = (float)(Math.PI * labware.well_mouth_radius * labware.well_mouth_radius);
|
}
|
else if (labware.well_shape == (int)WellSharpe.Rectangle)
|
{
|
area = (float)(labware.well_top_x * labware.well_top_y);
|
}
|
dispenseMParam.sectionalArea = area;
|
dispenseMParam.isMixFollowup = enableMixFollow;
|
}
|
else
|
{
|
|
}
|
}
|
}
|
else
|
{
|
|
}
|
|
dispenseMParam.isMix = methodFileMoveLiquid.bdpsMix;
|
if (dispenseMParam.isMix)
|
{
|
dispenseMParam.mixAspiratePositionValue = Convert.ToInt32(methodFileMoveLiquid.dpsmixAspiratePositionValue);
|
dispenseMParam.mixAspiratePositionText = methodFileMoveLiquid.dpsmixAspiratePositionText;
|
|
if (labware.labware_type_id.Equals("4"))
|
{
|
if (methodFileMoveLiquid.dpsmixAspiratePositionValue == 0)//liquid
|
{
|
}
|
else if (methodFileMoveLiquid.dpsmixAspiratePositionValue == 1)//top
|
{
|
dispenseMParam.mixAspirateDistance = ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_height - (float)methodFileMoveLiquid.dpsmixAspirateDistance);
|
}
|
else if (methodFileMoveLiquid.dpsmixAspiratePositionValue == 2)//bottom
|
{
|
dispenseMParam.mixAspirateDistance = (float)methodFileMoveLiquid.dpsmixAspirateDistance;
|
}
|
}
|
else
|
{
|
if (methodFileMoveLiquid.dpsmixAspiratePositionValue == 0)//liquid
|
{
|
|
}
|
else if (methodFileMoveLiquid.dpsmixAspiratePositionValue == 1)//top
|
{
|
dispenseMParam.mixAspirateDistance = ((float)labware.well_height - (float)methodFileMoveLiquid.dpsmixAspirateDistance);
|
}
|
else if (methodFileMoveLiquid.dpsmixAspiratePositionValue == 2)//bottom
|
{
|
dispenseMParam.mixAspirateDistance = (float)methodFileMoveLiquid.dpsmixAspirateDistance;
|
}
|
}
|
dispenseMParam.mixAspirateSpeed = (float)Convert.ToDouble(methodFileMoveLiquid.dpsmixAspirateSpeed);
|
dispenseMParam.mixDispensePositionValue = Convert.ToInt32(methodFileMoveLiquid.dpsmixDispensePositionValue);
|
dispenseMParam.mixDispensePositionText = methodFileMoveLiquid.dpsmixDispensePositionText;
|
if (labware.labware_type_id.Equals("4"))
|
{
|
if (methodFileMoveLiquid.dpsmixDispensePositionValue == 0)//liquid
|
{
|
|
}
|
else if (methodFileMoveLiquid.dpsmixDispensePositionValue == 1)//top
|
{
|
dispenseMParam.mixDispenseDistance = ((float)ControlCom.GetCentrifugalLabwer(labware.piled_script).well_height - (float)methodFileMoveLiquid.dpsmixDispenseDistance);
|
}
|
else if (methodFileMoveLiquid.dpsmixDispensePositionValue == 2)//bottom
|
{
|
dispenseMParam.mixDispenseDistance = (float)methodFileMoveLiquid.dpsmixDispenseDistance;
|
}
|
}
|
else
|
{
|
if (methodFileMoveLiquid.dpsmixDispensePositionValue == 0)//liquid
|
{
|
|
}
|
else if (methodFileMoveLiquid.dpsmixDispensePositionValue == 1)//top
|
{
|
dispenseMParam.mixDispenseDistance = ((float)labware.well_height - (float)methodFileMoveLiquid.dpsmixDispenseDistance);
|
}
|
else if (methodFileMoveLiquid.dpsmixDispensePositionValue == 2)//bottom
|
{
|
dispenseMParam.mixDispenseDistance = (float)methodFileMoveLiquid.dpsmixDispenseDistance;
|
}
|
}
|
dispenseMParam.mixDispenseSpeed = (float)Convert.ToDouble(methodFileMoveLiquid.dpsmixDispenseSpeed);
|
|
dispenseMParam.mixvolume = (float)methodFileMoveLiquid.dpsmixvolume;
|
dispenseMParam.mixCount = methodFileMoveLiquid.dpsmixcount;
|
}
|
else
|
{
|
dispenseMParam.mixAspirateDistance = 0;
|
dispenseMParam.mixAspirateSpeed = 100;
|
dispenseMParam.mixDispenseDistance = 0;
|
dispenseMParam.mixDispenseSpeed = 100;
|
dispenseMParam.enableVolumeToNull = true;
|
dispenseMParam.zAxisVal = zAxisVals;
|
dispenseMParam.pAxisVal = pVolmunVals;
|
dispenseMParam.mixzAxisVal = 0f;
|
}
|
|
float pVolumnVas = 0f;
|
for (int k = 0; k < methodFileMoveLiquid.channels.Length; k++)
|
{
|
pVolumnVas = pVolume; // 体积
|
if (k == 0)
|
{
|
dispenseMParam.xAxisVal = tipsTable.axis_b_X;
|
dispenseMParam.yAxisVal = tipsTable.axis_b_Y;
|
}
|
|
// 孔位平面的z轴
|
float zVal = dispenseMParam.wellzAxisVal;//tipsTableRemoteArrayList[n][k].axis_b_Z + ControlCom.CurrentLengthOfTipOffSetVal;
|
//dispenseMParam.wellzAxisVal = zVal - (float)labware.well_height;
|
|
#region 孔位的z轴
|
if (liquid.dispense_position_type == 0)
|
{
|
}
|
else if (liquid.dispense_position_type == 1)
|
{
|
zVal = zVal + (float)liquid.dispense_well_bottom_length;
|
}
|
else if (liquid.dispense_position_type == 2)
|
{
|
//zVal = dispenseMParam.wellzAxisVal + (float)liquid.dispense_well_bottom_length;
|
if (labware.labware_type_id.Equals("4"))
|
{
|
if (labware.labware_tubeshelf_type == 1)
|
{
|
ObservableCollection<LabwareWellInfo> labwareWellInfoList = DataRWDAL.LabwareDB.GetSpecialLabwareWellInfo(labware.labware_id);
|
LabwareWellInfo currentWellInfo = labwareWellInfoList.FirstOrDefault(x => x.labware_well_name.Equals(tipsTable.wellname));
|
Labware currentWellLabware = DataRWDAL.LabwareDB.GetLabware(currentWellInfo.well_labware_id);
|
zVal = tipsTable.axis_b_Z - (float)Convert.ToDouble(liquid.dispense_well_bottom_length) - ((float)currentWellLabware.labware_height- (float)currentWellLabware.well_height);
|
}
|
else
|
{
|
zVal = tipsTable.axis_b_Z - (float)Convert.ToDouble(liquid.dispense_well_bottom_length) - ControlCom.CalculateWellBottomThickness(labware.piled_script);
|
}
|
}
|
else
|
{
|
zVal = tipsTable.axis_b_Z - (float)Convert.ToDouble(liquid.dispense_well_bottom_length);
|
}
|
}
|
zAxisVals = zVal < 0 ? 0 : zVal;
|
#endregion
|
|
wellnames[k] = tipsTable.wellname; // 孔位
|
dispenseMParam.mixzAxisVal = (float)Convert.ToDouble(dispenseMParam.zAxisVal);
|
// 精度校准后的体积
|
LiquidAccuracy liquidAccuracy = liquidAccuracyBll.GetLiquidAccuracyFromdb(Convert.ToInt32(liquidrangeidValue), Convert.ToInt32(dispenseMParam.armId), Convert.ToDouble(pVolume), liquididValue);
|
double targetVolume = liquidAccuracyBll.CalculateAspirateParamVolume(Convert.ToDouble(pVolumnVas), liquidAccuracy);
|
pVolmunVals = (float)targetVolume == 0f ? 20f : (float)targetVolume;
|
}
|
|
dispenseMParam.mixzAxisVal = zAxisVals;
|
dispenseMParam.zAxisVal = zAxisVals;
|
dispenseMParam.pAxisVal = pVolmunVals;
|
return dispenseMParam;
|
}
|
#endregion
|
|
|
}
|
}
|