c#读取XML文件实现晶圆wafermapping显示demo计算电机坐标控制电机移动

c#读取XML文件实现晶圆wafermapping显示

功能:

1.读取XML文件,显示mapping图

2.在mapping视图图标移动,实时查看bincode,x,y索引与计算的电机坐标

3.通过设置wafer放在平台的位置x,y轴电机编码值,相机在wafer的中心位置,计算出所有芯片的电机坐标。 

4.mapping视图中,通过注册鼠标事件后,左键返回电机坐标,中键返回x,y索引值,右键返回索引值

5.通过2个左右对位点,计算dieszie宽,比实际xml文件的diesize精度更高。

6.电机移动每颗芯片的电机坐标,视图分析结果后,可修改对应坐标bincode的结果--

7.通过索引查询bincode的结果

8.计算wafer每颗芯片的电机坐标--则可按数组的值进行移动检测每颗芯片,

9.通过索引获取电机坐标

10.保存修改结果后的xml文件

11.显示局部预览图

 

6.通过2个上下对位点,计算dieszie高,比实际xml文件的diesize精度更高。

代码使用电机每个脉冲1um进行示范,所以移动精度更高

初始化:通过预设的wafer中心坐标(镜头视觉显示wafer的中心位置)与xml文件路径,完成mapping的初始化

