|
|
using HalconDotNet;
|
|
|
using NPOI.SS.Formula.Eval;
|
|
|
using Rs.Camera;
|
|
|
using Rs.Controls;
|
|
|
using Rs.Framework;
|
|
|
using Rs.Motion;
|
|
|
using Rs.MotionPlat.Commom;
|
|
|
using Rs.MotionPlat.Entitys;
|
|
|
using Rs.MotionPlat.Entitys.Trays;
|
|
|
using Rs.MotionPlat.Flow.Common;
|
|
|
using Rs.MotionPlat.Flow.NormalFlow;
|
|
|
using Rs.MotionPlat.Flow.SafePosFlow;
|
|
|
using Rs.MotionPlat.Flow.SubFlow;
|
|
|
using Rs.MotionPlat.Vision;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Diagnostics;
|
|
|
using System.Diagnostics.Eventing.Reader;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Net.Http;
|
|
|
using System.Runtime.CompilerServices;
|
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
namespace Rs.MotionPlat.Flow
|
|
|
{
|
|
|
public enum EDischargeFlowStep
|
|
|
{
|
|
|
//开始排料前准备
|
|
|
等待启动,
|
|
|
料仓上料,
|
|
|
等待料仓上料完成,
|
|
|
上料仓去盖,
|
|
|
等待上料仓去盖完成,
|
|
|
料仓三点定位,
|
|
|
等待料仓三点定位完成,
|
|
|
|
|
|
//料仓取料
|
|
|
判断是否需要从料仓取料,
|
|
|
到料仓拍照位上方,
|
|
|
等待到料仓拍照位上方,
|
|
|
料仓取料拍照,
|
|
|
到料仓取料位上方,
|
|
|
等待到料仓取料位上方,
|
|
|
到料仓取料位下方,
|
|
|
等待到料仓取料位下方,
|
|
|
料仓取料完成抬起,
|
|
|
等待料仓取料完成抬起,
|
|
|
料仓取料真空吸检测,
|
|
|
|
|
|
//治具换料
|
|
|
到治具取料等待位,
|
|
|
等待到治具取料等待位,
|
|
|
等待治具测试完成换料,
|
|
|
到治具取料位上方,
|
|
|
等待到治具取料位上方,
|
|
|
到治具取料位下方1,
|
|
|
等待到治具取料位下方1,
|
|
|
到治具取料位下方2,
|
|
|
等待到治具取料位下方2,
|
|
|
治具取料打开真空吸,
|
|
|
治具取料松开治具夹爪,
|
|
|
治具取料完成抬起1,
|
|
|
等待治具取料完成抬起1,
|
|
|
治具取料完成抬起2,
|
|
|
等待治具取料完成抬起2,
|
|
|
治具取料完成真空检测,
|
|
|
到治具拍照位,
|
|
|
等待到治具拍照位,
|
|
|
通知相机拍照,
|
|
|
处理拍照结果,
|
|
|
到治具放料位上方,
|
|
|
等待到治具放料位上方,
|
|
|
到治具放料位下方1,
|
|
|
等待到治具放料位下方1,
|
|
|
到治具放料位下方2,
|
|
|
等待到治具放料位下方2,
|
|
|
治具放料完成后抬起,
|
|
|
等待治具放料完成后抬起,
|
|
|
|
|
|
//料仓放料
|
|
|
判断是否需要放料到料仓,
|
|
|
到料仓放料位上方,
|
|
|
等待到料仓放料位上方,
|
|
|
到料仓放料位下方,
|
|
|
等待到料仓放料位下方,
|
|
|
料仓放料完成抬起,
|
|
|
等待料仓放料完成抬起,
|
|
|
料仓放料完成粘料检测
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 排料流程
|
|
|
/// </summary>
|
|
|
public class DischargeFlow
|
|
|
{
|
|
|
private Task mainTask;
|
|
|
private DischargeFlow() { }
|
|
|
|
|
|
private static DischargeFlow instance;
|
|
|
public static DischargeFlow Instance
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
if (instance == null)
|
|
|
{
|
|
|
instance = new DischargeFlow();
|
|
|
}
|
|
|
return instance;
|
|
|
}
|
|
|
}
|
|
|
private AlarmEntity alarmEntity;
|
|
|
Stopwatch timeout = new Stopwatch();
|
|
|
EDischargeFlowStep flowStep = EDischargeFlowStep.等待启动;
|
|
|
|
|
|
int scanNum = 0;
|
|
|
string logInfo = string.Empty;
|
|
|
string alarmInfo = string.Empty;
|
|
|
|
|
|
private bool stop = true;
|
|
|
private bool run = true;
|
|
|
TargetPosition targetPosition = new TargetPosition();
|
|
|
ErrorCode errCode = ErrorCode.Ok;
|
|
|
TraySlot slot = null;
|
|
|
Nozzle curNozzle = null;
|
|
|
TestFixture curFixture = null;
|
|
|
//放料穴位
|
|
|
TraySlot curDumpSlot = null;
|
|
|
/// <summary>
|
|
|
/// 最后一次换料的治具编号
|
|
|
/// </summary>
|
|
|
private int lastFixtureIndex = 0;
|
|
|
List<int> checkFixtureList = new List<int>();
|
|
|
|
|
|
public void Init()
|
|
|
{
|
|
|
mainTask = new Task(Run);
|
|
|
mainTask.Start();
|
|
|
}
|
|
|
|
|
|
public void Deinit()
|
|
|
{
|
|
|
run = false;
|
|
|
}
|
|
|
private void Run()
|
|
|
{
|
|
|
while (run)
|
|
|
{
|
|
|
if (stop || !GlobalVar.DeviceIsAuto)
|
|
|
{
|
|
|
Thread.Sleep(10);
|
|
|
continue;
|
|
|
}
|
|
|
switch (flowStep)
|
|
|
{
|
|
|
case EDischargeFlowStep.等待启动:
|
|
|
|
|
|
flowStep = EDischargeFlowStep.判断是否需要从料仓取料;
|
|
|
break;
|
|
|
#region 临时屏蔽
|
|
|
//case EDischargeFlowStep.料仓上料:
|
|
|
// Task.Run(() => {
|
|
|
// Stock2Flow.Instance.Load();
|
|
|
// });
|
|
|
// Task.Run(() => {
|
|
|
// Stock3Flow.Instance.Load();
|
|
|
// });
|
|
|
// Task.Run(() => {
|
|
|
// Stock1Flow.Instance.Load();
|
|
|
// });
|
|
|
// flowStep = EDischargeFlowStep.等待料仓上料完成;
|
|
|
// break;
|
|
|
//case EDischargeFlowStep.等待料仓上料完成:
|
|
|
// if(Stock1Flow.Instance.WaitFinished() && Stock2Flow.Instance.WaitFinished() && Stock3Flow.Instance.WaitFinished())
|
|
|
// {
|
|
|
// if (Stock2Flow.Instance.HasTray() && Stock3Flow.Instance.HasTray())
|
|
|
// {
|
|
|
// Msg.ShowInfo("料盘准备完毕");
|
|
|
// int l = Stock1Flow.Instance.GetCurLayer();
|
|
|
// flowStep = EDischargeFlowStep.上料仓去盖;
|
|
|
// }
|
|
|
// }
|
|
|
// break;
|
|
|
//case EDischargeFlowStep.上料仓去盖:
|
|
|
// if(Ops.IsOff("满料1对射光电"))
|
|
|
// {
|
|
|
// TakeTrayFlow.Instance.Take(ETrayType.Input, ETrayType.Ok, null, null, null);
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// TakeTrayFlow.Instance.Take(ETrayType.Input, ETrayType.Empty, null, null, null);
|
|
|
// }
|
|
|
// flowStep = EDischargeFlowStep.等待上料仓去盖完成;
|
|
|
// break;
|
|
|
//case EDischargeFlowStep.等待上料仓去盖完成:
|
|
|
// break;
|
|
|
#endregion
|
|
|
//料仓取料
|
|
|
case EDischargeFlowStep.判断是否需要从料仓取料:
|
|
|
//检测吸嘴有几个产品,少于3个产品则需要从料仓上料
|
|
|
int idelNozzleNum = NozzleManager.GetIdleNozzleCount();
|
|
|
if (idelNozzleNum == 1)
|
|
|
{
|
|
|
logInfo = GetClassName() + $"空闲吸嘴的数量为{idelNozzleNum},没有空闲的吸嘴了,去治具换料";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
//NozzleManager.GetNozzle(1).Status = ENozzleStatus.IDLE;
|
|
|
//NozzleManager.GetNozzle(2).Status = ENozzleStatus.IDLE;
|
|
|
//NozzleManager.GetNozzle(3).Status = ENozzleStatus.IDLE;
|
|
|
flowStep = EDischargeFlowStep.到治具取料等待位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
logInfo = GetClassName() + $"空闲吸嘴的数量为{idelNozzleNum},继续取料";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
//检测料仓的拍照结果,如果还有未取的料则先取料,否则需要先拍照
|
|
|
if (OneGrabFourManager.Instance.GetCanTakeSlotNum()>0)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到料仓取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//没有可以取的穴位了,先拍照
|
|
|
flowStep = EDischargeFlowStep.到料仓拍照位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到料仓拍照位上方:
|
|
|
slot = GlobalTray.GrabTray.GetSlot(ESlotStatus.Have);
|
|
|
if(slot!=null)
|
|
|
{
|
|
|
SlotPoint sp = TrayPointManager.GetSlotPoint(ETrayType.Grab, slot.Index);
|
|
|
if(sp!=null)
|
|
|
{
|
|
|
targetPosition.X = sp.X;
|
|
|
targetPosition.Y1 = GlobalVar.StockSideY1;
|
|
|
targetPosition.Y2 = sp.Y;
|
|
|
if(GroupAxisMove.XY1Y2MovePos(targetPosition))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"到料仓拍照位上方,tloadx:{targetPosition.X},tloady1:{targetPosition.Y1},tloady2:{targetPosition.Y2}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.等待到料仓拍照位上方;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//没有料了,判断是否需要换料
|
|
|
GlobalTray.GrabTray.ChangeStatus(ESlotStatus.Have);
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到料仓拍照位上方:
|
|
|
if(Ops.IsStop("LoadX","LoadY1","LoadY2"))
|
|
|
{
|
|
|
PrintXY1Y2CurrentPos("轴loadx,loady1,loady2已停止运动,");
|
|
|
if(AxisArrived.LoadXY1Y2IsArrived(targetPosition.X,targetPosition.Y1,targetPosition.Y2))
|
|
|
{
|
|
|
logInfo = $"已运动到料仓拍照位上方,cloadx:{Ops.GetCurPosition(AxisControl.LoadX)},cloady1:{AxisControl.LoadY1},cloady2:{AxisControl.LoadY2}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.料仓取料拍照;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
logInfo = GetClassName() + $"轴不在目标位置,重新运动一次";
|
|
|
MessageQueue.Instance.Warn(logInfo) ;
|
|
|
flowStep = EDischargeFlowStep.到料仓拍照位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.料仓取料拍照:
|
|
|
List<VisionResult> vResult = VisionHelper.OneGrabFour();
|
|
|
if(vResult!=null &&vResult.Count==4)
|
|
|
{
|
|
|
for (int i = 0; i < vResult.Count; i++)
|
|
|
{
|
|
|
OneGrabFourManager.Instance.DealGrabResult(slot.Index, i + 1, vResult[i]);
|
|
|
}
|
|
|
GlobalTray.GrabTray.ChangeStatus(slot.Index, ESlotStatus.NotHave);
|
|
|
flowStep = EDischargeFlowStep.到料仓取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msgbox.ShowDialog(EButtonType.Retry, "料盘拍照失败,请处理后点击重试");
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到料仓取料位上方:
|
|
|
//获取空闲吸嘴
|
|
|
curNozzle = NozzleManager.GetIdelNozzle();
|
|
|
if(curNozzle!=null)
|
|
|
{
|
|
|
//获取料盘位置
|
|
|
OneGrabFourResult re = OneGrabFourManager.Instance.GetCanTakeSlot();
|
|
|
re.IsTakeOver = true;
|
|
|
targetPosition.X = re.LoadX + GlobalVar.Nozzle1ToCameraCenterOffsetX + NozzleManager.GetNozzleOffsetX(curNozzle.NozzleIndex);
|
|
|
targetPosition.Y1 = GlobalVar.StockSideY1;
|
|
|
targetPosition.Y2 = re.LoadY + GlobalVar.Nozzle1ToCameraCenterOffsetY2 + NozzleManager.GetNozzleOffsetY2(curNozzle.NozzleIndex);
|
|
|
if(GroupAxisMove.XY1Y2MovePos(targetPosition))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待到料仓取料位上方;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到料仓取料位上方:
|
|
|
if (Ops.IsStop("LoadX", "LoadY1", "LoadY2") || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
PrintXY1Y2CurrentPos("轴XY1Y2已停止运动,");
|
|
|
if (AxisArrived.LoadXY1Y2IsArrived(targetPosition.X, targetPosition.Y1, targetPosition.Y2))
|
|
|
{
|
|
|
logInfo = $"已运动到取印尼位上方,cloadx:{Ops.GetCurPosition(AxisControl.LoadX)},cloady1:{AxisControl.LoadY1},cloady2:{AxisControl.LoadY2}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.到料仓取料位下方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到料仓取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到料仓取料位下方:
|
|
|
targetPosition.StockZ = NozzleManager.GetNozzleToTrayTakeProductPos(ETrayType.Input, curNozzle.NozzleIndex);
|
|
|
if(NozzleManager.Go(curNozzle, targetPosition.StockZ, GlobalVar.WholeSpeed))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待到料仓取料位下方;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到料仓取料位下方:
|
|
|
if(Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
curNozzle.VacSuction(EIoOperate.Open);
|
|
|
flowStep = EDischargeFlowStep.料仓取料完成抬起;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.料仓取料完成抬起:
|
|
|
if(NozzleManager.Go(curNozzle,0,GlobalVar.WholeSpeed))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待料仓取料完成抬起;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待料仓取料完成抬起:
|
|
|
if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.料仓取料真空吸检测;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.料仓取料真空吸检测:
|
|
|
if (Ops.IsOn($"吸料真空{curNozzle.NozzleIndex}检测"))
|
|
|
{
|
|
|
curNozzle.Product = new TestProduct() { SN = VirtualBarCode.Code, TestNum = 0 };
|
|
|
curNozzle.Status = ENozzleStatus.ToTest;
|
|
|
GlobalTray.NozzleTray.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.Have);
|
|
|
flowStep = EDischargeFlowStep.判断是否需要从料仓取料;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
EButtonType btnSelect = Msgbox.ShowDialog(EButtonType.EndInput | EButtonType.Retry | EButtonType.Skip, "料仓取料失败");
|
|
|
switch (btnSelect)
|
|
|
{
|
|
|
case EButtonType.EndInput:
|
|
|
|
|
|
break;
|
|
|
case EButtonType.Retry:
|
|
|
logInfo = GetClassName() + $"选择了重试";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
//关闭真空吸
|
|
|
curNozzle.VacSuction(EIoOperate.Close);
|
|
|
flowStep = EDischargeFlowStep.到料仓取料位下方;
|
|
|
break;
|
|
|
case EButtonType.Skip:
|
|
|
logInfo = GetClassName() + $"选择了跳过";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.到料仓取料位上方;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//治具换料
|
|
|
case EDischargeFlowStep.到治具取料等待位:
|
|
|
//先去第一个治具拍照位上方等待
|
|
|
targetPosition =FixtureManager.GetFixtureGrabPos(lastFixtureIndex + 1);
|
|
|
if(GroupAxisMove.XY1Y2MovePos(targetPosition))
|
|
|
{
|
|
|
logInfo = $"到治具放料缓冲位,tloadx={targetPosition.X},tloady1={targetPosition.Y1},tloady2={targetPosition.Y2}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.等待到治具取料等待位;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到治具取料等待位:
|
|
|
if(Ops.IsStop("LoadX","LoadY1","LoadY2"))
|
|
|
{
|
|
|
PrintXY1Y2CurrentPos("轴loadx,loady1,loady2已停止运动,");
|
|
|
if(AxisArrived.LoadXY1Y2IsArrived(targetPosition.X, targetPosition.Y1, targetPosition.Y2))
|
|
|
{
|
|
|
CreateCheckFixtureQueue();
|
|
|
logInfo = $"已运动到放料缓冲位,cloadx={Ops.GetCurPosition(AxisControl.LoadX)},cloady1={Ops.GetCurPosition(AxisControl.LoadY1)},cloady2={Ops.GetCurPosition(AxisControl.LoadY2)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.等待治具测试完成换料;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具取料等待位;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待治具测试完成换料:
|
|
|
foreach (int i in checkFixtureList)
|
|
|
{
|
|
|
TestFixture fixture = TestFixtureManager.Instance.GetTestFixture(i);
|
|
|
if (fixture != null && fixture.Status == ETestFixtureStatus.IDLE)
|
|
|
{
|
|
|
//在这里检测吸嘴上有没有产品可以方到这个治具,如果有就把这个产品取起来,如果没有等待下一个就绪的治具
|
|
|
|
|
|
curFixture = fixture;
|
|
|
//判断治具是否有产品,没有产品则直接放料
|
|
|
if(curFixture.Product!=null)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具拍照位;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到治具取料位上方:
|
|
|
//先找出要放的吸嘴
|
|
|
curNozzle = NozzleManager.GetIdelNozzle();
|
|
|
if(curNozzle!=null)
|
|
|
{
|
|
|
targetPosition = NozzleManager.GetNozzleToFixturePos(curFixture.Index, curNozzle.NozzleIndex);
|
|
|
if (GroupAxisMove.XY1Y2MovePos(targetPosition))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"到治具取料位上方,tloadx={targetPosition.X},tloady1={targetPosition.Y1},tloady2={targetPosition.Y2}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.等待到治具取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到治具取料位上方:
|
|
|
if (Ops.IsStop("LoadX", "LoadY1", "LoadY2"))
|
|
|
{
|
|
|
PrintXY1Y2CurrentPos("轴loadx,loady1,loady2已停止运动,");
|
|
|
if (AxisArrived.LoadXY1Y2IsArrived(targetPosition.X, targetPosition.Y1, targetPosition.Y2))
|
|
|
{
|
|
|
logInfo = $"已运动到治具取料位上方,cloadx={Ops.GetCurPosition(AxisControl.LoadX)},cloady1={Ops.GetCurPosition(AxisControl.LoadY1)},cloady2={Ops.GetCurPosition(AxisControl.LoadY2)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.到治具取料位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到治具取料位下方1:
|
|
|
targetPosition.NozzleZ = NozzleManager.GetFixtureTakeProductPos(curFixture.Index, curNozzle.NozzleIndex);
|
|
|
if(NozzleManager.Go(curNozzle, targetPosition.NozzleZ, GlobalVar.WholeSpeed))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待到治具取料位下方1;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到治具取料位下方1:
|
|
|
if(Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具取料位下方2;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到治具取料位下方2:
|
|
|
targetPosition.NozzleZ = NozzleManager.GetFixtureTakeProductPos(curFixture.Index, curNozzle.NozzleIndex);
|
|
|
if (NozzleManager.Go(curNozzle, targetPosition.NozzleZ, GlobalVar.WholeSpeed))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待到治具取料位下方2;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到治具取料位下方2:
|
|
|
if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
if(GlobalVar.RunSpace)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.治具取料完成抬起1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
curNozzle.VacSuction(EIoOperate.Open);
|
|
|
curFixture.ColletOff();
|
|
|
flowStep = EDischargeFlowStep.治具取料完成抬起1;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.治具取料完成抬起1:
|
|
|
if(NozzleManager.Go(curNozzle,0, GlobalVar.WholeSpeed))
|
|
|
{
|
|
|
|
|
|
}
|
|
|
errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待治具取料完成抬起1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴NozzleZ{curNozzle.NozzleIndex}运动异常");
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待治具取料完成抬起1:
|
|
|
if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.治具取料完成抬起2;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.治具取料完成抬起2:
|
|
|
errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待治具取料完成抬起2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴NozzleZ{curNozzle.NozzleIndex}运动异常");
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待治具取料完成抬起2:
|
|
|
if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.治具取料完成真空检测;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.治具取料完成真空检测:
|
|
|
if(GlobalVar.RunSpace)
|
|
|
{
|
|
|
|
|
|
curNozzle.Product=curFixture.Product;
|
|
|
curFixture.Product = null;
|
|
|
curNozzle.Status = ENozzleStatus.ToUnload;
|
|
|
GlobalTray.NozzleTray.ChangeStatus(curNozzle.NozzleIndex, ESlotStatus.Have);
|
|
|
flowStep = EDischargeFlowStep.到治具拍照位;
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
case EDischargeFlowStep.到治具拍照位:
|
|
|
|
|
|
targetPosition.X = GetFixtureGrabPosX(curFixture.Index);
|
|
|
targetPosition.Y1 = GlobalVar.FixtureSideY1;
|
|
|
targetPosition.Y2 = GetFixtureGrabPosY2(curFixture.Index);
|
|
|
errCode = AxisControl.LoadX.MovePos(targetPosition.X, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
errCode = AxisControl.LoadY1.MovePos(targetPosition.Y1, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
errCode = AxisControl.LoadY2.MovePos(targetPosition.Y2, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
logInfo = $"到治具拍照位,tloadx={targetPosition.X},tloady1={targetPosition.Y1},tloady2={targetPosition.Y2}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.等待到治具拍照位;
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadY2运动异常,ret={errCode}");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadY1运动异常,ret={errCode}");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadX运动异常,ret={errCode}");
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到治具拍照位:
|
|
|
if (Ops.IsStop("LoadX", "LoadY1", "LoadY2"))
|
|
|
{
|
|
|
PrintXY1Y2CurrentPos("轴loadx,loady1,loady2已停止运动,");
|
|
|
if (AxisArrived.LoadXY1Y2IsArrived(targetPosition.X, targetPosition.Y1, targetPosition.Y2))
|
|
|
{
|
|
|
CreateCheckFixtureQueue();
|
|
|
logInfo = $"已运动到治具拍照位,cloadx={Ops.GetCurPosition(AxisControl.LoadX)},cloady1={Ops.GetCurPosition(AxisControl.LoadY1)},cloady2={Ops.GetCurPosition(AxisControl.LoadY2)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.通知相机拍照;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具拍照位;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.通知相机拍照:
|
|
|
flowStep = EDischargeFlowStep.处理拍照结果;
|
|
|
break;
|
|
|
case EDischargeFlowStep.处理拍照结果:
|
|
|
flowStep = EDischargeFlowStep.到治具放料位上方;
|
|
|
break;
|
|
|
|
|
|
case EDischargeFlowStep.到治具放料位上方:
|
|
|
//先找出要放的吸嘴
|
|
|
curNozzle = NozzleManager.GetToTestNozzle();
|
|
|
if (curNozzle != null)
|
|
|
{
|
|
|
targetPosition.X = GetFixtureGrabPosX(curFixture.Index) + GlobalVar.Nozzle1ToCameraCenterOffsetX + NozzleManager.GetNozzleOffsetX(curNozzle.NozzleIndex);
|
|
|
targetPosition.Y1 = GlobalVar.FixtureSideY1;
|
|
|
targetPosition.Y2 = GetFixtureGrabPosY2(curFixture.Index) + GlobalVar.Nozzle1ToCameraCenterOffsetY2 + NozzleManager.GetNozzleOffsetY2(curNozzle.NozzleIndex);
|
|
|
errCode = AxisControl.LoadX.MovePos(targetPosition.X, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
errCode = AxisControl.LoadY1.MovePos(targetPosition.Y1, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
errCode = AxisControl.LoadY2.MovePos(targetPosition.Y2, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
logInfo = $"到治具放料位上方,tloadx={targetPosition.X},tloady1={targetPosition.Y1},tloady2={targetPosition.Y2}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.等待到治具放料位上方;
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadY2运动异常,ret={errCode}");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadY1运动异常,ret={errCode}");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadX运动异常,ret={errCode}");
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到治具放料位上方:
|
|
|
if (Ops.IsStop("LoadX", "LoadY1", "LoadY2"))
|
|
|
{
|
|
|
PrintXY1Y2CurrentPos("轴loadx,loady1,loady2已停止运动,");
|
|
|
if (AxisArrived.LoadXY1Y2IsArrived(targetPosition.X, targetPosition.Y1, targetPosition.Y2))
|
|
|
{
|
|
|
CreateCheckFixtureQueue();
|
|
|
logInfo = $"已运动到治具放料位上方,cloadx={Ops.GetCurPosition(AxisControl.LoadX)},cloady1={Ops.GetCurPosition(AxisControl.LoadY1)},cloady2={Ops.GetCurPosition(AxisControl.LoadY2)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.到治具放料位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具放料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到治具放料位下方1:
|
|
|
errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(10, GlobalVar.WholeSpeed);
|
|
|
if(errCode== ErrorCode.Ok)
|
|
|
{
|
|
|
logInfo = $"";
|
|
|
flowStep = EDischargeFlowStep.等待到治具放料位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴NozzleZ{curNozzle.NozzleIndex}运动异常");
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到治具放料位下方1:
|
|
|
if(Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具放料位下方2;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到治具放料位下方2:
|
|
|
errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(10, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待到治具放料位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴NozzleZ{curNozzle.NozzleIndex}运动异常");
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到治具放料位下方2:
|
|
|
if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
Ops.On($"治具夹{curFixture.Index}");
|
|
|
Thread.Sleep(100);
|
|
|
//关闭真空吸
|
|
|
Ops.Off($"吸料真空{curNozzle.NozzleIndex}吸");
|
|
|
Thread.Sleep(100);
|
|
|
//打开真空破
|
|
|
Ops.On($"吸料真空{curNozzle.NozzleIndex}破");
|
|
|
Thread.Sleep(100);
|
|
|
Ops.Off($"吸料真空{curNozzle.NozzleIndex}破");
|
|
|
|
|
|
flowStep = EDischargeFlowStep.治具放料完成后抬起;
|
|
|
}
|
|
|
|
|
|
|
|
|
break;
|
|
|
case EDischargeFlowStep.治具放料完成后抬起:
|
|
|
errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待治具放料完成后抬起;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴NozzleZ{curNozzle.NozzleIndex}运动异常");
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待治具放料完成后抬起:
|
|
|
if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
curFixture.Product = curNozzle.Product;
|
|
|
curFixture.StartTest();
|
|
|
lastFixtureIndex = curFixture.Index == 6 ? 0 : curFixture.Index;
|
|
|
curNozzle.Clear();
|
|
|
if (NozzleManager.GetToTestNozzle()!=null)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到治具取料等待位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.判断是否需要放料到料仓;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//料仓放料
|
|
|
case EDischargeFlowStep.判断是否需要放料到料仓:
|
|
|
//检测有没有需要放料到料仓的吸嘴
|
|
|
if(NozzleManager.GetToUnloadNozzle()!=null)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到料仓放料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.判断是否需要从料仓取料;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到料仓放料位上方:
|
|
|
curNozzle = NozzleManager.GetToUnloadNozzle();
|
|
|
if(curNozzle!=null)
|
|
|
{
|
|
|
|
|
|
//吸嘴放料,加测吸嘴上的产品的测试结果,决定把料放到哪个料仓
|
|
|
//目前先都方到OK料仓
|
|
|
curDumpSlot = GlobalTray.NgTray.GetSlot(ESlotStatus.NotHave);
|
|
|
if(curDumpSlot != null)
|
|
|
{
|
|
|
//获取点位
|
|
|
SlotPoint slotPoint = TrayPointManager.GetSlotPoint(ETrayType.Ng, curDumpSlot.Index);
|
|
|
targetPosition.X = slotPoint.X + GlobalVar.Nozzle1ToCameraCenterOffsetX + NozzleManager.GetNozzleOffsetX(curNozzle.NozzleIndex);
|
|
|
targetPosition.Y1 = GlobalVar.StockSideY1;
|
|
|
targetPosition.Y2 = slotPoint.Y + GlobalVar.Nozzle1ToCameraCenterOffsetY2 + NozzleManager.GetNozzleOffsetY2(curNozzle.NozzleIndex);
|
|
|
errCode = AxisControl.LoadX.MovePos(targetPosition.X, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
errCode = AxisControl.LoadY1.MovePos(targetPosition.Y1, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
errCode = AxisControl.LoadY2.MovePos(targetPosition.Y2, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
logInfo = $"到料仓放料位上方,tloadx={targetPosition.X},tloady1={targetPosition.Y1},tloady2={targetPosition.Y2}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.等待到料仓放料位上方;
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadY2运动异常,ret={errCode}");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadY1运动异常,ret={errCode}");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴LoadX运动异常,ret={errCode}");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
GlobalTray.NgTray.ChangeStatus(ESlotStatus.NotHave);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到料仓放料位上方:
|
|
|
if (Ops.IsStop("LoadX", "LoadY1", "LoadY2"))
|
|
|
{
|
|
|
PrintXY1Y2CurrentPos("轴loadx,loady1,loady2已停止运动,");
|
|
|
if (AxisArrived.LoadXY1Y2IsArrived(targetPosition.X, targetPosition.Y1, targetPosition.Y2))
|
|
|
{
|
|
|
CreateCheckFixtureQueue();
|
|
|
logInfo = $"已运动到料仓放料位上方,cloadx={Ops.GetCurPosition(AxisControl.LoadX)},cloady1={Ops.GetCurPosition(AxisControl.LoadY1)},cloady2={Ops.GetCurPosition(AxisControl.LoadY2)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
flowStep = EDischargeFlowStep.到料仓放料位下方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.到料仓放料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.到料仓放料位下方:
|
|
|
errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(36, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待到料仓放料位下方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴NozzleZ{curNozzle.NozzleIndex}运动异常");
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待到料仓放料位下方:
|
|
|
if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.料仓放料完成抬起;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.料仓放料完成抬起:
|
|
|
errCode = AxisControl.GetAxis($"NozzleZ{curNozzle.NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed);
|
|
|
if (errCode == ErrorCode.Ok)
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.等待料仓放料完成抬起;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError($"轴NozzleZ{curNozzle.NozzleIndex}运动异常");
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.等待料仓放料完成抬起:
|
|
|
if (Ops.IsStop($"NozzleZ{curNozzle.NozzleIndex}"))
|
|
|
{
|
|
|
flowStep = EDischargeFlowStep.料仓放料完成粘料检测;
|
|
|
}
|
|
|
break;
|
|
|
case EDischargeFlowStep.料仓放料完成粘料检测:
|
|
|
if(true)
|
|
|
{
|
|
|
GlobalTray.NgTray.ChangeStatus(curDumpSlot.Index, ESlotStatus.Have);
|
|
|
curNozzle.Clear();
|
|
|
flowStep = EDischargeFlowStep.判断是否需要放料到料仓;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void Start()
|
|
|
{
|
|
|
stop = false;
|
|
|
}
|
|
|
public void Stop()
|
|
|
{
|
|
|
stop = true;
|
|
|
}
|
|
|
private string GetClassName()
|
|
|
{
|
|
|
return "DischargeFlow-";
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 获取吸嘴取料取不起来时,吸嘴在原取料位的偏移
|
|
|
/// 奇数向下偏移
|
|
|
/// 偶数向上偏移
|
|
|
/// </summary>
|
|
|
/// <param name="fetchNum"></param>
|
|
|
/// <returns></returns>
|
|
|
private double GetVacOffsetHeight(int fetchNum)
|
|
|
{
|
|
|
if (fetchNum == 0) return 0;
|
|
|
//先判断是奇数还是偶数
|
|
|
int count = 0;
|
|
|
int oddOrEven = fetchNum & 0x01;
|
|
|
|
|
|
double offsetDisct = 0.0;
|
|
|
if (oddOrEven == 1)
|
|
|
{
|
|
|
count = (fetchNum / 2) + 1;
|
|
|
offsetDisct = -0.1 * count;
|
|
|
}
|
|
|
|
|
|
else if (oddOrEven == 0)
|
|
|
{
|
|
|
count = (fetchNum / 2);
|
|
|
offsetDisct = 0.1 * count;
|
|
|
}
|
|
|
return offsetDisct;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 判断XY是否可以在本区域运动
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
public bool XYCanGoLocalArea()
|
|
|
{
|
|
|
//获取周转Y轴的位置,当排料Y轴去周转盘的时候,检测是否安全
|
|
|
double turnoverYPos = Ops.GetCurPosition("TurnoverY");
|
|
|
if (turnoverYPos - SysConfigParam.GetValue<double>("TurnoverDumpY") < -0.5)
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
public string GetCurStep()
|
|
|
{
|
|
|
return flowStep.ToString();
|
|
|
}
|
|
|
|
|
|
|
|
|
private void PrintXY1Y2CurrentPos(string prefixLog)
|
|
|
{
|
|
|
LogHelper.Debug(GetClassName() + $"{prefixLog}当前位置:cloadx:{Ops.GetCurPosition(AxisControl.LoadX)},cloady1:{Ops.GetCurPosition(AxisControl.LoadY1)},cloady2:{Ops.GetCurPosition(AxisControl.LoadY2)}");
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void VirtualAxisSleep()
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 根据治具编号获取治具的拍照位X
|
|
|
/// </summary>
|
|
|
/// <param name="idx"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <exception cref="Exception"></exception>
|
|
|
private double GetFixtureGrabPosX(int idx)
|
|
|
{
|
|
|
if (idx < 1 || idx > 6)
|
|
|
{
|
|
|
throw new Exception("索引错误");
|
|
|
}
|
|
|
switch (idx)
|
|
|
{
|
|
|
case 1:
|
|
|
return GlobalVar.Fixture1GrabImageX;
|
|
|
case 2:
|
|
|
return GlobalVar.Fixture2GrabImageX;
|
|
|
case 3:
|
|
|
return GlobalVar.Fixture3GrabImageX;
|
|
|
case 4:
|
|
|
return GlobalVar.Fixture4GrabImageX;
|
|
|
case 5:
|
|
|
return GlobalVar.Fixture5GrabImageX;
|
|
|
case 6:
|
|
|
return GlobalVar.Fixture6GrabImageX;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 根据治具编号获取治具的拍照位Y2
|
|
|
/// </summary>
|
|
|
/// <param name="idx"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <exception cref="Exception"></exception>
|
|
|
private double GetFixtureGrabPosY2(int idx)
|
|
|
{
|
|
|
if (idx < 1 || idx > 6)
|
|
|
{
|
|
|
throw new Exception("索引错误");
|
|
|
}
|
|
|
switch (idx)
|
|
|
{
|
|
|
case 1:
|
|
|
return GlobalVar.Fixture1GrabImageY2;
|
|
|
case 2:
|
|
|
return GlobalVar.Fixture2GrabImageY2;
|
|
|
case 3:
|
|
|
return GlobalVar.Fixture3GrabImageY2;
|
|
|
case 4:
|
|
|
return GlobalVar.Fixture4GrabImageY2;
|
|
|
case 5:
|
|
|
return GlobalVar.Fixture5GrabImageY2;
|
|
|
case 6:
|
|
|
return GlobalVar.Fixture6GrabImageY2;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 生成检测治具状态的队列
|
|
|
/// </summary>
|
|
|
void CreateCheckFixtureQueue()
|
|
|
{
|
|
|
checkFixtureList.Clear();
|
|
|
for (int i = 0; i < 6; i++)
|
|
|
{
|
|
|
int number = ((lastFixtureIndex+1) + i - 1) % 6 + 1;
|
|
|
checkFixtureList.Add(number);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|