界面篇立仿真屏的时候留了一句实话:轨迹描画是二维的。平切的活这样够用——轮廓画出来对着图纸肉眼核对,尺寸、过切、切入位置,一张图说尽。锥形切割一进来,这张二维图开始答非所问:上下两条轨迹各自都画得对,中间切出来的面长什么样?摆角会不会顶到线架行程?天圆地方的活图纸只给上下两个轮廓,中间的过渡腔连设计的人都只靠想象——车间里交这种活,编程的人自己心里都没底,只能切个试件用真金白银买确定。

用图形先验再上机,是数控的老传统。APT 年代刀位数据先上绘图仪画一遍(CLFILE 出图,人眼查刀路),车间"先描图、后切件"的习惯是这个传统的民间版;商品化的切削验证软件八十年代末出现——CGTech 1988 年成立,头号产品 VERICUT 干的就是验刀路、防碰撞、防过切,至今还是铣削领域的主力;线切割控制系统则跟着显示硬件降价一路走:字符终端、二维轨迹图、三维线框,到今天 Sodick 这类厂商的系统里 3D 模拟是标配屏。我们自研系统的仿真屏从二维升三维,是把同一条曲线重走一遍——好在走起来便宜,原因见下。

线切割在这件事上有先天便宜:切出来的面天然是直纹面(锥形切割篇),母线就是丝本身。别家做 3D 显示要先过实体造型这道门——B-rep、CSG、布尔运算,每一件都是大工程——这个功能一件都不用:把丝扫过的位置一条条画出来,切后的形状就在屏幕上自己立起来了。渲染原语和机床原语是同一个东西(直线段),这是线切割 3D 模拟能做成"仿真屏里的一页"而不是"一个 CAD 系统"的根源。

一、仿真屏校验什么:图形看形状,数值管边界

先把这页屏的职责说清,免得把它做成玩具。校验分两层,各管各的:

图形三看。看形状:上下异形的过渡面是顺滑还是扭曲,直观可判——母线要是打结(交叉),一眼看出来;看方向:G51 还是 G52,锥度往哪边歪,图上立体的比二维正负号可靠;看过程:拐角过渡弧怎么转、切入切出怎么走,动画放一遍比脑补强。

