private void btn_focusMove2_Click(object sender, EventArgs e) { PTPPrm[] movePrm = new PTPPrm[1]; PTPPrm prm; prm.iCoorAxis = 2; prm.dPos = m_prm.FocusPos_z_2; movePrm[0] = prm; moWin.Motion_PToPMove_unblock(movePrm); }
//记录、应用、移动 //记录:从运动模块读取坐标,并显示在屏幕,但是不会应用 //应用:将textBox中的数据应用到控制参数 //移动:移动到控制参数中的位置,注意不一定是TextBox中的数值 //移动到记录位置公用函数 //num:1-10时为用户自定义,21,22,23分别为上料,拍照,下料位置 //type=0时为阻塞式,type=1时为非阻塞式,默认为0 private void goto_recordPos(int num, int type) { if (num > 23 || (num > 9 && num < 21) || num < 0) { statusLabel_1.Text = "索引错误"; return; } double x, y; switch (num) { case 21: x = m_prm.startPos_x; y = m_prm.startPos_y; break; case 22: x = m_prm.PhotoPos_x; y = m_prm.PhotoPos_y; break; case 23: x = m_prm.endPos_x; y = m_prm.endPos_y; break; default: x = m_prm.pos_x[num]; y = m_prm.pos_y[num]; break; } PTPPrm[] movePrm = new PTPPrm[2]; movePrm[0].iCoorAxis = 0; movePrm[0].dPos = x; movePrm[1].iCoorAxis = 1; movePrm[1].dPos = y; switch (type) { case 0: moWin.m_motion.Motion_PToPMove(movePrm); break; case 1: moWin.Motion_PToPMove_unblock(movePrm); break; } }
//视觉处理3,其中包含了激光修复流程 //对于是否需要根据运行成功返回bool值 //暂时不需要,一个坏点搜索失败可以弹出一个警告框/写一个log或者完全不处理,继续修复下一个坏点 //如果是因为stopflag而停止,上层调用中应该在函数返回后进行stopFlag判定,调用栈依次退出即可 //如果在中间发生了严重错误,必须停止整个加工流程,则可以设置stopFlag private void visionPro_3() { double[] vision_3_x; double[] vision_3_y; int vision_3_num; cogWin.Job3_Run(out vision_3_x, out vision_3_y, out vision_3_num, 2); if (vision_3_num == 0 || vision_3_x == null || vision_3_y == null) { //statusLabel_1.Text = "坏点路径搜索失败!"; workStopped(); return; } //记录,测试用 string file = "raw pos.txt"; StreamWriter sw = new StreamWriter(file); for (int k = 0; k < vision_3_num; k++) { sw.WriteLine(vision_3_x[k]); sw.WriteLine(vision_3_y[k]); } sw.WriteLine(vision_3_num); sw.Flush(); sw.Close(); if (stopFlag) { return; } //坐标间隔处理,得到一系列加工点 double[] work_x; double[] work_y; int work_num; datapro(vision_3_x, vision_3_y, vision_3_num, m_prm.gap, out work_x, out work_y, out work_num); //将相对位置转换为绝对位置 double axisPos_x, axisPos_y; moWin.m_motion.Motion_GetRealTimePosAxis(0, out axisPos_x); moWin.m_motion.Motion_GetRealTimePosAxis(1, out axisPos_y); for (int k = 0; k < work_num; k++) { work_x[k] = axisPos_x - work_x[k]; work_y[k] = axisPos_y - work_y[k]; } //路径记录,用于测试 file = "work path.txt"; sw = new StreamWriter(file, true); for (int k = 0; k < work_num; k++) { sw.WriteLine(work_x[k]); sw.WriteLine(work_y[k]); } sw.WriteLine(work_num); sw.Flush(); sw.Close(); if (stopFlag) { return; } //激光修复 PTPPrm[] movePrm_work = new PTPPrm[2]; for (int k = 0; k < work_num; k++) { movePrm_work[0].iCoorAxis = 0; movePrm_work[0].dPos = work_x[k]; movePrm_work[1].iCoorAxis = 1; movePrm_work[1].dPos = work_y[k]; moWin.m_motion.Motion_PToPMove(movePrm_work); //moWin.m_motion.Motion_LaserOn(1); if (stopFlag) { return; } } }
//视觉处理2 private void visionPro_2() { //二级视觉处理,得到若干坐标 double[] vision_2_x; double[] vision_2_y; int vision_2_num; cogWin.Job2_Run(out vision_2_x, out vision_2_y, out vision_2_num); if (stopFlag) { return; } double cPos_2_x, cPos_2_y; moWin.m_motion.Motion_GetRealTimePosAxis(0, out cPos_2_x); moWin.m_motion.Motion_GetRealTimePosAxis(1, out cPos_2_y); for (int j = 0; j < vision_2_num; j++) { PTPPrm[] movePrm_3 = new PTPPrm[3]; PTPPrm prm_3_x; prm_3_x.iCoorAxis = 0; prm_3_x.dPos = cPos_2_x - vision_2_x[j]; PTPPrm prm_3_y; prm_3_y.iCoorAxis = 1; prm_3_y.dPos = cPos_2_y - vision_2_y[j]; PTPPrm prm_3_z; prm_3_z.iCoorAxis = 2; prm_3_z.dPos = m_prm.FocusPos_z; movePrm_3[0] = prm_3_x; movePrm_3[1] = prm_3_y; movePrm_3[2] = prm_3_z; moWin.m_motion.Motion_PToPMove(movePrm_3); if (stopFlag) { return; } //物镜切换、自动对焦 if (stopFlag) { return; } //三级视觉处理,得到轮廓路径坐标 //三级视觉只获得最靠近视野中心的那个斑点的路径 visionPro_3(); if (stopFlag) { return; } } }
//视觉处理1 //注意,因为视觉处理不同级之间是嵌套关系,所以在visionPro_1中循环调用了visionPro_2,在2中调用了3 private void visionPro_1() { //一级视觉处理,得到一系列坐标 double[] vision_1_x; double[] vision_1_y; int vision_1_num; cogWin.Job1_Run(out vision_1_x, out vision_1_y, out vision_1_num); if (stopFlag) { return; } if (vision_1_num <= 0) { Console.WriteLine("not found"); workStopped(); return; } //注意,这里在相对运动时出现未考虑到的情况,即后面点的初始位置已经变化。改用点位运动。 //每一级视觉标定时,都是以下级视觉的中心为原点标定的,所以得到的坐标值即*-1 就得到移动到下一级视觉的step值 double cPos_1_x, cPos_1_y; moWin.m_motion.Motion_GetRealTimePosAxis(0, out cPos_1_x); moWin.m_motion.Motion_GetRealTimePosAxis(1, out cPos_1_y); for (int i = 0; i < vision_1_num; i++) { PTPPrm[] movePrm_2 = new PTPPrm[3]; PTPPrm prm_2_x; prm_2_x.iCoorAxis = 0; prm_2_x.dPos = cPos_1_x - vision_1_x[i]; PTPPrm prm_2_y; prm_2_y.iCoorAxis = 1; prm_2_y.dPos = cPos_1_y - vision_1_y[i]; PTPPrm prm_2_z; prm_2_z.iCoorAxis = 2; prm_2_z.dPos = m_prm.FocusPos_z_2; movePrm_2[0] = prm_2_x; movePrm_2[1] = prm_2_y; movePrm_2[2] = prm_2_z; moWin.m_motion.Motion_PToPMove(movePrm_2); if (stopFlag) { return; } //物镜切换、自动对焦 if (stopFlag) { return; } //二级视觉处理,得到若干坐标 visionPro_2(); if (stopFlag) { return; } //检验是否修复成功 if (stopFlag) { return; } } }