📄 源代码.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 + -