private void button_initia_Click(object sender, EventArgs e){//Mapping mapping = new Mapping();mapping2.CloseWindow();int x_axis_pulse = int.Parse(textBox_motor_value_x.Text); //wafer中心坐标xint y_axis_pulse = int.Parse(textBox_motor_value_y.Text); //wafer中心坐标yPoint2d[] points_die_size = new Point2d[] { new Point2d(x_axis_pulse, y_axis_pulse), new Point2d(27, 106), new Point2d(1238, 102) } ;Point2d motor_xy_loc = points_die_size[0]; //wafer中心坐标(x与y轴电机脉冲),确定实际值后,一般不会变化。wafer在卡环中心,卡环每次放置的位置固定不变double theta = mapping2.GetTheta(points_die_size[1], points_die_size[2]);//默认,初始校准可忽略mapping2.Calibrate(motor_xy_loc, default(OpenCvSharp.Point)/*new Point(55, 82)*/, theta, textBox_xml_path.Text);AddToLogInfo("已完成初始化");button_set_result.Enabled = true;//button_to_txt.Enabled = true;button_to_XML.Enabled = true;button_get_result.Enabled = true;button_get_index_motor_loc.Enabled = true;}

 

校准:

 传入参数:

鼠标在mapping视图中移动到对位点,显示xy的索引与初始的电机坐标

参考参数注释 

 /// <summary>/// duiwei_mapping指的行列/// </summary>/// <param name="duiwei_coord ">移动x,y轴,相机显示对位点后,对准到芯片中心位置,记录电机的实际值编码值脉冲值</param>/// <param name="duiwei_mapping">mapping视图的显示比如32,225</param>/// <param name="theta">默认</param>/// <param name="芯片间距">xml的芯片尺寸,宽盒高</param>/// <param name="path_xml">xml文件的路径</param>public void Calibrate(Point2d duiwei_coord, Point duiwei_mapping, double theta, Size2d 芯片间距, string path_xml){mapping.Calibrate(duiwei_coord, duiwei_mapping, theta, 芯片间距, path_xml);}

相机镜头下看到的对位点,移动xy轴把红色十字对准芯片中心,记录电机编码脉冲值。 

 

 依次传入参数:(电机实际值,mapping图索引值,默认角度,xml文件的diesize,xml文件路径)

即可完成校准

 

  private void button_cali_Click(object sender, EventArgs e){var p1 = new Point2d(27, 92);var p2 = new Point2d(1238, 73);var theta = mapping2.GetTheta(p1, p2);//  mapping2.Calibrate(new Point2d(-361129, -351128), new Point(50, 17), 0, @"D:\APS_Work\Work_Project\芯片切割道检测\program\WinFormsApp1\mapping融合\2KG026075JL-0.xml");// mapping.Show();// mapping.MouseMiddleClick += (coord) =>//{//mapping.SetResult(new Point(coord[0], coord[1]), 5);// };string die_size_w = textBox_die_size_w.Text; //已知实际尺寸-宽string die_size_h = textBox_die_size_h.Text; 已知实际尺寸-高string duiwei_x = textBox_duiwei_motor_loc_x.Text; //第一个对位点x  //电机x轴实际脉冲,通过读取PLC得到string duiwei_y = textBox_duiwei_motor_loc_y.Text; //第一个对位点y //电机y轴实际脉冲,通过读取PLC得到int xx_loc = Convert.ToInt32(duiwei_x);int yy_loc = Convert.ToInt32(duiwei_y);//mapping文件的x,y坐标OpenCvSharp.Point point_xy_row_colomn = new OpenCvSharp.Point(int.Parse(textBox_duiwei_index_x.Text), int.Parse(textBox_duiwei_index_y.Text));//获取xy,行列OpenCvSharp.Point2d motor_point2D_loc = new OpenCvSharp.Point2d(xx_loc, yy_loc);mapping2.Calibrate(motor_point2D_loc, point_xy_row_colomn, 0.1/*jog_mapping.d_wafer_angle*/, new Size2d(double.Parse(die_size_w), double.Parse(die_size_h)), textBox_xml_path.Text);AddToLogInfo("已校准");}

显示mapping图

  private void button_show_mapping_Click(object sender, EventArgs e){// CloseMappingProcess();//Task.Run(() =>// {try{mapping2.mapping_show();}catch (Exception ex){AddToLogInfo("请先初始化,再执行校准");MessageBox.Show("请先初始化,再执行校准");MessageBox.Show("请标定" + ex.Message + ex.StackTrace);}//  });}

批量设置结果:

 指定修改对应值:mapping中:NG对应05,OK对应01

 private void button_modify_Click(object sender, EventArgs e){// FindAndKillWindow("mapping");//  mapping2.GetImgQualityScore("test11.jpg",0);Thread.Sleep(500);int ind_x = int.Parse(textBox_x.Text);int ind_y = int.Parse(textBox_y.Text);bool b_value = false;if(comboBox_result.Text.Trim()==""){AddToLogInfo("请选择结果");MessageBox.Show("请选择结果","tips",MessageBoxButtons.OK,MessageBoxIcon.Information);return;}if(comboBox_result.Text == "OK"){mapping2.SetResult(new Point(ind_x, ind_y), 01);}else{mapping2.SetResult(new Point(ind_x, ind_y), 05);}AddToLogInfo("设置结果:" + comboBox_result.Text);button_show_mapping.PerformClick();}

 获取指定坐标点结果:

private void button_get_result_Click(object sender, EventArgs e){//FindAndKillWindow("mapping");//  mapping2.GetImgQualityScore("test11.jpg",0);Thread.Sleep(500);int ind_x = int.Parse(textBox_x.Text);int ind_y = int.Parse(textBox_y.Text);textBox_get_result.Text = mapping2.GetBinCode(ind_x,ind_y).ToString();AddToLogInfo("已获取结果:"+textBox_get_result.Text);}

计算所有芯片的电机坐标:

private void button_calc_all_loc_Click(object sender, EventArgs e){point2Ds_calc = GetMotorLocation(0, 0, 0, 0);}
private OpenCvSharp.Point2d[,] GetMotorLocation(int xx, int yy, int width2, int height2){//  int xx = Convert.ToInt32(loc_x);//  int yy = Convert.ToInt32(loc_y);//OpenCvSharp.Point point_loc = new OpenCvSharp.Point(xx, yy);//Size size2 = new Size(width2, height2);OpenCvSharp.Point2d[,] motor_loc = mapping2.AllCoord();//.GetMotoCoord(point_loc, size2);return motor_loc;}

通过索引获取电机坐标:

得到了电机坐标,则可进行电机移动,对每颗芯片进行图像采集与分析,修改对应的结果

private void button_get_index_motor_loc_Click(object sender, EventArgs e){button_calc_all_loc.PerformClick();int x = int.Parse(textBox_x.Text);int y = int.Parse(textBox_y.Text);string motor_loc_x = "";string motor_loc_y = "";motor_loc_x = point2Ds_calc[x, y].X.ToString();motor_loc_y = point2Ds_calc[x, y].Y.ToString();textBox_get_motor_loc_x.Text = int.Parse( motor_loc_x).ToString();textBox_get_motor_loc_y.Text = int.Parse(motor_loc_y).ToString();}

或许会出现使用xml默认的diesize 宽和高计算的电机坐标进行移动,每颗芯片并没有再芯片中心位置。此时需要校准dieszie的宽和高

左右偏移有偏差则计算宽:

private void button_recal_w_Click(object sender, EventArgs e){try{OpenCvSharp.Point map1 = new OpenCvSharp.Point(int.Parse(textBox_middle_loc_x.Text), int.Parse(textBox_middle_loc_y.Text));var s = ",".Split(',');s[0] = textBox_recal_loc_x1.Text;s[1] = textBox_recal_loc_y1.Text;OpenCvSharp.Point2d coord1 = new OpenCvSharp.Point(double.Parse(s[0]), double.Parse(s[1]));OpenCvSharp.Point map2 = new OpenCvSharp.Point(int.Parse(textBox_right_loc_x.Text), int.Parse(textBox_right_loc_y.Text));var s2 = ",".Split(',');s2[0] = textBox_recal_loc_x2.Text;s2[1] = textBox_recal_loc_y2.Text;OpenCvSharp.Point2d coord2 = new OpenCvSharp.Point(double.Parse(s2[0]), double.Parse(s2[1]));var dieSizeX = mapping2.CalDieSize(map1, coord1, map2, coord2);// label_DieSizeX.Text = (dieSizeX / 1000).ToString();//0.259425476439132textBox_die_size_w.Text = (dieSizeX / 1000).ToString();//0.259425476439132AddToLogInfo("校准后的diesize_宽:" + textBox_die_size_w.Text);}catch(Exception ex){AddToLogInfo(ex.Message+ "在mapping视图第一个对位点点击中键(左边),然后移动鼠标在mapping视图第二个对位点点击右键(右边)");MessageBox.Show(ex.Message+ "在mapping视图第一个对位点点击中键(左边),然后移动鼠标在mapping视图第二个对位点点击右键(右边)");}}

校准方法:

鼠标移动到第一个对位点,点击中键,这里是32,225,(不同xml不是值),会记录到编辑中

 在32,225位置点击左键,回传对位点的电机坐标,这个可以写入PLC寄存器,执行移动到实际位置附近。此时通过相机查看,控制电机左右微调到芯片中心,并记录电机值

 

 鼠标移动到第二个对位点,点击右键,这里是380,225,(不同xml不是值),会记录到编辑中

在38,225位置点击左键,回传对位点的电机坐标,这个可以写入PLC寄存器,执行移动到实际位置附近。此时通过相机查看,控制电机左右微调到芯片中心,并记录电机值到编辑框 

 

完成校准。

上下偏移有偏差则计算高:

private void button_recal_h_Click(object sender, EventArgs e){try{OpenCvSharp.Point map1 = new OpenCvSharp.Point(int.Parse(textBox_middle_loc_x.Text), int.Parse(textBox_middle_loc_y.Text));var s = ",".Split(',');s[0] = textBox_recal_loc_x1.Text;s[1] = textBox_recal_loc_y1.Text;OpenCvSharp.Point2d coord1 = new OpenCvSharp.Point(double.Parse(s[0]), double.Parse(s[1]));OpenCvSharp.Point map2 = new OpenCvSharp.Point(int.Parse(textBox_right_loc_x.Text), int.Parse(textBox_right_loc_y.Text));var s2 = ",".Split(',');s2[0] = textBox_recal_loc_x2.Text;s2[1] = textBox_recal_loc_y2.Text;OpenCvSharp.Point2d coord2 = new OpenCvSharp.Point(double.Parse(s2[0]), double.Parse(s2[1]));var dieSizeX = mapping2.CalDieSize(map1, coord1, map2, coord2);// label_DieSizeX.Text = (dieSizeX / 1000).ToString();//0.259425476439132textBox_die_size_h.Text = (dieSizeX / 1000).ToString();//0.259425476439132AddToLogInfo("校准后的diesize_高:" + textBox_die_size_h.Text);}catch (Exception ex){AddToLogInfo(ex.Message + "在mapping视图第一个对位点点击中键(上边),然后移动鼠标在mapping视图第二个对位点点击右键(下边)");MessageBox.Show(ex.Message+ "在mapping视图第一个对位点点击中键(上边),然后移动鼠标在mapping视图第二个对位点点击右键(下边)");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/215555.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

写实3D游戏模型纹理贴图设置

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xff1a; …

kyuubi整合flink yarn session mode

目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catlogsql测试 结束 概述 flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5 整合过程中&#xff0c;需要注意对应的版本。 注意以上版本 配置 ky…

Python从入门到精通四:Python循环语句

前言 循环普遍存在于日常生活中&#xff0c;同样&#xff0c;在程序中&#xff0c;循环功能也是至关重要的基础功能。 为什么学习循环语句 循环在程序中同判断一样&#xff0c;也是广泛存在的&#xff0c;是非常多功能实现的基础&#xff1a; while循环的基础语法 学习目标&…

STM32超声波——HC_SR04

文章目录 一.超声波图片二.时序图三.超声波流程四.单位换算五.取余计算六.换算距离七.超声波代码 一.超声波图片 测量距离&#xff1a;2cm——400cm 二.时序图 (1).以下时序图要先提供一个至少10us的脉冲触发信号&#xff0c;告诉单片机我准备好了&#xff0c;然后该超声波…

STM32——继电器

继电器工作原理 单片机供电 VCC GND 接单片机&#xff0c; VCC 需要接 3.3V &#xff0c; 5V 不行&#xff01; 最大负载电路交流 250V/10A &#xff0c;直流 30V/10A 引脚 IN 接收到 低电平 时&#xff0c;开关闭合。

黄油市场调研:预计2028年将达到717亿美元

黄油富含矿物质和维生素&#xff0c;奶油主要为脂肪和蛋白质组成&#xff0c;黄油主要用于涂抹面包和煎牛排等&#xff0c;随着西餐认可度提升&#xff0c;国内需求持续上行。黄油营养成分为乳制品之首&#xff0c;脂肪含量更高。 黄油主要用于涂抹面包和煎牛排等&#xff0c;随…

二十四、双缓冲机制

二十四、双缓冲机制 所谓双缓冲机制&#xff0c;是指在绘制控件时&#xff0c;首先将要绘制的内容绘制在一个图片中&#xff0c;再将图片一次性的绘制到控件上。 实现以下实例 接下来我们将一一介绍实现的功能 首先我们创建一个QMainWindow工程 继续创建一个cClass文件&…

配置BFD多跳检测示例

BFD简介 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网络设备需要能够…

vue3中实现el-tree通过ctrl或shift批量选择节点并高亮展示

一、看效果&#xff1a; 按住ctrl键实现单个多选 按住shift实现区间范围多选 二、代码&#xff1a; vue页面 <template><el-treeclass"w100%":data"$.treeData"ref"treeTab…

SQL中的三值逻辑:TRUE、FALSE 和 UNKNOWN。

在SQL中&#xff0c;通常采用三值逻辑处理条件表达式的真值。这种逻辑是基于三种可能的真值状态&#xff1a;TRUE、FALSE 和 UNKNOWN。 TRUE&#xff08;真&#xff09;&#xff1a; 表示条件为真或成立。 FALSE&#xff08;假&#xff09;&#xff1a; 表示条件为假或不成立。…

python实战教学之python版“张万森,好久不见”

前言 WINTER IS COMING 最近《一闪一闪亮星星》的电影在火热预售中&#xff0c;家人们抢到票了嘛&#xff0c;前两天小编写了一篇“张万森&#xff0c;下雪了”的文章后&#xff0c;收到了不少小伙伴的反馈&#xff1a;“代码的运行结果只有文字&#xff0c;没有雪花啊”&#…

C# OpenCvSharp DNN 深度神经网络下的风格迁移模型

目录 介绍 效果 项目 代码 下载 C# OpenCvSharp DNN 深度神经网络下的风格迁移模型 介绍 深度神经网络下的风格迁移模型&#xff0c;适用于OpenCv、EmguCv。 斯坦福大学李飞飞团队的风格迁移模型是一种基于深度学习的图像处理技术&#xff0c;可以将一张图像的风格转移…

全面解析ucrtbased.dll找不到的解决方法,快速解决dll问题

在计算机编程和软件开发中&#xff0c;我们经常会遇到一些陌生的DLL文件&#xff0c;其中就包括了ucrtbased.dll。那么&#xff0c;ucrtbased.dll是什么&#xff1f;它有什么作用&#xff1f;又该如何正确使用呢&#xff1f;本文将详细解析ucrtbased.dll的定义、功能以及应用&a…

Python:核心知识点整理大全8-笔记

目录 ​编辑 4.5 元组 4.5.1 定义元组 dimensions.py 4.5.2 遍历元组中的所有值 4.5.3 修改元组变量 4.6 设置代码格式 4.6.1 格式设置指南 4.6.2 缩进 4.6.3 行长 4.6.4 空行 4.6.5 其他格式设置指南 4.7 小结 第5章 if语句 5.1 一个简单示例 cars.py 5.2 条…

以企业架构为中心的SABOE数字化转型五环法

文章目录 01 传统企业数字化转型面临诸多挑战02 SABOE数字化转型五环法为企业转型破除迷雾 01 传统企业数字化转型面临诸多挑战 即将过去的2023年&#xff0c;chatGPT大模型、数据资产入表等事件的发生&#xff0c;标志着数字经济正在加速发展。数字经济是人类社会继农业经济、…

二进制、八进制、十进制、十六进制之间转换 原码、反码、补码

进制之间转换 二进制转十进制八进制转十进制十六进制转十进制十进制转二进制十进制转八进制十进制转十六进制二进制转八进制二进制转十六进制八进制转二进制十六进制转二进制原码、反码、补码 对于整数&#xff0c;有四种表示方式&#xff1a; 二进制&#xff1a;0,1&#xff…

Vue:用IDEA开发Vue,标签语法爆红问题处理

一、场景描述 我在IDEA中&#xff0c;学习Vue课程。 入门学习时&#xff0c;是在html文件中&#xff0c;script引入vue.js文件方式。 此时&#xff0c;在html文件中用v-标签&#xff0c;爆红。 二、解决办法 打开 菜单栏 File - Settings 选择 Editor - Files Type&#xf…

一文了解什么是Selenium自动化测试?

一、Selenium是什么&#xff1f; 用官网的一句话来讲&#xff1a;Selenium automates browsers. Thats it&#xff01;简单来讲&#xff0c;Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作浏览器一样。支持的浏…

Hanlp自然语言处理如何再Spring Boot中使用

一、HanLP HanLP (Hankcs NLP) 是一个自然语言处理工具包&#xff0c;具有功能强大、性能高效、易于使用的特点。HanLP 主要支持中文文本处理&#xff0c;包括分词、词性标注、命名实体识别、依存句法分析、关键词提取、文本分类、情感分析等多种功能。 HanLP 可以在 Java、Py…

2023 年山东省职业院校技能大赛(高等职业教育) “信息安全管理与评估”样题

2023 年山东省职业院校技能大赛&#xff08;高等职业教育&#xff09; “信息安全管理与评估”样题 目录 任务 1 网络平台搭建&#xff08;50 分&#xff09; 任务 2 网络安全设备配置与防护&#xff08;250 分&#xff09; 模块二 网络安全事件响应、数字取证调查、应用程序安…