diff --git a/Rs.Camera/Rs.Camera.csproj b/Rs.Camera/Rs.Camera.csproj index 5c7e653..22252d7 100644 --- a/Rs.Camera/Rs.Camera.csproj +++ b/Rs.Camera/Rs.Camera.csproj @@ -33,10 +33,10 @@ - ..\Rs.MotionPlat\bin\Debug\halcondotnet.dll + ..\..\..\ls\Rs.MotionSystem\Rs.MovePlat\bin\Debug\halcondotnet.dll - ..\..\Rs.MotionPlat\Rs.MotionPlat\bin\Debug\MvCameraControl.Net.dll + F:\WorkSpace\RealSystem.Motion.SYP\Rs.Motion.UI.Winfrom\bin\Debug\MvCameraControl.Net.dll diff --git a/Rs.Controls/Rs.Controls.csproj b/Rs.Controls/Rs.Controls.csproj index 41f0963..9467f75 100644 --- a/Rs.Controls/Rs.Controls.csproj +++ b/Rs.Controls/Rs.Controls.csproj @@ -33,10 +33,10 @@ - ..\Rs.MotionPlat\bin\Debug\halcondotnet.dll + ..\..\..\ls\Rs.MotionSystem\Rs.MovePlat\bin\Debug\halcondotnet.dll - ..\Rs.MotionPlat\bin\Debug\HWindow_Tool.dll + C:\Users\Administrator\Desktop\1\bin\Debug\HWindow_Tool.dll diff --git a/Rs.Framework/Rs.Framework.csproj b/Rs.Framework/Rs.Framework.csproj index 715c6db..9489d2d 100644 --- a/Rs.Framework/Rs.Framework.csproj +++ b/Rs.Framework/Rs.Framework.csproj @@ -33,7 +33,7 @@ - ..\Rs.MotionPlat\bin\Debug\halcondotnet.dll + C:\Users\Administrator\Desktop\Rs.MotionPlat\Rs.MotionPlat\bin\Debug\halcondotnet.dll ..\packages\log4net.2.0.15\lib\net45\log4net.dll diff --git a/Rs.Motion/Ztm/ZtmCardManager.cs b/Rs.Motion/Ztm/ZtmCardManager.cs index eb7dddb..dec03c0 100644 --- a/Rs.Motion/Ztm/ZtmCardManager.cs +++ b/Rs.Motion/Ztm/ZtmCardManager.cs @@ -112,8 +112,16 @@ namespace Rs.Motion.GugaoEcat } public ICard GetCard(short cardID) { + ICard card; if(cardDic.ContainsKey((ushort)cardID)) return cardDic[(ushort)cardID]; - ICard card = new ZtmCard((ushort)cardID, (ushort)mcDic[cardID], 10, $"ztm{cardID}.xml"); + if(mcDic.ContainsKey(cardID)) + { + card = new ZtmCard((ushort)cardID, (ushort)mcDic[cardID], 10, $"ztm{cardID}.xml"); + } + else + { + card = new ZtmCard((ushort)cardID, (ushort)cardID, 10, $"ztm{cardID}.xml"); + } card.Init(); cardDic.Add((ushort)cardID, card); return card; diff --git a/Rs.MotionPlat/Flow/SpaceFlow.cs b/Rs.MotionPlat/Flow/SpaceFlow.cs index 2c720be..981bc67 100644 --- a/Rs.MotionPlat/Flow/SpaceFlow.cs +++ b/Rs.MotionPlat/Flow/SpaceFlow.cs @@ -1,10 +1,12 @@ 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.Drawing; using System.Linq; using System.Text; @@ -18,123 +20,441 @@ namespace Rs.MotionPlat.Flow public enum ESpaceFlowStep { 到取料位上方, - 拍照, - 等待拍照结果 + 等待到取料位上方, + 到取料位下方, + 等待到取料位下方, + 开真空, + 取料真空检测, + 取料完成抬起, + 等待取料完成抬起, + 到下相机拍照起始位, + 等待到下相机拍照起始位, + 到下相机拍照结束位, + 等待到下相机拍照结束位, + 等待相机拍照完成, + 等待视觉处理结果, + 到放料位上方, + 等待到放料位上方, + 到放料位下方, + 等待到放料位下方, + 放料完成抬起, + 等待放料完成抬起 } - public class SpaceFlow + public class SpaceFlow:BaseFlow { - private double fetchPointX = 215; - private double fetchPointY = 90; - private double cameraStartPointX= 174; - private double cameraStartPointY = -240; - private double cameraEndPointX = 64; - private double cameraEndPointY = -240; - private double downPointX = -106; - private double downPointY = -466; - private double zDownPos = -6; - private double zUpPos = 0; - - private ESpaceFlowStep workStep; - private static SpaceFlow instace; - private bool m_bCancle = false; - private bool m_bHomed = false; - private bool m_bStop = false; - double startPos = 2; - double endPos = 15; - private bool bIsStart = false; - - public event Action CameraOkEvent; + private static SpaceFlow instance; public static SpaceFlow Instance { get { - if (instace == null) - instace = new SpaceFlow(); - return instace; + if (instance == null) + instance = new SpaceFlow(); + return instance; } } + private bool grabOK = false; - public void CancleHome() - { - m_bCancle = true; - } + public event Action> CameraOkEvent; - public void Stop() - { - m_bStop = true; - MachineManage.Instance.MachineStatus = EMachineStatus.Stop; - } + /// + /// 当前取料穴位 + /// + private ushort CurFetchSlotIndex = 1; + /// + /// 当前组装穴位 + /// + private ushort CurAssembleSlotInex = 1; + /// + /// 吸嘴索引 + /// + private ushort NozzleIndex = 1; + + bool[] stop = new bool[30]; + + ESpaceFlowStep flowStep = ESpaceFlowStep.到取料位上方; + HObject[] imgs = new HObject[2]; + List mrs = new List(); + int FetchNum = 0;//取料次数 + bool bFetchBack = false; + double targetX = 0.0; + double targetY = 0.0; + TraySlot tray = new TraySlot(); private SpaceFlow() { } + public override void Run() + { + switch (flowStep) + { + case ESpaceFlowStep.到取料位上方: + if (XYCanMove()) + { + if (bFetchBack == false) + { + tray = GlobalTray.InputTray2.GetSlot(CurFetchSlotIndex); + } + else + { + tray = GlobalTray.OkTray2.GetSlot(CurFetchSlotIndex); + } + if (NozzleIndex == 1) + { + targetX = tray.Position.X + (GlobalVar.Instance.Nozzle1Center2CameraCenterDistX * -1); + targetY = tray.Position.Y - GlobalVar.Instance.Nozzle1Center2CameraCenterDistY; + AxisControl.LoadX.MovePos(targetX, GlobalVar.Instance.WholeSpeed); + AxisControl.LoadY.MovePos(targetY, (int)(GlobalVar.Instance.WholeSpeed)); + AxisControl.VacR1.MovePos(0, GlobalVar.Instance.WholeSpeed); + } + else if (NozzleIndex == 2) + { + targetX = tray.Position.X + (GlobalVar.Instance.Nozzle1Center2CameraCenterDistX * -1) + GlobalVar.Instance.Nozzle2Center2Nozzle1CenterDistX; + targetY = tray.Position.Y - GlobalVar.Instance.Nozzle1Center2CameraCenterDistY + GlobalVar.Instance.Nozzle2Center2Nozzle1CenterDistY; + AxisControl.LoadX.MovePos(targetX, GlobalVar.Instance.WholeSpeed); + AxisControl.LoadY.MovePos(targetY, 1); + AxisControl.VacR2.MovePos(0, GlobalVar.Instance.WholeSpeed); + } + flowStep = ESpaceFlowStep.等待到取料位上方; + } + break; + case ESpaceFlowStep.等待到取料位上方: + AxisControl.LoadX.IsStop(out stop[0]); + AxisControl.LoadY.IsStop(out stop[1]); + AxisControl.VacR1.IsStop(out stop[2]); + AxisControl.VacR2.IsStop(out stop[3]); + if (stop[0] && stop[1] && stop[2] && stop[3]) + { + Thread.Sleep(100); + flowStep = ESpaceFlowStep.到取料位下方; + + } + break; + case ESpaceFlowStep.到取料位下方: + if (NozzleIndex == 1) + { + AxisControl.VacZ1.MovePos(GetVacOffsetHeight(FetchNum) + GlobalVar.Instance.Vac1Tray1FetchHeight, GlobalVar.Instance.WholeSpeed); + } + else + { + AxisControl.VacZ2.MovePos(GetVacOffsetHeight(FetchNum) + GlobalVar.Instance.Vac2Tray1FetchHeight, GlobalVar.Instance.WholeSpeed); + } + flowStep = ESpaceFlowStep.等待到取料位下方; + break; + case ESpaceFlowStep.等待到取料位下方: + AxisControl.VacZ1.IsStop(out stop[0]); + AxisControl.VacZ2.IsStop(out stop[1]); + if (stop[0] && stop[1]) + { + flowStep = ESpaceFlowStep.开真空; + } + break; + case ESpaceFlowStep.开真空: + IoManager.Instance.WriteOut($"吸嘴{NozzleIndex}真空吸", 1); + Thread.Sleep(60); + flowStep = ESpaceFlowStep.取料完成抬起; + break; + + case ESpaceFlowStep.取料完成抬起: + if (NozzleIndex == 1) + { + AxisControl.VacZ1.MovePos(0, GlobalVar.Instance.WholeSpeed); + } + else + { + AxisControl.VacZ2.MovePos(0, GlobalVar.Instance.WholeSpeed); + } + flowStep = ESpaceFlowStep.等待取料完成抬起; + break; + case ESpaceFlowStep.等待取料完成抬起: + AxisControl.VacZ1.IsStop(out stop[0]); + AxisControl.VacZ2.IsStop(out stop[1]); + if (stop[0] && stop[1]) + { + flowStep = ESpaceFlowStep.取料真空检测; + //Thread.Sleep(100); + + } + break; + case ESpaceFlowStep.取料真空检测: + if (IoManager.Instance.ReadIn($"吸嘴{NozzleIndex}真空信号") == 1 || GlobalVar.Instance.RunSpace) + { + FetchNum = 0; + if (bFetchBack == false) + { + GlobalTray.InputTray2.ChangeStatus(CurFetchSlotIndex, ESlotStatus.NotHave); + } + else + { + GlobalTray.OkTray2.ChangeStatus(CurFetchSlotIndex, ESlotStatus.NotHave); + } + if (NozzleIndex == 1) + { + NozzleIndex++; + flowStep = ESpaceFlowStep.到取料位上方; + } + else if (NozzleIndex == 2) + { + NozzleIndex = 1; + flowStep = ESpaceFlowStep.到下相机拍照起始位; + } + CurFetchSlotIndex++; + } + else + { + FetchNum++; + if (FetchNum == 6) + { + Msg.ShowError($"吸嘴{NozzleIndex}取料{FetchNum}次失败报警,请处理后点击确定"); + FetchNum = 0; + } + flowStep = ESpaceFlowStep.到取料位下方; + } + break; + case ESpaceFlowStep.到下相机拍照起始位: + if (XYCanMove()) + { + ImageProcess.ClearAutoTrigger(); + HikCamera.Instance.SetExposure("downCamera", 40); + HikCamera.Instance.SetGain("downCamera", 20); + AxisControl.LoadX.MovePos(GlobalVar.Instance.Nozzle1CameraPosX - 10, GlobalVar.Instance.WholeSpeed); + AxisControl.LoadY.MovePos(GlobalVar.Instance.Nozzle1CameraPosY, GlobalVar.Instance.WholeSpeed); + flowStep = ESpaceFlowStep.等待到下相机拍照起始位; + } + + break; + case ESpaceFlowStep.等待到下相机拍照起始位: + AxisControl.LoadX.IsStop(out stop[0]); + AxisControl.LoadY.IsStop(out stop[1]); + if (stop[0] && stop[1]) + { + flowStep = ESpaceFlowStep.到下相机拍照结束位; + Thread.Sleep(100); + HikCamera.Instance.SetTrigger(GlobalVar.Instance.DownCameraName, ETriggerMode.Auto); + AxisControl.LoadX.SetPosCompare(1, new double[] { GlobalVar.Instance.Nozzle1CameraPosX, GlobalVar.Instance.Nozzle2CameraPosX }); + } + break; + + case ESpaceFlowStep.到下相机拍照结束位: + if (XYCanMove()) + { + IoManager.Instance.WriteOut("下相机光源", 1); + Thread.Sleep(50); + AxisControl.LoadX.MovePos(GlobalVar.Instance.Nozzle2CameraPosX + 10, GlobalVar.Instance.FlyCameraSpeed); + flowStep = ESpaceFlowStep.等待到下相机拍照结束位; + } + + break; + case ESpaceFlowStep.等待到下相机拍照结束位: + AxisControl.LoadX.IsStop(out stop[0]); + Stopwatch stopwatch = new Stopwatch(); + + if (stop[0]) + { + AxisControl.LoadX.ClearCompare(1); + IoManager.Instance.WriteOut("下相机光源", 0); + flowStep = ESpaceFlowStep.等待相机拍照完成; + stopwatch.Start(); + } + break; + case ESpaceFlowStep.等待相机拍照完成: + imgs = ImageProcess.GetAutoImage(); + if (imgs != null && imgs.Length == 2) + { + CameraOkEvent?.Invoke(imgs, null); + if (GlobalVar.Instance.RunSpace) + { + flowStep = ESpaceFlowStep.到放料位上方; + mrs = new List(); + mrs.Add(new MatchResult()); + mrs.Add(new MatchResult()); + } + else + { + //拍照完成 + flowStep = ESpaceFlowStep.等待视觉处理结果; + } - public void Restart() + } + break; + case ESpaceFlowStep.等待视觉处理结果: + mrs = VisionProcess.Instance.MatchDownCam(imgs); + if (mrs != null && mrs.Count == 2) + { + CameraOkEvent?.Invoke(imgs, mrs); + flowStep = ESpaceFlowStep.到放料位上方; + //Thread.Sleep(2000); + } + else + { + flowStep = ESpaceFlowStep.到下相机拍照起始位; + } + break; + case ESpaceFlowStep.到放料位上方: + if (XYCanMove()) + { + targetX = 0.0; + targetY = 0.0; + if (bFetchBack) + { + tray = GlobalTray.InputTray2.GetSlot(CurAssembleSlotInex); + } + else + { + tray = GlobalTray.OkTray2.GetSlot(CurAssembleSlotInex); + } + + if (NozzleIndex == 1) + { + targetX = (mrs[0].OffsetCol) + tray.Position.X + (GlobalVar.Instance.Nozzle1Center2CameraCenterDistX * -1); + targetY = (mrs[0].OffsetRow * -1) + tray.Position.Y - GlobalVar.Instance.Nozzle1Center2CameraCenterDistY; + + AxisControl.LoadX.MovePos(targetX, GlobalVar.Instance.WholeSpeed); + AxisControl.LoadY.MovePos(targetY, GlobalVar.Instance.WholeSpeed); + AxisControl.VacR1.MoveOffset(AngleTool.Rad2Deg((mrs[0].Angle)), GlobalVar.Instance.WholeSpeed); + } + else if (NozzleIndex == 2) + { + targetX = (mrs[1].OffsetCol) + tray.Position.X + (GlobalVar.Instance.Nozzle1Center2CameraCenterDistX * -1) + GlobalVar.Instance.Nozzle2Center2Nozzle1CenterDistX; + targetY = (mrs[1].OffsetRow * -1) + tray.Position.Y - GlobalVar.Instance.Nozzle1Center2CameraCenterDistY + GlobalVar.Instance.Nozzle2Center2Nozzle1CenterDistY; + AxisControl.LoadX.MovePos(targetX, GlobalVar.Instance.WholeSpeed); + AxisControl.LoadY.MovePos(targetY, 1); + AxisControl.VacR2.MoveOffset(AngleTool.Rad2Deg(mrs[1].Angle), GlobalVar.Instance.WholeSpeed); + } + + flowStep = ESpaceFlowStep.等待到放料位上方; + } + + break; + case ESpaceFlowStep.等待到放料位上方: + AxisControl.LoadX.IsStop(out stop[0]); + AxisControl.LoadY.IsStop(out stop[1]); + AxisControl.VacR1.IsStop(out stop[2]); + AxisControl.VacR2.IsStop(out stop[3]); + if (stop[0] && stop[1] && stop[2] && stop[3]) + { + Thread.Sleep(100); + flowStep = ESpaceFlowStep.到放料位下方; + + } + break; + case ESpaceFlowStep.到放料位下方: + if (NozzleIndex == 1) + { + AxisControl.VacZ1.MovePos(GlobalVar.Instance.Vac1Tray1FetchHeight + 1, GlobalVar.Instance.WholeSpeed); + } + else + { + AxisControl.VacZ2.MovePos(GlobalVar.Instance.Vac2Tray1FetchHeight + 1, GlobalVar.Instance.WholeSpeed); + } + flowStep = ESpaceFlowStep.等待到放料位下方; + break; + case ESpaceFlowStep.等待到放料位下方: + AxisControl.VacZ1.IsStop(out stop[0]); + AxisControl.VacZ2.IsStop(out stop[1]); + if (stop[0] && stop[1]) + { + IoManager.Instance.WriteOut($"吸嘴{NozzleIndex}真空吸", 0); + Thread.Sleep(50); + IoManager.Instance.WriteOut($"吸嘴{NozzleIndex}真空破", 1); + Thread.Sleep(100); + IoManager.Instance.WriteOut($"吸嘴{NozzleIndex}真空破", 0); + flowStep = ESpaceFlowStep.放料完成抬起; + } + break; + case ESpaceFlowStep.放料完成抬起: + if (NozzleIndex == 1) + { + AxisControl.VacZ1.MovePos(0, GlobalVar.Instance.WholeSpeed); + } + else + { + AxisControl.VacZ2.MovePos(0, GlobalVar.Instance.WholeSpeed); + } + flowStep = ESpaceFlowStep.等待放料完成抬起; + break; + case ESpaceFlowStep.等待放料完成抬起: + AxisControl.VacZ1.IsStop(out stop[0]); + AxisControl.VacZ2.IsStop(out stop[1]); + if (stop[0] && stop[1]) + { + Thread.Sleep(100); + if (bFetchBack) + { + GlobalTray.InputTray2.ChangeStatus(CurAssembleSlotInex, ESlotStatus.Have); + } + else + { + GlobalTray.OkTray2.ChangeStatus(CurAssembleSlotInex, ESlotStatus.Have); + } + if (NozzleIndex == 1) + { + NozzleIndex++; + flowStep = ESpaceFlowStep.到放料位上方; + } + else if (NozzleIndex == 2) + { + NozzleIndex = 1; + flowStep = ESpaceFlowStep.到取料位上方; + } + CurAssembleSlotInex++; + if (CurAssembleSlotInex == 261) + { + CurAssembleSlotInex = 1; + CurFetchSlotIndex = 1; + //if(bFetchBack) + //{ + // GlobalTray.InputTray2.Fill(); + // GlobalTray.OkTray2.Clear(); + //} + //else + //{ + // GlobalTray.InputTray2.Fill(); + // GlobalTray.OkTray2.Clear(); + //} + bFetchBack = !bFetchBack; + } + } + break; + default: + break; + } + + + + } + + private double GetVacOffsetHeight(int fetchNum) { - m_bStop = false; - MachineManage.Instance.MachineStatus = EMachineStatus.Working; + switch (fetchNum) + { + case 0: + return 0; + case 1: + return -0.1; + case 2: + return -0.2; + case 3: + return -0.3; + case 4: + return 0.1; + case 5: + return 0.2; + case 6: + return 0.3; + default: + return 0; + } } - private bool[] bStops=new bool[10]; - public void Start() + private bool XYCanMove() { - HikCamera.Instance.SetTrigger(GlobalVar.Instance.UpCameraName, ETriggerMode.Manual); - Task.Run(() => + AxisControl.VacZ1.GetOrgStatus(out bool bOrgZ1); + AxisControl.VacZ2.GetOrgStatus(out bool bOrgZ2); + if (AxisControl.LoadX.HomeStatus == EHomeStatus.Finished + && AxisControl.LoadY.HomeStatus == EHomeStatus.Finished + && bOrgZ1 && bOrgZ2) { - //while (true) - //{ - // if (m_bStop && !m_bCancle) - // { - // Thread.Sleep(100); - // continue; - // } - // switch (workStep) - // { - // case ESpaceFlowStep.到取料位上方: - // PointF goPoint = GlobalTray.LoadTray.GetCurrentSlot().Position; - // AxisControl.LoadX.MovePos(goPoint.X, GlobalVar.Instance.WholeSpeed); - // AxisControl.LoadY.MovePos(goPoint.Y, GlobalVar.Instance.WholeSpeed); - // while(true) - // { - // AxisControl.LoadX.IsStop(out bStops[0]); - // AxisControl.LoadY.IsStop(out bStops[1]); - // if (bStops[0] && bStops[1]) - // { - // MessageQueue.Instance.Insert($"go to slot {GlobalTray.LoadTray.GetCurrentSlot().Index}"); - // break; - // } - // } - // workStep = ESpaceFlowStep.拍照; - // break; - // case ESpaceFlowStep.拍照: - // Thread.Sleep(50); - // ImageProcess.ClearManualTrigger(); - // IoManager.Instance.WriteOut("上相机光源", 1); - // Thread.Sleep(50); - // HikCamera.Instance.Grab(GlobalVar.Instance.UpCameraName); - // workStep = ESpaceFlowStep.等待拍照结果; - // break; - // case ESpaceFlowStep.等待拍照结果: - // if(ImageProcess.manualTriggerEvent.WaitOne(3000)) - // { - // CameraOkEvent?.Invoke(GlobalTray.LoadTray.GetCurrentSlot().Index, ImageProcess.GetManualImage()); - // IoManager.Instance.WriteOut("上相机光源", 0); - // if (!GlobalTray.LoadTray.IsLastSlot()) - // { - // GlobalTray.LoadTray.NextSlot(); - // } - // else - // { - // GlobalTray.LoadTray.ResetTray(); - // } - // workStep = ESpaceFlowStep.到取料位上方; - // Thread.Sleep(300); - // } - // break; - // default: - // break; - // } - - //} - }); + return true; + } + return false; } } } diff --git a/Rs.MotionPlat/FormMain.cs b/Rs.MotionPlat/FormMain.cs index e3a4b96..46aae37 100644 --- a/Rs.MotionPlat/FormMain.cs +++ b/Rs.MotionPlat/FormMain.cs @@ -43,9 +43,9 @@ namespace Rs.MotionPlat modelID = new HTuple(); HOperatorSet.ReadShapeModel("Model/model.shm", out modelID); inputTray1.Fill(); - SpaceFlow.Instance.CameraOkEvent += Instance_CameraOkEvent; LoadModel(); WorkFlow.Instance.CameraOkEvent += Instance_CameraOkEvent1; + SpaceFlow.Instance.CameraOkEvent += Instance_CameraOkEvent1; RsTray turnoverTray = new RsTray() { OffsetX = -40, OffsetY = 18, OffsetYEven = 42, SinglePoint = true, RowNum = 4, ColumnNum = 8, }; diff --git a/Rs.MotionPlat/Rs.MotionPlat.csproj b/Rs.MotionPlat/Rs.MotionPlat.csproj index 2bf8588..688e770 100644 --- a/Rs.MotionPlat/Rs.MotionPlat.csproj +++ b/Rs.MotionPlat/Rs.MotionPlat.csproj @@ -44,7 +44,7 @@ G:\ls\Rs.MotionSystem\Rs.MovePlat\bin\Debug\HWindow_Tool.dll - ..\Rs.Framework\bin\Debug\log4net.dll + C:\Users\Administrator\source\repos\AutoControlSystemUI\rs.utils\bin\Debug\log4net.dll False