共四部分(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//圓弧結(jié)構(gòu) { 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//速度結(jié)構(gòu) { 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 ); //脈沖轉(zhuǎn)毫米 long M2P( int nAxis, double fMM ); //毫米轉(zhuǎn)脈沖 int GetOut( int nIO ); static double SoftLimit( double fCur, int dir, double fMin, double fMax );
protected: long m_nOutStatus;//保存輸出狀態(tài)
struct tag_AXIS{//單軸信息 double fUnitPM; //脈沖當量 long nRP; //每轉(zhuǎn)脈沖數(shù) 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 ) //脈沖轉(zhuǎn)毫米 { return double(nPulse) / m_axis[ nAxis ].fUnitPM; } long CCtrlCard::M2P( int nAxis, double fMM ) //毫米轉(zhuǎn)脈沖 { 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 );
//驅(qū)動函數(shù) 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/*聯(lián)動或插補*/ ); int MoveM3( short nAxis1, short nAxis2, short nAxis3,//三軸驅(qū)動 double pos1, double pos2, double pos3, const tag_SPEED &speed, BOOL bInp = true ); int MoveES( short nAxises, short *pAxis, double *pPos,//多軸驅(qū)動 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 ); //取得指定軸狀態(tài) int GetAxisStatus( int nAxis ); //返回當前速度 double GetSpeed( int nAxis );
//數(shù)字IO函數(shù) 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; }
//驅(qū)動函數(shù) 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 /*聯(lián)動或插補*/ ) { 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,//三軸驅(qū)動 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,//多軸驅(qū)動 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 ) {// 入口參數(shù)io的范圍: 1 - n # ifdef USERCARD
return d3000_in_bit( nIO );
# endif return nIO; }
|