⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 源代码.txt

📁 一款运动控制卡的源码,讲述如何用运动控制卡进行编程开了.
💻 TXT
字号:
  
  一个DMC3000控制卡类的完全源代码   

--------------------------------------------------------------------------------


 

长话短说,直截了当,共四部分(VC++6.0)。 
一、 tag_CARD.h文件源代码 
# ifndef ___CONTROL_CARD_H___ 
# define ___CONTROL_CARD_H___ 

# define MAX_AXIS 4 
# define XCH 0 
# define YCH 1 
# define ZCH 2 
# define UCH 3 

# define NO_CARD 0 
# define DMC1000 1 
# define DMC2000 2 
# define DMC3000 3 
# define DMC1408 4 
# define DMC5000 5 

# define USERCARD //是否选用 

struct tag_CARC//圆弧结构 
{ 
tag_CARC(); 
tag_CARC( double ox, double oy, double ex, double ey, int dir ); 
double ox,oy; 
double ex,ey; 
int dir; 
}; 


struct tag_SPEED//速度结构 
{ 
tag_SPEED( double start=5, double speed=10, double accel=0.1 ); 
//, double decel, double scc ); 

double start; 
double speed; 
double accel; 
// double decel; 
// double scc; 
}; 

//控制卡基类 

class CCtrlCard 
{ 
public: 
CCtrlCard(); 
virtual ~CCtrlCard(); 

int m_nType; 
mutable int ORGIN; 
mutable int LIMIT_A, LIMIT_B; 

public: 
//单位计算 
double SetUP( int nAxis, double fMM, long nPulse, double fMax );//设定脉冲当量 
double P2M( int nAxis, long nPulse ); //脉冲转毫米 
long M2P( int nAxis, double fMM ); //毫米转脉冲 
int GetOut( int nIO ); 
static double SoftLimit( double fCur, int dir, double fMin, double fMax ); 

protected: 
long m_nOutStatus;//保存输出状态 

struct tag_AXIS{//单轴信息 
double fUnitPM; //脉冲当量 
long nRP; //每转脉冲数 
double fMaxLen; //有效行程范围 
}m_axis[MAX_AXIS]; 
}; 


# endif 



二、 tag_CARD.CPP文件源代码 
# include "stdafx.h" 
# include "tag_card.h" 


tag_CARC::tag_CARC():ox(0),oy(0),ex(0),ey(0),dir(0) 
{ 
} 

tag_CARC::tag_CARC( double ox, double oy, double ex, double ey, int dir ): 
ox(ox),oy(oy),ex(ex),ey(ey),dir(dir) 
{ 
} 


tag_SPEED::tag_SPEED( double start, double speed, double accel ): 
//, double decel, double scc ): 
start(start), 
speed(speed), 
accel(accel) 
// decel(decel), 
//scc(scc) 
{ 
} 


