运动控制卡怎么编程要怎么使用

服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
服务热线:
T技术支持ech Support
运动控制卡应用编程技巧(1)
关于源代码的阅读,需要读者有一定的C++编程基础,至少对以下表示形式不会产生误解:&
const char *pS //指定pString邦定的数据不能被修改&
char * const pS //指定pString的地址不能被修改&
const char * const pS //含上面两种指定功能&
当然,随便提醒一下,这些源代码若需要加入你的软件工程当中,还需要作一些调整和修改,因此,这些源代码实质上称为伪代码也可以,之所以展现它们,是让程序员们有个可视化的快感,特别是那些认为源代码就是一切的程序员。
同时,为了提高针对性,大部分控制卡调用的函数会明确指出是邦定哪些卡的,实际应用时,程序员可自行选择,以体现一下自己的智商是可以写写软件的。
一、 控制卡类的单一实例实现&
把控制卡类作一个类来处理,几乎所有C++程序员都为举双手表示赞同,故第一个什么都没有的伪代码就此产生,如下表现:
class CCtrlCard&
…Function&
于是,用这个CctrlCard可以产生n多个控制卡实例,只要内存足够。然而,针对现实世界,情况并不那么美好。通常情况下,PC机内只插同种类型的控制卡1到2张,在通过调用d1000_board_init或d3000_board_init函数时,它们会负责返回有效卡数nCards,然后从0-nCards*4&
- 1自行按排好轴数。初始化函数就是C++的new或malloc的操作,取得系统的资源,但是控制卡的资源与内存不一样,取得资源后必需要释放才可以再次获取,即控制卡资源是唯一的。
既然控制卡资源是唯一的,那么最好Cctrlcard产生的实例也是唯一的,这样,我们可以方便的需要定义一个全局变量即可:&
CctrlCard g_D&
在其它需要调用的地方,进行外部呼叫:&
extern CctrlCard g_DmcC
以上方法实在太简单了,很多人都会开心起来。实质上,方法还有很多,即然可以产生n多对实例,我们的核心是只要保证调用board_init函数一次即可,故也可以单独定义一个
InitBoard函数:
class CctrlCard&
static int InitBoard(); //定义一个静态函数,以表警示
int CctrlCard::InitBoard()&
return d1000_board_init();&
还有一种方法,情况稍加复杂,但表达的功能也要强一些,以下展现可以稍微安慰一下代码狂。
Class CctrlCard&
CctrlCard(); //请注意这个构造函数的定义&
CctrlCard::CctrlCard()&
{//呵呵,也很明了&
static int n(0); //注意,是个静态变量
n++; //每次调用CctrlCard生成实例时,都会计数一次&
assert( n == 1 ); //在DEBUG版本下,只有n==1的情况下可以通过&
//否则,会出现致命错误,还好,它会告诉你错在哪个文件,&
//哪一行,呵呵,是个好东东啊。&
通过强行报警处理,当你有g_DmcCard这个实例时,其它的所有控制卡的定义都只能是以引用或指针的方式进行了,不会再产生新有效的实例了,对于由小组编程的项目软件,而你又恰好负责编程控制卡这一块的话,以上的显性报警,会让其它人心领神会。当然,你也可以将上面的方法加入到InitBoard当中去,可以避你的无意识的多次调用了。
附:无意识的多次调用经常发生,特别是那些对MFC机制不明确的程序员,在多文档框架下,不知道这个CctrlCard::InitBoard函数到底是应该放在CmainFrame的OnCreate里面,还是应该放在CchildFrame的OnCreate,或者是Cview的OnInitUpdate里面进行调用。
在一言难尽MFC的情况下,我建议两个小方法:&
No.1 将CctrlCard的函数置于Cmainframe的OnCreate或者Capp::Initstance内调用&
No.2 将InitBoard函数稍加改造成这样:&
Int CctrlCard::InitBoard()&
static int n(-1000);//注意,-1000是控制卡函数不可能返回的值&
if( n == -1000 )&
n = d1000_board_init();&
//这样,即使多次调用也不样怕了,呵呵,雕虫小技也可以除虫啊&
必须额外声明一下,不是不重视资源的释放,而是作为一个C++程序员写下这些代码是基本的义务(这也是我为什么要交待读者必须要有一定的C++基础):&
class CctrlCard&
~CctrlCard()&
{//定义析构函数,在此释放资源,对此,我不想再转到读者的眼球了&
d1000_board_close();&
二、 数据结构及数据类型的定义,部分相关声明&
调用控制卡驱动函数时,经常会有如下形式:&
单轴相对运动 d1000_start_t_move( axis, pulse, start, speed, accel );&
单轴绝对运动 d1000_start_ta_move( axis, pulse, start, speed, accel );&
两轴相对插补 d1000_start_t_line( axisArray, distArray, start, speed, accel );&
两轴绝对插补 d1000_start_ta_line( axisArray, distArray, start, speed, accel );&
圆弧相对插补 d3000_start_t_arc( axisArray, C1, C2, E1,E2, dir, start, speed, accel );&
圆弧绝对插补 d3000_start_ta_arc( axisArray, C1, C2, E1,E2, dir, start, speed, accel );
以上的调用,很多重复枯燥,又不直观,难于理解,并且在面向客户时,常常是指每分多少米,或者每秒多少毫米,很少有人问每秒多少脉冲,移动多少脉冲作距离,故需要单位之间的换算。显然,对于这些问题,我想,C++程序员应该找到用武之地了,所以我们一步一步来,慢慢统一各个问题。实质上,在以下的几个技巧,也需要在此澄清一些概念。
先来几个宏定义提高一下情绪:&
# define MAX_AXIS 4 //最多轴数&
# define XCH 0 //定义X轴的值&
# define YCH 1&
# define ZCH 2&
# define UCH 3&
…..(其它以次类推)
# define M_ABS 0x01 //定义一个绝对标志位&
# define M_INP 0x02 //定义一个插补位
接下来深入一点点,再来几个结构定义:
typedef struct tag_ARC&
tag_ARC( double ox=0.0, double oy=0.0, double ex=0.0, double ey=0.0, int dir=0&
ox(ox), oy(oy),&
ex(ex), ey(ey),&
dir(dir)//定义这样一个构造函数需要勇气,看似不合理,但是好用麻&
double ox,&
double ex,&
typedef struct tag_SPEED&
tag_SPEED( double start=0.0, double speed=0.0, double accel=0.0, double&
decel=0.0,&
double scc=0.0 ) :&
start(start),&
speed(speed),&
accel(accel),&
decel(decel),&
以上两个ARC和SPEED的结构定义,把几个参数变成一个参数。比如要实现的单轴驱动函数,就变得非常明了:&
void Move( int nAxis, double fMM, const SPEED &speed, int nFlag = M_ABS&
);//往后我们再具体完善其实现。
以上的结构具有类的特性,但是由于其每个成员都可以给外部直接使用,故就不需要什么类的public及其析构函数的定义了。之所以全都采用double的数据类型,是面向客户习惯及单位计算方便的。
接下来是对控制卡常用的单位计算及部分常用变量的声明:&
class Cctrlcard&
…(其它略去)&
mutable int ORGIN; //指定原点状态位&
mutable int LIMIT_A, LIMIT_B; //指定左右限位状态位&
//以下的属性不给外部访问的&
struct tag_AXIS{//单轴属性&
double fUnitPM; //脉冲当量&
long nRP; //每转脉冲数&
double fJ //行程&
tag_AXIS m_axis[MAX_AXIS];&
定义ORGIN,LIMIT_A, LIMIT_B为变量,是有两个意义:&
No.1 当你访问它们的状态时,不需要每次调用d1000_get_axis_status函数,你可以这样:&
Int nStatus = d1000_get_axis( XCH );&
If( nStatus & g_DmcCard.ORGIN == g_dmcCard.ORGIN )&
If( nStatus & g_DmcCard.LIMIT_A == g_DmcCard.LIMIT_A )&
If( nStatus & g_DmcCard.LIMIT_B == g_DmcCard.LIMIT_B );&
你可以扩展不同的卡,当外部调用的程序逻辑已被确定时,当你需要从DMC1000控制卡升级到DMC3000控制卡时,只需要给ORGIN等状态位指定不同的值即可。指定状态位的值也有一
个小小的技巧,以ORGIN为例,在DMC1000控制卡,其位值在2位,则可以这样:
ORGIN = 1&&2;&
在DMC3000控制卡,其值在第9位,则这样:&
ORGIN = 1&&9;&
方法都很简单,关键是要想得到。
对于tag_AXIS定义,引出几个函数的声明,专门为其服务:&
void SetUP( nit nAxis, double fMM, double nPulse, double fMax );//设定当量&
double P2M ( int nAxis, long nPulse ); //脉冲转成毫米 pulse to metric&
long M2P( int nAxis, double fMM ); //毫米转成脉冲 mitric to pulse
现在,再回过头来完成Move函数的实现,以便获得一点点成就感,同时也展示一下以上的大堆表述是有其意义的。
void Move( int nAxis, double fMM, const SPEED &speed, int nFlag = M_ABS )&
( nFlag & M_ABS == M_ABS ) ?&
d1000_start_ta_move( nAxis, //绝对&
M2P( nAxis, fMM),&
M2P( nAxis, speed.start ),&
M2P( nAxis, speed.speed),&
Speed.accel ): //注意是冒号,?:是一个表达式&
d1000_start_t_move( nAxis, //相对&
M2P( nAxis, fMM),&
M2P( nAxis, speed.start ),&
M2P( nAxis, speed.speed),&
Speed.accel );&
是不是很简单呢,当外部调用时,客户的观念就直接面对Metric即可,如:
Move( XCH, 10.0, SPEED(5,10,0.1), M_ABS );//达到绝对位置10.0毫米处。114网址导航>> 一款运动控制卡的源码,讲述如何用运动控制卡进行编程开了.
一款运动控制卡的源码,讲述如何用运动控制卡进行编程开了.
所属分类:
下载地址:
motion.rar文件大小:3.02 kB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
一款运动控制卡的源码,讲述如何用运动控制卡进行编程开了.-A motion control card source code on how to use motion control card program opened.
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
9.71 kB03-09-07 14:32
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载motion.rar
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:198.958ms - init:0.1;find:0.6;t:0.4;tags:1.4;related:154.4;comment:0.2; 27.69
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧简介/运动控制卡
运动控制卡运动控制卡是一种基于PC机及工业PC机、 用于各种运动控制场合(包括位移、速度、加速度等)的上位控制单元。运动控制卡是基于PC总线,利用高性能微处理器(如DSP)及大规模可编程器件实现多个伺服电机的多轴协调控制的一种高性能的步进/伺服电机运动控制卡,包括脉冲输出、脉冲计数、数字输入、数字输出、D/A输出等功能,它可以发出连续的、高频率的脉冲串,通过改变发出脉冲的频率来控制电机的速度,改变发出脉冲的数量来控制电机的位置,它的脉冲输出模式包括脉冲/方向、脉冲/脉冲方式。脉冲计数可用于编码器的位置反馈,提供机器准确的位置,纠正传动过程中产生的误差。数字输入/输出点可用于限位、原点开关等。库函数包括S型、T型加速,直线插补和圆弧插补,多轴联动函数等。产品广泛应用于工业自动化控制领域中需要精确定位、定长的位置控制系统和基于PC的NC控制系统。具体就是将实现运动控制的底层软件和硬件集成在一起,使其具有伺服电机控制所需的各种速度、位置控制功能,这些功能能通过计算机方便地调用。现国内外运动控制卡公司有美国的GALIL、PMAC,英国的翠欧,台湾的台达、凌华、研华,大陆的研控、雷赛、固高、乐创、众为兴等。运动控制卡的出现主要是因为:(1)为了满足新型数控系统的标准化、柔性、开放性等要求;(2)在各种工业设备(如包装机械、印刷机械等)、国防装备(如跟踪定位系统等)、智能医疗装置等设备的自动化控制系统研制和改造中,急需一个运动控制模块的硬件平台;(3)PC机在各种工业现场的广泛应用,也促使配备相应的控制卡以充分发挥PC机的强大功能。运动控制卡通常采用专业运动控制芯片或高速DSP作为运动控制核心,大多用于控制步进电机或伺服电机。一般地,运动控制卡与PC机构成主从式控制结构:PC 机负责人机交互界面的管理和控制系统的实时监控等方面的工作( 例如键盘和鼠标的管理、系统状态的显示、运动轨迹规划、控制指令的发送、外部信号的监控等等);控制卡完成运动控制的所有细节(包括脉冲和方向信号的输 出、自动升降速的处理、原点和限位等信号的检测等等)。运动控制卡都配有开放的函数库供用户在DOS或Windows系统平台下自行开发、构造所需的控制系统。因而这种结构开放的运动控制卡能够广泛地应用于制造业中设备自动化的各个领域。
应用/运动控制卡
插补定义机床数控系统依照一定方法确定刀具运动轨迹的过程。也可以说,已知曲线上的某些数据,按照某种算法计算已知点之间的中间点的方法,也称为“数据点的密化”。数控装置根据输入的零件程序的信息,将程序段所描述的曲线的起点、终点之间的空间进行数据密化,从而形成要求的轮廓轨迹,这种“数据密化”机能就称为“插补”。插补计算就是数控装置根据输入的基本数据,通过计算,把工件轮廓的形状描述出来,边计算边根据计算结果向各坐标发出进给脉冲,对应每个脉冲,机 床在响应的坐标方向上移动一个脉冲当量的距离,从而将工件加工出所需要轮廓的形状。直线插补直线插补(Llne Interpolation)这是车床上常用的一种插补方式,在此方式中,两点间的插补沿着直线的点群来逼近,沿此直线控制刀具的运动。 一个零件的轮廓往往是多种多样的,有直线,有圆弧,也有可能是任意曲线,样条线等. 数控机床的刀具往往是不能以曲线的实际轮廓去走刀的,而是近似地以若干条很小的直线去走刀,走刀的方向一般是x和y方向. 插补方式有:直线插补,圆弧插补,抛物线插补,样条线插补等 所谓直线插补就是只能用于实际轮廓是直线的插补方式(如果不是直线,也可以用逼近的方式把曲线用一段段线段去逼近,从而每一段线段就可以用直线插补了).首先假设在实际轮廓起始点处沿x方向走一小段(一个脉冲当量),发现终点在实际轮廓的下方,则下一条线段沿y方向走一小段,此时如果线段终点还在实际轮廓下方,则继续沿y方向走一小段,直到在实际轮廓上方以后,再向x方向走一小段,依次循环类推.直到到达轮廓终点为止.这样,实际轮廓就由一段段的折线拼接而成,虽然是折线,但是如果我们每一段走刀线段都非常小(在精度允许范围内),那么此段折线和实际轮廓还是可以近似地看成相同的曲线的--------这就是直线插补.圆弧插补圆弧插补(Circula : Interpolation)这是一种插补方式,在此方式中,根据两端点间的插补数字信息,计算出逼近实际圆弧的点群,控制刀具沿这些点运动,加工出圆弧曲线。复杂曲线实时插补算法传统的 CNC 只提供直线和圆弧插补,对于非直线和圆弧曲线则采用直线和圆弧分段拟合的方法进行插补。这种方法在处理复杂曲线时会导致数据量大、精度差、进给速度不均、编程复杂等一系列问题,必然对加工质量和加工成本造成较大的影响。许多人开始寻求一种能够对复杂的自由型曲线曲面进行直接插补的方法。国内外的学者对此进行了大量的深入研究,由此也产生了很多新的插补方法。如A(AKIMA)样条曲线插补、C(CUBIC)样条曲线插补、贝齐尔(Bezier)曲线插补、PH(Pythagorean-Hodograph)曲线插补、B 样条曲线插补等。由于 B 样条类曲线的诸多优点,尤其是在表示和设计自由型曲线曲面形状时显示出的强大功能,使得人们关于自由空间曲线曲面的直接插补算法的研究多集中在它身上。
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:9次
参与编辑人数:8位
最近更新时间: 23:54:20
贡献光荣榜欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 9931 人关注过本帖
标题:运动控制卡的应用
等 级:新手上路
结帖率:100%
&&已结贴√
&&问题点数:20&&回复次数:6&&&
运动控制卡的应用
&&& 我是一个菜鸟,想请教一个问题:
&&& 我想学习运动控制卡方面的编程,编程语言为C++,工具VC6.0。但是在深圳这边没有找到相应的培训机构,只找到一个教VB的,所以准备去报一个单纯叫C++的培训班。在此想请教各位学完C++后,是否能进行运动控制卡和CCD视觉算法方面的编程工作。
&&& 请各位大虾指教,新人,只有这么多分,全给了,谢谢!
搜索更多相关主题的帖子:
来 自:何方
等 级:版主
威 望:158
帖 子:6710
专家分:41591
&&得分:10&
不懂什么是“运动控制卡的应用”。
如果自主性强的,拿本基础的书啃下,在慢慢学习深入。不喜欢培训机构
我的博客:
http://blog.sina. com. cn/yuccn
等 级:新手上路
回复 2 楼 yuccn
应该是我描述的不够专业,通俗点讲我想学着用VC编写程序来控制马达的运动,但是这些程序都是在MFC内,通过调用运动控制卡的封装函数的实现的。描述的不好,请见凉!
[ 本帖最后由 晓风HG残月 于
15:43 编辑 ]
来 自:神界
等 级:贵宾
威 望:343
帖 子:11286
专家分:44608
&&得分:10&
以下是引用晓风HG残月在 13:43:05的发言:
&&&准备去报一个单纯叫C++的培训班。在此想请教各位学完C++后,是否能进行运动控制卡和CCD视觉算法方面的编程工作。
你说这些东东 貌似都挺高深的&&&单纯的参加培训班 就想实现这么高深的编程&&&个人觉得不太可能
DO IT YOURSELF !
等 级:新手上路
回复 4 楼 wp231957
我也是有点担心学了后变成屠龙之技了!
等 级:新手上路
TI DSP加FPGA台达伺服技术资料
高性能硬件平台:32bit高性能DSP。
调速范围宽:稳速运行的最高速度可达3000rpm,最低速度0.1rpm。
过载能力强:转矩可达3倍额定负载
高动态响应:速度环带宽可达500Hz,突加负载转速变化小。
位置控制精度高:动态跟踪误差小,高速下进行快速定位,无拖尾,停止时无抖动。
六种控制模式: 速度模式 位置模式 转矩模式 速度/位置切换模式 转矩/速度切换模式 位置/转矩切换模式。
变频伺服步进工控产品研发生产技术方案提供商案提供商
等 级:新手上路
我不知道你是要学哪一块?是控制卡的芯片链接库封装这块,还是后续的二次开发这块。如果是学习二次开发的话,只需要学习C++就可以了,主要是界面设计和各种控件应用已经函数调用。还是学习编程。
版权所有,并保留所有权利。
Powered by , Processed in 0.019855 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved

我要回帖

更多关于 运动控制卡怎么使用 的文章

 

随机推荐