一.为什么 大孔中要加小孔(即卸力孔)

这其实跟钻刀的排屑有关了,当钻刀越大孔,排屑量也越大(当然这也得跟转速,下刀速的参数有关系),通常当钻刀越大,转速越慢,下刀速也越慢(因为要保证它的排屑通畅)。

这里科普一下钻刀的【进刀速度】,【转速】,【进刀量】之间的关系是怎样的.

进刀速度、转速之间的关系对于钻头来讲,切削量越大,产生的粉尘颗粒就会更大,部分切屑尤其是铜丝,会缠绕到钻头,从而严重影响孔壁的质量。相应的,切削量越小,在钻孔时,钻头停留在孔内的时间就会越长,产生的钻污就会越多。

进刀量、转速之间的关系如果转速太高,会导致线速度增大。从而影响钻头的平稳性和动态平衡性。合适的参数可以达到合理的切削性,保证下钻过程中受力对准度和均匀性。反之会影响孔壁的凹凸度,还会产生渗铜

为了保证大孔的排屑性能好,PCB行业作法是,在钻大孔之前,提前在大孔中间钻几个小孔,先让小孔排除一定孔屑,等再钻大孔时,孔屑变少了。不会再造成大孔排屑不畅。

二.大孔加小孔实现原理

求解方法:(具体可以看下方函数)
1.通过已知大孔6.0mm,小孔与小孔间距:0.2mm
小孔个数,求出最大内切孔尺寸=2.585mm
2.最大内切孔2.585mm,向下取整 钻刀为2.55mm
3. 求大圆中心到小圆中心距离
(6-0.1*2-2.55)*0.5=1.625mm
4.以大圆为中心,并3个小孔的以圆心角为120度依次旋转,即可得到3个小圆坐标

三.C#简易代码实现:

1.大孔加小孔代码

  1. #region 大孔加卸力孔 ydkdrl
  2. List<gP> MaxHoleList = glayer.Plist.Where(tt => tt.width >= && tt.width <= ).ToList();
  3. if (MaxHoleList.Count() > )
  4. {
  5. for (int i = ; i < MaxHoleList.Count; i++)
  6. {
  7. //求内切孔函数共6参数 大孔尺寸 小孔尺寸 小孔个数 小孔与小孔间距 小孔与大孔间距 旋转角度
  8. //当小孔尺寸不填,由函数自动计算小孔孔径,否则以填写小孔孔径为准
  9. List<gP> smallHoleList = calc2.p_small_hole_Plist(MaxHoleList[i], , , 0.2, 0.1,);
  10. addCOM.pad(smallHoleList);
  11. }
  12. }
  13. #endregion

2.计算函数(关键在于此函数实现)

  1. /// <summary>
  2. /// 求点P【内切圆Plist坐标】
  3. /// </summary>
  4. /// <param name="p">点P</param>
  5. /// <param name="small_hole_size">内切圆尺寸,填写为0时自动计算</param>
  6. /// <param name="small_hole_count">内切圆个数</param>
  7. /// <param name="small2small">内切圆与内切圆间距</param>
  8. /// <param name="small2big">内切圆与外圆间距</param>
  9. /// <param name="ang_rotate">内切圆转旋角度</param>
  10. /// <param name="units">单位:mm/inch</param>
  11. /// <returns>返回:【内切圆Plist坐标】</returns>
  12. public List<gP> p_small_hole_Plist(gP p, double small_hole_size, double small_hole_count = , double small2small = , double small2big = , double ang_rotate = )
  13. {
  14. List<gP> list_p = new List<gP>();
  15. double ang_single, ang_sum, dia_hole;
  16. gP tempP;
  17. tempP.mirror = false;
  18. tempP.attribut = "";
  19. tempP.angle = ;
  20. tempP.negative = false;
  21. tempP.symbols = "";
  22. dia_hole = p.width / - small2big * ; //units mm
  23. p.width = p.width - small2big * ; //units um
  24. if (small_hole_size < 0.001)
  25. small_hole_size = Math.Floor(p_small_hole_size(p, small2small, small_hole_count) / 0.05) * 0.05; //um-->mm
  26. ang_single = / small_hole_count;
  27. ang_sum = - ang_rotate;
  28. for (int i = ; i <= small_hole_count - ; i++)
  29. {
  30. tempP.p = p_val_ang(p.p, (dia_hole - small_hole_size) * 0.5, ang_sum);
  31. tempP.width = small_hole_size * ;
  32. tempP.symbols = "r" + tempP.width.ToString();
  33. ang_sum += ang_single;
  34. list_p.Add(tempP);
  35. }
  36. return list_p;
  37. }
  38. /// <summary>
  39. /// 求点P【最大内切圆尺寸】
  40. /// </summary>
  41. /// <param name="p">点P</param>
  42. /// <param name="small_hole_space">内切圆与内切圆间距</param>
  43. /// <param name="small_hole_count">内切圆个数</param>
  44. /// <returns>返回:【内切圆尺寸】</returns>
  45. public double p_small_hole_size(gP p, double small_hole_space = , double small_hole_count = )
  46. {
  47. double sin_val = Math.Sin( / small_hole_count * Math.PI / );
  48. return (sin_val * p.width * 0.0005 - 0.5 * small_hole_space) / ( + sin_val) * ;
  49. }
  50. /// <summary>
  51. /// 求增量坐标
  52. /// </summary>
  53. /// <param name="ps">起点</param>
  54. /// <param name="val">增量值</param>
  55. /// <param name="ang_direction">角度</param>
  56. /// <returns></returns>
  57. public gPoint p_val_ang(gPoint ps, double val, double ang_direction)
  58. {
  59. gPoint pe;
  60. pe.x = ps.x + val * Math.Cos(ang_direction * Math.PI / );
  61. pe.y = ps.y + val * Math.Sin(ang_direction * Math.PI / );
  62. return pe;
  63. }

