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.

104 lines
4.0 KiB
C#

2 years ago
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.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Rs.MotionPlat.Flow.Space
{
enum CameraTriggerTestStep
{
gotoTriggerStartPos,
waitGotoTriggerStartPos,
gotoTriggerEndPos,
waitGotoTriggerEndPos,
waitGrabOk
}
public class CameraTriggerTest:BaseFlow
{
public event Action<List<MatchResult>> OnMatchResult;
//goto trigger start postion
private static CameraTriggerTest instance;
public static CameraTriggerTest Instance
{
get
{
if(instance == null)
instance = new CameraTriggerTest();
return instance;
}
}
static int grabNum = 0;
CameraTriggerTestStep step;
HObject[] imgs;
public override void Run()
{
switch (step)
{
case CameraTriggerTestStep.gotoTriggerStartPos:
AxisControl.LoadX.MovePos(SysConfigParam.GetValue<double>("Nozzle1CenterX") + 50, GlobalVar.WholeSpeed);
AxisControl.LoadY.MovePos(SysConfigParam.GetValue<double>("Nozzle1CenterY"), GlobalVar.WholeSpeed);
step = CameraTriggerTestStep.waitGotoTriggerStartPos;
break;
case CameraTriggerTestStep.waitGotoTriggerStartPos:
if(Ops.IsStop("LoadX", "LoadY"))
{
IoManager.Instance.WriteOut("下左相机光源触发", 1);
HikCamera.Instance.SetExposure("locationCamera", 50);
HikCamera.Instance.SetGain("locationCamera", 15);
List<double> grabPos = new List<double>();
for(int i=1;i<10;i++)
{
grabPos.Add(SysConfigParam.GetValue<double>($"Nozzle{i}CenterX"));
}
AxisControl.LoadX.SetPosCompare(1, grabPos.ToArray());
HikCamera.Instance.SetTrigger("locationCamera", ETriggerMode.Auto);
step = CameraTriggerTestStep.gotoTriggerEndPos;
}
break;
case CameraTriggerTestStep.gotoTriggerEndPos:
AxisControl.LoadX.MovePos(SysConfigParam.GetValue<double>("Nozzle9CenterX")-50, GlobalVar.WholeSpeed);
step = CameraTriggerTestStep.waitGotoTriggerEndPos;
break;
case CameraTriggerTestStep.waitGotoTriggerEndPos:
if (Ops.IsStop(AxisControl.LoadX))
{
IoManager.Instance.WriteOut("下左相机光源触发", 0);
AxisControl.LoadX.ClearCompare(1);
Thread.Sleep(1000);
step = CameraTriggerTestStep.waitGrabOk;
}
break;
case CameraTriggerTestStep.waitGrabOk:
imgs = ImageProcess.GetAutoImage();
if(imgs != null && imgs.Length==9)
{
ImageProcess.ClearAutoTrigger();
List<MatchResult> result = VisionProcess.Instance.MatchDownCam(imgs);
if(result.Where(r=>r.IsOK==true).Count()==imgs.Length)
{
OnMatchResult?.Invoke(result);
step = CameraTriggerTestStep.gotoTriggerStartPos;
}
else
{
MessageQueue.Instance.Warn("拍照定位失败");
step = CameraTriggerTestStep.gotoTriggerStartPos;
}
}
break;
}
}
}
}