一、功能和工艺要求 1.接受常见的平面矢量图形文件,如PLT,DXF。 2.处理图形加工的先后顺序,及加工方向。 3.能简单处理图形,如选择,旋转,平移,镜像,复制,排列等。 4.可手动调试设备,及检测输入输出。 5.加工控制能调节速度,需要暂停,继续,中断等控制。 6.加工需要显示时度,时间,位置等部分用户信息 7.可设定加工工作原点,激光开关控制(此处不关心激光能量调节)
二、系统流程

三、使用函数 手动调试需要完成的功能:输入输出测试,手动驱动脉冲,检测运行状态,停止动作,找机械原点: 对应的函数调为: d1000_out_bit 数字输出函数,可控制激光的开启或关闭 d1000_get_in_bit 读输入口状态 d1000_start_tr_move 手动发脉冲,可使用单轴点位运行 d1000_check_done 检测运动状态函数 d1000_decel_stop 停止脉冲输出(减速停较好) d1000_home_move 单轴找原点函数 d1000_home_move_all 多轴找原点函数 d1000_board_init 控制卡初始化 d1000_board_close 控制卡释放
位置显示及清除需要的函数: d1000_get_abs_position 取得绝对位置 d1000_set_position 设定位置函数,当值为0时位置清除
加工控制需要的函数: d1000_start_ta_line2 两轴插补函数 d1000_set_vector_profile 设定矢量插补速度 d1000_change_speed 速度改变速度
四、核心部分的编程 在实际编程当中,有较多细节需要解决: 1.需要考虑响应加工暂停,继续,中断的操作,位置显示等 2.暂停后XY位置需要记录,有可能XY被手动移开 3.加工完整个图形,需要回到一停止位置,以便取料 4.开激光关激光,需要考虑激光的反应时间 5.在实际应用当中,当激光未开启时,为提高速度,可直接采用点位运动 6.需要需要速度的调节处理
注意:以下代码只体现只实用的编程思想,不会能通过编译器的编译
const UINT NORUN =0x0000; //空闲,或中断状态 const UINT RUNNING =0x0001; //运行状态标识 const UINT CONTINUE =0x0002; //继续标识 const UINT PAUSE =0X0003 //暂停标识
UINT m_nWorkStatus = NORUN; //记录加工状态,初始化为NORUN
void OnButtonStart() {//开始按钮(可当暂停,继续,开始用,在某些情况下,继续与暂停隔开较好一些) if( runData.GetSize() < 1 ) { messageBox(“无加工数据或未生成加工路径”,”提示”); return;, }
switch( m_nWorkStatus ){ case NORUN://若空闲,直接加工 m_nWorkStatus = RUNNING; //运行 RunData(); //调用加工核心函数 Break; Case RUNNING://若在运行,则中断 M_nWorkStatus = PAUSE; StopMove( X,Y ); //停止XY驱动 Break; Case PAUSE://若为暂停 M_nWorkStatus = CONTINUE;//继续处理 Break; } }
void OnButtonStop() {//中断加工处理 m_nWorkStatus = NORUN; StopMove(X,Y); }
double fRunSpeed(10.0); //加工速度
void RunData() { //数据runData的定义为: CarrayrunData //CDPoint的定义,可参见[编程技术]的资料 const int nSize = runData.GetSize(); //处理进度度 progress.SetRang(0, nSize);
CDPoint pntBreak; //暂停时记录的断点 BOOL bPause=false; for( int I(0); I { ::DoEvent(); //一个系统消息处理函数 switch( m_nWorkStatus ){ case PAUSE://若为暂停,只管循检系统消息 continue; case CONTINUE: m_nWorkStatus = RUNNING; case RUNNING: { if( IsMove(X,Y) ) break;//如果XY在运行,则继续检测系统消息 const CDPoint &pt = runData[I]; if( I == 0 || bPause ) { bPause = false; //快速到达第一点或断点 I == 0? fast_moveto( pt.x, pt.y )://达到第一点 fast_moveto( pntBreak.x, pntBreak.y);//达到断点 while( IsMove(X,Y) ) :: DoEvent();//等待达到位置 if( m_nWorkStatus == RUNNING ) { OpenLasert( Nio ); //开启激光 Sleep( ti_open ); //开启延时 } continue; } Con_Line_move( pt.x, pt.y, fRunSpeed ); //此处用匀速,因为激光切割速度不快 while( IsMove(X,Y) ) ::DoEvent(); if( m_nWorkStatus == PAUSE ) { CloseLasert( nIO );//关闭激光 Sleep( ti_close );//关闭延时 bPause = true;//有暂停 pntBreak.x = GetX(); pntBreak.y = GetY();//记录断点位置 } else if( m_nWorkStatus == RUNNING ) {//正常完成一个数据点 I ++; Progress.PostMessage( PM_POS, I, 0 ); //更新进度条 } }// end case running }// end switch workstatus }// end for i CloseLasert( nIO );//关闭激光 Sleep( ti_close );//关闭延时 if( m_nWorkStatus != NORUN ) {//顺序加工完 Fast_moveto (stopX,stopY);//达到停止位置 //其它计数处理 } else{ //提示加工中断 }
}
void OnVscrollSpeed( ) {//响应的速度事件调节 fRunSpeed += 1; 或者 fRunSpeed -=1; d1000_change_speed( fRunSpeed );//速度值更改 }
注意: ::DoEvent 函数在[编程技术]中或《编程高手》书中可找到 OpenLasert和CloseLasert函数只完成一个d1000_out_bit操作
Fast_moveto 内含XY两轴点位或插补驱动函数 Con_line_move 内含XY两轴的插补驱动函数(一般为常速)
GetX() 和GetY()函数内含d1000_get_abs_position位置读取函数 IsMove函数内含检测XY两轴运动状态检测函数
五、注意事项 1.本程序未考虑脉冲当量的关系,需要用户自行处理,在此只提供一种编程思路 2.部分参数需要用户通过设定,在此只为简单介绍 3.使用的部分结构需要参考其它资料,或来电咨询。 4.控制操作在实际应用当中,需要改变按钮的文字显示,用户需要留意 5.完好的系统,需要限定速度和限定XY范围 6.在某些激光切割系统中,激光的控制较为复杂,其编程思想基本一致
|