共四部分(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; }
|