| CNC解释库调用接口详述 
 
 以下展示库函数接口的意义及相关示例编程的部分代码,关于CNC解释库的完整头文件DMCNC.H,用户可以咨询本公司,公司视情况会进行相应的处理。
 声明一点,本库暂支持C++语言。
 
 # define CW -1
 # define CCW 1
 //以上两个宏定义值,为圆弧的顺逆时走向
 
 struct D2POINT //二维点
 {
 double x,y;
 };
 二维点的结构,主要用于平面设备处理
 
 struct D3POINT: public D2POINT //三维点
 {
 double z;
 };
 三维点的结构,可用于浮点雕刻与点胶
 
 struct tag_ARC
 {
 int nType; //方向
 
 D2POINT ptStart; //起点
 D2POINT ptOrgin; //圆心
 D2POINT ptEnd; //终点
 };
 圆弧结构,适合本公司DMC3000控制卡对其坐标关系的定义,唯参数nType方向需要对应函数的0或1的逻辑判断,往后的例子会说明这一点的。
 
 struct tag_CMD //CNC指令结构
 {
 char cmd; //G,M,F,S等指令
 int nCode; //指令值
 
 int nAxisBit; //驱动轴号位(X,Y,Z,U,A)
 
 D3POINT ptStart; //坐标1
 D3POINT ptEnd; //坐标2
 D3POINT ptOrgin; //坐标3
 
 double fValue; //一个浮点保留接口
 };
 CNC指令结构,重点说明一下:
 cmd 可以是G,M,C,F,S等设备指令,若客户想增加其它指令,可通知本公司进行扩充即可。
 nCode 指令值,如G指令,可以有00,01,02,03,常表述为G00,G01,G02,G03
 nAxisBit 当前行的有效驱动轴,此变量的提取可由函数JP_GET_AXIS进行提取
 ptStart, ptEnd 分别为直线或圆弧的起点和终点
 ptOrgin 仅为圆弧的圆心
 fValue 专门为带有浮点值的指令保留,如C代码,可能有表示为 :C0.317
 
 以下展示一下,tag_CMD的一般用法操作(用以加工的):
 int CNC_MARK( tag_CMD &cmd, tag_CONTROL &ctrlItem )
 {//此函数不断接受到新的CNC指令
 //g_DmcCard为一个控制类的实例,如TD3000 g_DmcCard;
 //
 switch( cmd.cmd ){
 case ’G’:
 {// 以G代码为例,以下代码为对G代码的处理
 if( ctrlItem.nStatus != tag_CONTROL::Running )
 return ctrlItem.nStatus;
 while( ctrlItem.nStatus != tag_CONTROL::NoRun )
 {
 DoEvents();//此函数可参见我的相关文章
 if( ctrlItem.nStatus==tag_CONTROL::Pause ) continue;
 //处理暂停的代码
 if( g_DmcCard.IsRunning() != 1 ) break;
 }
 if( ctrlItem.nStatus == tag_CONTROL::Running )
 {
 ctrlItem.cmdCurrent = cmd;//保存当前执行的CNC指令
 return DoGCode( cmd, ctrlItem );
 //处理G代码函数(用户自定)
 }
 } break;
 case ’S’://其它代码处理
 case ’M’:
 break;
 }
 return ctrlItem.nStatus;
 }
 
 //处理G代码的函数
 int DoGCode( tag_CMD &cmd, tag_CONTROL &ctrlItem )
 {
 tag_PARA ¶ = g_Para;//一个参数对象,内容由用户决定,在此仅作为示例
 
 C3DPoint pt( para.pntWorkOrgin.x, para.pntWorkOrgin.y, para.fZLimit);
 //double fsafePos = para.fZLimit - para.fZUpSafe;
 
 switch( cmd.nCode ){
 case 0:
 {//G00指令
 
 short nAxis(cmd.nCode>>8),i(0);
 short axisArray[4];
 double pos[4];
 if( (nAxis&0x100) != 0 ){
 axisArray[i]=XCH;
 pos[i++] = cmd.ptStart.x+g_Para.pntWorkOrgin.x;
 }
 if( (nAxis&0x010) != 0 ){
 axisArray[i]=YCH;
 pos[i++] = cmd.ptStart.y+g_Para.pntWorkOrgin.y;
 }
 if( (nAxis&0x001) != 0 ){
 axisArray[i]=ZCH;
 pos[i++] = pt.z-cmd.ptStart.z ;
 }
 
 g_DmcCard.MoveES( i, axisArray, pos,
 g_Para.jumpSpeed,
 false );
 }
 break;
 case 1:
 {//G01指令
 g_DmcCard.MoveM3( XCH, YCH, ZCH,
 cmd.ptEnd.x+g_Para.pntWorkOrgin.x,
 cmd.ptEnd.y+g_Para.pntWorkOrgin.y,
 pt.z-cmd.ptEnd.z,
 g_Para.workSpeed,
 true );
 }
 break;
 case 2://顺圆弧,注意方向, tag_CARC是在控制卡类定义的结构
 //0为顺时,1为逆时
 g_DmcCard.Arc( XCH, YCH,
 tag_CARC(cmd.ptOrgin.x+g_Para.pntWorkOrgin.x,
 cmd.ptOrgin.y+g_Para.pntWorkOrgin.y,
 cmd.ptEnd.x+g_Para.pntWorkOrgin.x,
 cmd.ptEnd.y+g_Para.pntWorkOrgin.y,0),
 g_Para.workSpeed, 0.1 );
 break;
 case 3://逆圆弧
 g_DmcCard.Arc( XCH, YCH,
 tag_CARC(cmd.ptOrgin.x+g_Para.pntWorkOrgin.x,
 cmd.ptOrgin.y+g_Para.pntWorkOrgin.y,
 cmd.ptEnd.x+g_Para.pntWorkOrgin.x,
 cmd.ptEnd.y+g_Para.pntWorkOrgin.y,1),
 g_Para.workSpeed, 0.1 );
 break;
 default: break;
 }
 return ctrlItem.nStatus;
 
 }
 
 以上基本显示一个G代码处理过程,若要处理暂停/继续,也很简单,等介绍tag_CONTROL结构时,再举例说明。
 struct tag_FILEACTION
 {
 enum{ Inital, Over, Process };
 
 int nAction;
 
 int nFilePosition;//文件当前位置
 int
 |