引言
' J% U4 l4 {- B" J# j
) m$ a7 z# n3 M+ @6 E 随着CAD \CAM技术的发展和数控机床性能,零件复杂程度的不断提高, NC程序变得越来越长和复杂,数控编程的难度日益增大, NC程序的故障率也日益增高。由于NC程序的质量直接影响者零件的加工质量和加工成本,因此在NC程序输入机床正式加工之前都要经过正确性检验。传统的数控程序的检验方法为试切法,即采用某种切削材料,通常多为非金属切削材料来代替实际零件材料进行试切加工。这种方法既耗时又浪费材料,而且常常不能达到令人满意的结果。运用计算机软件来模拟数控加工过程,并将加工过程和加工结果中的信息在计算机中用图形、数字、图表等方式表达出来,可以在实际加工前及时发现并除去程序中的错误,确保程序的正确性,合理性。从而使得而在不实际占用和消耗机床、工件等资源,不需要真实加工环境下评价数控加工过程成为可能。 2 {- w% F) z" L7 J0 Z e9 b- P6 e
9 g, k; K: L" {/ S 1、仿真环境的建立
0 W3 Q9 v$ n) v6 J) t$ R! [8 p% m2 M* n- E. n+ T) I0 G
现在软件开发工具很多,较为常用的有MicrosoftVisual C ++ 6. 0, Borland C ++ , Dephi等。本仿真系统采用基于开放式图形库OpenGL,结合MFC类库,使用MicrosoftVisual C ++ 6. 0工具在Windows XP操作环境下开发。OpenGL 即开放式图形库(Open Graphics L i2brary) ,是目前比较完善的三维图形标准,它广泛适合于计算机系统环境下的三维图形应用程序设计接口,目前已成为开放式的国际三维图形程序标准。
3 F: E( w w, B0 M$ @( U$ X- e/ G, f: P/ a+ e# T3 G/ b
本系统中,我们从基本的点元素开始,在三维空间内生成实体,实现了数据的可视化和对实体的交互操作。在Windows XP环境下,采用Visual C ++与开放式三维图形编程标准OpenGL 相结合, 建立了一个与OpenGL的接口类即CSetGL类完成对OpenGL的初始化设置,在使用OpenGL进行渲染的时候,只需要遍历根据插补计算得到的刀位轨迹数据表,然后在图形显示类中调用OpenGL基本图元绘制函数和复杂三维曲线/面绘制函数进行环境的几何建模;利用对话框来实现对毛坯形状、尺寸、材料的设置,以及对刀具的选择。
0 ~! c% N8 b, C; U0 x4 n/ ~
: l9 w! J# j9 l0 n# a9 [4 q CTransformation类中函数glScalef ( ) 、glRotatef ( ) 、gl2Translatef ( ) 实现实体的缩放、旋转、平移等操作,COpenGLContext类定义了实现OpenGL的绘图描述表和象素格式,矩阵元进出栈操作实现空间切换。
; }, q7 @8 [ q2、系统总体结构设计与实现 8 I% |3 E3 U- d2 R& I. g) K6 x
2 K+ u/ A; b @! \3 w3 b: {$ X
根据机床加工的特点和实际机床工作流程,该系统软件采用如图1所示结构,包括用户界面模块、程序编辑与处理模块、仿真显示模块。
' v( `" s: ]; g) H$ v
( z7 F4 h9 Y/ E6 v7 ~; y 8 e* s) e; \% w7 k! x# ~# x
图1 仿真系统总体结构
% z9 h, q$ v! i% r8 H2 U 2. 1程序编辑与处理模块 1 q' x0 M; h( S* H: M+ ]5 F
0 F, _) Z' W4 E8 ?3 j* T+ |
该模块用于实现数控程序输入、显示修改及分析解释功能。程序的读取可以采用直接键盘手工输入和程序文件读入两种方式;代码解释和分析主要是分析程序的结构,通过对NC代码的理解、检查代码语法语意的正确性,经过译码、刀补计算、进给速度处理,以得到刀具中心轨迹和其它所需数据,为刀具路径建立数据表,作为仿真的驱动信息,用于模拟加工模块。该模块的具体实现是由NC程序的预处理和代码的解释两个大的过程来完成的。
. u- o4 ^2 m6 J$ Q' {7 s" f8 e$ @. b$ I* m! `. r5 J3 b+ T l
(1)预处理模块NC代码的预处理过程主要完成NC程序的读入以及对读入程序的词法、语法检查。目前国内外的数控装置几乎都采用可变程序段“字地址格式”,国际标准化组织制定了字地址程序段格式ISO6983 - 1 - 1982标准,形式如下:
; B; D' Z' K3 r9 z/ S1 ?% f4 F( g' E X- v& N) \1 d
N. . . G. . . X ±. . . Y ±. . . Z ±. . . I ±. . . J ±. . . K ±. . . M. . . S. . . T. . . F. . . $ E- P w' x2 G" O/ e) U. U$ Q
0 W" E3 H+ m, M0 C0 Z/ _
数控程序是由这样一组字地址组成的指令集,根据数控程序的特点本系统存取、管理这些代码采用单向链表结构来实现。由于本系统数控源代码是以文本格式存储的,所以首先由C ++提供的I/O流操作函数Ofstream, fstream, ifstream来实现对源代码的存取,由类ifstream读入每一程序行,将读入的程序行以字符串的格式存入text_list链表的text成员中,该链表的具体结构为:
' @# }* [; c" u( T! _: l7 K" g
4 U' f/ H+ h2 S5 p struct Pro _text 8 b' M! O# O( g& Y( ^
* H; g4 P( ^- F& T7 ]4 s
{ & _/ W, l! g8 U" R) [# m# @
4 ~4 S- o+ n" l* L% _+ f CString text;
7 f/ e6 r0 G* R0 I' V; V7 Z5 D: t& g; _* w, F: `& A$ S3 h
int lengh;
|+ l ]9 r+ ?& ~. a1 n$ {& O. o/ c- q+ @0 P/ ?% |2 r _/ t
Pro text3next;
- V) F3 `( V) R7 H3 ? f
# H6 H& @2 P Y4 P$ n: _ };
0 ~2 S" ~% y, T0 G% J! y) P 4 B* Y# E( }6 f2 }; v9 i
对数控程序代码和数控仿真目的分析可知,我们只需从数控程序中提炼与仿真系统运动部件有关的运动与状态信息,而对于那些与运动轴无关的代码,只要计算机能够识别它们并进行词法的检验就可以了。因此,遍历text_list链表对结构体中成员text进行分析,根据特定的算法,去除注释等不必要的信息,提取有用的代码信息即程序行中的指令值存入dictate _ list链表。同时该过程还完成数控程序的词法和语法的检查,若有错误的信息将其存入指定的文件中。dictate_list链表的结构即:
1 O3 O0 k& Z2 o p0 e, q9 {, y. [) B! m) T6 F' l# ^
struct Command # m' E' z+ ?& ^$ e9 W5 [( @2 e+ l
K# S, m/ K. J8 o) t6 D* E
{ $ O# s# W" d6 c/ l
% C1 F/ k5 [0 P8 N6 n# g8 C" C intN; / /行号
6 G% w+ g; G% U( G$ Y" x- V2 i1 c' W6 p* ? x1 b
CString G; / /G指令 $ t0 H& E# r; G1 a, z% e- }
# t/ n4 Y5 d) S
double X; / /x坐标 , p/ A' t2 x" m* N
8 h; e* j5 e. \# S+ l$ ?- N$ U/ [. ]
double Z; / / z坐标
# W9 z0 x- ^' h: Z! X2 J4 ~/ g9 w) v1 Q+ I/ I
double R; / /圆弧半径值 # A# H5 d% X7 k0 `# t
( o+ D. U8 Y6 K) j7 {# V
double I; / /圆弧中心坐标 u) I3 _( ~- i, S/ n1 _
! i! w, T; _6 W. e3 Y! [
Idouble K; / /圆弧中心坐标
1 V, O6 V7 L3 L! t
; {9 C3 V: ?& y- i$ c* i Kdouble F; / /进给速度值 + e& f% B Q7 F! @' f" Q u
C; S- P: i+ U( k" a! D! D int S; / /S指令 & D. E3 x' k% l: A
8 S) V* E' k1 R& I
CStringM; / /M指令
) g3 S9 E% Z% x" `- C$ h0 T+ ]3 f' m9 u% t9 M8 Z6 }7 W
int T; / /刀具号 , ^/ v; [. s/ o7 R2 C9 N5 G) q
) Y% v' K; Q6 x5 M Command3next; / /next指针 * y1 \8 X8 Z1 w* u: C" K X* a
9 J ? F, Y# e3 @) @ y y
}
& {1 r9 B% r: L) s, l- E (2)解释处理模块解释处理模块负责提取有关命令动作和状态信息,通过对已经存入缓冲区的数据结构进行分析扫描,即遍历dictate_list链表,分离出相应的信息,进行刀具轨迹的离散和插补,得到仿真的驱动信息,将其存入一定的数据结构中。G代码是数控代码中最重要的代码,几乎控制了数控机床所有的功能和重要设置,必须对其进行合理有效的处理。在本文研究中根据仿真需要忽略其他G代码而只对以下几组G代码进行分析:G50工件坐标系设定; G00 点位控制; G01 直线插补;G02 /G03圆弧插补; G41 /G42半径补偿; G71 /72 /73车削循环; G90 /G91设置绝对或相对坐标等,并对M, S,T, F等代码进行状态分析。 2. 2仿真显示模块 ! |" G+ s6 m" ~
' P9 p$ f. {+ E( U3 B, Q 加工仿真就是利用计算机图形技术,让计算机模拟真实的加工过程,通过动画的形式形象、直观的模拟数控加工的切削过程。零件仿真画面在屏幕切分窗口的显示区域显示。用户可以调节切分窗口大小,旋转图像观看加工工件。通过仿真结果的可视化显示,可以发现错误,修改工艺文件,优化加工方案。根据计算机动画原理,每秒显示25幅以上的切削加工场景,整个加工过程的演示就是连续的。用OpenGL 的双缓存(Double Buffering)技术可以方便地实现刀具相对运动过程的动画仿真。双缓存提供两个颜色缓存,在一个缓存中显示帧时,在另一个缓存中绘制帧。在绘图时,数控加工仿真系统根据插补计算得到的刀位轨迹值,在屏幕上实时的显示刀具的变化情况。对于每一个计算出的插值点,刀具就进给一步,系统即刷新一次,此时在后台缓存进行建模及对模型进行变换,在前台缓存显示由后台缓存已计算好的画面, 如此反复,最终动态显示切削加工过程。另外还利用OpenGL 的显示列表技术和局部刷新技术防止场景的颤动,增强切削场景的显示效果。 . h; V5 p8 k* p
% s0 _) l6 T4 |1 i
分析数控车床加工的特点:数控车床的毛坯通常为棒料,为回转体零件,而且刀具做的只是X方向和Z方向上的二维运动。因此在本系统的仿真算法中,首先将毛坯进行细分为单位厚度的小圆柱单元,小圆柱单元的厚度根据仿真所需的精度和显示效果来决定。 $ N% O$ H: {7 h2 g2 |" D6 }" Y& f1 e
" |; N& B, ~6 h' W1 Y
小圆柱单元的具体的数据结构为: / a) J* ?/ q' r
, \1 T9 `" `1 m8 U& z. ?( R4 T$ w
struct CircleCell
1 E5 t, N; q& D0 a' l, f1 N& U0 |0 T- X# `6 Y( Q6 r
{
0 q1 P- \6 [/ W* G
2 P4 o9 E. i* v! N- d/ z intNum; / /序号 " {& O$ L1 Z5 B7 M
8 X8 Z3 i% p: y5 s
float z; / /距离毛坯左端面的长度
% x) K9 t$ E8 m: _3 \# W! S. Y. a; G {8 _" K- L# v
floatD; / /外圆半径 * Q; s+ j3 K9 L6 A
L. Y" H9 h7 z3 |" @ float d; / /内圆半径
# t: p1 N Y5 I% g7 U' a4 V9 p
8 A3 }2 i* \4 H& @: m float h; / /单元体厚度
$ t$ a6 G2 {. b/ n4 P3 @+ i
1 N ?, T& `0 a5 A0 H } cell[ 100 ]
& i# `% q& N l/ V! {( M8 U) N' f5 A- i8 A: x
读入经过程序处理模块得到的仿真驱动信息,即刀具运动信息,得到车刀刀尖处的位置(Xt , Zt) ,根据Zt确定刀具经过的小圆柱单元在工件数组中的位置,也就是确定哪个单元体被切削。然后比较该单元体的直径和刀尖点的Xt坐标,确定该单元体是否被切削。
, p$ L- |7 i4 D$ L A2 W0 T; a; F' j) f7 h0 H3 u, E
具体的实现命令如:
/ J4 c$ \; \/ O% s# i9 J- W
6 q% S! c! v8 j8 H int i = int ( ( cell[ 0 ]. z - Zt) /h) ; / /确定是被切削的单元体; 6 W$ l5 t; h: E. P2 I+ U: x
$ w+ v8 X* G. W if / /加工的为外圆 - F5 b* e" h$ a
) z# i* r3 _0 ~. @2 J { 9 A* v+ R- m* }$ O! U
4 ?. A+ G* ?+ P9 j5 K
if (Xt < cell[ i ]D)
F; ^. u) W( @. F4 h# z: |
2 a$ `' B+ N) L. k } 4 t4 r4 l* S/ n7 n( h! f1 Y
6 d/ m) Q: D" |2 o: R% ~- e5 y0 t
else if ( / /加工的为内圆) / k7 s/ M' O- ] Z% o8 {
7 M, K7 D/ l7 }$ v { 3 {( V- \7 @' H
9 C- g0 j/ d% l3 h( s2 ~ if (Xt > cell[ i ]. d) % I) `1 m; f8 z* y4 Y2 O
& y, Z' E+ t# I$ Q
{Cell[ i]. d =Xt; } & H7 x& d. m; |
# J: j. K+ w: W, e
}
" b, \; A8 ]4 {, ]2 ~( `: O. n% m; |7 M: f/ K
对工件数组进行遍历,根据工件数组中数据绘制相应的单元体,也就显示了加工后的工件。 - _* p; |- R ]) f7 ^% \
0 F" l/ O1 f G: @' O; {8 C
2. 3用户界面模块
: s9 h, a: W) L- Y5 m- c7 I, D3 X) {
该模块用于设立数控加工环境,主要由操作键区、NC代码显示编辑区和模拟显示屏组成。操作键区主要响应用户的鼠标点击,完成一些数控系统的基本操作,同时也实时的显示主轴转速和刀尖位置; NC代码显示编辑区主要完成对代码的显示与编辑;在模拟显示屏区可将机床的加工过程逼真地显示出来,在NC程序的驱动下,用三维动画仿真显示加工过程,画面可放大缩小,还可以从任意角度观察加工过程。
& E7 }; Q9 ^5 e1 F, f6 e9 k8 H0 t. m0 V0 {5 x6 ]- G
公共用户界面如图2所示,此用户界面采用VC ++ 6. 0中的“窗口的动态分割”技术来分割、创建,通过类CSp litterWnd将用户界面切分成三个静态视图界面,即左侧的模拟显示区,右侧上方的NC代码显示编辑区和下方的操作键区。使用时可根据实际需要调节界面图形显示窗口的大小。 : v f* Q0 l; B. P$ n! f
6 \- f0 p3 c; @5 q$ a- o 3、实例
; P5 g) Y, S8 q4 t+ T+ X
& c( x. o+ l3 Q2 Q 在Windows Xp环境下利用OpenGL技术,以Visu2al C ++为开发平台,初步完成了一套三维数控车削仿真系统的开发。图2为加工仿真实例。经验证,该系统具有良好的界面和交互性;较好的实现了数控程序进行正确性检查;可以同步显示加工代码和工件切削状态,以验证加工代码编写的正确性;可以判断诸如刀具与夹具干涉等错误; 在显示过程中还可以旋转、放大、缩小对象,使操作者可以从任何角度清楚地观察刀具切削的过程。虽然取得了预期的研究开发效果,但是系统还有待于进一步完善。 |