using DataEntity.Rack;
|
using DataRWDAL;
|
using DriverLib.Engine;
|
using HxEnum;
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using System.Collections.ObjectModel;
|
using System.Xml;
|
using XCoreBLL.Resource;
|
using XImagingXhandler.XDAL;
|
|
namespace XCore
|
{
|
public class GripTransportBll
|
{
|
|
#region 获取抓板方向
|
/// <summary>
|
/// 获取抓板方向
|
/// </summary>
|
/// <param name="softwareDevicNumber"></param>
|
/// <returns></returns>
|
public List<GripTransportModel> GenerateGripTransportModel(string softwareDevicNumber)
|
{
|
List<GripTransportModel> gripTransportModels= new List<GripTransportModel>();
|
GripTransportModel gripTransportModel = null;
|
|
gripTransportModel = new GripTransportModel();
|
gripTransportModel.model_id = EnumManagement.GetEnumValue(GripperModelEnum.Right).ToString();
|
gripTransportModel.model_name = "夹爪轴心在板位右侧";
|
gripTransportModels.Add(gripTransportModel);
|
|
gripTransportModel = new GripTransportModel();
|
gripTransportModel.model_id = EnumManagement.GetEnumValue(GripperModelEnum.Left).ToString();
|
gripTransportModel.model_name = "夹爪轴心在板位左侧";
|
gripTransportModels.Add(gripTransportModel);
|
|
gripTransportModel = new GripTransportModel();
|
gripTransportModel.model_id = EnumManagement.GetEnumValue(GripperModelEnum.Up).ToString(); ;
|
gripTransportModel.model_name = "夹爪轴心在板位上侧";
|
gripTransportModels.Add(gripTransportModel);
|
|
gripTransportModel = new GripTransportModel();
|
gripTransportModel.model_id = EnumManagement.GetEnumValue(GripperModelEnum.Down).ToString(); ;
|
gripTransportModel.model_name = "夹爪轴心在板位下侧";
|
gripTransportModels.Add(gripTransportModel);
|
|
return gripTransportModels;
|
}
|
#endregion
|
|
#region 构建抓板时的模式位置数据
|
public List<GripTransportModel> GetGripTransportModelPoss()
|
{
|
List<GripTransportModel> gripTransportModels = new List<GripTransportModel>();
|
GripTransportModel gripTransportModel = new GripTransportModel();
|
gripTransportModel.model_id = "1";
|
gripTransportModel.model_name = "底部";
|
gripTransportModels.Add(gripTransportModel);
|
|
gripTransportModel = new GripTransportModel();
|
gripTransportModel.model_id = "2";
|
gripTransportModel.model_name = "顶部";
|
gripTransportModels.Add(gripTransportModel);
|
|
return gripTransportModels;
|
}
|
#endregion
|
|
string strCurrentCulture = "";
|
public GripTransportBll()
|
{
|
strCurrentCulture = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
|
}
|
|
/// <summary>
|
/// 生成抓板转移方法的xml节点属性对象
|
/// </summary>
|
/// <param name="xmlNode">抓板转移方法的xml节点</param>
|
/// <returns>抓板转移方法的xml节点属性对象</returns>
|
public MethodGripTransport GenerateMethodGripTransport(XmlNode xmlNode)
|
{
|
MethodGripTransport methodGripTransport = new MethodGripTransport();
|
methodGripTransport.isrun = xmlNode.SelectSingleNode("isrun").InnerText;
|
methodGripTransport.status = xmlNode.SelectSingleNode("status").InnerText;
|
methodGripTransport.name = xmlNode.SelectSingleNode("name").InnerText;
|
methodGripTransport.strIndex = xmlNode.SelectSingleNode("strIndex").InnerText;
|
methodGripTransport.label = xmlNode.SelectSingleNode("label").InnerText;
|
methodGripTransport.armText = xmlNode.SelectSingleNode("arm/text").InnerText;
|
methodGripTransport.armValue = xmlNode.SelectSingleNode("arm/value").InnerText;
|
|
#region 来源点位
|
methodGripTransport.srcPositionText = xmlNode.SelectSingleNode("sourceLattice/text").InnerText;
|
methodGripTransport.srcPositionValue = xmlNode.SelectSingleNode("sourceLattice/value").InnerText;
|
methodGripTransport.srcPositionType = Convert.ToInt32(xmlNode.SelectSingleNode("sourceLattice/type").InnerText);
|
#endregion
|
|
#region 目标点位
|
methodGripTransport.desPositionText = xmlNode.SelectSingleNode("destinationLattice/text").InnerText;
|
methodGripTransport.desPositionValue = xmlNode.SelectSingleNode("destinationLattice/value").InnerText;
|
methodGripTransport.desPositionType = Convert.ToInt32(xmlNode.SelectSingleNode("destinationLattice/type").InnerText);
|
#endregion
|
|
methodGripTransport.gripModelText = xmlNode.SelectSingleNode("gripModel/text").InnerText;
|
methodGripTransport.gripModelValue = Convert.ToInt32(xmlNode.SelectSingleNode("gripModel/value").InnerText);
|
methodGripTransport.gripModelSetText = xmlNode.SelectSingleNode("gripModelSet/text").InnerText;
|
methodGripTransport.gripModelSetValue = Convert.ToInt32(xmlNode.SelectSingleNode("gripModelSet/value").InnerText);
|
methodGripTransport.gripPickLabwareText = xmlNode.SelectSingleNode("gripPickObject/text").InnerText;
|
methodGripTransport.gripPickLabwareValue = xmlNode.SelectSingleNode("gripPickObject/value").InnerText;
|
methodGripTransport.pickPosMode = xmlNode.SelectSingleNode("pickPosMode")!=null? Convert.ToInt32(xmlNode.SelectSingleNode("pickPosMode").InnerText):0;
|
methodGripTransport.pickPosValue = xmlNode.SelectSingleNode("pickPosValue") != null ? xmlNode.SelectSingleNode("pickPosValue").InnerText : "0";
|
|
methodGripTransport.gripPlaceLabwareText = xmlNode.SelectSingleNode("gripPlaceObject/text").InnerText;
|
methodGripTransport.gripPlaceLabwareValue = xmlNode.SelectSingleNode("gripPlaceObject/value").InnerText;
|
|
methodGripTransport.gripModelPosText = xmlNode.SelectSingleNode("gripModelPos/text").InnerText;
|
methodGripTransport.gripModelPosValue = Convert.ToInt32(xmlNode.SelectSingleNode("gripModelPos/value").InnerText);
|
methodGripTransport.placePosMode = xmlNode.SelectSingleNode("placePosMode") != null ? Convert.ToInt32(xmlNode.SelectSingleNode("placePosMode").InnerText) : 0;
|
methodGripTransport.placePosValue = xmlNode.SelectSingleNode("placePosValue") != null ? xmlNode.SelectSingleNode("placePosValue").InnerText : "0";
|
|
methodGripTransport.transportMode= Convert.ToInt32(xmlNode.SelectSingleNode("transportMode").InnerText);
|
methodGripTransport.transportCount = Convert.ToInt32(xmlNode.SelectSingleNode("transportCount").InnerText);
|
return methodGripTransport;
|
}
|
|
#region 检查所有属性设置是否满足要求
|
/// <summary>
|
/// 检查所有属性设置是否满足要求
|
/// </summary>
|
/// <param name="methodAspirate">抓板转移属性对象</param>
|
/// <returns>检查所有属性设置是否满足要求</returns>
|
public MethodPropertyInfo CheckProperty(MethodGripTransport methodGripTransport)
|
{
|
MethodPropertyInfo methodPropertyInfo = new MethodPropertyInfo();
|
|
if (strCurrentCulture == "zh-CN")
|
{
|
methodPropertyInfo.property_tips_info = GripTransportResourceCHS.tipsInfo.ToString();
|
|
if (methodGripTransport.armText == null || methodGripTransport.armText == "")
|
{
|
methodPropertyInfo.property_name_info = GripTransportResourceCHS.armText.ToString();
|
}
|
if (methodGripTransport.srcPositionText == null || methodGripTransport.srcPositionText == "")
|
{
|
methodPropertyInfo.property_name_info = GripTransportResourceCHS.sourceLatticeText.ToString();
|
}
|
if (methodGripTransport.desPositionText == null || methodGripTransport.desPositionText == "")
|
{
|
methodPropertyInfo.property_name_info = GripTransportResourceCHS.destinationLatticeText.ToString();
|
}
|
}
|
else if (strCurrentCulture == "en-US")
|
{
|
methodPropertyInfo.property_tips_info = GripTransportResourceENU.tipsInfo.ToString();
|
|
if (methodGripTransport.armText == null || methodGripTransport.armText == "")
|
{
|
methodPropertyInfo.property_name_info = GripTransportResourceENU.armText.ToString();
|
}
|
if (methodGripTransport.srcPositionText == null || methodGripTransport.srcPositionText == "")
|
{
|
methodPropertyInfo.property_name_info = GripTransportResourceENU.sourceLatticeText.ToString();
|
}
|
if (methodGripTransport.desPositionText == null || methodGripTransport.desPositionText == "")
|
{
|
methodPropertyInfo.property_name_info = GripTransportResourceENU.destinationLatticeText.ToString();
|
}
|
}
|
return methodPropertyInfo;
|
}
|
#endregion
|
|
#region 判断当前板位左右是否有障碍耗材
|
/// <summary>
|
/// 判断当前板位左右是否有障碍耗材
|
/// </summary>
|
/// <param name="latticesNode">当前板位数据节点xml</param>
|
/// <param name="methodNode">夹爪方法属性参数xml节点对象</param>
|
/// <param name="software_device_number">当前设备号</param>
|
/// <param name="fGripperBaseHeight">夹爪指尖与夹爪横梁之间距离高度</param>
|
/// <param name="isSourceLattice">是否来源板位;1是;2目标板</param>
|
/// <returns>0:没有障碍,夹爪正常位抓取;1:较小编号台面有障碍;3:较大编号台面有障碍;2;前后两个都有障碍</returns>
|
public int IsExistObstacle(XmlNode latticesNode, XmlNode methodNode, string software_device_number, float fGripperBaseHeight, int isSourceLattice)
|
{
|
int iResult = 0;
|
string strSrcLatticeid = "";
|
if (isSourceLattice == 1)
|
{
|
strSrcLatticeid = methodNode.SelectSingleNode("sourceLattice/value").InnerText;//来源板
|
}else if(isSourceLattice==2)
|
{
|
strSrcLatticeid = methodNode.SelectSingleNode("destinationLattice/value").InnerText;//来源板
|
}
|
ArrayList arrayList = GetFourDirectionLatticeId(Convert.ToInt32(strSrcLatticeid), software_device_number);
|
for (int i = 0; i < arrayList.Count; i++)
|
{
|
var latticeXn = latticesNode.SelectSingleNode("platform[lattice_id=" + arrayList[i] + "]");
|
string strlabwareId = "";
|
if (latticeXn != null)
|
{
|
strlabwareId = latticeXn.SelectSingleNode("labware_id").InnerText;//板位上放的耗材Id
|
//数据库读取耗材个总高度
|
//判断耗材的高度是否在夹爪的安全抓取范围
|
//夹爪正向耗材是在范围;夹爪纵向耗材是在范围;两者都在安全范围;两者都不在安全范围;
|
ObservableCollection<XImagingXhandler.XDAL.Labware> labwares = LabwareDB.GetLabware(1, strlabwareId);
|
if (labwares.Count == 0)
|
{
|
labwares = LabwareDB.GetLabware(0, strlabwareId);
|
}
|
|
if (labwares.Count >= 1)
|
{
|
if (labwares[0].labware_height >= fGripperBaseHeight)
|
{
|
if (arrayList.Count == 1 && ((int)arrayList[i] < Convert.ToInt32(strSrcLatticeid)))
|
{
|
iResult = 1;
|
}
|
else if (arrayList.Count == 1 &&((int)arrayList[i] > Convert.ToInt32(strSrcLatticeid)))
|
{
|
iResult = 3;
|
}
|
else
|
{
|
iResult++;
|
}
|
}
|
}
|
}
|
else
|
{
|
|
}
|
}
|
|
return iResult;
|
}
|
#endregion
|
|
#region 根据当前板位Id,获取其四周的板位Id
|
/// <summary>
|
/// 根据当前板位Id,获取其四周的板位Id
|
/// </summary>
|
/// <param name="currentLatticeId">当前板位id</param>
|
/// <param name="software_device_number">当前设备号</param>
|
/// <returns></returns>
|
public ArrayList GetFourDirectionLatticeId(int currentLatticeId, string software_device_number)
|
{
|
ArrayList arrayList= new ArrayList();
|
Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(currentLatticeId.ToString());
|
int currentLatticeIndex = Convert.ToInt32(lattice.lattice_num.Substring(1, lattice.lattice_num.Length - 1));
|
|
return arrayList;
|
}
|
#endregion
|
|
#region 执行抓板,返回结果字符串
|
/// <summary>
|
/// 执行放板,返回结果字符串
|
/// </summary>
|
/// <param name="gripTransportMParam">抓板动作参数实体</param>
|
/// <param name="isSimulator">0:连接设备;1:虚拟运行</param>
|
/// <returns>结果实体对象</returns>
|
public HxResult ExecuteGripTransportPick(GripTransportMParam gripTransportMParam, bool isSimulator = false)
|
{
|
HxResult ret = new HxResult();
|
if (!isSimulator)
|
{
|
ret = MethodAction.Instance.Pick(gripTransportMParam);
|
}
|
else
|
{
|
System.Threading.Thread.Sleep(1000);
|
ret.Result = ResultType.Success;
|
//ret.AlarmInfo = "空测试";
|
}
|
|
return ret;
|
}
|
#endregion
|
|
#region 执行放板,返回结果字符串
|
/// <summary>
|
/// 执行放板,返回结果字符串
|
/// </summary>
|
/// <param name="gripTransportMParam">放板动作参数实体</param>
|
/// <param name="isSimulator">0:连接设备;1:虚拟运行</param>
|
/// <returns>结果实体对象</returns>
|
public HxResult ExecuteGripTransportPlace(GripTransportMParam gripTransportMParam, bool isSimulator=false)
|
{
|
HxResult ret = new HxResult();
|
if (!isSimulator)
|
{
|
ret = MethodAction.Instance.Place(gripTransportMParam);
|
}
|
else
|
{
|
System.Threading.Thread.Sleep(1000);
|
ret.Result = ResultType.Success;
|
}
|
|
return ret;
|
}
|
#endregion
|
}
|
}
|