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
{
///
/// 周转流程步序
///
enum ETurnoverFlowStep
{
等待任务,
到周转盘取料位上方,
等待运动到周转盘取料位上方,
取料异常报警,
到周转盘下方取料位1,
等待运动到周转盘下方取料位1,
到周转盘下方取料位2,
等待运动到周转盘下方取料位2,
到周转盘取料破真空位,
等待到周转盘取料破真空位,
周转盘取料完成抬起,
等待周转盘取料完成抬起,
周转盘取料完成真空检测,
到测试放料位上方,
等待运动到测试放料位上方,
测试位上料丢料检测,
到测试放料位下方1,
等待运动到到测试放料位下方1,
到测试放料位下方2,
等待运动到到测试放料位下方2,
测试位放料完成抬起1,
等待测试位放料完成抬起1,
测试位放料完成抬起2,
等待测试位放料完成抬起2,
测试位放料完成粘料检测,
测试位放料完成真空检测,
到测试保压位上方,
等待到测试保压位上方,
到测试保压位下方1,
等待到测试保压位下方1,
到测试保压位下方2,
等待到测试保压位下方2,
通知中控开始测试,
等待测试完成,
测试完成抬起到高速位,
等待测试完成抬起到高速位,
测试完成抬起安全位,
等待测试完成抬起安全位,
测试完成到治具取料位上方,
等待测试完成到治具取料位上方,
///
/// ///////////////////////////////////////////////////////////////////
///
到测试取料位上方,
等待到测试取料位上方,
到测试取料位下方1,
测试治具取料失败报警,
等待到测试取料位下方1,
到测试取料位下方2,
等待到测试取料位下方2,
到测试破关真空位,
等待到测试关破真空位,
测试位取料完成抬起,
等待测试位取料完成抬起,
测试位取料完成后真空检测,
等待排料离开周转盘,
到周转盘放料位上方,
等待到周转盘放料位上方,
周转盘放料前丢料检测,
到周转盘放料位下方1,
等待到周转盘放料位下方1,
到周转盘放料位下方2,
等待到周转盘放料位下方2,
周转盘放料完成粘料检测,
周转盘放料完成后真空检测,
周转盘放料真空异常处理,
周转盘放料完成抬起1,
等待周转盘放料完成抬起1,
周转盘放料完成抬起2,
等待周转盘放料完成抬起2,
到安全位,
等待到安全位,
上报中控任务完成
}
///
/// 周转流程
///
public class TurnoverFlow:BaseFlow
{
///
/// 周转盘取料是否完成
///
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(){ }
///
/// 保压位上料
///
private bool pressLoad = false;
///
/// 保压位下料
///
private bool pressUnload = false;
private bool loadOk = false;
private bool unloadOk = false;
//List slots = new List();
List ngList = new List();
ETurnoverFlowStep Step = ETurnoverFlowStep.等待任务;
//double targetPos = 0.0;
Motion.ErrorCode errCode = Motion.ErrorCode.Ok;
List hasProductNozzles = new List();
///
/// 重取次数
///
private int retakeNum = 0;
List slots;
///
/// 丢料的吸嘴
///
List loseSlots = new List();
///
/// 粘料的吸嘴
///
List masticSlots = new List();
AlarmEntity alarmEntity= null;
bool bTakeFlag = false;
bool hasUnloadFlag = false;
int turnoverTrayToTestTrayNum = 1;
double targetTurnoverY = 0.0;
double targetTurnoverZ = 0.0;
double targetPressZ = 0.0;
///
/// 可以下料到周转盘
///
public void CanMoveFromTestTrayToTurnoverTray()
{
bTakeFlag = true;
}
///
/// 不可以下料到周转盘
///
public void CannotMoveFromTestTrayToTurnoverTray()
{
bTakeFlag = false;
}
///
/// 获取未执行的任务
///
private List undealTasks = new List();
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("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 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("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset;
}
else
{
targetTurnoverZ = SysConfigParam.GetValue("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("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("TurnoverTakeZ") + GlobalVar.CloseVacOffsetHeight;
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
}
else
{
targetTurnoverZ = SysConfigParam.GetValue("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("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("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 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("PressDumpZ") + GlobalVar.PressLowSpeedOffset;
}
else
{
targetTurnoverZ = SysConfigParam.GetValue("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("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("PressDumpZ") + GlobalVar.PressLowSpeedOffset;
}
else
{
targetTurnoverZ = SysConfigParam.GetValue("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("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("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("PressZ");
if (GlobalVar.EnableTwoSpeed)
{
targetPressZ = targetPressZ + SysConfigParam.GetValue("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("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 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 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 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("PressSafeZ")) <1)
{
Step = ETurnoverFlowStep.测试完成抬起安全位;
}
else
{
if (GlobalVar.EnableTwoSpeed)
{
targetPressZ = SysConfigParam.GetValue("PressZ") + GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.PressZ.MovePos(targetPressZ, GlobalVar.PressLowSpeed);
}
else
{
targetPressZ = SysConfigParam.GetValue("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("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("PressTakeX");
// errCode = AxisControl.TurnoverX.MovePos(targetPos, GlobalVar.WholeSpeed);
// if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
// {
// targetPos = SysConfigParam.GetValue("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("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 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("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("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("PressTakeZ") + GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
}
else
{
targetTurnoverZ = SysConfigParam.GetValue("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("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("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("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset+1;
}
else
{
targetTurnoverZ = SysConfigParam.GetValue("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("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("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.TurnoverZ.MovePos(targetTurnoverZ, GlobalVar.PressLowSpeed);
}
else
{
targetTurnoverZ = SysConfigParam.GetValue("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("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 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 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("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();
}
///
/// 检测周转Y轴是否可以到周转盘位置
///
///
private bool CanGoTurnoverTrayPos()
{
double curPos = Ops.GetCurPosition(AxisControl.LoadY);
double maxPos = SysConfigParam.GetValue("Nozzle1CenterY") + 3;
if (curPos > maxPos)
return false;
return true;
}
ManualResetEvent testTrayHasProductCheckEvent=new ManualResetEvent(false);
private List testTrayHasProductList = new List();
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();
});
}
}
}