|
|
using log4net.Core;
|
|
|
using NPOI.HSSF.Record.Chart;
|
|
|
using Rs.Controls;
|
|
|
using Rs.Framework;
|
|
|
using Rs.MotionPlat.Commom;
|
|
|
using Rs.MotionPlat.Entitys;
|
|
|
using Rs.MotionPlat.Entitys.Trays;
|
|
|
using Rs.MotionPlat.Flow.Camera;
|
|
|
using Rs.MotionPlat.Flow.Common;
|
|
|
using Rs.MotionPlat.Flow.SafePosFlow;
|
|
|
using Rs.MotionPlat.Flow.SubFlow;
|
|
|
using System;
|
|
|
using System.Collections;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Windows.Forms;
|
|
|
using static Rs.MotionPlat.Commom.SchedulingMessageBox;
|
|
|
|
|
|
namespace Rs.MotionPlat.Flow
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 周转流程步序
|
|
|
/// </summary>
|
|
|
enum ETurnoverFlowStep
|
|
|
{
|
|
|
等待任务,
|
|
|
到周转盘取料位上方,
|
|
|
等待运动到周转盘取料位上方,
|
|
|
取料异常报警,
|
|
|
到周转盘下方取料位1,
|
|
|
等待运动到周转盘下方取料位1,
|
|
|
到周转盘下方取料位2,
|
|
|
等待运动到周转盘下方取料位2,
|
|
|
到周转盘取料破真空位,
|
|
|
等待到周转盘取料破真空位,
|
|
|
周转盘取料完成抬起,
|
|
|
等待周转盘取料完成抬起,
|
|
|
周转盘取料完成真空检测,
|
|
|
到测试放料位上方,
|
|
|
等待运动到测试放料位上方,
|
|
|
测试位上料丢料检测,
|
|
|
到测试放料位下方1,
|
|
|
等待运动到到测试放料位下方1,
|
|
|
到测试放料位下方2,
|
|
|
等待运动到到测试放料位下方2,
|
|
|
测试位放料完成抬起1,
|
|
|
等待测试位放料完成抬起1,
|
|
|
测试位放料完成抬起2,
|
|
|
等待测试位放料完成抬起2,
|
|
|
测试位放料完成粘料检测,
|
|
|
测试位放料完成真空检测,
|
|
|
到测试保压位上方,
|
|
|
等待到测试保压位上方,
|
|
|
到测试保压位下方1,
|
|
|
等待到测试保压位下方1,
|
|
|
到测试保压位下方2,
|
|
|
等待到测试保压位下方2,
|
|
|
通知中控开始测试,
|
|
|
等待测试完成,
|
|
|
测试完成抬起到高速位,
|
|
|
等待测试完成抬起到高速位,
|
|
|
测试完成抬起安全位,
|
|
|
等待测试完成抬起安全位,
|
|
|
测试完成到治具取料位上方,
|
|
|
等待测试完成到治具取料位上方,
|
|
|
/// <summary>
|
|
|
/// ///////////////////////////////////////////////////////////////////
|
|
|
/// </summary>
|
|
|
到测试取料位上方,
|
|
|
等待到测试取料位上方,
|
|
|
到测试取料位下方1,
|
|
|
测试治具取料失败报警,
|
|
|
等待到测试取料位下方1,
|
|
|
到测试取料位下方2,
|
|
|
等待到测试取料位下方2,
|
|
|
到测试破关真空位,
|
|
|
等待到测试关破真空位,
|
|
|
测试位取料完成抬起,
|
|
|
等待测试位取料完成抬起,
|
|
|
|
|
|
|
|
|
测试位取料完成后真空检测,
|
|
|
等待排料离开周转盘,
|
|
|
到周转盘放料位上方,
|
|
|
等待到周转盘放料位上方,
|
|
|
周转盘放料前丢料检测,
|
|
|
到周转盘放料位下方1,
|
|
|
等待到周转盘放料位下方1,
|
|
|
到周转盘放料位下方2,
|
|
|
等待到周转盘放料位下方2,
|
|
|
周转盘放料完成粘料检测,
|
|
|
周转盘放料完成后真空检测,
|
|
|
周转盘放料真空异常处理,
|
|
|
周转盘放料完成抬起1,
|
|
|
等待周转盘放料完成抬起1,
|
|
|
周转盘放料完成抬起2,
|
|
|
等待周转盘放料完成抬起2,
|
|
|
到安全位,
|
|
|
等待到安全位,
|
|
|
上报中控任务完成
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 周转流程
|
|
|
/// </summary>
|
|
|
public class TurnoverFlow:BaseFlow
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 周转盘取料是否完成
|
|
|
/// </summary>
|
|
|
bool turnoverTakeFinishe = false;
|
|
|
public EFlowStatus FlowStatus { get; set; } = EFlowStatus.Idle;
|
|
|
private static TurnoverFlow instance;
|
|
|
public static TurnoverFlow Instance
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
if(instance == null)
|
|
|
instance = new TurnoverFlow();
|
|
|
return instance;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private TurnoverFlow(){ }
|
|
|
/// <summary>
|
|
|
/// 保压位上料
|
|
|
/// </summary>
|
|
|
private bool pressLoad = false;
|
|
|
/// <summary>
|
|
|
/// 保压位下料
|
|
|
/// </summary>
|
|
|
private bool pressUnload = false;
|
|
|
|
|
|
private bool loadOk = false;
|
|
|
private bool unloadOk = false;
|
|
|
//List<int> slots = new List<int>();
|
|
|
List<int> ngList = new List<int>();
|
|
|
ETurnoverFlowStep Step = ETurnoverFlowStep.等待任务;
|
|
|
//double targetPos = 0.0;
|
|
|
Motion.ErrorCode errCode = Motion.ErrorCode.Ok;
|
|
|
List<TransitNozzle> hasProductNozzles = new List<TransitNozzle>();
|
|
|
/// <summary>
|
|
|
/// 重取次数
|
|
|
/// </summary>
|
|
|
private int retakeNum = 0;
|
|
|
List<int> slots;
|
|
|
/// <summary>
|
|
|
/// 丢料的吸嘴
|
|
|
/// </summary>
|
|
|
List<int> loseSlots = new List<int>();
|
|
|
/// <summary>
|
|
|
/// 粘料的吸嘴
|
|
|
/// </summary>
|
|
|
List<int> masticSlots = new List<int>();
|
|
|
AlarmEntity alarmEntity= null;
|
|
|
bool bTakeFlag = false;
|
|
|
bool hasUnloadFlag = false;
|
|
|
int turnoverTrayToTestTrayNum = 1;
|
|
|
double targetTurnoverY = 0.0;
|
|
|
double targetTurnoverZ = 0.0;
|
|
|
double targetPressZ = 0.0;
|
|
|
/// <summary>
|
|
|
/// 可以下料到周转盘
|
|
|
/// </summary>
|
|
|
public void CanMoveFromTestTrayToTurnoverTray()
|
|
|
{
|
|
|
bTakeFlag = true;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 不可以下料到周转盘
|
|
|
/// </summary>
|
|
|
public void CannotMoveFromTestTrayToTurnoverTray()
|
|
|
{
|
|
|
bTakeFlag = false;
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 获取未执行的任务
|
|
|
/// </summary>
|
|
|
private List<TurnoverInfo> undealTasks = new List<TurnoverInfo>();
|
|
|
public override void Run()
|
|
|
{
|
|
|
switch (Step)
|
|
|
{
|
|
|
case ETurnoverFlowStep.等待任务:
|
|
|
if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestLoad) > 0)
|
|
|
{
|
|
|
turnoverTakeFinishe = false;
|
|
|
FlowStatus = EFlowStatus.Running;
|
|
|
retakeNum = 0;
|
|
|
logInfo = GetClassName()+$"接收到测试工位上料任务";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
}
|
|
|
else if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestUnload) > 0)//测试下料任务一般不会在这里触发,只有上次异常结束打开软件时,中控会发过来下料任务
|
|
|
{
|
|
|
FlowStatus = EFlowStatus.Running;
|
|
|
retakeNum = 0;
|
|
|
logInfo = GetClassName() + $"接收到测试工位下料任务";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
if(GlobalVar.CleanOut==true && GlobalVar.TurnoverNozzleHasProduct)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.测试完成抬起到高速位;
|
|
|
}
|
|
|
//Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到周转盘取料位上方:
|
|
|
if(CanGoTurnoverTrayPos())
|
|
|
{
|
|
|
targetTurnoverY = SysConfigParam.GetValue<double>("TurnoverTakeY");
|
|
|
errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到周转盘取料位上方,ty:{targetTurnoverY}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待运动到周转盘取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//Msg.ShowError("turnovery axis move is unsafe");
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.运动不安全).Transform($"{AxisAlias.TurnoverY}", $"{AxisAlias.LoadY}");
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待运动到周转盘取料位上方:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到周转盘取料位上方,cy:{Ops.GetCurPosition(AxisControl.TurnoverY)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
if (retakeNum <= GlobalVar.TurnoverRetakeNum)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘下方取料位1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal);
|
|
|
TurnoverDumpFlow.Instance.Dump(ETrayType.Turnover, undealTasks.Select(t => ((t.FromIndex + 1) > 8 ? (t.FromIndex + 1) - 8 : (t.FromIndex + 1))).ToList());
|
|
|
TurnoverDumpFlow.Instance.Wait();
|
|
|
Step = ETurnoverFlowStep.取料异常报警;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.取料异常报警:
|
|
|
//查询周转盘中待测穴位中有料的穴位
|
|
|
List<TurnoverTraySlot> untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have);
|
|
|
if (untestSlots != null && untestSlots.Count > 0)
|
|
|
{
|
|
|
bool exit = false;
|
|
|
while (!exit)
|
|
|
{
|
|
|
//alarmInfo = GetClassName() + $"周转盘{string.Join(",", untestSlots.Select(s => s.Index))}号穴位产品未取出,请处理";
|
|
|
//alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在周转盘取料失败报警), untestSlots.Select(s => (s.Index>8?s.Index-8:s.Index)).ToJoinString(), untestSlots.Select(s => s.Index).ToJoinString());
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在周转盘取料失败报警).Transform(untestSlots.Select(s => (s.Index > 8 ? s.Index - 8 : s.Index)).ToJoinString(), untestSlots.Select(s => s.Index).ToJoinString());
|
|
|
//TestCenterMessageBox.Show(AlarmConstID.TurnoverTakeFailAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(),
|
|
|
//MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
|
|
|
//msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头在周转盘取料失败报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(),MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.TurnoverTakeFailAlarm);
|
|
|
ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
|
|
|
//switch (msgBox.Button)
|
|
|
switch(btnRet)
|
|
|
{
|
|
|
case ETipButton.Retry:
|
|
|
logInfo = $"选择了重试";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
retakeNum = 0;
|
|
|
exit = true;
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
break;
|
|
|
case ETipButton.Skip:
|
|
|
retakeNum = 0;
|
|
|
logInfo = GetClassName() + $"选择了跳过";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have);
|
|
|
foreach (TurnoverTraySlot slot in untestSlots)
|
|
|
{
|
|
|
TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Turnover, slot.Index);
|
|
|
if (!heightResult.HasProduct)
|
|
|
{
|
|
|
VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index);
|
|
|
slot.ClearProduct();
|
|
|
GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.NotHave);
|
|
|
}
|
|
|
}
|
|
|
untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have);
|
|
|
if (untestSlots == null || untestSlots.Count == 0)
|
|
|
{
|
|
|
exit = true;
|
|
|
Step = ETurnoverFlowStep.到测试放料位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETipButton.Yes:
|
|
|
logInfo = $"选择了移动到安全位";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TurnoverTray);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ETurnoverFlowStep.到周转盘下方取料位1:
|
|
|
if(GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverTakeZ");
|
|
|
}
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
|
|
|
logInfo = GetClassName() + $"到周转盘下方取料位1,tz:{targetTurnoverZ}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待运动到周转盘下方取料位1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ETurnoverFlowStep.等待运动到周转盘下方取料位1:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到周转盘下方取料位1 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到周转盘下方取料位2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘下方取料位1;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到周转盘下方取料位2:
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverTakeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到周转盘下方取料位2,tz:{targetTurnoverZ}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待运动到周转盘下方取料位2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待运动到周转盘下方取料位2:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if (AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到周转盘下方取料位2 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal);
|
|
|
/*提前打开周转吸嘴真空吸*/
|
|
|
VacManager.TransitNozzleVacSuction(EVacOperator.Open, true, undealTasks.Select(t => t.ToIndex + 1).ToArray());
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
|
|
|
|
|
|
/*关闭周转盘真空吸*/
|
|
|
//VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, undealTasks.Select(t => t.FromIndex + 1).ToArray());
|
|
|
/*打开周转盘真空破*/
|
|
|
//VacManager.TurnoverTrayVacBreak(EVacOperator.Open, true, undealTasks.Select(t => t.FromIndex + 1).ToArray());
|
|
|
Step = ETurnoverFlowStep.到周转盘取料破真空位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘下方取料位2;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到周转盘取料破真空位:
|
|
|
if(GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverTakeZ") + GlobalVar.CloseVacOffsetHeight;
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverSafeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
}
|
|
|
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到周转盘取料破真空位,tz:{targetTurnoverZ}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到周转盘取料破真空位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到周转盘取料破真空位:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = $"已到周转盘取料破真空位,cz:{Ops.GetCurPosition(AxisControl.TurnoverZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal);
|
|
|
/*关闭周转盘真空破*/
|
|
|
VacManager.TurnoverTrayVacBreak(EVacOperator.Close, false, undealTasks.Select(t => t.FromIndex + 1).ToArray());
|
|
|
Step = ETurnoverFlowStep.周转盘取料完成抬起;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘取料破真空位;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.周转盘取料完成抬起:
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverSafeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
if(errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"周转盘取料完成抬起,tz:{targetTurnoverZ}";
|
|
|
MessageQueue.Instance.Insert (logInfo);
|
|
|
Step = ETurnoverFlowStep.等待周转盘取料完成抬起;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待周转盘取料完成抬起:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"周转盘取料完成已抬起,cz:{Ops.GetCurPosition(AxisControl.TurnoverZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.周转盘取料完成真空检测;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.周转盘取料完成抬起;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.周转盘取料完成真空检测:
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal);
|
|
|
foreach (TurnoverInfo task in undealTasks)
|
|
|
{
|
|
|
if (Ops.IsOn($"周转{task.ToIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace)
|
|
|
{
|
|
|
GlobalTray.TurnoverNozzle.ChangeStatus(task.ToIndex + 1, ESlotStatus.Have);
|
|
|
//如果真空检测OK,带料产品已经吸上了
|
|
|
TransitNozzleManager.Instance.Nozzle(task.ToIndex + 1).AddProduct(task);
|
|
|
TurnoverTrayManager.Instance.Slot(task.FromIndex + 1).ClearProduct();
|
|
|
//slot.ClearProduct();
|
|
|
GlobalTray.TurnoverTray.ChangeStatus(task.FromIndex + 1, ESlotStatus.NotHave);
|
|
|
task.Dealed = true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
MessageQueue.Instance.Warn($"周转{task.ToIndex + 1}号吸嘴真空吸检测异常");
|
|
|
}
|
|
|
}
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
if (hasProductNozzles.Count > 0)
|
|
|
{
|
|
|
logInfo = GetClassName()+ $"周转吸头{hasProductNozzles.Select(n => n.NozzleIndex).ToJoinString()}真空检测OK";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal);
|
|
|
if(undealTasks.Count > 0 )
|
|
|
{
|
|
|
TurnoverDumpFlow.Instance.Dump(ETrayType.Turnover, undealTasks.Select(t => ((t.FromIndex + 1) > 8 ? (t.FromIndex + 1 - 8) : (t.FromIndex + 1))).ToList());
|
|
|
TurnoverDumpFlow.Instance.Wait();
|
|
|
}
|
|
|
Step = ETurnoverFlowStep.到测试放料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
retakeNum++;
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到测试放料位上方:
|
|
|
targetTurnoverY = SysConfigParam.GetValue<double>("PressDumpY");
|
|
|
errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到测试放料位上方,ty:{targetTurnoverY}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
if (turnoverTrayToTestTrayNum == 1)
|
|
|
{
|
|
|
TestTrayHasProduct();//异步检测
|
|
|
}
|
|
|
Step = ETurnoverFlowStep.等待运动到测试放料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待运动到测试放料位上方:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
LogHelper.Debug(GetClassName()+ $"turnoverxy in target ,cury={Ops.GetCurPosition(AxisControl.TurnoverY)},y={targetTurnoverY}");
|
|
|
//if (turnoverTrayToTestTrayNum == 1)
|
|
|
//{
|
|
|
// testTrayHasProductCheckEvent.WaitOne();
|
|
|
// if(testTrayHasProductList!=null && testTrayHasProductList.Count>0)
|
|
|
// {
|
|
|
// while (true)
|
|
|
// {
|
|
|
// //alarmInfo = $"测试穴位{testTrayHasProductList.ToJoinString()}中有产品,请取出后点击确定";
|
|
|
// //alarmEntity = AlarmCollection.Get(AlarmConstID.测试穴位有产品待取出).Transform(testTrayHasProductList.ToJoinString());
|
|
|
// LogHelper.Debug(alarmEntity.CN);
|
|
|
// //MsgBox.ShowDialog(1, alarmInfo, ETipButton.Ok);
|
|
|
// AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
// //再次检测
|
|
|
// TestTrayHasProduct();
|
|
|
// testTrayHasProductCheckEvent.WaitOne();
|
|
|
// if (testTrayHasProductList ==null || testTrayHasProductList.Count == 0)
|
|
|
// {
|
|
|
// break;
|
|
|
// }
|
|
|
// }
|
|
|
// }
|
|
|
//}
|
|
|
//turnoverTrayToTestTrayNum++;
|
|
|
if (turnoverTakeFinishe == false && TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have).Count() == 0)
|
|
|
{
|
|
|
turnoverTakeFinishe = true;
|
|
|
//在这里处理中控发过来的任务
|
|
|
//如果有下料任务,先处理下料任务,再处理上料任务
|
|
|
|
|
|
#region 下料任务
|
|
|
if(hasUnloadFlag)
|
|
|
{
|
|
|
hasUnloadFlag = false;
|
|
|
while (true)
|
|
|
{
|
|
|
if (LoadAndUnloadTask.Instance.TestUnloadTaskArrived)
|
|
|
{
|
|
|
LoadAndUnloadTask.Instance.TestUnloadTaskArrived = false;
|
|
|
MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null });
|
|
|
logInfo = GetClassName() + "通知中控产品全部已从治具中取出,状态变成NotReady";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
unloadOk = true;
|
|
|
TestCenter.Instance.LoadTestUnLoadResult();
|
|
|
LoadAndUnloadTask.Instance.Clear(1);
|
|
|
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
#region 上料任务
|
|
|
while (true)
|
|
|
{
|
|
|
if (LoadAndUnloadTask.Instance.TestloadTaskArrived)
|
|
|
{
|
|
|
LoadAndUnloadTask.Instance.TestloadTaskArrived = false;
|
|
|
string reportStr = LoadAndUnloadTask.Instance.GetTestLoadString();
|
|
|
TestCenter.Instance.Send(reportStr,Encoding.ASCII);
|
|
|
LoadAndUnloadTask.Instance.Clear(1);
|
|
|
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
|
|
|
MessageQueue.Instance.Insert("通知中控周转载盘产品已取走,可以继续排料");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
}
|
|
|
Step = ETurnoverFlowStep.测试位上料丢料检测;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试放料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试位上料丢料检测:
|
|
|
if(GlobalVar.VirtualAxis || GlobalVar.RunSpace)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试放料位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if(TransitNozzleManager.Instance.GetHasProductNozzles().Count>0)
|
|
|
{
|
|
|
loseSlots.Clear();
|
|
|
//检测是否丢料
|
|
|
foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles())
|
|
|
{
|
|
|
if (!nozzle.HasVacSignal())
|
|
|
{
|
|
|
loseSlots.Add(nozzle.NozzleIndex);
|
|
|
}
|
|
|
}
|
|
|
if (loseSlots.Count > 0)
|
|
|
{
|
|
|
bool exit = false;
|
|
|
while (!exit)
|
|
|
{
|
|
|
//alarmInfo = $"周转{loseSlots.ToJoinString()}号吸嘴真空异常丢料,请处理";
|
|
|
//alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在测试治具放料时丢料报警), loseSlots.ToJoinString());
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在测试治具放料时丢料报警).Transform(loseSlots.ToJoinString());
|
|
|
LogHelper.Debug(GetClassName()+ alarmEntity.CN);
|
|
|
//TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
|
|
|
// msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头在测试治具放料时丢料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm);
|
|
|
ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
|
|
|
//switch (msgBox.Button)
|
|
|
switch (btnRet)
|
|
|
{
|
|
|
case ETipButton.Skip:
|
|
|
logInfo = GetClassName() + $"点击了跳过按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
exit = true;
|
|
|
List<TransitNozzle> hasProducts = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
//把吸嘴的真空吸关闭
|
|
|
VacManager.TransitNozzleVacSuction(EVacOperator.Close,false, loseSlots.ToArray());
|
|
|
//打开周转吸嘴的真空破
|
|
|
VacManager.TransitNozzleVacBreak(EVacOperator.Open,true, loseSlots.ToArray());
|
|
|
//关闭周转吸嘴的真空破
|
|
|
VacManager.TransitNozzleVacBreak(EVacOperator.Close,false, loseSlots.ToArray());
|
|
|
foreach(int nozzleIndex in loseSlots)
|
|
|
{
|
|
|
TransitNozzleManager.Instance.Nozzle(nozzleIndex).Clear();
|
|
|
}
|
|
|
Step = ETurnoverFlowStep.到测试放料位上方;
|
|
|
break;
|
|
|
case ETipButton.Yes:
|
|
|
logInfo = GetClassName() + $"点击了移动到安全位按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.TransitNozzle);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到测试放料位上方";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到测试放料位下方1;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (!turnoverTakeFinishe)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
retakeNum++;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.通知中控开始测试;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到测试放料位下方1:
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if (GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("PressDumpZ") + GlobalVar.PressLowSpeedOffset;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("PressDumpZ");
|
|
|
}
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//获取需要放料的吸嘴
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
/*打开测试穴位真空吸*/
|
|
|
VacManager.TestTrayVacSuction(EVacOperator.Open, false, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到测试放料位下方1,tz:{targetTurnoverZ}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待运动到到测试放料位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);''
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试放料位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待运动到到测试放料位下方1:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到到测试放料位下方1 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到测试放料位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试放料位下方1;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试放料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到测试放料位下方2:
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("PressDumpZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis )
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo =GetClassName()+ $"到测试放料位下方2,tz:{targetTurnoverZ}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待运动到到测试放料位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待运动到到测试放料位下方2:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if (AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
//获取需要放料的吸嘴
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
//TrayStatusManager.UpdateMultiSlotAsync("TurnoverNozzle", hasProductNozzles.Select(n => n.NozzleIndex).ToArray(), 0);
|
|
|
logInfo = GetClassName() + $"已运动到到测试放料位下方2 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
/*打开测试穴位真空吸*/
|
|
|
//VacManager.TestTrayVacSuction(EVacOperator.Open, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
/*关闭周转吸头真空吸*/
|
|
|
VacManager.TransitNozzleVacSuction(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
/*打开周转吸头真空破*/
|
|
|
VacManager.TransitNozzleVacBreak(EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
/*关闭周转吸头真空破*/
|
|
|
VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
//在这里更新产品状态
|
|
|
//TransitNozzleManager.Instance.Transi
|
|
|
Step = ETurnoverFlowStep.测试位放料完成抬起1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试放料位下方2;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试放料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试位放料完成抬起1:
|
|
|
if(GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("PressDumpZ") + GlobalVar.PressLowSpeedOffset;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverSafeZ");
|
|
|
}
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
if(errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName()+$"测试位放料完成抬起1,tz:{targetTurnoverZ}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待测试位放料完成抬起1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待测试位放料完成抬起1:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
//获取需要放料的吸嘴
|
|
|
//hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
/*关闭周转吸头真空破*/
|
|
|
//VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
|
|
|
logInfo = GetClassName() + $"测试位放料完成抬起完成1,cz:{Ops.GetCurPosition(AxisControl.TurnoverZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.测试位放料完成抬起2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.测试位放料完成抬起1;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试位放料完成抬起2:
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverSafeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"测试位放料完成抬起2,tz:{targetTurnoverZ}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待测试位放料完成抬起2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待测试位放料完成抬起2:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if (Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if (AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
//获取需要放料的吸嘴
|
|
|
//hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
/*关闭周转吸头真空破*/
|
|
|
//VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
|
|
|
//logInfo = GetClassName() + $"测试位放料完成抬起完成2";
|
|
|
//MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.测试位放料完成粘料检测;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.测试位放料完成抬起2;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试位放料完成粘料检测:
|
|
|
masticSlots.Clear();
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
//打开全部吸嘴的真空吸
|
|
|
VacManager.TransitNozzleVacSuction(EVacOperator.Open,true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles())
|
|
|
{
|
|
|
//nozzle.OpenVac();
|
|
|
if (nozzle.HasVacSignal() && !GlobalVar.RunSpace)
|
|
|
{
|
|
|
logInfo = $"周转{nozzle.NozzleIndex}号吸嘴粘料";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
masticSlots.Add(nozzle.NozzleIndex);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
logInfo = $"周转{nozzle.NozzleIndex}号吸嘴无粘料";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
nozzle.CloseVac();
|
|
|
}
|
|
|
}
|
|
|
if(masticSlots.Count > 0)
|
|
|
{
|
|
|
//粘料报警
|
|
|
//alarmInfo = $"周转吸头{masticSlots.ToJoinString()}号吸嘴真空异常粘料,请手工处理";
|
|
|
//alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转头粘料报警), masticSlots.ToJoinString());
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.周转头粘料报警).Transform(masticSlots.ToJoinString());
|
|
|
//TestCenterMessageBox.Show(AlarmConstID.NozzleTackinessAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
|
|
|
//msgBox = MsgBox.ShowDialog(AlarmConstID.周转头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());// TestCenterMessageBox.WaitResult(AlarmConstID.NozzleTackinessAlarm);
|
|
|
ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
|
|
|
//switch (msgBox.Button)
|
|
|
switch(btnRet)
|
|
|
{
|
|
|
case ETipButton.Skip:
|
|
|
logInfo = GetClassName() + $"点击了跳过按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
foreach (int nozzleIndex in masticSlots)
|
|
|
{
|
|
|
TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(nozzleIndex);
|
|
|
if (!nozzle.HasVacSignal())
|
|
|
{
|
|
|
nozzle.CloseVac();
|
|
|
nozzle.OpenBreak();
|
|
|
nozzle.CloseBreak();
|
|
|
nozzle.Clear();
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETipButton.Yes:
|
|
|
MessageQueue.Instance.Insert(GetClassName() + $"点击了移动到安全位按钮");
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.TransitNozzle);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.测试位放料完成真空检测;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试位放料完成真空检测:
|
|
|
/*检测逻辑(光纤优先原则)
|
|
|
1 先用光纤检测是否叠料,如果光纤跌料,则报警,如果光纤检测没有叠料,再用真空检测
|
|
|
2 真空检测正常则继续,真空检测异常,报真空报警
|
|
|
*/
|
|
|
foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles())
|
|
|
{
|
|
|
if(nozzle.IsHasProduct)
|
|
|
{
|
|
|
if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位真空吸检测") || GlobalVar.RunSpace || GlobalVar.DisableFixtureVacuumCheck)
|
|
|
{
|
|
|
GlobalTray.TurnoverNozzle.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.NotHave);
|
|
|
GlobalTray.TestTray.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.Have);
|
|
|
TestTrayManager.Instance.Slot(nozzle.NozzleIndex).AddProduct(nozzle);
|
|
|
nozzle.Clear();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
bool exit = false;
|
|
|
while (!exit)
|
|
|
{
|
|
|
// alarmInfo = $"测试治具{nozzle.NozzleIndex}号真空吸异常";
|
|
|
//alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警), nozzle.NozzleIndex);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警).Transform(nozzle.NozzleIndex);
|
|
|
MessageQueue.Instance.Warn(GetClassName() + alarmEntity.CN);
|
|
|
//TestCenterMessageBox.Show(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
|
|
|
// msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头放料到测试治具后测试治具真空吸报警);
|
|
|
ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
|
|
|
//switch (msgBox.Button)
|
|
|
switch(btnRet)
|
|
|
{
|
|
|
case ETipButton.Retry:
|
|
|
VacManager.TestTrayVacSuction(EVacOperator.Open,true, nozzle.NozzleIndex);
|
|
|
if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位真空吸检测"))
|
|
|
{
|
|
|
GlobalTray.TestTray.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.Have);
|
|
|
TestTrayManager.Instance.Slot(nozzle.NozzleIndex).AddProduct(nozzle);
|
|
|
nozzle.Clear();
|
|
|
exit = true;
|
|
|
}
|
|
|
break;
|
|
|
case ETipButton.Skip:
|
|
|
//镭射头过来复检,有产品则继续报警,
|
|
|
TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex);
|
|
|
if (!heightResult.HasProduct)
|
|
|
{
|
|
|
nozzle.Clear();
|
|
|
exit = true;
|
|
|
}
|
|
|
break;
|
|
|
case ETipButton.Yes://移动到安全位
|
|
|
VacManager.TestTrayVacSuction(EVacOperator.Close,true, nozzle.NozzleIndex);
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
if (!turnoverTakeFinishe)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位上方;
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到测试保压位上方:
|
|
|
targetTurnoverY = SysConfigParam.GetValue<double>("PressY");
|
|
|
errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
turnoverTrayToTestTrayNum = 1;
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到测试保压位上方,ty:{targetTurnoverY}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到测试保压位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform($"{AxisAlias.TurnoverY}", errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到测试保压位上方:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0)
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到测试保压位上方,cy:{Ops.GetCurPosition(AxisControl.TurnoverY)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到测试保压位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
logInfo = GetClassName() + $"检测到测试治具中无产品需要测试";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.通知中控开始测试;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到测试保压位下方1:
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
targetPressZ = SysConfigParam.GetValue<double>("PressZ");
|
|
|
if (GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetPressZ = targetPressZ + SysConfigParam.GetValue<double>("PressLowSpeedOffset");
|
|
|
}
|
|
|
errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到测试保压位下方1,tz:{targetPressZ}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到测试保压位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到测试保压位下方1:
|
|
|
if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.PressZIsInTargetPos(targetPressZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已到测试保压位下方1 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到测试保压位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位下方1;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ETurnoverFlowStep.到测试保压位下方2:
|
|
|
if (AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
targetPressZ = SysConfigParam.GetValue<double>("PressZ");
|
|
|
errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.PressLowSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到测试保压位下方2";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到测试保压位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到测试保压位下方2:
|
|
|
if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//Thread.Sleep(100);
|
|
|
//if(Ops.IsArrived(AxisControl.PressZ) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.PressZIsInTargetPos(targetPressZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已到测试保压位下方2 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
/*关闭测试穴位真空吸*/
|
|
|
List<TestTraySlot> willTestSlot = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have);
|
|
|
VacManager.TestTrayVacSuction(EVacOperator.Close, false, willTestSlot.Select(s => s.Index).ToArray());
|
|
|
Step = ETurnoverFlowStep.通知中控开始测试;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位下方2;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试保压位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.通知中控开始测试:
|
|
|
MachineManage.Instance.TestStatus = ETestStatus.Testing;
|
|
|
loadOk = true;
|
|
|
HashSet<int> needTestSlot = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Select(s => s.Index-1).ToHashSet();
|
|
|
MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.Ready, ReadySites = needTestSlot });
|
|
|
logInfo = GetClassName() + $"通知中控测试位就绪,可以开始测试{needTestSlot.ToJoinString()}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
//Thread.Sleep(1000 * 30);
|
|
|
Step = ETurnoverFlowStep.等待测试完成;
|
|
|
break;
|
|
|
/*---------------------------------------------准备下料---------------------------------------------------------------------------------*/
|
|
|
case ETurnoverFlowStep.等待测试完成:
|
|
|
//if(MachineManage.Instance.tes)
|
|
|
if(MachineManage.Instance.TestStatus== ETestStatus.Finished)
|
|
|
{
|
|
|
hasUnloadFlag = true;
|
|
|
//测试完成后,重新打开真空吸
|
|
|
List<TestTraySlot> tested = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have);
|
|
|
VacManager.TestTrayVacSuction(EVacOperator.Open, true, tested.Select(s => s.Index).ToArray());
|
|
|
//测试完成后先判断中控的任务有没有下发过来,如果已经过来了就直接用,如果没有过来就自己生成任务
|
|
|
if (LoadAndUnloadTask.Instance.GetTaskNum(ETaskType.TestUnload) <= 0)
|
|
|
{
|
|
|
LoadAndUnloadTask.Instance.CreateTestUnLoadTask();
|
|
|
}
|
|
|
Step = ETurnoverFlowStep.测试完成抬起到高速位;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
|
|
|
case ETurnoverFlowStep.测试完成抬起到高速位:
|
|
|
double curPos = Ops.GetCurPosition(AxisAlias.PressZ);
|
|
|
if(Math.Abs(curPos- SysConfigParam.GetValue<double>("PressSafeZ")) <1)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.测试完成抬起安全位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetPressZ = SysConfigParam.GetValue<double>("PressZ") + GlobalVar.PressLowSpeedOffset;
|
|
|
errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.PressLowSpeed);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetPressZ = SysConfigParam.GetValue<double>("PressSafeZ");
|
|
|
errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed);
|
|
|
}
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName()+$"测试完成准备抬起";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待测试完成抬起到高速位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform($"{AxisAlias.PressZ}", errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待测试完成抬起到高速位:
|
|
|
if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if(AxisArrived.PressZIsInTargetPos(targetPressZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"测试完成已抬起 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.测试完成抬起安全位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.测试完成抬起到高速位;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试完成抬起安全位:
|
|
|
targetPressZ = SysConfigParam.GetValue<double>("PressSafeZ");
|
|
|
errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.WholeSpeed);
|
|
|
if(errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"测试完成抬起安全位";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待测试完成抬起安全位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.PressZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.PressZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待测试完成抬起安全位:
|
|
|
if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//AxisControl.PressZ.Get_Target_Position(out double pos);
|
|
|
//double tpos = Ops.GetCurPosition(AxisControl.PressZ);
|
|
|
//AxisControl.PressZ.IsArrived(out bool isArrived);
|
|
|
//Thread.Sleep(100);
|
|
|
//if (Ops.IsArrived(AxisAlias.PressZ) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.PressZIsInTargetPos(targetPressZ))
|
|
|
{
|
|
|
retakeNum = 0;
|
|
|
logInfo = GetClassName() + $"测试完成已抬起到安全位 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.测试完成抬起安全位;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
//case ETurnoverFlowStep.测试完成到治具取料位上方:
|
|
|
// targetPos = SysConfigParam.GetValue<double>("PressTakeX");
|
|
|
// errCode = AxisControl.TurnoverX.MovePos(targetPos, GlobalVar.WholeSpeed);
|
|
|
// if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// targetPos = SysConfigParam.GetValue<double>("PressTakeY");
|
|
|
// errCode = AxisControl.TurnoverY.MovePos(targetPos, GlobalVar.WholeSpeed);
|
|
|
// if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// if (GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
// }
|
|
|
// logInfo = GetClassName() + $"测试完成到治具取料位上方";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// Step = ETurnoverFlowStep.等待测试完成到治具取料位上方;
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
|
|
|
// }
|
|
|
// }
|
|
|
// else
|
|
|
// {
|
|
|
// MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverX, errCode);
|
|
|
// }
|
|
|
// break;
|
|
|
//case ETurnoverFlowStep.等待测试完成到治具取料位上方:
|
|
|
// if (Ops.IsStop(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
// {
|
|
|
// if(Ops.IsArrived(AxisControl.TurnoverX,AxisControl.TurnoverY))
|
|
|
// {
|
|
|
// logInfo = GetClassName() + $"已运动到治具取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}";
|
|
|
// MessageQueue.Instance.Insert(logInfo);
|
|
|
// Step = ETurnoverFlowStep.等待任务;
|
|
|
// }
|
|
|
// }
|
|
|
// break;
|
|
|
//-----------------------------------------------测试位下料---------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
case ETurnoverFlowStep.到测试取料位上方:
|
|
|
targetTurnoverY = SysConfigParam.GetValue<double>("PressTakeY");
|
|
|
errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到测试取料位上方";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到测试取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到测试取料位上方:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到测试取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
if (retakeNum < 3)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试取料位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
LogHelper.Debug(GetClassName()+ $"失败次数已达上限{retakeNum},报警");
|
|
|
// undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal);
|
|
|
//TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList());
|
|
|
//TurnoverDumpFlow.Instance.Wait();
|
|
|
Step = ETurnoverFlowStep.测试治具取料失败报警;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试治具取料失败报警:
|
|
|
//取三次之后还没有取起来的产品,这个时候需要弹框报警提示是否继续还是跳过
|
|
|
//获取还未执行完的任务
|
|
|
List<TestTraySlot> testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have);
|
|
|
if (testedSlots != null && testedSlots.Count > 0)
|
|
|
{
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal);
|
|
|
if(TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList()))
|
|
|
{
|
|
|
TurnoverDumpFlow.Instance.Wait();
|
|
|
}
|
|
|
bool exit = false;
|
|
|
while (!exit)
|
|
|
{
|
|
|
//alarmInfo = GetClassName() + $"测试治具{testedSlots.Select(s => s.Index).ToJoinString()}号穴位取料失败";
|
|
|
//alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在测试治具取料失败报警), testedSlots.Select(s => s.Index).ToJoinString());
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在测试治具取料失败报警).Transform(testedSlots.Select(s => s.Index).ToJoinString());
|
|
|
LogHelper.Debug(GetClassName() + alarmEntity.CN);
|
|
|
//TestCenterMessageBox.Show(AlarmConstID.周转吸头在测试治具取料失败报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
|
|
|
//msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头在测试治具取料失败报警);
|
|
|
ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
|
|
|
//switch (msgBox.Button)
|
|
|
switch(btnRet)
|
|
|
{
|
|
|
case ETipButton.Retry:
|
|
|
logInfo = GetClassName() + $"选择了重试按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
retakeNum = 0;
|
|
|
exit = true;
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
break;
|
|
|
case ETipButton.Skip:
|
|
|
retakeNum = 0;
|
|
|
logInfo = GetClassName() + $"选择了跳过按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have);
|
|
|
foreach (TestTraySlot slot in testedSlots)
|
|
|
{
|
|
|
TestHeightResult heightResult = LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index);
|
|
|
if (!heightResult.HasProduct)
|
|
|
{
|
|
|
logInfo = GetClassName() + $"镭射头检测{slot.Index}号穴位无产品";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
TurnoverInfo ti = LoadAndUnloadTask.Instance.GetTestUnloadTask(slot.Index);
|
|
|
if(ti != null)
|
|
|
{
|
|
|
ti.Dealed = true;
|
|
|
}
|
|
|
slot.ClearProduct();
|
|
|
GlobalTray.TestTray.ChangeStatus(slot.Index, ESlotStatus.NotHave);
|
|
|
}
|
|
|
}
|
|
|
testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have);
|
|
|
if (testedSlots == null || testedSlots.Count == 0)
|
|
|
{
|
|
|
|
|
|
exit = true;
|
|
|
Step = ETurnoverFlowStep.上报中控任务完成;
|
|
|
}
|
|
|
break;
|
|
|
case ETipButton.Yes://移动到安全位
|
|
|
logInfo = GetClassName() + $"选择了移动到安全位按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
if (testedSlots.Select(ts => (ts.Index >= 9 && ts.Index <= 16)).Count() > 0)
|
|
|
{
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.SocketFrom9ToSixteen);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket);
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到测试取料位下方1:
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("PressTakeZ");
|
|
|
if (GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetTurnoverZ = targetTurnoverZ + GlobalVar.PressLowSpeedOffset;
|
|
|
}
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal);
|
|
|
/*提前打开周转吸头真空吸*/
|
|
|
VacManager.TransitNozzleVacSuction(EVacOperator.Open, false, undealTasks.Select(t => t.FromIndex + 1).ToArray());
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到测试取料位下方1";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到测试取料位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到测试取料位下方1:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到到测试取料位下方1";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到测试取料位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试取料位下方1;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到测试取料位下方2:
|
|
|
//if(AxisArrived.TurnoverXYIsInTargetPos(targetTurnoverX,targetTurnoverY))
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("PressTakeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到测试取料位下方2";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到测试取料位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
//else
|
|
|
//{
|
|
|
// Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
//}
|
|
|
break;
|
|
|
|
|
|
case ETurnoverFlowStep.等待到测试取料位下方2:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到测试取料位下方2 TurnoverZ at:{Ops.GetCurPosition("TurnoverZ")}";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
//int[] indexes = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Select(s=>s.Index).ToArray();
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal);
|
|
|
/*打开周转吸头真空吸*/
|
|
|
//VacManager.TransitNozzleVacSuction(EVacOperator.Open, true, indexes);
|
|
|
/*关闭测试穴位真空吸*/
|
|
|
VacManager.TestTrayVacSuction(EVacOperator.Close, true, undealTasks.Select(t => t.FromIndex + 1).ToArray());
|
|
|
/*打开测试穴位真空破*/
|
|
|
VacManager.TestTrayVacBreak(EVacOperator.Open, true, undealTasks.Select(t => t.FromIndex + 1).ToArray());
|
|
|
Step = ETurnoverFlowStep.到测试破关真空位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试取料位下方2;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到测试破关真空位:
|
|
|
if(GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("PressTakeZ") + GlobalVar.PressLowSpeedOffset;
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverSafeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
}
|
|
|
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
logInfo = GetClassName()+ $"到测试破关真空位";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
Step = ETurnoverFlowStep.等待到测试关破真空位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到测试关破真空位:
|
|
|
if(Ops.IsStop(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到测试关破真空位";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal);
|
|
|
/*关闭测试穴位真空破*/
|
|
|
VacManager.TestTrayVacBreak(EVacOperator.Close, false, undealTasks.Select(t => t.FromIndex + 1).ToArray());
|
|
|
Step = ETurnoverFlowStep.测试位取料完成抬起;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试破关真空位;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试位取料完成抬起:
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverSafeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
if(errCode== Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo =GetClassName()+ $"测试位取料完成抬起";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待测试位取料完成抬起;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待测试位取料完成抬起:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"测试位取料完成已抬起";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.测试位取料完成后真空检测;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.测试位取料完成抬起;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.测试位取料完成后真空检测:
|
|
|
/*
|
|
|
测试位取料完成真空检测,只要有吸嘴上有产品,就先把产品放到周转盘中
|
|
|
*/
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal);
|
|
|
if(undealTasks != null && undealTasks.Count>0)
|
|
|
{
|
|
|
foreach (TurnoverInfo task in undealTasks)
|
|
|
{
|
|
|
TestTraySlot testSlot = TestTrayManager.Instance.Slot(task.FromIndex + 1);
|
|
|
if (Ops.IsOn($"周转{task.FromIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace)
|
|
|
{
|
|
|
GlobalTray.TurnoverNozzle.ChangeStatus(task.FromIndex + 1, ESlotStatus.Have);
|
|
|
logInfo = $"周转{task.FromIndex + 1}号吸嘴真空吸检测OK";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
testSlot.ClearProduct();
|
|
|
task.Dealed = true;
|
|
|
TransitNozzleManager.Instance.Nozzle(task.FromIndex + 1).AddProduct(task);
|
|
|
GlobalTray.TestTray.ChangeStatus(task.FromIndex + 1, ESlotStatus.NotHave);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
logInfo = $"周转{task.FromIndex + 1}号吸嘴真空吸检测异常";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count == 0)
|
|
|
{
|
|
|
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
if (hasProductNozzles.Count > 0 || GlobalVar.RunSpace || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
Step = ETurnoverFlowStep.等待排料离开周转盘;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.上报中控任务完成;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
if (hasProductNozzles.Count > 0 || GlobalVar.RunSpace || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal);
|
|
|
if(undealTasks.Count > 0 )
|
|
|
{
|
|
|
TurnoverDumpFlow.Instance.Dump(ETrayType.Test, undealTasks.Select(t => t.FromIndex + 1).ToList());
|
|
|
TurnoverDumpFlow.Instance.Wait();
|
|
|
}
|
|
|
//Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
Step = ETurnoverFlowStep.等待排料离开周转盘;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
retakeNum++;
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待排料离开周转盘:
|
|
|
if (bTakeFlag|| GlobalVar.CleanOut)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到周转盘放料位上方:
|
|
|
if (CanGoTurnoverTrayPos())
|
|
|
{
|
|
|
targetTurnoverY = SysConfigParam.GetValue<double>("TurnoverDumpY");
|
|
|
errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到周转盘放料位上方";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到周转盘放料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Msg.ShowError("turnovery axis move is unsafe");
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到周转盘放料位上方:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverX, AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到周转盘放料位上方";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.周转盘放料前丢料检测;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.周转盘放料前丢料检测:
|
|
|
if(!GlobalVar.RunSpace)
|
|
|
{
|
|
|
loseSlots.Clear();
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
if (hasProductNozzles != null && hasProductNozzles.Count > 0)
|
|
|
{
|
|
|
foreach (var nozzle in hasProductNozzles.ToArray())
|
|
|
{
|
|
|
if (!nozzle.HasVacSignal())
|
|
|
{
|
|
|
loseSlots.Add(nozzle.NozzleIndex);
|
|
|
}
|
|
|
}
|
|
|
if (loseSlots.Count > 0)
|
|
|
{
|
|
|
bool exit = false;
|
|
|
while (!exit)
|
|
|
{
|
|
|
//alarmInfo = $"周转{loseSlots.ToJoinString()}号吸嘴真空异常丢料,请处理";
|
|
|
//alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头在周转盘放料时丢料报警), loseSlots.ToJoinString()) ;
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头在周转盘放料时丢料报警).Transform(loseSlots.ToJoinString());
|
|
|
LogHelper.Debug(GetClassName() + alarmEntity.CN);
|
|
|
//TestCenterMessageBox.Show(AlarmConstID.周转吸头在周转盘放料时丢料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
|
|
|
//msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转吸头在周转盘放料时丢料报警);
|
|
|
ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
|
|
|
//switch (msgBox.Button)
|
|
|
switch(btnRet)
|
|
|
{
|
|
|
case ETipButton.Skip:
|
|
|
logInfo = GetClassName() + $"点击了跳过按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
foreach (var slotIndex in loseSlots)
|
|
|
{
|
|
|
TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(slotIndex);
|
|
|
//关闭吸嘴的真空吸
|
|
|
nozzle.CloseVac();
|
|
|
//打开吸嘴的真空破
|
|
|
nozzle.OpenBreak();
|
|
|
//关闭吸嘴的真空破
|
|
|
nozzle.CloseBreak();
|
|
|
//清空吸嘴上的产品
|
|
|
nozzle.Clear();
|
|
|
}
|
|
|
exit = true;
|
|
|
//循环退出,重新检测一下粘料
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
break;
|
|
|
case ETipButton.Yes:
|
|
|
logInfo = GetClassName() + $"点击了移动到安全位按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.TransitNozzle);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位下方1;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//这里再次判断治具中是否还有产品未取出,如果都已取出,则到安全位,如果还有产品,则到治具位上放取料
|
|
|
if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count > 0)
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到安全位;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位下方1;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到周转盘放料位下方1:
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if (GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset+1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverTakeZ")+1;
|
|
|
}
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ , GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
/*提前打开周转盘真空吸*/
|
|
|
VacManager.TurnoverTrayVacSuction(EVacOperator.Open, false, hasProductNozzles.Select(n => n.ToIndex + 1).ToArray());
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到周转盘放料位下方1";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到周转盘放料位下方1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到周转盘放料位下方1:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到周转盘放料位下方1";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位下方1;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ETurnoverFlowStep.到周转盘放料位下方2:
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverTakeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"到周转盘放料位下方2";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到周转盘放料位下方2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到周转盘放料位下方2:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
foreach (TransitNozzle nozzle in hasProductNozzles)
|
|
|
{
|
|
|
GlobalTray.TurnoverNozzle.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.NotHave);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"已运动到周转盘放料位下方2";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
//TrayStatusManager.UpdateMultiSlotAsync("TurnoverNozzle", hasProductNozzles.Select(n => n.NozzleIndex).ToArray(), 0);
|
|
|
/*关闭周转吸头真空吸*/
|
|
|
VacManager.TransitNozzleVacSuction(EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray());
|
|
|
/*打开周转吸头真空破*/
|
|
|
VacManager.TransitNozzleVacBreak(EVacOperator.Open, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray());
|
|
|
/*关闭周转吸头真空破*/
|
|
|
VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray());
|
|
|
Step = ETurnoverFlowStep.周转盘放料完成抬起1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位下方2;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到周转盘放料位上方;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case ETurnoverFlowStep.周转盘放料完成抬起1:
|
|
|
if(GlobalVar.EnableTwoSpeed)
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset;
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverSafeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
}
|
|
|
|
|
|
if(errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"周转盘放料完成准备抬起1";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待周转盘放料完成抬起1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待周转盘放料完成抬起1:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
//hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
/*关闭周转吸头真空破*/
|
|
|
//VacManager.TransitNozzleVacBreak(EVacOperator.Close, true, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray());
|
|
|
logInfo = GetClassName() + $"周转盘放料完成已抬起1";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.周转盘放料完成抬起2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.周转盘放料完成抬起1;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.周转盘放料完成抬起2:
|
|
|
targetTurnoverZ = SysConfigParam.GetValue<double>("TurnoverSafeZ");
|
|
|
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"周转盘放料完成准备抬起2";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待周转盘放料完成抬起2;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverZ运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待周转盘放料完成抬起2:
|
|
|
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverZIsInTargetPos(targetTurnoverZ))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"周转盘放料完成已抬起2";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.周转盘放料完成粘料检测;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.周转盘放料完成抬起2;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.周转盘放料完成粘料检测:
|
|
|
masticSlots.Clear();
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
VacManager.TransitNozzleVacSuction(EVacOperator.Open, true, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
|
|
|
foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles())
|
|
|
{
|
|
|
//nozzle.OpenVac();
|
|
|
if (nozzle.HasVacSignal() && !GlobalVar.RunSpace)
|
|
|
{
|
|
|
logInfo = $"周转{nozzle.NozzleIndex}号吸嘴粘料";
|
|
|
MessageQueue.Instance.Warn(logInfo);
|
|
|
masticSlots.Add(nozzle.NozzleIndex);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
logInfo = $"周转{nozzle.NozzleIndex}号吸嘴无粘料";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
nozzle.CloseVac();
|
|
|
}
|
|
|
}
|
|
|
if (masticSlots.Count > 0)
|
|
|
{
|
|
|
//粘料报警
|
|
|
bool exit = false;
|
|
|
while (!exit)
|
|
|
{
|
|
|
//alarmInfo = $"周转{masticSlots.ToJoinString()}号吸嘴真空异常粘料,请手工处理";
|
|
|
//alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转头粘料报警), masticSlots.ToJoinString());
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.周转头粘料报警).Transform(masticSlots.ToJoinString());
|
|
|
MessageQueue.Instance.Warn(GetClassName()+ alarmEntity.CN);
|
|
|
//TestCenterMessageBox.Show(AlarmConstID.周转头粘料报警, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
|
|
|
//msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.周转头粘料报警);
|
|
|
ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
|
|
|
//switch (msgBox.Button)
|
|
|
switch(btnRet)
|
|
|
{
|
|
|
case ETipButton.Skip:
|
|
|
logInfo = GetClassName() + "点击了跳过按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
foreach (int nozzleIndex in masticSlots.ToArray())
|
|
|
{
|
|
|
TransitNozzle nozzle = TransitNozzleManager.Instance.Nozzle(nozzleIndex);
|
|
|
if (!nozzle.HasVacSignal())
|
|
|
{
|
|
|
nozzle.CloseVac();
|
|
|
nozzle.OpenBreak();
|
|
|
nozzle.CloseBreak();
|
|
|
nozzle.Clear();
|
|
|
masticSlots.Remove(nozzleIndex);
|
|
|
}
|
|
|
}
|
|
|
if(masticSlots.Count==0)
|
|
|
{
|
|
|
exit = true;
|
|
|
}
|
|
|
break;
|
|
|
case ETipButton.Yes:
|
|
|
logInfo = GetClassName() + "点击了移动到安全位按钮";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.TransitNozzle);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.周转盘放料完成后真空检测;
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
case ETurnoverFlowStep.周转盘放料完成后真空检测:
|
|
|
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
|
|
|
if (hasProductNozzles != null&&hasProductNozzles.Count>0)
|
|
|
{
|
|
|
bool needGoSafePos = false;
|
|
|
foreach (var nozzle in hasProductNozzles)
|
|
|
{
|
|
|
TurnoverTraySlot slot = TurnoverTrayManager.Instance.Slot(nozzle.ToIndex + 1);
|
|
|
//GlobalTray.TurnoverTray.ChangeStatus(nozzle.ToIndex, ESlotStatus.Have);
|
|
|
//TurnoverTrayManager.Instance.Slot(nozzle.ToIndex).AddProduct(nozzle.SN, nozzle.NozzleIndex, TurnoverType.Turnover, nozzle.NozzleIndex);
|
|
|
if (slot.HasVac() || GlobalVar.VirtualAxis || GlobalVar.RunSpace)
|
|
|
{
|
|
|
LogHelper.Debug( GetClassName()+ $"周转盘{slot.Index}穴位真空吸正常");
|
|
|
slot.AddProduct(nozzle);
|
|
|
GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have);
|
|
|
slot.VacException = false;
|
|
|
nozzle.Clear();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//1 退到安全位
|
|
|
LogHelper.Debug(GetClassName()+ $"通知周转模组回到安全位");
|
|
|
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.Socket);
|
|
|
//2 排料轴上相机过来检测
|
|
|
LogHelper.Debug(GetClassName() + $"等待排料模组IDLE");
|
|
|
DischargeFlow.Instance.WaitCanMove();
|
|
|
LogHelper.Debug(GetClassName() + $"上相机到周转盘{slot.Index}号穴位定位检测");
|
|
|
VisionResult vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true,true,false);
|
|
|
//VisionResult vr = UpCameraScanBarCodeFlow.Instance.WaitSingle();
|
|
|
needGoSafePos = true;
|
|
|
if (!UpCameraScanBarCodeFlow.Instance.CheckResult(vr))//如果不在穴位中,就弹框报警
|
|
|
{
|
|
|
LogHelper.Debug(GetClassName() + "检测到产品不在穴位中");
|
|
|
bool exit = false;
|
|
|
while (!exit)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
//alarmInfo = $"周转盘{slot.Index}号穴位真空吸异常,请选择处理";
|
|
|
//alarmInfo = string.Format(AlarmCollection.GetAlarm(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警), slot.Index);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警).Transform(slot.Index);
|
|
|
LogHelper.Debug(GetClassName() + alarmEntity.CN);
|
|
|
//msgBox = MsgBox.ShowDialog(AlarmConstID.周转吸头放料到周转盘后周转盘真空吸报警, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
|
|
|
ETipButton btnRet = AlarmMessageBox.ShowDialog(alarmEntity, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
|
|
|
//switch (msgBox.Button)
|
|
|
switch(btnRet)
|
|
|
{
|
|
|
case ETipButton.Retry:
|
|
|
logInfo = GetClassName() + "选择了重试";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
vr = UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true, true, false);
|
|
|
//vr = UpCameraScanBarCodeFlow.Instance.WaitSingle();
|
|
|
if (UpCameraScanBarCodeFlow.Instance.CheckResult(vr))
|
|
|
{
|
|
|
slot.AddProduct(nozzle);
|
|
|
GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have);
|
|
|
slot.VacException = false;
|
|
|
nozzle.Clear();
|
|
|
exit = true;
|
|
|
}
|
|
|
break;
|
|
|
case ETipButton.Skip:
|
|
|
logInfo = GetClassName() + "选择了跳过";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
//检测穴位中还是否有料
|
|
|
if (!UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, slot.Index, true).HasProduct)
|
|
|
{
|
|
|
nozzle.Clear();
|
|
|
VacManager.TurnoverTrayVacSuction(EVacOperator.Close, true, slot.Index);
|
|
|
exit = true;
|
|
|
}
|
|
|
break;
|
|
|
case ETipButton.Yes:
|
|
|
logInfo = GetClassName() + "选择了移动到安全位";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
DischargeModuleGoSafePosFlow.Instance.GoSafePostion();
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
Msg.ShowError(ex.Message);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
LogHelper.Debug(GetClassName() + "检测到产品在穴位中");
|
|
|
slot.AddProduct(nozzle);
|
|
|
GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have);
|
|
|
slot.VacException = false;
|
|
|
nozzle.Clear();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
//排料轴回安全位
|
|
|
if(needGoSafePos)
|
|
|
{
|
|
|
DischargeFlow.Instance.WaitCanMove();
|
|
|
DischargeModuleGoSafePosFlow.Instance.GoSafePostion();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//检测治具盘中是否还有待取的料,如果有继续取,如果没有回安全位
|
|
|
if (TestTrayManager.Instance.GetSlots( ETestTraySlotStatus.Have).Count>0)
|
|
|
{
|
|
|
retakeNum++;
|
|
|
Step = ETurnoverFlowStep.到测试取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到安全位;
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.周转盘放料真空异常处理:
|
|
|
{
|
|
|
if(GlobalVar.EnableExceptionHandlingNozzle)
|
|
|
{
|
|
|
List<TurnoverTraySlot> vacExceptionSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.Tested, ETurnoverTraySlotStatus.VacException);
|
|
|
if (vacExceptionSlots != null && vacExceptionSlots.Count > 0)
|
|
|
{
|
|
|
|
|
|
foreach (TurnoverTraySlot slot in vacExceptionSlots)
|
|
|
{
|
|
|
//通知大力吸嘴过来取料,如果取成功了,就把当前穴位的产品删除
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.到安全位:
|
|
|
MachineManage.Instance.TestStatus = ETestStatus.Idle;
|
|
|
//这里判断周转载盘还有没有待测的产品,如果有就不动,如果没有就退到安全位
|
|
|
List<TurnoverTraySlot> hasProductSlots= TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have);
|
|
|
if (hasProductSlots.Count > 0)
|
|
|
{
|
|
|
|
|
|
logInfo =GetClassName()+ $"周转盘{hasProductSlots.Select(s=>s.Index).ToJoinString()}穴位中有待测产品,就地等待周转盘取料指令";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
//Step = ETurnoverFlowStep.上报中控任务完成;
|
|
|
//如果周转盘有上料的穴位,这是自动生成上料任务
|
|
|
LoadAndUnloadTask.Instance.CreateTestLoadTask();
|
|
|
turnoverTakeFinishe = false;
|
|
|
Step = ETurnoverFlowStep.到周转盘取料位上方;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
targetTurnoverY = SysConfigParam.GetValue<double>("PressTakeY");
|
|
|
errCode = AxisControl.TurnoverY.MovePos(targetTurnoverY, GlobalVar.WholeSpeed);
|
|
|
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
if (GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
|
|
|
}
|
|
|
logInfo = GetClassName() + $"周转吸头下料完成到安全位";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.等待到安全位;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverY, errCode);
|
|
|
alarmEntity = AlarmCollection.Get(AlarmConstID.TurnoverY运动异常).Transform(errCode.ToString());
|
|
|
AlarmMessageBox.ShowDialog(alarmEntity, ETipButton.Ok, null);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.等待到安全位:
|
|
|
if(Ops.IsStop("TurnoverX","TurnoverY") || GlobalVar.VirtualAxis)
|
|
|
{
|
|
|
//if(Ops.IsArrived(AxisControl.TurnoverX,AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
|
|
|
if(AxisArrived.TurnoverYIsInTargetPos(targetTurnoverY))
|
|
|
{
|
|
|
logInfo = GetClassName() + $"已运动到安全位,任务结束";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
Step = ETurnoverFlowStep.上报中控任务完成;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Step = ETurnoverFlowStep.到安全位;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
case ETurnoverFlowStep.上报中控任务完成:
|
|
|
if(GlobalVar.CleanOut)
|
|
|
{
|
|
|
unloadOk = true;
|
|
|
MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null });
|
|
|
LoadAndUnloadTask.Instance.Clear(1);
|
|
|
Step = ETurnoverFlowStep.等待任务;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (LoadAndUnloadTask.Instance.TestUnloadTaskArrived)
|
|
|
{
|
|
|
hasUnloadFlag = false;
|
|
|
LoadAndUnloadTask.Instance.TestUnloadTaskArrived = false;
|
|
|
MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null });
|
|
|
logInfo = GetClassName() + "通知中控产品全部已从治具中取出,状态变成NotReady";
|
|
|
MessageQueue.Instance.Insert(logInfo);
|
|
|
unloadOk = true;
|
|
|
TestCenter.Instance.LoadTestUnLoadResult();
|
|
|
LoadAndUnloadTask.Instance.Clear(1);
|
|
|
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
|
|
|
Step = ETurnoverFlowStep.等待任务;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public bool LoadFinished()
|
|
|
{
|
|
|
return loadOk;
|
|
|
}
|
|
|
|
|
|
public bool UnloadFinished()
|
|
|
{ return unloadOk; }
|
|
|
|
|
|
|
|
|
public string GetStep()
|
|
|
{
|
|
|
return Step.ToString();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 检测周转Y轴是否可以到周转盘位置
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
private bool CanGoTurnoverTrayPos()
|
|
|
{
|
|
|
double curPos = Ops.GetCurPosition(AxisControl.LoadY);
|
|
|
double maxPos = SysConfigParam.GetValue<double>("Nozzle1CenterY") + 3;
|
|
|
if (curPos > maxPos)
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
ManualResetEvent testTrayHasProductCheckEvent=new ManualResetEvent(false);
|
|
|
private List<int> testTrayHasProductList = new List<int>();
|
|
|
private void TestTrayHasProduct()
|
|
|
{
|
|
|
Task.Run(() => {
|
|
|
testTrayHasProductCheckEvent.Reset();
|
|
|
testTrayHasProductList.Clear();
|
|
|
//打开所有的真空
|
|
|
//VacManager.TestTrayVacSuction(EVacOperator.Open, true, TestTrayManager.Instance.Slots.Select(s => s.Index).ToArray());
|
|
|
//foreach (TestTraySlot slot in TestTrayManager.Instance.Slots)
|
|
|
//{
|
|
|
// if(!GlobalVar.DisableFixtureVacuumCheck)
|
|
|
// {
|
|
|
// if (Ops.IsOn($"测试{slot.Index}号穴位真空吸检测"))
|
|
|
// {
|
|
|
// //testTrayHasProductList.Add(slot.Index);
|
|
|
// }
|
|
|
// }
|
|
|
//}
|
|
|
//VacManager.TestTrayVacSuction(EVacOperator.Close, true, TestTrayManager.Instance.Slots.Select(s => s.Index).ToArray());
|
|
|
testTrayHasProductCheckEvent.Set();
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|