CCtrlCard::CCtrlCard():m_nType(NO_CARD), 
ORGIN(1<<9), 
LIMIT_A(1<<2), 
LIMIT_B(1<<3) 
{ 

for( int i(0); i { 
m_axis[i].nRP = 3200; 
m_axis[i].fUnitPM = m_axis[i].nRP/5; 

m_axis[i].fMaxLen = 500; 
} 
m_nOutStatus = 0x00000000; 
} 

CCtrlCard::~CCtrlCard() 
{ 

} 


int CCtrlCard::GetOut( int nIO ) 
{ 
static int a; 
a = 1<<(nIO-1); 
a &= m_nOutStatus; 
return a!=0; 
} 

double CCtrlCard::SoftLimit( double fCur, int dir, double fMin, double fMax ) 
{ 
if( dir < 0 ) 
return fMin-fCur; 
else 
return fMax-fCur; 
} 

//单位计算 setunitpulse 
double CCtrlCard::SetUP( int nAxis, double fMM, long nPulse, double fMax )//设定脉冲当量 
{ 
if( fMM < 0.0001 ) fMM = 0.0001; 
if( nPulse == 0 ) 
{ 
m_axis[ nAxis ].nRP = 360; 
m_axis[ nAxis ].fUnitPM = fMM; 
} 
else{ 
if( nPulse < 20 ) nPulse = 20; 
m_axis[ nAxis ].nRP = nPulse; 
m_axis[ nAxis ].fUnitPM = double(nPulse)/fMM; 
} 
m_axis[ nAxis ].fMaxLen = fMax; 

return m_axis[ nAxis ].fUnitPM; 
} 
double CCtrlCard::P2M( int nAxis, long nPulse ) //脉冲转毫米 
{ 
return double(nPulse) / m_axis[ nAxis ].fUnitPM; 
} 
long CCtrlCard::M2P( int nAxis, double fMM ) //毫米转脉冲 
{ 
return long( fMM * m_axis[ nAxis ].fUnitPM ); 
} 


三、 TD3000.h文件源代码 
# ifndef ___CONTROL_DMC3000_HEAD___ 
# define ___CONTROL_DMC3000_HEAD___ 


# include "tag_card.h" 

class CD3000: public CCtrlCard 
{ 
public: 
CD3000(); 
~CD3000(); 

// init card 
int InitBoard( int nCardType ); 


//驱动函数 
int MoveMM( short nAxis, double fMM, const tag_SPEED &speed );//单轴运行 
int MoveM2( short nAxis1, short nAxis2, double pos1, double pos2,//两轴运行 
const tag_SPEED &speed, BOOL bInp = true/*联动或插补*/ ); 
int MoveM3( short nAxis1, short nAxis2, short nAxis3,//三轴驱动 
double pos1, double pos2, double pos3, 
const tag_SPEED &speed, BOOL bInp = true ); 
int MoveES( short nAxises, short *pAxis, double *pPos,//多轴驱动 
const tag_SPEED &speed, BOOL bInp = true ); 
int Arc( short nAxis1, short nAxis2,//圆弧插补 
const tag_CARC &arc, const tag_SPEED &speed, 
double dt = 0.0 ); 
//位置处理 
double SetPosition( int nAxis, double fMM, BOOL bCmd = TRUE ); 
double GetPosition( int nAxis, BOOL bCmd = TRUE ); 

//停止 
int Stop( int nAxis, double fTime ); 

//是否在运动 
int IsRunning( int nAxis = -1 ); 
//取得指定轴状态 
int GetAxisStatus( int nAxis ); 
//返回当前速度 
double GetSpeed( int nAxis ); 

//数字IO函数 
int WriteBit( int nIO, int nStatus ); 
int ReadBit( int nIO ); 

}; 

# endif 

四、 TD3000.CPP文件源代码 
# include "stdafx.h" 
# include "dmc3000.h" 
# include "td3000.h" 
extern BOOL bSCavse; 

CD3000::CD3000() 
{ 
} 
CD3000::~CD3000() 
{ 
d3000_board_close(); 
} 

int CD3000::InitBoard( int nCardType ) 
{ 
m_nType = nCardType; 
if( d3000_board_init() <= 0 ){ 
m_nType = -1; 
return m_nType; 
} 
for( int i(0); i<4; i++) 
{ 
d3000_set_pls_outmode( i, 0 ); 
d3000_set_home( i, 0, 1 ); 
} 
ORGIN = (1<<9); 
LIMIT_A = (1<<2); 
LIMIT_B = (1<<3); 
return m_nType; 
} 

//驱动函数 
int CD3000::MoveMM( short nAxis, double fMM, const tag_SPEED &speed )//单轴运行 
{ 

// if( speed.scc < 0.0001 ) 
if( bSCavse != TRUE ) 
{ 
d3000_start_t_move( nAxis, M2P( nAxis, fMM ), 
M2P(nAxis, speed.start), 
M2P(nAxis, speed.speed), 
speed.accel, 
speed.accel); 
} 
else{ 
d3000_start_s_move( nAxis, M2P( nAxis, fMM ), 
M2P(nAxis, speed.start), 
M2P(nAxis, speed.speed), 
speed.accel, 
speed.accel/2.0); 
} 
return nAxis; 

} 
int CD3000::MoveM2( short nAxis1, short nAxis2, double pos1, double pos2,//两轴运行 
const tag_SPEED &speed, BOOL bInp /*联动或插补*/ ) 
{ 
short axisArray[]={ nAxis1, nAxis2, 2 }; 
double posiArray[]={ pos1, pos2, 0 }; 
return MoveES( 2, axisArray, posiArray, speed, bInp ); 
} 
int CD3000::MoveM3( short nAxis1, short nAxis2, short nAxis3,//三轴驱动 
double pos1, double pos2, double pos3, 
const tag_SPEED &speed, BOOL bInp ) 
{ 
short axisArray[]={ nAxis1, nAxis2, nAxis3 }; 
double posiArray[]={ pos1, pos2, pos3 }; 
return MoveES( 3, axisArray, posiArray, speed, bInp ); 
} 
int CD3000::MoveES( short nAxises, short *pAxis, double *pPos,//多轴驱动 
const tag_SPEED &speed, BOOL bInp ) 
{ 
// if( nAxises > 3 || nAxises <2) return 0; 
// bInp = true; 

if( bInp ){//插补 
short *axisArray = pAxis; 
double *pos = pPos; 
double accel = speed.accel; 
double decel = speed.accel; 
//double sc = speed.scc; 
if( decel < 0.001 ) decel = 0.001; 
if( accel <0.001 ) { 
accel = 0.002; 
// sc = 0.001; 
} 

// if( 1 ){ 
if( bSCavse != TRUE ){ 

nAxises == 2 ? 
d3000_start_ta_line2( axisArray, 
M2P(axisArray[0], pos[0] ), 
M2P(axisArray[1], pos[1] ), 
M2P(axisArray[0], speed.start), 
M2P(axisArray[0], speed.speed), 
accel, 
decel)://T轴插补 
d3000_start_ta_line3( axisArray, 
M2P(axisArray[0], pos[0] ), 
M2P(axisArray[1], pos[1] ), 
M2P(axisArray[2], pos[2] ), 
M2P(axisArray[0], speed.start), 
M2P(axisArray[0], speed.speed), 
accel, 
decel);//T三轴插补 
} 
else{ //S形插补 
nAxises == 2 ? 
d3000_start_sa_line2( axisArray, 
M2P(axisArray[0], pos[0] ), 
M2P(axisArray[1], pos[1] ), 
M2P(axisArray[0], speed.start), 
M2P(axisArray[0], speed.speed), 
accel, 
decel)://S轴插补 
d3000_start_sa_line3( axisArray, 
M2P(axisArray[0], pos[0] ), 
M2P(axisArray[1], pos[1] ), 
M2P(axisArray[2], pos[2] ), 
M2P(axisArray[0], speed.start), 
M2P(axisArray[0], speed.speed), 
accel, 
accel/2.0 );//S莆三轴插补 
} 
return nAxises; 
} 

for(int i(0); i MoveMM( pAxis[i], pPos[i]-GetPosition(pAxis[i],true), speed ); 
return nAxises; 
} 
int CD3000::Arc( short nAxis1, short nAxis2,//圆弧插补 
const tag_CARC &arc, const tag_SPEED &speed, 
double dt) 
{ 
/* 
short axisArray[]={ nAxis2, nAxis1 }; 
d3000_start_t_arc( axisArray, 
M2P(nAxis2, arc.oy), 
M2P(nAxis1, arc.ox), 
M2P(nAxis2, arc.ey), 
M2P(nAxis1, arc.ex), 
arc.dir==0?1:0, 
M2P(nAxis1, speed.start), 
M2P(nAxis1, speed.speed), 
speed.accel, 
speed.decel); 
/*/ 
short axisArray[]={ nAxis1, nAxis2 }; 
d3000_start_t_arc( axisArray, 
M2P(nAxis1, arc.ox), 
M2P(nAxis2, arc.oy), 
M2P(nAxis1, arc.ex), 
M2P(nAxis2, arc.ey), 
arc.dir, 
M2P(nAxis1, speed.start), 
M2P(nAxis1, speed.speed), 
speed.accel, 
speed.accel); 

//*/ 
return 1; 
} 

//位置处理 
double CD3000::SetPosition( int nAxis, double fMM, BOOL bCmd ) 
{ 
long nPulse = M2P( nAxis, fMM ); 
double fPos = GetPosition( nAxis, bCmd ); 


bCmd == TRUE ? 
d3000_set_command_pos( nAxis, nPulse ): 
d3000_set_encoder_pos( nAxis, nPulse ); 

return fPos; 
} 
double CD3000::GetPosition( int nAxis, BOOL bCmd ) 
{ 
static long nPulse = 0; 

nPulse = (bCmd == TRUE) ? 
d3000_get_command_pos( nAxis ): 
d3000_get_encoder_pos( nAxis ); 

return P2M( nAxis, nPulse ); 
} 

//停止 
int CD3000::Stop( int nAxis, double fTime ) 
{ 

d3000_decel_stop( nAxis, fTime ); 
return nAxis; 

} 
//是否在运动 
int CD3000::IsRunning( int nAxis ) 
{ 

if( nAxis != -1 ){ 
return d3000_check_done( nAxis ) == 1; 
} 
return d3000_check_done( XCH ) == 1 
|| d3000_check_done( YCH ) == 1 
|| d3000_check_done( ZCH ) == 1; 

} 

int CD3000::GetAxisStatus( int nAxis ) 
{ 

static int status(0); 
status = d3000_get_axis_status( nAxis ); 
if( !(status&ORGIN) ) status |= ORGIN; 
else status &=~ORGIN; 
return status; 

} 

double CD3000::GetSpeed( int nAxis ) 
{ 
return P2M( nAxis, d3000_get_speed( nAxis ) ); 
} 
int CD3000::WriteBit( int nIO, int nStatus ) 
{ 
if( nStatus ){ 
m_nOutStatus |= (1< } 
else{ 
m_nOutStatus &= (~(1< } 
# ifdef USERCARD 

d3000_out_bit( nIO, nStatus ); 

# endif 
return (int)m_nOutStatus; 
} 

int CD3000::ReadBit( int nIO ) 
{// 入口参数io的范围: 1 - n 
# ifdef USERCARD 

return d3000_in_bit( nIO ); 

# endif 
return nIO; 
} 
 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -