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> 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("Nozzle1CenterX") + 50, GlobalVar.WholeSpeed); AxisControl.LoadY.MovePos(SysConfigParam.GetValue("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 grabPos = new List(); for(int i=1;i<10;i++) { grabPos.Add(SysConfigParam.GetValue($"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("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 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; } } } }