You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1812 lines
101 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using log4net.Core;
using Rs.Controls;
using Rs.Framework;
using Rs.MotionPlat.Commom;
using Rs.MotionPlat.Entitys.Trays;
using Rs.MotionPlat.Flow.Camera;
using Rs.MotionPlat.Flow.NgFlow;
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,
,
,
,
,
,
,
,
,
/// <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>();
/// <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);
//Step = ETurnoverFlowStep.测试完成抬起到高速位;
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
if(CanGoTurnoverTrayPos())
{
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeX");
errCode = AxisControl.TurnoverX.MovePos(targetPos, GlobalVar.WholeSpeed);
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
{
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeY");
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);
}
}
else
{
Msg.ShowError("turnovery axis move is unsafe");
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverX,AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到周转盘取料位上方";
MessageQueue.Instance.Insert(logInfo);
if(retakeNum<3)
{
Step = ETurnoverFlowStep.1;
}
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))}号穴位异常";
TestCenterMessageBox.Show(AlarmConstID.TurnoverTakeFailAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(),
MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.TurnoverTakeFailAlarm);
switch (msgBox.Button)
{
case ETipButton.Retry:
logInfo = $"选择了重试";
MessageQueue.Instance.Insert(logInfo);
retakeNum = 0;
exit = true;
Step = ETurnoverFlowStep.;
break;
case ETipButton.Skip:
logInfo = GetClassName() + $"选择了跳过";
MessageQueue.Instance.Insert(logInfo);
if (GlobalVar.EnableExceptionHandlingNozzle)
{
foreach (TurnoverTraySlot slot in untestSlots)
{
WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, slot.Index);
slot.ClearProduct();
VacManager.TurnoverTrayVacSuction(EVacOperator.Close, slot.Index);
GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.NotHave);
}
exit = true;
Step = ETurnoverFlowStep.;
}
else
{
untestSlots = TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have);
foreach (TurnoverTraySlot slot in untestSlots)
{
if (!LaserFlow.Instance.HasProduct(ETrayType.Turnover, slot.Index))
{
VacManager.TurnoverTrayVacSuction(EVacOperator.Close, 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:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.TurnoverZ.MovePos(targetPos, 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);
}
break;
case ETurnoverFlowStep.1:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName()+ $"已运动到周转盘下方取料位1 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.2;
}
break;
case ETurnoverFlowStep.2:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, 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);
}
break;
case ETurnoverFlowStep.2:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到周转盘下方取料位2 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
MessageQueue.Instance.Insert(logInfo);
undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal);
/*打开周转吸嘴真空吸*/
VacManager.TransitNozzleVacSuction(EVacOperator.Open, undealTasks.Select(t => t.ToIndex + 1).ToArray());
/*关闭周转盘真空吸*/
VacManager.TurnoverTrayVacSuction(EVacOperator.Close, undealTasks.Select(t => t.FromIndex + 1).ToArray());
/*打开周转盘真空破*/
VacManager.TurnoverTrayVacBreak(EVacOperator.Open, undealTasks.Select(t => t.FromIndex + 1).ToArray());
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ")+GlobalVar.CloseVacOffsetHeight;
errCode = AxisControl.TurnoverZ.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.TurnoverZ, errCode);
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = $"已到周转盘取料破真空位";
MessageQueue.Instance.Insert(logInfo);
undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal);
/*关闭周转盘真空破*/
VacManager.TurnoverTrayVacBreak(EVacOperator.Close, undealTasks.Select(t => t.FromIndex + 1).ToArray());
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("TurnoverSafeZ");
errCode = AxisControl.TurnoverZ.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.TurnoverZ, errCode);
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"周转盘取料完成已抬起";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
undealTasks = LoadAndUnloadTask.Instance.GetTurnoverToTestTasks(ETaskDealStatus.Undeal);
foreach (TurnoverInfo task in undealTasks)
{
if (Ops.IsOn($"周转{task.FromIndex + 1}号吸嘴真空吸检测") || GlobalVar.VirtualAxis || GlobalVar.RunSpace)
{
//如果真空检测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;
}
}
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
if (hasProductNozzles.Count > 0)
{
logInfo = GetClassName()+ $"周转吸头{hasProductNozzles.Select(n => n.NozzleIndex).ToJoinString()}真空检测OK";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.;
}
else
{
retakeNum++;
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressDumpX");
errCode = AxisControl.TurnoverX.MovePos(targetPos, GlobalVar.WholeSpeed);
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
{
targetPos = SysConfigParam.GetValue<double>("PressDumpY");
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 (turnoverTakeFinishe==false && TurnoverTrayManager.Instance.GetSlots(ETurnoverTraySlotType.WaitTest, ETurnoverTraySlotStatus.Have).Count() == 0)
{
turnoverTakeFinishe = true;
string reportStr = LoadAndUnloadTask.Instance.GetTestLoadString();
TestCenter.Instance.Send(reportStr);
LoadAndUnloadTask.Instance.Clear(1);
MachineManage.Instance.SetLoadUnloadStatus(ERunState.Waiting);
MessageQueue.Instance.Insert("通知中控周转载盘产品已取走,可以继续排料");
}
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()}号吸嘴真空异常丢料,请处理";
TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm);
switch (msgBox.Button)
{
case ETipButton.Skip:
logInfo = GetClassName() + $"点击了跳过按钮";
MessageQueue.Instance.Insert(logInfo);
exit = true;
List<TransitNozzle> hasProducts = TransitNozzleManager.Instance.GetHasProductNozzles();
//把吸嘴的真空吸关闭
VacManager.TransitNozzleVacSuction(EVacOperator.Close, loseSlots.ToArray());
//打开周转吸嘴的真空破
VacManager.TransitNozzleVacBreak(EVacOperator.Open, loseSlots.ToArray());
//关闭周转吸嘴的真空破
VacManager.TransitNozzleVacBreak(EVacOperator.Close, 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:
targetPos = SysConfigParam.GetValue<double>("PressDumpZ")+GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.TurnoverZ.MovePos(targetPos, 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);
}
break;
case ETurnoverFlowStep.1:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo =GetClassName()+ $"已运动到到测试放料位下方1 TurnoverZ at:{Ops.GetCurPosition(AxisAlias.TurnoverZ)}";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.2;
}
break;
case ETurnoverFlowStep.2:
targetPos = SysConfigParam.GetValue<double>("PressDumpZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.PressLowSpeed);
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis )
{
if (GlobalVar.VirtualAxis)
{
Thread.Sleep(GlobalVar.VirtualAxisMoveTime);
}
logInfo =GetClassName()+ $"到测试放料位下方2";
MessageQueue.Instance.Insert(logInfo);
LogHelper.Debug(logInfo);
Step = ETurnoverFlowStep.2;
}
else
{
MsgBox.ShowAxisAlarmDialog(AxisControl.TurnoverZ, errCode);
}
break;
case ETurnoverFlowStep.2:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
//获取需要放料的吸嘴
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
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, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
/*打开周转吸头真空破*/
VacManager.TransitNozzleVacBreak(EVacOperator.Open, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
/*关闭周转吸头真空破*/
VacManager.TransitNozzleVacBreak(EVacOperator.Close, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressSafeZ");
errCode = AxisControl.TurnoverZ.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.TurnoverZ, errCode);
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName()+$"测试位放料完成抬起完成";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
masticSlots.Clear();
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
//打开全部吸嘴的真空吸
VacManager.TransitNozzleVacSuction(EVacOperator.Open, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles())
{
//nozzle.OpenVac();
if (nozzle.HasVacSignal() && !GlobalVar.RunSpace)
{
masticSlots.Add(nozzle.NozzleIndex);
}
else
{
nozzle.CloseVac();
}
}
if(masticSlots.Count > 0)
{
//粘料报警
alarmInfo = $"周转吸头{masticSlots.ToJoinString()}号吸嘴真空异常粘料,请手工处理";
TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm);
switch (msgBox.Button)
{
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(GlobalVar.EnableTestFixtureFiberCheck)//如果启用光纤
{
if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位光纤检测") || GlobalVar.RunSpace)
{
bool exit = false;
while (!exit)
{
alarmInfo = $"测试治具{nozzle.NozzleIndex}号光纤异常,有可能叠料,请处理";
MessageQueue.Instance.Warn(GetClassName() + alarmInfo);
TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm);
switch (msgBox.Button)
{
case ETipButton.Retry:
VacManager.TestTrayVacSuction(EVacOperator.Open, nozzle.NozzleIndex);
if (!Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位光纤检测") || GlobalVar.RunSpace)
{
//GlobalTray.TestTray.ChangeStatus(nozzle.NozzleIndex, ESlotStatus.Have);
//TestTrayManager.Instance.Slot(nozzle.NozzleIndex).AddProduct(nozzle);
//nozzle.Clear();
exit = true;
}
break;
case ETipButton.Skip:
//镭射头过来复检,有产品则继续报警,
if (!LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex))
{
VacManager.TestTrayVacSuction(EVacOperator.Close, nozzle.NozzleIndex);
nozzle.Clear();
exit = true;
}
break;
case ETipButton.Yes://移动到安全位
VacManager.TestTrayVacSuction(EVacOperator.Close, nozzle.NozzleIndex);
TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket);
break;
}
}
}
}
if(nozzle.IsHasProduct)
{
if (Ops.IsOn($"测试{nozzle.NozzleIndex}号穴位真空吸检测") || GlobalVar.RunSpace)
{
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}号真空吸异常";
MessageQueue.Instance.Warn(GetClassName() + alarmInfo);
TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm);
switch (msgBox.Button)
{
case ETipButton.Retry:
VacManager.TestTrayVacSuction(EVacOperator.Open, 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:
//镭射头过来复检,有产品则继续报警,
if (!LaserFlow.Instance.HasProduct(ETrayType.Test, nozzle.NozzleIndex))
{
nozzle.Clear();
exit = true;
}
break;
case ETipButton.Yes://移动到安全位
VacManager.TestTrayVacSuction(EVacOperator.Close, nozzle.NozzleIndex);
TransitModuleSafePosFlow.Instance.GoSafePostion(EExceptionSafePos.Socket);
break;
}
}
}
}
}
if (!turnoverTakeFinishe)
{
Step = ETurnoverFlowStep.;
}
else
{
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressDumpX");
errCode = AxisControl.TurnoverX.MovePos(targetPos, GlobalVar.WholeSpeed);
if(errCode== Motion.ErrorCode.Ok|| GlobalVar.VirtualAxis)
{
targetPos = SysConfigParam.GetValue<double>("PressY");
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(TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count>0)
{
logInfo = GetClassName() + $"已运动到测试保压位上方";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.1;
}
else
{
logInfo = GetClassName() + $"检测到测试治具中无产品需要测试";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.;
}
}
break;
case ETurnoverFlowStep.1:
targetPos = SysConfigParam.GetValue<double>("PressZ");
targetPos = targetPos + SysConfigParam.GetValue<double>("PressLowSpeedOffset");
errCode = AxisControl.PressZ.MovePos(targetPos, 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.PressZ, errCode);
}
break;
case ETurnoverFlowStep.1:
if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已到测试保压位下方1 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.2;
}
break;
case ETurnoverFlowStep.2:
targetPos = SysConfigParam.GetValue<double>("PressZ");
errCode = AxisControl.PressZ.MovePos(targetPos, 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);
}
break;
case ETurnoverFlowStep.2:
if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis)
{
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, willTestSlot.Select(s => s.Index).ToArray());
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)
{
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressZ")+GlobalVar.PressLowSpeedOffset;
double curPos = Ops.GetCurPosition(AxisAlias.PressZ);
if(Math.Abs(curPos-targetPos)<0.1)
{
Step = ETurnoverFlowStep.;
}
else
{
errCode = AxisControl.PressZ.MovePos(targetPos, GlobalVar.PressLowSpeed);
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);
}
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.PressZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName()+$"测试完成已抬起 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressSafeZ");
errCode = AxisControl.PressZ.MovePos(0, 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);
}
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);
if (Ops.IsArrived(AxisAlias.PressZ))
{
logInfo = GetClassName() + $"测试完成已抬起到安全位 PressZ at:{Ops.GetCurPosition(AxisAlias.PressZ)}";
MessageQueue.Instance.Insert(logInfo);
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)
{
logInfo = GetClassName() + $"已运动到治具取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}";
MessageQueue.Instance.Insert(logInfo);
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)
{
logInfo = GetClassName() + $"已运动到测试取料位上方 TurnoverY at:{Ops.GetCurPosition(AxisAlias.TurnoverY)}";
MessageQueue.Instance.Insert(logInfo);
if (retakeNum < 3)
{
Step = ETurnoverFlowStep.1;
}
else
{
Step = ETurnoverFlowStep.;
}
}
break;
case ETurnoverFlowStep.:
//取三次之后还没有取起来的产品,这个时候需要弹框报警提示是否继续还是跳过
//获取还未执行完的任务
List<TestTraySlot> testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have);
if (testedSlots != null && testedSlots.Count > 0)
{
bool exit = false;
while (!exit)
{
alarmInfo = GetClassName() + $"测试治具{testedSlots.Select(s => s.Index).ToJoinString()}号穴位取料失败";
TestCenterMessageBox.Show(AlarmConstID.TransitNozzlelTakeProductFailAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.TransitNozzlelTakeProductFailAlarm);
switch (msgBox.Button)
{
case ETipButton.Retry:
logInfo = GetClassName() + $"选择了重试按钮";
MessageQueue.Instance.Insert(logInfo);
retakeNum = 0;
exit = true;
Step = ETurnoverFlowStep.;
break;
case ETipButton.Skip:
logInfo = GetClassName() + $"选择了跳过按钮";
MessageQueue.Instance.Insert(logInfo);
testedSlots = testedSlots = TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have);
foreach (TestTraySlot slot in testedSlots)
{
if (!LaserFlow.Instance.HasProduct(ETrayType.Test, slot.Index))
{
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);
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.Socket);
break;
default:
break;
}
}
}
break;
case ETurnoverFlowStep.1:
targetPos = SysConfigParam.GetValue<double>("PressTakeZ") + GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.TurnoverZ.MovePos(targetPos, 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);
}
break;
case ETurnoverFlowStep.1:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName()+ $"已运动到到测试取料位下方1";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.2;
}
break;
case ETurnoverFlowStep.2:
targetPos = SysConfigParam.GetValue<double>("PressTakeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, 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);
}
break;
case ETurnoverFlowStep.2:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
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);
int[] indexes = undealTasks.Select(t => t.FromIndex + 1).ToArray();
/*打开周转吸头真空吸*/
VacManager.TransitNozzleVacSuction(EVacOperator.Open, indexes);
/*关闭测试穴位真空吸*/
VacManager.TestTrayVacSuction(EVacOperator.Close, indexes);
/*打开测试穴位真空破*/
VacManager.TestTrayVacBreak(EVacOperator.Open, indexes);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressTakeZ")+GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.PressLowSpeed);
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);
}
break;
case ETurnoverFlowStep.:
if(Ops.IsStop(AxisAlias.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName()+$"已运动到测试关破真空位";
MessageQueue.Instance.Insert(logInfo);
undealTasks = LoadAndUnloadTask.Instance.GetTestToTurnoverTasks(ETaskDealStatus.Undeal);
/*关闭测试穴位真空破*/
VacManager.TestTrayVacBreak(EVacOperator.Close, undealTasks.Select(t => t.FromIndex + 1).ToArray());
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
targetPos = SysConfigParam.GetValue<double>("PressSafeZ");
errCode = AxisControl.TurnoverZ.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.TurnoverZ, errCode);
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo =GetClassName()+ $"测试位取料完成已抬起";
MessageQueue.Instance.Insert(logInfo);
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)
{
testSlot.ClearProduct();
task.Dealed = true;
TransitNozzleManager.Instance.Nozzle(task.FromIndex + 1).AddProduct(task);
GlobalTray.TestTray.ChangeStatus(task.FromIndex + 1, ESlotStatus.NotHave);
}
}
}
if (TestTrayManager.Instance.GetSlots(ETestTraySlotStatus.Have).Count == 0)
{
MachineManage.Instance.SetTesterState(new TesterInfo() { State = ETesterState.NotReady, ReadySites = null });
logInfo = GetClassName() + "通知中控产品全部已从治具中取出状态变成NotReady";
MessageQueue.Instance.Insert(logInfo);
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
if (hasProductNozzles.Count > 0 || GlobalVar.RunSpace || GlobalVar.VirtualAxis)
{
Step = ETurnoverFlowStep.;
}
else
{
Step = ETurnoverFlowStep.;
}
}
else
{
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
if (hasProductNozzles.Count > 0 || GlobalVar.RunSpace || GlobalVar.VirtualAxis)
{
Step = ETurnoverFlowStep.;
}
else
{
retakeNum++;
Step = ETurnoverFlowStep.;
}
}
break;
case ETurnoverFlowStep.:
if(CanGoTurnoverTrayPos())
{
targetPos = SysConfigParam.GetValue<double>("TurnoverDumpX");
errCode = AxisControl.TurnoverX.MovePos(targetPos, GlobalVar.WholeSpeed);
if (errCode == Motion.ErrorCode.Ok || GlobalVar.VirtualAxis)
{
targetPos = SysConfigParam.GetValue<double>("TurnoverDumpY");
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);
}
}
else
{
Msg.ShowError("turnovery axis move is unsafe");
}
break;
case ETurnoverFlowStep.:
if (Ops.IsStop(AxisControl.TurnoverY) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到周转盘放料位上方";
MessageQueue.Instance.Insert(logInfo);
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()}号吸嘴真空异常丢料,请处理";
TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm);
switch (msgBox.Button)
{
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:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.TurnoverZ.MovePos(targetPos+1, 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);
}
break;
case ETurnoverFlowStep.1:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到周转盘放料位下方1";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.2;
}
break;
case ETurnoverFlowStep.2:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, 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);
}
break;
case ETurnoverFlowStep.2:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"已运动到周转盘放料位下方2";
MessageQueue.Instance.Insert(logInfo);
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
/*打开周转盘真空吸*/
VacManager.TurnoverTrayVacSuction(EVacOperator.Open, hasProductNozzles.Select(n => n.ToIndex+1).ToArray());
/*关闭周转吸头真空吸*/
VacManager.TransitNozzleVacSuction( EVacOperator.Close,hasProductNozzles.Select(n=>n.FromIndex + 1).ToArray());
/*打开周转吸头真空破*/
VacManager.TransitNozzleVacBreak(EVacOperator.Open, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray());
Step = ETurnoverFlowStep.1;
}
break;
case ETurnoverFlowStep.1:
targetPos = SysConfigParam.GetValue<double>("TurnoverTakeZ") + GlobalVar.PressLowSpeedOffset;
errCode = AxisControl.TurnoverZ.MovePos(targetPos, GlobalVar.PressLowSpeed);
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);
}
break;
case ETurnoverFlowStep.1:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
/*关闭周转吸头真空破*/
VacManager.TransitNozzleVacBreak(EVacOperator.Close, hasProductNozzles.Select(n => n.FromIndex + 1).ToArray());
logInfo = GetClassName() + $"周转盘放料完成已抬起1";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.2;
}
break;
case ETurnoverFlowStep.2:
targetPos = SysConfigParam.GetValue<double>("TurnoverSafeZ");
errCode = AxisControl.TurnoverZ.MovePos(targetPos, 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);
}
break;
case ETurnoverFlowStep.2:
if (Ops.IsStop(AxisControl.TurnoverZ) || GlobalVar.VirtualAxis)
{
logInfo = GetClassName() + $"周转盘放料完成已抬起2";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
masticSlots.Clear();
hasProductNozzles = TransitNozzleManager.Instance.GetHasProductNozzles();
VacManager.TransitNozzleVacSuction(EVacOperator.Open, hasProductNozzles.Select(n => n.NozzleIndex).ToArray());
foreach (var nozzle in TransitNozzleManager.Instance.GetHasProductNozzles())
{
//nozzle.OpenVac();
if (nozzle.HasVacSignal() && !GlobalVar.RunSpace)
{
masticSlots.Add(nozzle.NozzleIndex);
}
else
{
nozzle.CloseVac();
}
}
if (masticSlots.Count > 0)
{
//粘料报警
bool exit = false;
while (!exit)
{
alarmInfo = $"周转{masticSlots.ToJoinString()}号吸嘴真空异常粘料,请手工处理";
MessageQueue.Instance.Warn(GetClassName()+ alarmInfo);
TestCenterMessageBox.Show(AlarmConstID.NozzlesLoseMaterialAlarm, alarmInfo, MessageButtonManager.GetSkip_MoveToSafe_Button(), MessageButtonManager.GetSkip_MoveToSafe_ButtonText());
msgBox = TestCenterMessageBox.WaitResult(AlarmConstID.NozzlesLoseMaterialAlarm);
switch (msgBox.Button)
{
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)
{
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)
{
slot.AddProduct(nozzle);
GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have);
slot.VacException = false;
nozzle.Clear();
}
else
{
//1 退到安全位
TransitModuleSafePosFlow.Instance.GoSafePostion( EExceptionSafePos.Socket);
//2 排料轴上相机过来检测
UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true);
VisionResult vr = UpCameraScanBarCodeFlow.Instance.WaitSingle();
if (!UpCameraScanBarCodeFlow.Instance.CheckResult(vr))//如果不在穴位中,就弹框报警
{
bool exit = false;
while (!exit)
{
alarmInfo = $"周转盘{slot.Index}号穴位真空吸异常,请选择处理";
msgBox = MsgBox.ShowDialog(AlarmConstID.TurnoverDumpFailAlarm, alarmInfo, MessageButtonManager.GetRetry_Skip_MoveToSafe_Button(), MessageButtonManager.GetRetry_Skip_MoveToSafe_ButtonText());
switch (msgBox.Button)
{
case ETipButton.Retry:
logInfo = GetClassName() + "选择了重试";
MessageQueue.Instance.Insert(logInfo);
UpCameraScanBarCodeFlow.Instance.ScanSingle(slot.Index, true);
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(GlobalVar.EnableExceptionHandlingNozzle)//启用大力吸嘴
{
DischargeModuleGoSafePosFlow.Instance.GoSafePostion();
WarningSuckerNgFlow.Instance.DealNgProduct(ETrayType.Turnover, slot.Index);
nozzle.Clear();
VacManager.TurnoverTrayVacSuction(EVacOperator.Close, slot.Index);
exit = true;
}
else
{
//检测穴位中还是否有料
if (!UpCameraCheckFlow.Instance.CheckTurnoverTrayHasProduct(null, slot.Index, true))
{
nozzle.Clear();
VacManager.TurnoverTrayVacSuction(EVacOperator.Close, slot.Index);
exit = true;
}
}
break;
case ETipButton.Yes:
logInfo = GetClassName() + "选择了移动到安全位";
MessageQueue.Instance.Insert(logInfo);
DischargeModuleGoSafePosFlow.Instance.GoSafePostion();
break;
default:
break;
}
}
}
else
{
slot.AddProduct(nozzle);
GlobalTray.TurnoverTray.ChangeStatus(slot.Index, ESlotStatus.Have);
slot.VacException = false;
nozzle.Clear();
}
}
}
}
//排料轴回安全位
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.;
}
else
{
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("TurnoverX","TurnoverY") || GlobalVar.VirtualAxis)
{
logInfo = GetClassName()+$"已运动到安全位,任务结束";
MessageQueue.Instance.Insert(logInfo);
Step = ETurnoverFlowStep.;
}
break;
case ETurnoverFlowStep.:
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);
if(Math.Abs(GlobalVar.LoadYStartPos-curPos)<0.5)
{
return true;
}
return false;
}
}
}