数值四账。图形再好也有物理上限:1080p 的屏幕画 100mm 视野,一个像素就是 0.1mm——µm 世界的东西图形根本看不见,只能靠算。

  • 面积账:直纹面面积(丝扫过的斜切缝面积),多次切割每刀留量、规准选择的基准——等锥度圆柱对得上解析值 2πR×斜高,这是模块的期末考试
  • 工时账:面积 ÷ 规准效率(放电篇的 mm²/min 口径)逐刀累加,估出来的工时直接进报价和派工,是真金白银的数
  • 行程账:X/Y 软限位、U/V 行程占用、最大摆角全程扫描——超界在仿真屏先报警,机床不动(锥形切割篇立的 tanA·H ≤ U/V 行程断言,图形化版)
  • 极值账:上下开口尺寸差(验收时打表对 2·tanA·试件厚的预言)、最小内角 R(丝半径+放电间隙的物理下限,来历篇

分工口径:图形管人眼的意外,数值管机床的边界。屏上两张页——3D 视图页放动画,报告页出四账的数。

二、直纹面从哪来:双段表、弧长配对与三个高度

数据不吃新东西,吃锥形切割篇锥度展开器的吐出物:上下两条同步段表。直纹面的定义一行写完——弧长参数 u 处的母线是上下轨迹对应点的连线:

1
2
3
 上轨迹 T:  ●────●────●────●    各自总弧长归一到 u∈[0,1]
             │    │    │    │    母线 L(u) = T(u) − B(u)
 下轨迹 B:  ●────●────●────●    按弧长配对,不按段号配

配对有个坑:上下轮廓弧长不同,段边界天然不齐——下轨迹 6 段、上轨迹 4 段是常态。按段号配对会把母线拧成麻花。正确做法是把两条轨迹各自的总弧长归一到同一参数域,按等弧长比例取点连线。这跟编程系统处理上下异形的配对规则(锥形切割篇第一节"按弧长配对")是同一条约定——显示层不发明新规则,复用工艺层已经定下的。等锥度是它的退化特例:上下轮廓相似,配对点天然同参数,画出来就是教科书上的锥体。

高度要换一笔账。展开器吐的上下段表是轴的目标——下端在程序面高度、上端在上导轮切点高度(H−h₀),那是给电机走的。显示要的是工件里的面:工件下表面(程序面,z=0)和工件上表面(z=工件厚 W)。好在公式是现成的,锥形切割篇的展开三行里把 h₀ 换成 W 就是答案:

1
2
工件下表面轮廓 = P                    (程序面就取在下表面,零偏移)
工件上表面轮廓 = P + tanA · W · D     (W=工件厚,设置屏录入)

同一族公式,导轮的账用 H 和 h₀,显示的账用 W——“U/V 只认角度和跨距、高度差只进偏移量"这个不变量的又一次兑现。显示层复用展开器的 split(),把高度参数从 (h₀, H−h₀) 换成 (0, W) 就行,函数一个字不用改。

丝在空气里的部分画不画:不画。丝的真实全长是从下导轮切点到上导轮切点(跨距 H),但工件外的部分(垫块、空气里那两截)对校验没用,画出来反而把构图拉散。第一版只画工件内的一段,摆角的真值由数值账报。显示什么不显示什么,按校验需要裁,不是按物理完整画。

采样分两级:显示采样几百条母线(屏幕一帧的像素密度就那么多,画一万条是浪费),计量采样按 0.1mm 级弧长步长走(面积、极值账用精度说话)。两级同源——都是同一段表同一配对规则采出来的,只是步长不同,不会出现"图上一个形、账里另一个形"的分裂。

三、渲染:平行投影、线框和"丝就是原语”

投影选平行投影(等轴测),不选透视。机械制图的世界没有透视——车间人人读得懂等轴测图,透视的近大远小反而碍事。等轴测的两个角是死的:绕竖轴 45°、俯角 35.264°(arctan(1/√2),画出来三根轴的缩短系数相等),旋转矩阵一次算好,每帧复用:

1
2
 sx = x·r00 + y·r01 + z·r02 + ox        模型坐标 (mm, f32)
 sy = x·r10 + y·r11 + z·r12 + oy        平行投影:两行乘加,没有除法

透视才需要除以深度(透视除法),平行投影两行点乘搞定——这是选它的第二个理由:省的不只是习惯,还有每顶点一次除法。

定点纪律在这里放开,理由要说透。控制路径全链 i64 µm、拒 f64(解析篇立的规矩),显示路径放开 f32:旋转矩阵、乘加、取整,浮点随便用。这不是纪律松了,是误差的计量单位换了——控制路径的误差单位是 µm,f64 到 f32 的舍入在 µm 世界是事故;显示路径的误差单位是像素,0.1mm 量级,f32 的 24 位尾数对屏幕坐标富余五个数量级。定点买的是确定性回放和整数对账,渲染不参与对账(golden 测的是母线数组和数值账,不测像素),浮点不破坏任何测试。纪律是给风险的,不是给信仰的。

线框渲染三样东西:上轮廓折线、下轮廓折线、母线族(抽稀后的)。3D 到 2D 落地就一句话:投影完是 2D 点,连线用图形篇现成的画线——Bresenham 又来了,插补基础里它是机床走出斜线的算法,这里是屏幕走出斜线的算法,同一数学的第三次出场。3D 渲染=投影矩阵+已有 2D 画线,这是"两层架构"在图形栈里的兑现:新写的只有投影一层。

敢不敢不消隐:敢,第一版就是纯线框不消隐。要看的是丝扫出的形状,线框即信息;工件实体的遮挡(画家算法或 z-buffer,都是为画"实心东西"准备的)反而把上下异形腔体内部挡住——要看的就是那个腔。母线密了看不清就抽稀,间距拉开自然透气。面片填充加明暗留第二版,等真有"看不出深浅"的抱怨再说——没有需求先不做,这是专用系统的本分。

主角是丝,不是工件。切割过程模拟的重心是一条高亮的当前母线——动画推进时它沿轨迹走,已扫过的母线亮色、未走的暗色,加工方向一目了然。操作工要看的是"丝现在在哪、接下来去哪",工件形状是副产品。

四、动画节拍:几何回放,不走脉冲

仿真屏不碰插补器、不碰卡——界面篇的口径(UI 不摸卡寄存器只走命令队列)在这里的形态是:仿真屏直接在段表上做几何回放。每帧按弧长推进:Δs = v·Δt,落在哪段就在哪段内求值(直线段线性插值、圆弧段按弧长反解角度),当前位置、当前母线、已扫过集合一次更新。

节拍账:60fps 一帧 16.7ms,空走速度 5m/min 时一帧走 1.4mm——1m 的轮廓 12 秒放完。快放、慢放、单步、回退都是改 v 和方向的事,几何不变。单步按段推进是给对刀点核对用的:一段一段跳,每段报终点坐标,和程序单核对。

变频怎么算:真机上 放电篇的 0xE0 拿间隙反馈实时调频,仿真没有放电,这个反馈环天然不存在。仿真的速度模型就用规准基准速度乘手动倍率,固定值回放。想模拟"短路回退"吗?不模拟——仿真管几何和边界,不管物理;回退的真值在运行屏和日志里,仿真屏演它没有验收意义。同一段表+同参数=同动画,确定性回放,这是能进测试的前提。

测量绕开像素:屏上点选两条母线读尺寸,报的是几何真值(µm),不是屏幕坐标反推的像素值——像素精度 0.1mm 级,µm 的活它称不动。点选命中哪条母线由投影后的拾取距离定,显示出来的数从模型坐标取。一路 f32 只管画,i64 只管算,两不串门。

五、数值账:面积、工时与极值

四笔账的实现都比渲染还短,因为是纯几何:

面积走梯形积分:相邻两条母线(长 lᵢ、lᵢ₊₁)夹一段弧长步 Δs,微元面积 ≈ (lᵢ+lᵢ₊₁)/2·Δs,全轨迹求和。等锥度时母线长恒等于 W/cosθ(斜高,W 是工件厚),面积=轮廓长×W/cosθ;圆柱的解析值 2πR×W/cosθ 拿来对账,这就是模块的 golden 之一。

工时逐刀累加:t = Σₖ A/ηₖ,A 是面积(每刀同一轮廓,面积同),ηₖ 是第 k 刀的规准效率(规准库按组号给,放电篇的 Spec)。估算精度受限于 η 本身的散差——中走丝效率几十到上百 mm²/min,散差两三成是常态,所以工时账报的是"±20% 的预算数",够派工够报价,不能当承诺。这个口径要写在报告页上,不写的话销售真会拿它去签合同。

行程与极值是全程扫描:所有采样点上取 U/V 需求、摆角、四轴坐标的极值,跟软限界比。发现超界的处理不是弹窗完事——报告页列出哪个段、哪个位置、超了多少,操作工要拿着这个数回去改程序或改装夹,不是看完关掉。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
/// 直纹面账单:面积/极值/超界报告(全部 i64 µm,面积 mm² 换算出口才做)
pub struct SurfReport {
    pub area_mm2: i64,          // 梯形积分,×1e-6 换 mm²
    pub max_swing_mdeg: u32,    // 最大摆角(0.001°)
    pub uv_peak_um: i64,        // U/V 需求极值
    pub overruns: Vec<(u32, i64)>,  // 超界报告:(段号, 超出量 µm)
}

pub fn audit(lines: &[(Vec3, Vec3)], step_um: i64,
             lim: &SoftLimits) -> SurfReport {
    let mut area = 0i64; /* 梯形积分 + 极值扫描 + 软限位比对,纯函数 */
    ...
}

六、落进系统:第四个可测模块

模块链又串一节:解析器(段表)→ 锥度展开器(双段表)→ 直纹面生成器+账单(母线数组+SurfReport)→ 渲染层(投影+画线)。前三环都是纯函数,第三环同样是——输入双段表+参数,输出确定值,继解析器、插补器、锥度展开器之后第四个开发机可测模块。测试四条:

  • 解析对账:等锥度圆柱面积 vs 2πR×W/cosθ,容差 0.1%(梯形积分的收敛阶摆在那)
  • 不变量:等锥度全程母线长恒定(|T(u)−B(u)| ≡ W/cosθ),这是锥形切割篇不变量的第三种用法——先给插补当分层依据,再给展开器当测试断言,这里给面积账当解析对账
  • 配对单调:上下轨迹的弧长参数各自单调递增、无回绕——母线不打结的数学表述
  • 边界:构造一段超摆角的程序,overruns 非空且段号、超出量对得上

运行侧的挂接都是老口径:渲染跑在 Core1 服务侧(显示本来就是服务的活),显示采样几百条母线、KB 级内存,Core1 的堆接得住(它是唯一合法堆用户,多核篇);段表和几何全在 i64 µm 世界里转,投影前一次性换算显示单位,国际化篇的"内部永远 µm 公制"不破。界面挂接不动七屏框架,仿真屏里加 3D 视图页和报告页,键鼠转视角走键鼠篇现成的事件管道。

总结

实战清单:仿真校验两层分工(图形管人眼意外、数值管机床边界,四账=面积/工时/行程/极值);直纹面=双段表按弧长归一配对(不按段号,上下段数不齐是常态),高度账把 h₀ 换 W 复用展开器 split(不变量第三次兑现);渲染三件=等轴测平行投影(45°+35.264°,无除法)+线框不消隐(要看的是腔体内部)+Bresenham 复用(第三次出场);定点纪律的边界=控制路径 µm 级 i64、显示路径像素级 f32,纪律给风险不给信仰;动画=段表上的几何回放(60fps 一帧 1.4mm、单步按段、测量报 i64 真值绕开像素);面积走梯形积分对 2πR×W/cosθ 解析账、工时按规准效率 ±20% 口径、超界报段号和超出量;直纹面生成器=第四个开发机可测模块(解析对账/不变量/配对单调/边界四测试)。跑通标志:等锥度圆柱仿真面积对解析值 0.1% 内;天圆地方件母线无交叉、动画全程丝不跳变;超摆角程序在仿真屏报出段号,机床未动;工时估算与实切对上 ±20%;同一程序两次仿真报告逐字节一致——确定性回放的硬验收。

运动控制卡还在等手册,寄存器合同的另一头画不完整。下一篇写**中文输入法**:编程屏要敲工件名、注释要写汉字、权限登录要认操作工的名字——纯键盘的中文怎么进、候选怎么选、点阵字库怎么接,那篇把这个车间刚需做扎实。

参考链接