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<IMG SRC="/WF_SQL_XSRF.html"> |