激光切割软件的开发参考资料

作者:本网编辑 文章来源:MM现代制造 发布时间:2010-08-05
分享到

  (以下控制以DMC1000控制卡为例)

  一、功能和工艺要求

  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.在某些激光切割系统中,激光的控制较为复杂,其编程思想基本一致


收藏
赞一下
0