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.

359 lines
15 KiB
C#

using HalconDotNet;
using Rs.Camera;
using Rs.Controls;
using Rs.Framework;
using Rs.Motion;
using Rs.MotionPlat.Commom;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Rs.MotionPlat.Flow.Space
{
public enum ELoadAndUnloadTestStep
{
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
}
public class LoadAndUnloadTest:BaseFlow
{
private bool grabOK = false;
private static LoadAndUnloadTest instance;
public event Action<HObject[], List<MatchResult>> CameraOkEvent;
public static LoadAndUnloadTest Instance
{
get
{
if (instance == null)
{
instance = new LoadAndUnloadTest();
}
return instance;
}
}
private LoadAndUnloadTest()
{
//HikCamera.Instance.GrabOkEvent += (camIndex,img) => {
// grabOK = true;
//};
}
/// <summary>
/// 当前取料穴位
/// </summary>
private ushort CurFetchSlotIndex = 1;
/// <summary>
/// 当前组装穴位
/// </summary>
private ushort CurAssembleSlotInex = 1;
/// <summary>
/// 吸嘴索引
/// </summary>
private ushort NozzleIndex = 1;
bool[] stop = new bool[30];
ELoadAndUnloadTestStep flowStep = ELoadAndUnloadTestStep.;
HObject[] imgs = new HObject[2];
List<MatchResult> mrs = new List<MatchResult>();
int FetchNum = 0;//取料次数
bool bFetchBack = false;
double targetX = 0.0;
double targetY = 0.0;
TraySlot tray = new TraySlot();
ErrorCode errCode = ErrorCode.Ok;
public override void Run()
{
switch (flowStep)
{
case ELoadAndUnloadTestStep.:
SlotPoint sp1 = TrayPointManager.GetSlotPoint(GlobalVar.CurRecipe,"Input", CurFetchSlotIndex, EPointType.BASE);
SlotPoint dist = TrayPointManager.GetDistToNozzle1(NozzleIndex);
targetX = sp1.X + dist.X;
targetY = sp1.Y + dist.Y;
errCode = AxisControl.LoadX.MovePos(targetX, GlobalVar.WholeSpeed);
if (errCode != ErrorCode.Ok)
{
MessageQueue.Instance.Warn($"运动失败:{errCode}"); //运动失败
}
errCode = AxisControl.LoadY.MovePos(targetY, (int)(GlobalVar.WholeSpeed));
if (errCode != ErrorCode.Ok)
{
MessageQueue.Instance.Warn($"运动失败:{errCode}"); //运动失败
}
flowStep = ELoadAndUnloadTestStep.;
break;
case ELoadAndUnloadTestStep.:
if (Ops.IsStop("LoadX", "LoadY"))
{
Thread.Sleep(100);
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
AxisControl.GetAxis($"NozzleZ{NozzleIndex}").MovePos(-5, GlobalVar.WholeSpeed);
flowStep = ELoadAndUnloadTestStep.;
break;
case ELoadAndUnloadTestStep.:
if (Ops.IsStop($"NozzleZ{NozzleIndex}"))
{
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
IoManager.Instance.WriteOut($"{NozzleIndex}吸嘴真空吸电磁阀", 1);
Thread.Sleep(60);
flowStep = ELoadAndUnloadTestStep.;
break;
case ELoadAndUnloadTestStep.:
AxisControl.GetAxis($"NozzleZ{NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed);
flowStep = ELoadAndUnloadTestStep.;
break;
case ELoadAndUnloadTestStep.:
if (Ops.IsStop($"NozzleZ{NozzleIndex}"))
{
flowStep = ELoadAndUnloadTestStep.;
//Thread.Sleep(100);
}
break;
case ELoadAndUnloadTestStep.:
if (IoManager.Instance.ReadIn($"{NozzleIndex}吸嘴真空吸检测") == 1 || GlobalVar.RunSpace)
{
FetchNum = 0;
if (NozzleIndex < 2)
{
NozzleIndex++;
flowStep = ELoadAndUnloadTestStep.;
}
else
{
NozzleIndex = 1;
flowStep = ELoadAndUnloadTestStep.;
}
CurFetchSlotIndex++;
}
else
{
FetchNum++;
if (FetchNum == 6)
{
Msg.ShowError($"吸嘴{NozzleIndex}取料{FetchNum}次失败报警,请处理后点击确定");
FetchNum = 0;
}
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
if (XYCanMove())
{
ImageProcess.ClearAutoTrigger();
HikCamera.Instance.SetExposure("locationCamera", 40);
HikCamera.Instance.SetGain("locationCamera", 20);
AxisControl.LoadX.MovePos(SysConfigParam.GetValue<double>("Nozzle1CenterX")+30, GlobalVar.WholeSpeed);
AxisControl.LoadY.MovePos(SysConfigParam.GetValue<double>("Nozzle1CenterY"), GlobalVar.WholeSpeed);
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
if (Ops.IsStop("LoadX","LoadY"))
{
flowStep = ELoadAndUnloadTestStep.;
Thread.Sleep(100);
HikCamera.Instance.SetTrigger("locationCamera", ETriggerMode.Auto);
AxisControl.LoadX.SetPosCompare(1, new double[] { SysConfigParam.GetValue<double>("Nozzle1CenterX"), SysConfigParam.GetValue<double>("Nozzle2CenterX") });
}
break;
case ELoadAndUnloadTestStep.:
if (XYCanMove())
{
IoManager.Instance.WriteOut("下左相机光源触发", 1);
Thread.Sleep(50);
AxisControl.LoadX.MovePos(SysConfigParam.GetValue<double>("Nozzle9CenterX") - 10, GlobalVar.FlyCameraSpeed);
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
AxisControl.LoadX.IsStop(out stop[0]);
Stopwatch stopwatch = new Stopwatch();
if (Ops.IsStop("LoadX"))
{
AxisControl.LoadX.ClearCompare(1);
IoManager.Instance.WriteOut("下左相机光源触发", 0);
flowStep = ELoadAndUnloadTestStep.;
stopwatch.Start();
}
break;
case ELoadAndUnloadTestStep.:
if (GlobalVar.RunSpace)
{
flowStep = ELoadAndUnloadTestStep.;
mrs = new List<MatchResult>();
mrs.Add(new MatchResult());
mrs.Add(new MatchResult());
}
else
{
imgs = ImageProcess.GetAutoImage();
if (imgs != null && imgs.Length == 2)
{
CameraOkEvent?.Invoke(imgs, null);
//拍照完成
flowStep = ELoadAndUnloadTestStep.;
}
}
break;
case ELoadAndUnloadTestStep.:
mrs = VisionProcess.Instance.MatchDownCam(imgs);
if (mrs != null && mrs.Count == 2)
{
CameraOkEvent?.Invoke(imgs, mrs);
flowStep = ELoadAndUnloadTestStep.;
//Thread.Sleep(2000);
}
else
{
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
if (XYCanMove())
{
targetX = 0.0;
targetY = 0.0;
SlotPoint sp2 = TrayPointManager.GetSlotPoint(GlobalVar.CurRecipe, "Turnover", CurAssembleSlotInex, EPointType.RUN);
SlotPoint nozzleDist = TrayPointManager.GetDistToNozzle1(NozzleIndex);
AxisControl.LoadX.MovePos(sp2.X+nozzleDist.X, GlobalVar.WholeSpeed);
AxisControl.LoadY.MovePos(sp2.Y + nozzleDist.Y, GlobalVar.WholeSpeed);
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
AxisControl.LoadX.IsStop(out stop[0]);
AxisControl.LoadY.IsStop(out stop[1]);
if (Ops.IsStop("LoadX","LoadY"))
{
Thread.Sleep(100);
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
AxisControl.GetAxis($"NozzleZ{NozzleIndex}").MovePos(-5, GlobalVar.WholeSpeed);
flowStep = ELoadAndUnloadTestStep.;
break;
case ELoadAndUnloadTestStep.:
if (Ops.IsStop($"NozzleZ{NozzleIndex}"))
{
IoManager.Instance.WriteOut($"{NozzleIndex}吸嘴真空吸电磁阀", 0);
Thread.Sleep(50);
IoManager.Instance.WriteOut($"{NozzleIndex}吸嘴真空破电磁阀", 1);
Thread.Sleep(100);
IoManager.Instance.WriteOut($"{NozzleIndex}吸嘴真空破电磁阀", 0);
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
AxisControl.GetAxis($"NozzleZ{NozzleIndex}").MovePos(0, GlobalVar.WholeSpeed);
flowStep = ELoadAndUnloadTestStep.;
break;
case ELoadAndUnloadTestStep.:
if (Ops.IsStop($"NozzleZ{NozzleIndex}"))
{
Thread.Sleep(100);
if (NozzleIndex < 2)
{
NozzleIndex++;
flowStep = ELoadAndUnloadTestStep.;
}
else
{
NozzleIndex = 1;
flowStep = ELoadAndUnloadTestStep.;
}
CurAssembleSlotInex++;
if (CurAssembleSlotInex == 91)
{
CurAssembleSlotInex = 1;
CurFetchSlotIndex = 1;
}
}
break;
case ELoadAndUnloadTestStep.:
AxisControl.LoadX.MovePos(SysConfigParam.GetValue<double>("LoadXStartPos"),GlobalVar.WholeSpeed);
AxisControl.LoadY.MovePos(SysConfigParam.GetValue<double>("LoadYStartPos"), GlobalVar.WholeSpeed);
flowStep = ELoadAndUnloadTestStep.;
break;
case ELoadAndUnloadTestStep.:
if(Ops.IsStop("LoadX", "LoadY"))
{
flowStep = ELoadAndUnloadTestStep.;
}
break;
case ELoadAndUnloadTestStep.:
//TurnoverFlow.Instance.PressLoad();
flowStep = ELoadAndUnloadTestStep.;
break;
case ELoadAndUnloadTestStep.:
if(TurnoverFlow.Instance.LoadFinished())
{
flowStep = ELoadAndUnloadTestStep.;
//TurnoverFlow.Instance.PressUnload();
}
break;
case ELoadAndUnloadTestStep.:
if (TurnoverFlow.Instance.UnloadFinished())
{
flowStep = ELoadAndUnloadTestStep.;
}
break;
default:
break;
}
}
private bool XYCanMove()
{
return true;
}
}
}