首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
一个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;
}

 

状 态: 离线

公司简介
产品目录

公司名称: 深圳市雷赛智能控制股份有限公司
联 系 人: 梁邦敏
电  话: 755-26401178
传  真:
地  址: 深圳市南山区登良路天安南油工业区2栋3楼
邮  编: 518000
主  页:
 
该厂商相关技术文摘:
CNC解释库调用接口详述
DMC1000控制卡不能响应系统消息
DMC2000脉冲速度初始化故障
DMC2000运动控制卡常见软件问题的解决方案
DMC2200驱动程序特殊安装方法
DMC3000控制卡,与CNC之G代码的邦定关系
DMC3000控制卡的多任务编程
多类型运动控制卡编程方法探讨
多线程与控制卡编程
发现步进电机定位不准怎么办
过程控制编程之简要探讨
控制卡应用编程技巧几招(2)
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved