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.

474 lines
19 KiB
C#

using ChoiceTech.Halcon.Control;
using HalconDotNet;
using Rs.Camera;
using Rs.Controls;
using Rs.DataAccess;
using Rs.Framework;
using Rs.Motion.Base;
using Rs.MotionPlat.Commom;
using Rs.MotionPlat.Flow;
using Rs.MotionPlat.Flow.Space;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Rs.MotionPlat
{
public partial class FormMain : BaseForm
{
IAxis axis = null;
HWindow winHandle = null;
HObject hImage = null;
HObject hmodelImage = null;
HTuple h1;
HTuple modelID;
HObject final_Region = new HObject();
BindingList<MessageItem> runInfoList = new BindingList<MessageItem>();
BindingList<MessageItem> errorInfoList = new BindingList<MessageItem>();
public FormMain()
{
InitializeComponent();
//CameraTriggerTest.Instance.OnMatchResult += Instance_OnMatchResult;
//this.tabControlEx1.TabPages.RemoveAt(1);
//HikCamera.Instance.AutoGrabOkEvent += Instance_GrabOkEvent;
}
private void Instance_OnMatchResult(List<MatchResult> obj)
{
int i = 1;
foreach (MatchResult matchResult in obj)
{
HWindow_Final hwin = null;
if (i == 9) return;
switch (i)
{
case 1: hwin = himgNozzle1; break;
case 2: hwin = himgNozzle2; break;
case 3: hwin = himgNozzle3; break;
case 4: hwin = himgNozzle4; break;
case 5: hwin = himgNozzle5; break;
case 6: hwin = himgNozzle6; break;
case 7: hwin = himgNozzle7; break;
case 8: hwin = himgNozzle8; break;
default:
break;
}
if (hwin != null)
{
hwin.HobjectToHimage(matchResult.Himage);
if(matchResult.IsOK)
{
hwin.DispObj(matchResult.ContourXld, "green");
HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, matchResult.SN,20,20,"green");
HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"x:{matchResult.OffsetRow}", 200, 20, "green");
HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"y:{matchResult.OffsetCol}", 400, 20, "green");
HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, $"r:{matchResult.OffsetA}", 600, 20, "green");
}
else
{
HalconTool.DispMessage(hwin.hWindowControl.HalconWindow, "NG", 20, 20, "red");
}
i++;
}
}
}
static int num = 0;
private void Instance_CameraOkEvent1(HObject[] obj,List<MatchResult> mrs)
{
if (obj[0]!=null)
{
hwin_vac1.HobjectToHimage(obj[0]);
if (mrs!=null && mrs[0] != null)
{
MessageQueue.Instance.Insert($"cam1 R:{mrs[0].Row.ToString("0.000")},C:{mrs[0].Col.ToString("0.000")},A:{mrs[0].Angle.ToString("0.000")},S:{mrs[0].Score.ToString("0.000")}");
hwin_vac1.DispObj(mrs[0].ContourXld, "green");
}
}
if (obj[1]!=null)
{
hwin_vac2.HobjectToHimage(obj[1]);
if (mrs != null && mrs[1]!=null)
{
MessageQueue.Instance.Insert($"cam2 R:{mrs[1].Row.ToString("0.000")},C:{mrs[1].Col.ToString("0.000")},A:{mrs[1].Angle.ToString("0.000")},S:{mrs[1].Score.ToString("0.000")}");
hwin_vac2.DispObj(mrs[1].ContourXld, "green");
}
}
//if (obj[2] != null)
//{
// hwin_vac3.HobjectToHimage(obj[2]);
// if (mrs != null && mrs[2] != null)
// {
// MessageQueue.Instance.Insert($"cam3 R:{mrs[2].Row.ToString("0.000")},C:{mrs[2].Col.ToString("0.000")},A:{mrs[2].Angle.ToString("0.000")},S:{mrs[2].Score.ToString("0.000")}");
// hwin_vac3.DispObj(mrs[2].ContourXld, "green");
// }
//}
//if (obj[3] != null)
//{
// hwin_vac4.HobjectToHimage(obj[3]);
// if (mrs != null && mrs[3] != null)
// {
// MessageQueue.Instance.Insert($"cam4 R:{mrs[3].Row.ToString("0.000")},C:{mrs[3].Col.ToString("0.000")},A:{mrs[3].Angle.ToString("0.000")},S:{mrs[3].Score.ToString("0.000")}");
// hwin_vac4.DispObj(mrs[3].ContourXld, "green");
// }
//}
//if (obj[4] != null)
//{
// hwin_vac5.HobjectToHimage(obj[4]);
// if (mrs != null && mrs[4] != null)
// {
// MessageQueue.Instance.Insert($"cam5 R:{mrs[4].Row.ToString("0.000")},C:{mrs[4].Col.ToString("0.000")},A:{mrs[4].Angle.ToString("0.000")},S:{mrs[4].Score.ToString("0.000")}");
// hwin_vac5.DispObj(mrs[1].ContourXld, "green");
// }
//}
//if (obj[5] != null)
//{
// hwin_vac6.HobjectToHimage(obj[5]);
// if (mrs != null && mrs[5] != null)
// {
// MessageQueue.Instance.Insert($"cam6 R:{mrs[5].Row.ToString("0.000")},C:{mrs[5].Col.ToString("0.000")},A:{mrs[5].Angle.ToString("0.000")},S:{mrs[5].Score.ToString("0.000")}");
// hwin_vac6.DispObj(mrs[5].ContourXld, "green");
// }
//}
//if (obj[6] != null)
//{
// hwin_vac7.HobjectToHimage(obj[6]);
// if (mrs != null && mrs[6] != null)
// {
// MessageQueue.Instance.Insert($"cam7 R:{mrs[6].Row.ToString("0.000")},C:{mrs[6].Col.ToString("0.000")} ,A: {mrs[6].Angle.ToString("0.000")} ,S: {mrs[6].Score.ToString("0.000")}");
// hwin_vac7.DispObj(mrs[6].ContourXld, "green");
// }
//}
//if (obj[7] != null)
//{
// hwin_vac8.HobjectToHimage(obj[7]);
// if (mrs != null && mrs[7] != null)
// {
// MessageQueue.Instance.Insert($"cam8 R:{mrs[7].Row.ToString("0.000")},C:{mrs[7].Col.ToString("0.000")} ,A: {mrs[7].Angle.ToString("0.000")} ,S: {mrs[7].Score.ToString("0.000")}");
// hwin_vac8.DispObj(mrs[7].ContourXld, "green");
// }
//}
}
ProductModel pm;
private void LoadModel()
{
string dirPath = Path.Combine("Recipe",GlobalVar.CurRecipe, "料盘1");
pm = new ProductModel();
HOperatorSet.ReadRegion(out HObject region, Path.Combine(dirPath, "search.reg"));
pm.SearchRegion = region;
}
Stopwatch time = new Stopwatch();
private void Instance_CameraOkEvent(int index,HObject obj)
{
time.Restart();
hwin_vac1.HobjectToHimage(obj);
string m_savePath = Path.Combine(GlobalVar.CurRecipe, "料盘1");
string filePath = Path.Combine(m_savePath, "model.shm");
HOperatorSet.ReadShapeModel(filePath, out HTuple modelID);
HOperatorSet.ReadRegion(out HObject searchRegion, Path.Combine(m_savePath + "\\search.reg"));
if (searchRegion.IsInitialized())
{
hImage = obj;
pm.SearchRegion = searchRegion;
HOperatorSet.ReduceDomain(obj, pm.SearchRegion, out HObject searchImg);
HOperatorSet.GetShapeModelContours(out HObject modelContours, modelID, 1);
HOperatorSet.FindShapeModel(searchImg, modelID, AngleTool.Deg2Rad(-10), AngleTool.Deg2Rad(20), new HTuple(0.3), 1, 0.5, "least_squares", 0, 0.9, out HTuple row, out HTuple column, out HTuple angle, out HTuple score);
if (score != null && score.Length > 0)
{
int len = score.Length;
for (int i = 0; i < len; i++)
{
HOperatorSet.VectorAngleToRigid(0, 0, 0, row[i].D, column[i].D, angle[i].D, out HTuple homMat2D);
HOperatorSet.AffineTransContourXld(modelContours, out HObject contoursAffineTrans, homMat2D);
hwin_vac1.DispObj(contoursAffineTrans, "green");
//matchResultRow = row.DArr[i];
//matchResultColumn = column.DArr[i];
//matchResultAngle = angle.DArr[i];
//matchResultScore = score.DArr[i];
HOperatorSet.GenCrossContourXld(out HObject cross, row.DArr[i], column.DArr[i], 100, 0);
hwin_vac1.DispObj(cross, "red");
File.AppendAllText("d:\\test.csv",$"{index},{row.DArr[i]},{column.DArr[i]}\r\n");
}
}
HOperatorSet.GetImageSize(obj, out HTuple imgWidth, out HTuple imgHeight);
HOperatorSet.GenCrossContourXld(out HObject camCenter, imgHeight / 2, imgWidth / 2, Math.Max(imgHeight, imgWidth), 0);
hwin_vac1.DispObj(camCenter, "green");
time.Stop();
MessageQueue.Instance.Insert($"image process time:{time.ElapsedMilliseconds}");
}
}
bool cameraFinished = false;
int testNum = 0;
int speed = 50;
static int i = 0;
private void Instance_GrabOkEvent(int arg1, HalconDotNet.HObject arg2)
{
lock(this)
{
hwin_vac1.HobjectToHimage(arg2);
HOperatorSet.WriteImage(arg2, "bmp", 0, "d://temp//" + (i++).ToString());
}
//hImage = arg2;
//HOperatorSet.FindShapeModel(hImage, modelID, -0.39, 0.79, 0.5, 1, 0.5, "least_squares", 0, 0.9, out HTuple row, out HTuple column, out HTuple angle, out HTuple score);
//if (score.Length>0)
//{
// Invoke(new Action(() => {
// textBox1.Text = score.DArr[0].ToString("0.000");
// textBox2.Text = row.DArr[0].ToString("0.000");
// textBox3.Text = column.DArr[0].ToString("0.000");
// string msg = $"{testNum},{speed},{textBox2.Text},{textBox3.Text},{textBox1.Text}\r\n";
// File.AppendAllText("log.txt", msg);
// MessageQueue.Instance.Insert(msg);
// }));
//}
//else
//{
// string msg = $"{testNum},{speed},丢步\r\n";
// File.AppendAllText("log.txt", msg);
// MessageQueue.Instance.Warn("未找到");
//}
//cameraFinished = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
//获取运行信息
while (MessageQueue.Instance.HaveMessage())
{
MessageItem runInfo = MessageQueue.Instance.GetMessage();
if (runInfo != null)
{
while (dgv_runinfo.Rows.Count > 500)
{
dgv_runinfo.Rows.RemoveAt(dgv_runinfo.Rows.Count - 1);
}
dgv_runinfo.Rows.Insert(0, runInfo.Time, runInfo.Content);
}
MessageItem errorInfo = MessageQueue.Instance.GetWarn();
if (errorInfo != null)
{
while (dgv_errinfo.Rows.Count > 500)
{
dgv_errinfo.Rows.RemoveAt(dgv_errinfo.Rows.Count - 1);
}
dgv_errinfo.Rows.Insert(0, errorInfo.Time, errorInfo.Content);
}
}
if(MachineManage.Instance.MachineStatus== EMachineStatus.Working)
{
if (btnWholeHome.Visible == true)
btnWholeHome.Visible = false;
}
else
{
if (btnWholeHome.Visible == false)
btnWholeHome.Visible = true;
}
}
private void FormMain_Load(object sender, EventArgs e)
{
SqliteHelper db = new SqliteHelper();
string querySql = "select * from NormalTray";
DataTable dt=db.GetDataTable(querySql);
if(dt!=null&&dt.Rows.Count>0)
{
DataRow dr = dt.AsEnumerable().Where(r => r.Field<string>("TrayName") == "Empty1").First();
if(dr!=null)
{
trayEmpty1.ColumnNum = int.Parse(dr["ColumnNum"].ToString());
trayEmpty1.RowNum = int.Parse(dr["RowNum"].ToString());
}
dr = dt.AsEnumerable().Where(r => r.Field<string>("TrayName") == "Input").First();
if (dr != null)
{
trayInput.ColumnNum = int.Parse(dr["ColumnNum"].ToString());
trayInput.RowNum = int.Parse(dr["RowNum"].ToString());
}
dr = dt.AsEnumerable().Where(r => r.Field<string>("TrayName") == "OK").First();
if (dr != null)
{
trayOk.ColumnNum = int.Parse(dr["ColumnNum"].ToString());
trayOk.RowNum = int.Parse(dr["RowNum"].ToString());
}
dr = dt.AsEnumerable().Where(r => r.Field<string>("TrayName") == "NG").First();
if (dr != null)
{
trayNg.ColumnNum = int.Parse(dr["ColumnNum"].ToString());
trayNg.RowNum = int.Parse(dr["RowNum"].ToString());
}
dr = dt.AsEnumerable().Where(r => r.Field<string>("TrayName") == "Multi").First();
if (dr != null)
{
trayMulti.ColumnNum = int.Parse(dr["ColumnNum"].ToString());
trayMulti.RowNum = int.Parse(dr["RowNum"].ToString());
}
dr = dt.AsEnumerable().Where(r => r.Field<string>("TrayName") == "Empty2").First();
if (dr != null)
{
trayEmpty2.ColumnNum = int.Parse(dr["ColumnNum"].ToString());
trayEmpty2.RowNum = int.Parse(dr["RowNum"].ToString());
}
}
winHandle = hwin_vac1.hWindowControl.HalconWindow;
h1 = hwin_vac1.HWindowHalconID;
HOperatorSet.GenEmptyObj(out final_Region);
HOperatorSet.GenEmptyObj(out hmodelImage);
modelID = new HTuple();
HOperatorSet.ReadShapeModel("Model/model.shm", out modelID);
LoadModel();
WorkFlow.Instance.OnMatchResult += Instance_OnMatchResult;
SpaceFlow.Instance.CameraOkEvent += Instance_CameraOkEvent1;
RsTray turnoverTray = new RsTray()
{
OffsetX = -40,
OffsetY = 18,
OffsetYEven = 42,
SinglePoint = true,
RowNum = 4,
ColumnNum = 8,
};
turnoverTray.ItemName = "中转盘";
turnoverTray.Init();
GlobalTray.TurnoverTray = turnoverTray;
//dgv_runinfo.DataSource = runInfoList;
//dgv_errinfo.DataSource = errorInfoList;
timer1.Interval = 500;
timer1.Enabled = true;
HObject img = new HObject();
//HOperatorSet.CloseWindow(hWindow_Final1.HWindowHalconID);
//HOperatorSet.OpenWindow(0, 0, hWindow_Final1.Width, hWindow_Final1.Height, winHandle,"visible", "", out h1);
//HOperatorSet.openwi
string filepath = @"C:\Users\Administrator\MVS\Data\22.bmp";
if(File.Exists(filepath))
{
HOperatorSet.ReadImage(out HObject image, filepath);
hwin_vac1.HobjectToHimage(image);
//hSmartWindowControl1.HalconWindow.SetDraw("margin");
}
trayEmpty1.ItemName = "料盘1";
trayEmpty1.Init();
trayInput.ItemName = "Input";
trayInput.Init();
trayOk.ItemName = "料盘3";
trayOk.Init();
trayNg.ItemName = "料盘4";
trayNg.Init();
//okTray1.ItemName = "料盘5";
//okTray1.Init();
//okTray2.ItemName = "料盘6";
//okTray2.Init();
//okTray3.ItemName = "料盘7";
//okTray3.Init();
//ngTray.ItemName = "料盘8";
//ngTray.Init();
GlobalTray.Empty1Tray = trayEmpty1;
GlobalTray.InputTray = trayInput;
GlobalTray.OkTary= trayOk;
GlobalTray.NgTray= trayNg;
GlobalTray.MultiTray = trayMulti;
GlobalTray.Empty2Tray = trayEmpty2;
GlobalTray.TurnoverTray = trayTurnover;
tabControlEx1.TabPages.RemoveAt(1);
}
private void btnWholeHome_Load(object sender, EventArgs e)
{
if (MachineManage.Instance.MachineStatus == EMachineStatus.Homed
|| MachineManage.Instance.MachineStatus == EMachineStatus.NotInit
|| MachineManage.Instance.MachineStatus == EMachineStatus.NotHomed
)
{
HomeFlow.Instance.StartGoHome();
}
else
{
MessageQueue.Instance.Warn($"device state {MachineManage.Instance.MachineStatus} cann't home!");
}
}
private void btnSpaceRun_BtnClick(object sender, EventArgs e)
{
//SpaceTest.Instance.Start();
if (MachineManage.Instance.MachineStatus== EMachineStatus.Homed || MachineManage.Instance.MachineStatus == EMachineStatus.Stop)
{
MachineManage.Instance.RunStatus = Commom.ERunStatus.Started;
MachineManage.Instance.RunState = ERunState.Waiting;
WorkFlow.Instance.Start();
TurnoverFlow.Instance.Start();
TakeTrayFlow.Instance.Start();
//TakeTrayFlow.Instance.Start();
//StockManager.Instance.Start();
//WorkEnvironment.Instance.Ready();
//TakeDumpTest.Instance.Start();
}
}
private void btnStop_BtnClick(object sender, EventArgs e)
{
WorkFlow.Instance.Stop();
TurnoverFlow.Instance.Stop();
TakeTrayFlow.Instance.Stop();
//TakeDumpTest.Instance.Stop();
//LoadAndUnloadTest.Instance.Stop();
//TakeTrayTest.Instance.Stop();
//TurnoverFlow.Instance.Stop();
//TakeTrayFlow.Instance.Stop();
////ZRTest.Instance.Stop();
////CameraTriggerTest.Instance.Stop();
////SpaceTest.Instance.Stop();
//WorkFlow.Instance.Stop();
MachineManage.Instance.MachineStatus = EMachineStatus.Stop;
}
}
}