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.

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