3.Point,PAD数据结构

  1. /// <summary>
  2. /// PAD 数据类型
  3. /// </summary>
  4. public struct gP
  5. {
  6. public gP(double x_val, double y_val, double width_)
  7. {
  8. this.p = new gPoint(x_val, y_val);
  9. this.negative = false;
  10. this.angle = ;
  11. this.mirror = false;
  12. this.symbols = "r";
  13. this.attribut = string.Empty;
  14. this.width = width_;
  15. }
  16. public gPoint p;
  17. public bool negative;//polarity-- positive negative
  18. public double angle;
  19. public bool mirror;
  20. public string symbols;
  21. public string attribut;
  22. public double width;
  23. public static gP operator +(gP p1, gP p2)
  24. {
  25. p1.p += p2.p;
  26. return p1;
  27. }
  28. public static gP operator -(gP p1, gP p2)
  29. {
  30. p1.p -= p2.p;
  31. return p1;
  32. }
  33. }
  34. /// <summary>
  35. /// 点 数据类型 (XY)
  36. /// </summary>
  37. public struct gPoint
  38. {
  39. public gPoint(gPoint p_)
  40. {
  41. this.x = p_.x;
  42. this.y = p_.y;
  43. }
  44. public gPoint(double x_val, double y_val)
  45. {
  46. this.x = x_val;
  47. this.y = y_val;
  48. }
  49. public double x;
  50. public double y;
  51. public static gPoint operator +(gPoint p1, gPoint p2)
  52. {
  53. p1.x += p2.x;
  54. p1.y += p2.y;
  55. return p1;
  56. }
  57. public static gPoint operator -(gPoint p1, gPoint p2)
  58. {
  59. p1.x -= p2.x;
  60. p1.y -= p2.y;
  61. return p1;
  62. }
  63.  
  64. }

四.大孔加小孔脚本UI

五.实现效果

PCB genesis大孔加小孔(即卸力孔)实现方法的更多相关文章

  1. PCB genesis 大孔扩孔(不用G84命令)实现方法

    PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生 ...

  2. PCB genesis连孔加除毛刺孔(圆孔与槽孔)实现方法(二)

    一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...

  3. PCB genesis连孔加除毛刺孔(圆孔与圆孔)实现方法(一)

    一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...

  4. PCB genesis短槽加引导孔实现方法

    一.何为短槽 短槽通常定义:槽长小于2倍槽宽      如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个 ...

  5. PCB genesis连孔加除毛刺孔(槽孔与槽孔)实现方法(三)

    一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...

  6. PCB genesis自制孔点 Font字体实现方法

    一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个 ...

  7. PCB genesis孔符制作实现方法

    一.先看genesis原始孔符 孔符的作用:用于表示孔径的大小的一种代号, 当孔径检测时,可以按分孔图中的孔符对应的孔径尺寸对孔径检测. 在实际PCB行业通常不使用原始(图形)孔符,而使用字母孔符(如 ...

  8. PCB Genesis SET拼板(圆形板拼板) 实现效果(二)

    越来发现Genesis采用Surface多边形数据结构的重要性了,当撑握了多边形缩放,交集, 差集,并集等算法, 想实现PCB拼板简直轻而易举了;当然借助多边形算法可以开发出更多的PCB实用的工具出来 ...

  9. 转载:PCB名詞解釋:通孔、盲孔、埋孔

    在[電子製造業]打滾多年,分享 SMT.焊錫.塑膠射出.產品設計.瓦楞包裝…等經驗.請注意文章內容不見得都正確,服用前請三思… 之前有網友提醒我有篇文章把PCB的盲孔(Blind hole).埋孔(B ...

随机推荐

  1. Spring Security 介绍与Demo

    一.Spring Security 介绍 Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术选型.我们仅需引入spring-boot-s ...

  2. [Python数据结构] 使用 Circular List实现Queue

    [Python数据结构] 使用 Circular List实现Queue 1. Queue队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体 ...

  3. uWSGI+nginx+django+virtualenv+supervisor部署项目

    一.前言 在部署项目前,你已有一个能够在你本机测试过,能正常启动的Django项目(毕竟本文主要讲解部署Django项目),以及掌握了Linux系统的一些基本命令. 相关链接: Centos7安装py ...

  4. ubuntu 常见的操作命令

    原博客地址为:https://blog.csdn.net/qq_33421080/article/details/76551554 1.cd命令: cd:切换到当前用户根目录,默认[/home/用户名 ...

  5. linux的ssh相关指令

    1.安装ssh apt-get install openssh-server 2.备份ssh的配置文件 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_confi ...

  6. 简述Centos系统启动流程

    1. Centos5 POST开机自检 运行CMOS中的BIOS程序,加载第一个启动磁盘的Bootloader 由Bootloader读取kernel 通过挂载临时根目录initramfs加载核心模块 ...

  7. L2-012. 关于堆的判断(STL中heap)

    L2-012. 关于堆的判断   将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: “x is the root”:x是根结点: “x and y ...

  8. juruo的刷题&博文祭

    Nothing--- 祭我bzoj过66题,博文240篇(.弱.) 自娱(愚)自乐下-

  9. 【网络流24题】最长k可重区间集问题(费用流)

    [网络流24题]最长k可重区间集问题 [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a>< ...

  10. Contemplation! Algebra 矩阵快速幂

    Given the value of a+b and ab you will have to find the value of a n + b n Input The input file cont ...