优化空跑流程

master
lhiven 2 years ago
parent 20b2021772
commit 37705e310b

@ -33,10 +33,10 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="halcondotnet">
<HintPath>..\Rs.MotionPlat\bin\Debug\halcondotnet.dll</HintPath>
<HintPath>..\..\..\ls\Rs.MotionSystem\Rs.MovePlat\bin\Debug\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="MvCameraControl.Net">
<HintPath>..\..\Rs.MotionPlat\Rs.MotionPlat\bin\Debug\MvCameraControl.Net.dll</HintPath>
<HintPath>F:\WorkSpace\RealSystem.Motion.SYP\Rs.Motion.UI.Winfrom\bin\Debug\MvCameraControl.Net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />

@ -33,10 +33,10 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="halcondotnet">
<HintPath>..\Rs.MotionPlat\bin\Debug\halcondotnet.dll</HintPath>
<HintPath>..\..\..\ls\Rs.MotionSystem\Rs.MovePlat\bin\Debug\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="HWindow_Tool">
<HintPath>..\Rs.MotionPlat\bin\Debug\HWindow_Tool.dll</HintPath>
<HintPath>C:\Users\Administrator\Desktop\1\bin\Debug\HWindow_Tool.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />

@ -33,7 +33,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="halcondotnet">
<HintPath>..\Rs.MotionPlat\bin\Debug\halcondotnet.dll</HintPath>
<HintPath>C:\Users\Administrator\Desktop\Rs.MotionPlat\Rs.MotionPlat\bin\Debug\halcondotnet.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.15\lib\net45\log4net.dll</HintPath>

@ -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;

@ -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
{
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<int,HObject> CameraOkEvent;
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
}
public class SpaceFlow:BaseFlow
{
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 event Action<HObject[], List<MatchResult>> CameraOkEvent;
/// <summary>
/// 当前取料穴位
/// </summary>
private ushort CurFetchSlotIndex = 1;
/// <summary>
/// 当前组装穴位
/// </summary>
private ushort CurAssembleSlotInex = 1;
/// <summary>
/// 吸嘴索引
/// </summary>
private ushort NozzleIndex = 1;
bool[] stop = new bool[30];
ESpaceFlowStep flowStep = ESpaceFlowStep.;
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();
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.;
public void CancleHome()
}
break;
case ESpaceFlowStep.:
if (NozzleIndex == 1)
{
AxisControl.VacZ1.MovePos(GetVacOffsetHeight(FetchNum) + GlobalVar.Instance.Vac1Tray1FetchHeight, GlobalVar.Instance.WholeSpeed);
}
else
{
m_bCancle = true;
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;
public void Stop()
case ESpaceFlowStep.:
if (NozzleIndex == 1)
{
AxisControl.VacZ1.MovePos(0, GlobalVar.Instance.WholeSpeed);
}
else
{
m_bStop = true;
MachineManage.Instance.MachineStatus = EMachineStatus.Stop;
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);
private SpaceFlow() { }
}
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.;
}
public void Restart()
break;
case ESpaceFlowStep.:
AxisControl.LoadX.IsStop(out stop[0]);
AxisControl.LoadY.IsStop(out stop[1]);
if (stop[0] && stop[1])
{
m_bStop = false;
MachineManage.Instance.MachineStatus = EMachineStatus.Working;
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;
private bool[] bStops=new bool[10];
public void Start()
case ESpaceFlowStep.:
if (XYCanMove())
{
HikCamera.Instance.SetTrigger(GlobalVar.Instance.UpCameraName, ETriggerMode.Manual);
Task.Run(() =>
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])
{
//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())
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<MatchResult>();
mrs.Add(new MatchResult());
mrs.Add(new MatchResult());
}
else
{
//拍照完成
flowStep = ESpaceFlowStep.;
}
}
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.LoadTray.NextSlot();
// GlobalTray.InputTray2.Fill();
// GlobalTray.OkTray2.Clear();
//}
//else
//{
// GlobalTray.LoadTray.ResetTray();
// }
// workStep = ESpaceFlowStep.到取料位上方;
// Thread.Sleep(300);
// }
// break;
// default:
// break;
// GlobalTray.InputTray2.Fill();
// GlobalTray.OkTray2.Clear();
//}
bFetchBack = !bFetchBack;
}
}
break;
default:
break;
}
//}
});
}
private double GetVacOffsetHeight(int fetchNum)
{
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 XYCanMove()
{
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)
{
return true;
}
return false;
}
}
}

@ -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,
};

@ -44,7 +44,7 @@
<HintPath>G:\ls\Rs.MotionSystem\Rs.MovePlat\bin\Debug\HWindow_Tool.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\Rs.Framework\bin\Debug\log4net.dll</HintPath>
<HintPath>C:\Users\Administrator\source\repos\AutoControlSystemUI\rs.utils\bin\Debug\log4net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>

Loading…
Cancel
Save