运动控制卡应用编程技巧

合集下载

MPC08D 运动控制器 编程手册说明书

MPC08D 运动控制器 编程手册说明书

编程手册(0.3版)版权申明乐创自动化技术股份有限公司保留所有权利乐创自动化技术股份有限公司(以下简称乐创自动化公司)保留在不事先通知的情况下,修改本手册中的产品和产品规格等文件的权利。

乐创自动化公司不承担由于使用本手册或本产品不当,所造成直接的、间接的、附带的或相应产生的损失或责任。

乐创自动化公司具有本产品及其软件的专利权、版权和其它知识产权。

未经授权,不得直接或间接地复制、制造、加工、使用本产品及其相关部分。

前言感谢购买MPC08D 运动控制器!MPC08D 是本公司研制的一款高性价比通用控制器。

本编程手册描述MPC08D 运动指令的使用。

使用前请充分理解MPC08D 的使用功能。

安全警告注意以下警告,以免伤害操作人员及其他人员,防止机器损坏。

◆下面的“危险”和“警告”符号是按照其事故危险的程度来标出的。

◆下列符号指示哪些是禁止的,或哪些是必须遵守的。

常规安全概要指示一个潜在的危险情况,如果不避免,将导致死亡或严重伤害。

危险指示一个潜在的危险情况,如果不避免,将导致轻度或中度伤害,或物质损坏。

警告这个符号表示禁止操作。

这个符号表示须注意的操作。

请查看下列安全防范措施以避免受伤害并防止对本产品或任何与其相连接的产品造成损伤。

为避免潜在的危险,请按详细说明来使用本产品。

使用正确的电源线。

请使用满足国家标准的电源线。

正确地连接和断开。

先将控制卡输出连接至转接板,再将电机、驱动器连接到转接板,最后开启电源。

断开时先关闭外部电源,再断开电机、驱动器与转接板的连接,最后断开控制卡与转接板的连接。

当有可疑的故障时不要进行操作。

如果您怀疑本产品有损伤,请让有资格的服务人员进行检查。

不要在湿的/潮湿环境下操作。

不要在爆炸性的空气中操作。

保持产品表面清洁和干燥。

防止静电损伤。

静电释放(ESD)可能会对运动控制器及其附件中的元件造成损伤。

为了防止ESD,请小心处理控制器元件,不要触摸控制器上元器件。

不要将控制器放置在可能产生静电的表面。

运动控制卡应用编程技巧

运动控制卡应用编程技巧

运动控制卡应用编程技巧内容来源网络,由“深圳机械展(11万㎡,1100多家展商,超10万观众)”收集整理!更多cnc加工中心、车铣磨钻床、线切割、数控刀具工具、工业机器人、非标自动化、数字化无人工厂、精密测量、3D打印、激光切割、钣金冲压折弯、精密零件加工等展示,就在深圳机械展.关于源代码的阅读,需要读者有一定的C++编程基础,至少对以下表示形式不会产生误解:const char *pString; //指定pString邦定的数据不能被修改char * const pString; //指定pString的地址不能被修改const char * const pString; //含上面两种指定功能当然,随便提醒一下,这些源代码若需要加入你的软件工程当中,还需要作一些调整和修改,因此,这些源代码实质上称为伪代码也可以,之所以展现它们,是让程序员们有个可视化的快感,特别是那些认为源代码就是一切的程序员。

同时,为了提高针对性,大部分控制卡调用的函数会明确指出是邦定哪些卡的,实际应用时,程序员可自行选择,以体现一下自己的智商是可以写写软件的。

一、控制卡类的单一实例实现把控制卡类作一个类来处理,几乎所有C++程序员都为举双手表示赞同,故第一个什么都没有的伪代码就此产生,如下表现:class CCtrlCard{public:…Functionpublic:…attrib}于是,用这个CctrlCard可以产生n多个控制卡实例,只要内存足够。

然而,针对现实世界,情况并不那么美好。

通常情况下,PC机内只插同种类型的控制卡1到2张,在通过调用d1000_board_init或d3000_board_init函数时,它们会负责返回有效卡数nCards,然后从0-nCards*4- 1自行按排好轴数。

初始化函数就是C++的new或malloc的操作,取得系统的资源,但是控制卡的资源与内存不一样,取得资源后必需要释放才可以再次获取,即控制卡资源是唯一的。

运动控制卡应用编程技巧

运动控制卡应用编程技巧

运动控制卡应用编程技巧1.熟悉运动控制卡的指令集和接口:不同的运动控制卡有不同的指令和接口,首先需要熟悉所使用的运动控制卡的指令和接口。

这样可以更好地理解和掌握编程时的参数设置和指令调用。

2. 使用合适的编程语言:选择适合的编程语言可以更加方便地开发运动控制卡的应用程序。

常用的编程语言有C/C++、Python等。

其中C/C++的性能比较高,适合对实时性要求较高的应用场景;Python则具有简洁易读的特点,适合快速开发和调试。

3.精确控制运动参数:在运动控制卡的编程中,控制运动参数的精确性关系到设备的稳定性和运行效果。

要尽量准确地设置加速度、减速度、速度和位置等参数,并根据具体应用场景进行调整。

在编写控制程序时,可以通过采样和调试等手段来实现精确控制。

4.实现实时控制:对于需要实时控制的场景,需要特别注意处理程序的响应速度。

在编程中,可以使用多线程或中断控制的方式来实现实时性要求,确保控制程序能及时响应和处理运动控制卡的指令。

5.异常处理和错误检测:运动控制卡的编程过程中,需要时刻关注可能出现的异常情况和错误。

在程序中加入相应的异常处理和错误检测机制,可以及时发现和解决问题,提高系统的稳定性和可靠性。

6.数据存储和分析:对于一些特殊应用场景,可能需要将运动控制卡的数据进行存储和分析。

在编程中,可以设置数据采集和存储的机制,并使用相应的分析工具对数据进行处理和分析,从而为后续的优化和决策提供依据。

7.优化程序性能:为了提高运动控制卡应用程序的性能,可以采取一些优化措施。

比如使用合适的数据结构、减少不必要的计算、提高算法效率等。

通过优化程序性能,可以提高系统的响应速度和效率,提升运动设备的运行效果。

总的来说,编程运动控制卡需要熟悉控制卡的指令和接口,选择合适的编程语言,精确控制运动参数,实现实时控制,处理异常和错误,进行数据存储和分析,并优化程序性能。

通过合理应用这些技巧,可以有效地开发和控制运动设备,提高自动化设备的性能和效率。

雷赛运动控制卡应用程序开发注意事项

雷赛运动控制卡应用程序开发注意事项

发布时间:2011年6月1日雷赛科技刘玉平概述:对于一些初次使用雷赛运动控制产品的客户,由于对本公司产品的特点以及程序开发流程不够熟悉,在应用程序的开发过程中,难免会疏漏一些细节,从而产生各种问题,浪费很多宝贵的时间。

如果在应用程序开发前,就可以考虑到那些既重要又容易疏漏的细节,这样可以避免很多不必要的问题产生,从而大大缩短程序的开发周期。

本文总结以往的经验,以雷赛运动控制卡DMC2410B为例,为客户在开发应用程序时的初始化过程给出了一些参考与建议(其他产品与此类似),其中包括运动控制卡的初始化、特殊参数的设置及各种信号的设置,如图1虚线框内所示,这些处理过程必须加载至应用程序的初始化过程中,不同编程环境下,应用程序的初始化过程略有不同,例如在VB6.0编程环境下,须在Form_Load()函数中做程序的初始化处理,而在VC6.0编程环境下,须在OnInitDialog()函数中做程序的初始化处理。

图1 DMC2410B控制卡应用程序开发流程图1所示的控制卡初始化过程中,实线框内所示的参数设置或特殊信号的设置必须在初始化过程中加以处理,而虚线框内的信号在未选择使用时,可以不用设置,而当选择使用这些信号时,必须进行正确设置。

下面对这些初始化过程的方法及必要性做出简要的说明。

一、初始化运动控制卡相关函数:WORD d2410_board_init (void)函数功能:为控制卡分配系统资源并初始化控制卡;若在应用程序中未初始化控制卡,则系统无法为控制卡分配资源,导致控制卡无法正常使用,程序在运行时提示错误,弹出如图2所示对话框:图2 未初始化控制卡时的错误提示注意:程序在结束运行时,必须关闭运动控制卡,以释放系统资源,否则控制卡将一直占用系统资源,导致再次运行该应用程序时产生错误。

关闭控制卡的方法及说明如下:相关函数:Void d2410_board_close (void)函数功能:释放控制卡占用的系统资源。

控制卡应用编程技巧

控制卡应用编程技巧

控制卡应用编程技巧1.合理设计数据结构:在进行控制卡应用编程时,首先需要考虑合理的数据结构设计。

选择适当的数据结构可以提高代码执行效率,减小内存占用,并便于扩展和维护。

例如,使用链表结构来存储数据可以方便地插入和删除节点,而使用数组结构可以提高数据的访问速度。

2.优化算法和算法复杂度:在编写控制卡应用程序时,尽量使用高效的算法来提高程序的执行速度。

可以通过降低算法的时间和空间复杂度来优化程序的性能。

例如,使用二分算法代替线性算法,可以在有序数据中快速找到目标值。

3.合理利用缓存机制:缓存是提高程序执行效率的有效手段。

在控制卡应用编程中,可以使用缓存来存储频繁访问的数据,避免重复计算或IO操作,从而减少系统资源的消耗。

例如,可以将频繁访问的数据存储在高速缓存中,以提高数据的读取速度。

4. 错误处理和异常处理:在编写控制卡应用程序时,需要合理处理各种可能的错误和异常情况。

错误处理和异常处理能够提高程序的稳定性和鲁棒性,并提供更好的程序健壮性。

例如,可以使用try-catch语句块来捕获异常并进行相应的处理,避免程序崩溃。

5.避免内存泄漏和资源泄漏:内存泄漏和资源泄漏是程序开发中常见的问题。

在控制卡应用编程中,需要注意合理管理内存和资源,及时释放不再使用的对象和资源,避免造成内存泄漏和资源泄漏。

例如,在使用完毕后,可以显式地调用释放内存和资源的函数。

6.多线程和并发编程:在控制卡应用编程中,多线程和并发编程可以提高程序的性能和响应能力。

合理使用多线程和并发编程可以并行执行多个任务,充分利用系统资源,并加快程序的响应速度。

例如,可以使用多线程来处理并发请求,提高系统的吞吐量。

7.代码重用和模块化设计:在编写控制卡应用程序时,应鼓励代码的重用和模块化设计。

通过将相关代码封装成函数或类,并进行适当的抽象和封装,可以提高代码的可读性、可维护性和可扩展性。

例如,可以将相似的功能模块进行封装,通过调用函数或对象来实现代码的重用。

C#2010编程基础及在运动控制卡上的应用

C#2010编程基础及在运动控制卡上的应用

本人感受: C#的功能强:类库庞大、多线程、速度快; 界面设计简单、美观,和VB类似; 稳定性比VB6.0强(调试运动控制卡时没有自动退出现象) ; 智能化水平高(写代码时格式自动对齐,有智能提示;调试程序时方便,能给出 有用的信息等) ; 学C#比学VC容易(难点是要适应一些新概念,如:类) 。
C#的巨大成功是安德斯· 海尔斯伯格在编译器领域的领袖地位的又一次体现。可是说:安 德斯· 海尔斯伯格是C #之父。 (Turbo Pascal、Delphi也是出自他手) 三. C#的优点: C#是一种强大的、面向对象的程序开发语言,是专门用于.Net的编程语言,用C#编程的 代码总是在.Net Framework中运行。 C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法 风格、创新的语言特性和便捷的面向组件编程的支持成为.NET平台的首选语言。 C#在继承C和C++强大功能的同时去掉了一些它们的复杂特性 (例如没有指针、 宏以及不 允许多重继承等) 。 C#语言和Java很相似。学会C#后,学习Java很容易。

Python/ˈpaɪθən/是一种解释型、 面向对象、 动态数据类型的高级程序设计语言。 自从1991Python语言诞生至今, 它逐渐被广泛应用于处理系统管理任务和Web编程。免费、开源。
数据表明:用C#的人比用VB的人多近一倍。 二. C#的历史: C#读作C Sharp。符号#有2种解释: #在五线谱中读作Sharp,是“升半个音”的意思。这里用#有对C提升之意。 C C++ C + + + + ,为了方便写成了C #。
// Form1.cs 为窗体事件的代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); }

MPC02 运动控制卡运动函数库操作手册:

MPC02 运动控制卡运动函数库操作手册:
步进机电有限公司
Step-servo Co. Ltd.
MPC02 运动控制卡
操 作 手 册
2.1 版
MPC02 运动控制卡操作手册 2.1 版
目录
1 概 述............................................................................1
2 控制卡的安装..................................................................8
2.1 硬件安装..............................................................................................8 2.2 软件安装..............................................................................................8
69iii概述1概概述述11mpc02的软硬件简介的软硬件简介mpc02控制卡是基于pc机pci总线的步进电机或数字式伺服电机的上位控制单元它与pc机构成主从式控制结构pc机负责人机交互界面的管理和控制系统的实时监控等方面的工作例如键盘和鼠标的管理发送外部信号的监控等等mpc02卡完成运动控制的所有细节向信号的输出自动升降速的处理原点和限位等信号的检测等等卡可控制3轴步进电机或数字式伺服电机轴的控制每轴均可输出脉冲和方向信号减速限位等开关信号以实现回原点保护等功能这些开关信号由mpc02卡自动检测并作出反应另外mpc02卡还提供了适用于伺服系统的伺服使能和偏差清零信号接口以及供用户使用的通用io接口mpc02卡采用先进的专用控制芯片具有梯形及s形升降速曲线最高输出频率可达24mhz带有编码器反馈端口主要适用于数字式交流伺服系统或闭环的步进电机控制系统mpc02配备了功能强大内容丰富的运动控制驱动软件工具算法和运动函数的执行效率方面采用了更有效的方法和实时性这些软件工具主要分为示范软件和运动函数库两大类利用mpc02的示范软件既可以很快地熟悉mpc02控制卡的软硬件功能又可以方便快捷地测试执行电机及驱动系统在完成各种运动时的性能特性发用户只要用vc或visualbasic等支持dll调用的开发工具编制所需的用户界面程序并把它与mpc02运动库链接起来就可以开发出自己的控制系统例如数控系统检测设备自动生产线等mpc02的运动函数库能够完成与运动控制有关的复杂细节比如升降速直线插补系统的开发周期系统状态的显示控制指令的包括脉冲和方每块mpc02以实现多于三个运动同时可外接原点并支持多卡共用以控制电机的运转mpc02在插补插补速度提高了插补精度mpc02运动函数库用于二次开圆弧插补等这样就可以大大缩短控制1mpc02运动控制卡操作手册21版12mpc02的结构的结构mpc02控制卡作为开发运动控制系统的平台其结构是开放式的该卡插在pc机pci扩展槽内使用同时使用控制卡的数量和各卡上的控制轴数可方便地配置mpc02卡提供了功能强大的运动控制函数库开发完美的运动控制系统mpc02控制卡的结构示意图如下并可以充分利用pc机现有的资源来pc机cpumpc02运动控制智能ic脉冲发射光电隔离长线驱动指令状态pci总线光电隔离光电隔离pc接口光电隔离理想位置实际位置状态等脉冲方向报警行程减速原点运动控制函数库光码盘通用iompc02

控制卡的应用技巧

控制卡的应用技巧

5、 MoveTo成员
功能:让指定轴移动到指定的位置,调用控制卡中的 d5400_t_pmove函数实现 6、Line成员 功能:让X、Y和Z轴作直线插补(相对运动),调用控制卡中的 d5400_t_line3函数实现 7、Line成员 功能:让X、Y和Z轴作直线插补(绝对运动),调用控制卡中的 d5400_t_line3函数实现
pCard.LineTo x1, y1, 0 ‘(运行到线段的起点) If pCard.WaitDone = True Then Exit For pCard.LineTo x2, y2, 0 ‘(运行到线段的终点) If pCard.WaitDone = True Then Exit For End If End If Next
关于控制卡封装后的对象成员
1、mmScale成员 功能:确定机床的定位精度(脉冲数/毫米)
2、set_axis_speed成员 功能:设置指定轴的速度,调用控制卡中的 d5400_set_profile函数实现 3、set_vect_speedd成员 功能:设置指定直线/圆弧插补的速度,调用控制卡中的 d5400_set_vector_profile函数实现 4、Move成员 功能:让指定轴移动一相对位移,调用控制卡中的 d5400_t_pmove函数实现
2、添加dmc5400卡的函数定义模块
3、在工程中添加一个新的类
a、添加一个新的类,并命名为CardCls
2、添加dmc5400卡的函数定义模块
3、在工程中添加一个新的类
a、添加一个新的类,并命名为CardCls
b、加入CardCls控制卡相关的代码,实现 对控制卡功能函数的二次封装。
封装的好处: 1)对控制卡自动初始化和自动关闭的实现

EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续

EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续

EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续今天,正运动小助手给大家分享一下EtherCAT运动控制卡开发教程之Qt,主要介绍一下如何通过Qt编程实现小线段轨迹连续加工,暂停与继续。

一、ECI2828运动控制卡的硬件介绍ECI2828系列控制卡支持最多达16轴直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴、机械手指令等;采用优化的网络通讯协议可以实现实时的运动控制。

ECI2828系列运动控制卡支持以太网,232通讯接口和电脑相连,接收电脑的指令运行,可以通过EtherCAT总线和CAN总线去连接各个扩展模块,从而扩展输入输出点数或运动轴。

ECI2828系列运动控制卡的应用程序可以使用VC、VB、VS、C++、C#等多种高级语言编程来开发,程序运行时需要动态库zmotion.dll。

调试时可以把ZDevelop软件同时连接到控制器,从而方便调试、方便观察。

二、Qt进行运动控制卡开发的流程1.新建Qt项目。

图1:新建Qt项目图2:选择项目路径图3:选择Qt编译套件(kits)图4:选择基类2.将函数库相关的文件复制到新建的项目中。

3.向新建的项目里面添加函数库的静态库。

(zmotion.lib)第一步:添加函数库1第二步:添加函数库2第三步:添加函数库34.添加函数库相关的头文件到项目中。

5.声明相关头文件,并定义连接句柄。

三、PC函数介绍1.PC函数手册也在光盘资料里面,具体路径如下:“光盘资料\8.PC函数\函数库2.1\ZMotion函数库编程手册V2.1.pdf”。

2.PC编程,一般如果网口对控制器和工控机进行链接。

网口链接函数接口是ZAux_OpenEth();如果链接成功,该接口会返回一个链接句柄。

通过操作这个链接句柄可以实现对控制器的控制。

ZAux_OpenEth()接口说明:指令1ZAux_OpenEthint32 __stdcall ZAux_OpenEth(char *ipaddr, ZMC_HA 指令原型NDLE * phandle)指令说明以太网链接控制器。

qt creator数据采集卡运动控制卡编程实例

qt creator数据采集卡运动控制卡编程实例

qt creator数据采集卡运动控制卡编程实例Qt Creator是一款强大的集成开发环境(IDE)工具,能够支持多种编程语言的开发,其中包括C++。

本篇文章将向大家介绍如何在Qt Creator中使用C++编程来控制数据采集卡和运动控制卡。

第一步:准备工作在开始编写程序之前,需要先准备好相应的硬件设备以及开发环境。

对于数据采集卡和运动控制卡,需要根据其型号和规格进行适当的连接和配置。

同时,需要安装好Qt Creator开发环境和相关的库文件,如NI-DAQmx、Motion Control和Serial Communication。

第二步:创建Qt项目打开Qt Creator,点击菜单栏中的“File”,然后选择“NewFile or Project”来创建一个新的Qt项目。

在弹出的对话框中,选择“Application”类型,并在下拉菜单中选中“Qt Widgets Application”。

然后,输入项目名称和项目路径,最后点击“Create”按钮来创建项目。

第三步:添加头文件和库文件在Qt Creator中创建新项目后,需要添加相应的头文件和库文件。

在代码文件中加入以下头文件:```c++#include <NIDAQmx.h>#include "MotionControl.h"#include "SerialPort.h"```接着,在项目的.pro文件中添加相应的库文件:```c++LIBS += -lNIDAQmxLIBS += -lMotionControlLIBS += -lSerialPort```第四步:编写程序代码这一步是关键,需要根据具体的设备和需求编写相应的代码。

在此,我们以运动控制卡为例,来展示如何编写一个简单的控制程序。

下面是一个示例代码:```c++#include <QApplication>#include <QDebug>#include "MotionControl.h"int main(int argc, char *argv[]){QApplication a(argc, argv);MotionControl *mc = new MotionControl();mc->connect("COM1");mc->setAxis(1);mc->setServoOn();mc->moveTo(100, 5000);mc->setServoOff();mc->disconnect();delete mc;return a.exec();}```代码中,我们首先启动一个运动控制卡对象,并指定其连接的串口号("COM1")。

雷赛运动控制卡应用程序开发注意事项

雷赛运动控制卡应用程序开发注意事项

雷赛运动控制卡应用程序开发注意事项发布时间:2011年6月1日雷赛科技刘玉平概述:对于一些初次使用雷赛运动控制产品的客户,由于对本公司产品的特点以及程序开发流程不够熟悉,在应用程序的开发过程中,难免会疏漏一些细节,从而产生各种问题,浪费很多宝贵的时间。

如果在应用程序开发前,就可以考虑到那些既重要又容易疏漏的细节,这样可以避免很多不必要的问题产生,从而大大缩短程序的开发周期。

本文总结以往的经验,以雷赛运动控制卡DMC2410B为例,为客户在开发应用程序时的初始化过程给出了一些参考与建议(其他产品与此类似),其中包括运动控制卡的初始化、特殊参数的设置及各种信号的设置,如图1虚线框内所示,这些处理过程必须加载至应用程序的初始化过程中,不同编程环境下,应用程序的初始化过程略有不同,例如在VB6.0编程环境下,须在Form_Load()函数中做程序的初始化处理,而在VC6.0编程环境下,须在OnInitDialog()函数中做程序的初始化处理。

图1 DMC2410B控制卡应用程序开发流程图1所示的控制卡初始化过程中,实线框内所示的参数设置或特殊信号的设置必须在初始化过程中加以处理,而虚线框内的信号在未选择使用时,可以不用设置,而当选择使用这些信号时,必须进行正确设置。

下面对这些初始化过程的方法及必要性做出简要的说明。

一、初始化运动控制卡相关函数:WORD d2410_board_init (void)函数功能:为控制卡分配系统资源并初始化控制卡;若在应用程序中未初始化控制卡,则系统无法为控制卡分配资源,导致控制卡无法正常使用,程序在运行时提示错误,弹出如图2所示对话框:图2 未初始化控制卡时的错误提示注意:程序在结束运行时,必须关闭运动控制卡,以释放系统资源,否则控制卡将一直占用系统资源,导致再次运行该应用程序时产生错误。

关闭控制卡的方法及说明如下:相关函数:Void d2410_board_close (void)函数功能:释放控制卡占用的系统资源。

多类型运动控制卡编程方法探讨

多类型运动控制卡编程方法探讨

多类型运动控制卡编程方法探讨2008-10-29 8:57:26 【文章字体:大中小】推荐收藏打印运动控制卡发展越来越讯速,不同类型的控制卡亦多种多样,使软件项目经理具备越来越灵活的方案选择。

而对于软件开人员,对不同的类型卡的性能测试工作无疑也越来越麻烦,通常各类型的控制卡其驱动库函数各不一样,都需要用户自己进行整理封装。

本文的目的就是通过C++方式编程,探讨一下实现多类型卡编程方式,以供开发人员参考。

一、利用C++虚拟函数机制除了手动去单个修改替换以前卡的驱动函数之外,此方法最易被C++程序员所想起,其方法是,首先需要建立一个通用的基类(父),然后不同卡封装的类通过重写基类的虚拟函数来实现,代码看上去大致如下:class CDviece//用户根据自己的设置建立的基类{public:virtual int InitBoard(); //在此仅以初始化函数为例… (略)};class CDmc1000Card: public CDviece // 设该卡为雷赛的DMC1000卡{public:virtual int InitBoard(){return dmc1000_init_board();}//改进基类的InitBoard函数…(其它改写略去)}class COMS: public CDviece //设该卡为美国的OMS卡{public:virtual int InitBoard(){}…(其它改写略去)}在程序中,若想设备使用DMC1000控制卡,可定义如下:CDviece *pMineDviece = new CDmc1000Card;改为OMS控制卡则一样:CDviece *pMineDviece = new COMS;而其它代码调用InitBoard函数可以不去改动,照常使用:if( pMineDviece->InitBoard() ){…(Do s.th)}使用此方法,需要根据当前设备配置情况,完整的写好CDviece的所有函数,同样,从CDviece派生的控制卡类,也需要将父类虚拟函数全部改写完毕,对函数返回值,参数都需要进行规范,同时,修改完成之后,将整个软件工程全部编译一次。

DMC5400控制卡的应用技巧

DMC5400控制卡的应用技巧

DMC5400控制卡的应用技巧DMC5400控制卡G代码VB编程应用一、控制卡的安装1、硬件安装2、设备驱动的安装图1设备驱动二、控制卡的编程入门下面是以DMC5400卡在VB编译环境下的编程为例,介绍控制卡的入门编程1、首先,运行VB,并建立一个新的“标准EXE”工程2、添加dmc5400卡的函数定义模块关于dmc5400控制卡的函数定义dmc5400.bas文件是VB编译环境的函数定义dmc5400.h文件是VC编译环境的函数定义与dmc5400控制卡相关的所有函数,都定义在这两个文件中3、在工程中添加一个新的类a、添加一个新的类,并命名为CardClsb、加入CardCls控制卡相关的代码,实现对控制卡功能函数的二次封装。

封装的好处:1)对控制卡自动初始化和自动关闭的实现2)用对象编程的方式,对运动控制卡进行编程,将复杂的编程简易化4、(控制卡)对象的使用a) 在窗体代码中定义对象,例如:Private pCard As New CardClsb)调用对象中的成员,实现相关的功能,例如:显示当前的位置Label1(0).Caption = "X:" + Format(pCard.Position(0), "0.000") 其中:pcard.position(0)成员函数实现读取第0轴的当前位置,并显示到标签label(0)。

三、控制卡与G代码的编程入门1、G代码指令图2 G代码指令2、G代码的常用格式G00X10.600Y100.000G01X100.000Y100.0003、通过控制卡执行G代码的方法方法1、直接调用运动函数执行G代码a、快速定位G00X10.600Y100.000Z10例如:pCard.MoveTo AxisZ,0pCard.WaitDonepCard.FastMoveTo x,y,0pCard.WaitDonepCard.MoveTo AxisZ,zpCard.WaitDoneb、直线插补G01X10.600Y100.000例如:pCard.LineT o x,y,zpCard.WaitDone四、控制卡与CAD的接囗编程关于DXF文件格式中的线、圆弧及连续线的关键字段1、圆(AcDbCircle)2、圆弧(AcDbCircle)3、线段(AcDbLine)4、连续线段(AcDbPolyline)线段:起点XYZ(10,20,30)终点XYZ(11,21,31)圆弧:圆心XYZ(10,20,30)半径40 起始角50 终止角51圆:圆心XYZ(10,20,30)半径40连续线段:段线端点数90 封闭/不封闭70 点坐标XYZ(10,20,30)下面是读入Dxf文件中线段,并调用运动函数的实例代码:jj = Vb_TextTotalLineFor ii = 1 To jjIf VB_GetTextLine(ii, m_str) = True ThenIf m_str = "AcDbLine" ThenIf VB_GetTextLine(ii + 2, m_str) = True Thenx1 = Val(m_str)If VB_GetTextLine(ii + 4, m_str) = True Theny1 = Val(m_str)If VB_GetTextLine(ii + 8, m_str) = True Thenx2 = Val(m_str)If VB_GetTextLine(ii + 10, m_str) = True Theny2 = Val(m_str)ii = ii + 10pCard.LineT o x1, y1, 0 ‘(运行到线段的起点)If pCard.WaitDone = True ThenExit ForpCard.LineT o x2, y2, 0 ‘(运行到线段的终点)If pCard.WaitDone = True ThenExit ForEnd IfEnd IfNext关于控制卡封装后的对象成员1、mmScale成员功能:确定机床的定位精度(脉冲数/毫米)2、set_axis_speed成员功能:设置指定轴的速度,调用控制卡中的d5400_set_profile函数实现3、set_vect_speedd成员功能:设置指定直线/圆弧插补的速度,调用控制卡中的d5400_set_vector_profile函数实现4、Move成员功能:让指定轴移动一相对位移,调用控制卡中的d5400_t_pmove函数实现5、MoveTo成员功能:让指定轴移动到指定的位置,调用控制卡中的d5400_t_pmove函数实现6、Line成员功能:让X、Y和Z轴作直线插补(相对运动),调用控制卡中的d5400_t_line3函数实现7、Line成员功能:让X、Y和Z轴作直线插补(绝对运动),调用控制卡中的d5400_t_line3函数实现8、WaitDone成员功能:等待运动停止,调用控制卡中的d5400_check_done函数实现在对象入囗处加入d5400_board_init函数,实现对控制卡的自动初始化;在出囗处加入d5400_board_close,实现对释放对象时,自动关闭控制卡。

iMC系列六轴四轴运动控制卡快速应用v1.1

iMC系列六轴四轴运动控制卡快速应用v1.1

iMC系列六轴四轴运动控制卡快速应用v1.1iMC2X00系列运动控制卡快速应用此文档用于指引用户快速应用iMC2X00系列运动控制卡,对于iMC2X00系列运动控制卡各项功能的详细说明,请参考“iMC2X00系列运动控制卡使用手册”。

基于iMC2X00的运动控制应用系统开发流程如图所示:iMCSOFT 是本公司针对iMC2系列运动控制卡开发的应用开发调试软件,用于辅助用户加快运动控制应用的开发过程。

iMCSOFT 软件下的编程采用一种类似于BASIC 的语言,语法简单、易用。

若用户对运动控制卡的应用较熟悉,可跳过此步骤,直接采用VC 、VB 编写应用程序。

在iMCSOFT 下使用的指令,绝大多数都能在动态链接函数库中找到对应的函数,且格式相似,因此,只要在iMCSOFT 平台下编程调试了的控制功能,都可以用高级语言调用相应的函数编程实现。

1 硬件安装与连接iMC2X00系列运动控制卡与接口卡是分离的,用户可以选择本公司配套的接口卡,或根据需要自行设计接口卡。

iMC2X00系列运动控制卡与接口卡、伺服(或步进)驱动器的连接如“图1-1”所示,限位开关、原点开关等的布局如“图 1-2”所示。

注:限位开关、原点开关等的布局仅供参考,用户可根据具体应用情况采用不同的布局。

建议原点开关安装在靠近机械行程的末端位置,并设置偏移位置,这样可以固定一个搜寻原点的出发方向。

图 1-1图1-2轴接口卡运动控制卡上位机伺服驱动伺服驱动iMCSOFT 或用户程序 ...开关、传感器输入等输出接口卡...电磁阀、继电器等运动平台负限位开关原点开关正限位开关IMC2400U控制卡接口及跳线1.1iMC2400U的外形如“图 1-3”所示:图 1-3 IMC2400U控制卡外形图1.1.1各接口说明J1:USB总线接口,计算机通过该接口与控制卡通信;J2:外部供电插座;iMC2400U可由计算机的USB总线供电或外部5V电源供电,但一般计算机的USB总线供电能力只有800mA,建议iMC2400U由用外部电源供电。

PLC编程超详细的运动控制详解

PLC编程超详细的运动控制详解

PLC编程超详细的运动控制详解
运动控制在实际的工业现场中随处可见,也常听到大家提到运动控制;哪什么叫运动控制?以及基本概念有哪些?下面我们为大家做简单的介绍:运动控制(MC)是自动化的一个分支,它使用通称为伺服机构的一些设备如液压泵,线性执行机或者是电机来控制机器的位置或速度。

运动控制在机器人和数控机床的领域内的应用要比在专用机器中的应用更复杂,因为后者运动形式更简单,通常被称为通用运动控制(GMC)。

运动控制被广泛应用在包装、印刷、纺织和装配工业中。

定位的基本概念:使指定对象按指定速度和轨迹运动到指定位置运动控制需要有控制器(PLC)、驱动器、电机、机械等机械需要将位置和速度反馈给控制,形成一个闭环的控制;这样控制器就能知道机械的动态和位置信息
电机的速度和位置反馈给驱动器这也是一种闭环控制的方式,电机和驱动器之间形成一个闭环;或者电机将位置和速度反馈给控制器作为一个闭环
运动控制中关键的要素的位置和速度
a表示加速度 d表示减速度 s就是运行距离(位置)
伺服系统的概念和组成
什么是伺服系统?以物体的位置、方向、状态等为控制量,以跟踪输入目标值(或给定值)的任意变化为目的,所构成的自动控制系统
伺服系统的组成:伺服系统具有反馈闭环的自动控制系统,由控制器、伺服驱动器、伺服电机和反馈装置组成
伺服驱动器的原理
伺服与变频器的区别
伺服系统的三种控制方式
位置控制:以位置为目标的控制,从位置A到位置B
速度控制:以速度为目标的控制,以恒定的速度持续运转
转矩控制:以转矩或者力矩为目标的控制,输出恒定的转矩
小型自动化产品的运动控制有三种,分别是S7-200/200SMART /1200
END。

运动控制器编程技巧【快速入门】

运动控制器编程技巧【快速入门】

运动控制器ZHMI组态编程简介一今天我们来学习一下,运动控制器的ZHMI组态编程简介。

本文主要从产品概述、控制器连接触摸屏使用、HMI编程方法以及组态示例程序等四方面来讲解。

01 产品概述采用ZMC306X控制器连接ZHD400X触摸屏。

控制器参考配置如下图:(一)ZMC306XZMC306X系列控制器本体带6个脉冲轴,可通过CAN总线扩展脉冲轴,支持多达12轴直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随、虚拟轴设置等;采用优化的网络通讯协议可以实现实时的运动控制。

通讯接口包含RS232、RS485、RS422、以太网、U盘、CAN。

控制器的输入口0-1支持锁存功能,输出口0-1支持PWM功能;本身带两路模拟量输入和两路模拟量输出接口,12位精度,电压范围0-10V。

支持正运动技术XPLC的功能,使用ZDevelop软件的HMI编程开发组态程序,可以通过网络来做组态显示。

(二)ZHD400XZHD400X是一款网络显示的触摸屏示教盒,示教盒必须和支持ZHMI功能的控制器配合使用,触摸屏的组态程序开发使用ZDevelop的HMI编程开发方式,程序保存在控制器中。

示教盒带有一个USB口,一个U盘延长口,使用24V直流电源供电(可USB供电),带有800*480分辨率的真彩显示屏,本身带18个按键,配急停开关。

ZHD400X支持触摸屏,可以按键和触摸配合使用。

屏幕边上的物理按键的编码规则参见《ZHD400X手持盒手册》说明,按键按下时,示教盒自动向控制器发送物理按键,控制器程序可以检测到物理按键,如果需要使用虚拟按键,需要在组态里面使用按键转换表,ZDevelop带有标准400X的按键转换表,可以根据具体情况或面膜修改按键转换表。

02 控制器连接触摸屏使用触摸屏配一根网线,使用网线连接到控制器的EtherNET网口,网线水晶头边上引出三根线,分被是示教盒电源线和急停信号线,红色为24V电源正极,黑色为24V电源负极,紫色为急停信号线。

工控:C#如何控制运动卡

工控:C#如何控制运动卡

工控:C#如何控制运动卡现在越来越多的非标设备使用的是运动控制卡,那什么是运动控制卡?运动控制卡是一种基于PC机及工业PC机、用于各种运动控制场合(包括位移、速度、加速度等)的上位控制单元。

所以运动控制卡的编程就需要用到高级语言,常用的有C++,,Labview,C#这几种下面高级语言以C#为例,运动控制卡以固高GT-400-G-PCI(4轴控制卡)为例常见的系统架构一控制卡组成1.控制卡控制卡需要插在PC的PCI插槽内,露出的接口CN17需要用排线和外部端子板连接运动控制卡2.端子板端子板一般装在配电盘上,用于接线,下图中左边的四个AXIS就是轴系的脉冲接口右边为IO和限位接线端子最上门的CN17需要用排线连接到PC内的运动控制卡端子板二.配置运动控制卡(固高官网下载地址:/pro_view-3.html)1.首先装好驱动程序,驱动包可以找供应商拿2.配置卡的参数安装好驱动后,打开固高配置软件,主要配置为伺服的脉冲模式,正负极限的设置,急停的设置当中细节太多这边不一一讲3.用demo控制轴运动配置好参数后,用配置软件动一下轴确定轴参数都对后才能用上位机控制轴一的配置界面轴控制三.用C#编程1.新建一个winform窗体程序,把固高的动态链接库拷贝进去(正常和供应商索取驱动还有相关资料)动态链接库还有文件2.程序内引用gts文件右击项目➡添加➡现有项➡选择刚才拷贝的文件添加完效果3.开始编程卡操作流程:初始化➡读取参数配置(就是用DEMO软件配置好的参数)➡按逻辑控制每个轴归零➡程序控制轴进行位移运动我们在新建一个GtsCard类,把gts类中提供的方法重新整理下,方便以后复用//固高运动控制卡 public class GtsCard { /// <summary> /// 初始化,加载配置,清除轴系报错/// </summary> /// <paramname='cardNum'></param> /// <param name='filePath'></param> /// <param name='axis'></param> /// <returns></returns> public bool Initial(gtsCardID gtsCard, Axis[] axis) { short result; bool isOk = false; try { //channel : 打开运动控制器的方式。

雷赛运动控制卡应用程序开发注意事项

雷赛运动控制卡应用程序开发注意事项

雷赛运动控制卡应用程序开发注意事项发布时间:2011年6月1日雷赛科技刘玉平概述:对于一些初次使用雷赛运动控制产品的客户,由于对本公司产品的特点以及程序开发流程不够熟悉,在应用程序的开发过程中,难免会疏漏一些细节,从而产生各种问题,浪费很多宝贵的时间。

如果在应用程序开发前,就可以考虑到那些既重要又容易疏漏的细节,这样可以避免很多不必要的问题产生,从而大大缩短程序的开发周期。

本文总结以往的经验,以雷赛运动控制卡DMC2410B为例,为客户在开发应用程序时的初始化过程给出了一些参考与建议(其他产品与此类似),其中包括运动控制卡的初始化、特殊参数的设置及各种信号的设置,如图1虚线框内所示,这些处理过程必须加载至应用程序的初始化过程中,不同编程环境下,应用程序的初始化过程略有不同,例如在VB6.0编程环境下,须在Form_Load()函数中做程序的初始化处理,而在VC6.0编程环境下,须在OnInitDialog()函数中做程序的初始化处理。

图1 DMC2410B控制卡应用程序开发流程图1所示的控制卡初始化过程中,实线框内所示的参数设置或特殊信号的设置必须在初始化过程中加以处理,而虚线框内的信号在未选择使用时,可以不用设置,而当选择使用这些信号时,必须进行正确设置。

下面对这些初始化过程的方法及必要性做出简要的说明。

一、初始化运动控制卡相关函数:WORD d2410_board_init (void)函数功能:为控制卡分配系统资源并初始化控制卡;若在应用程序中未初始化控制卡,则系统无法为控制卡分配资源,导致控制卡无法正常使用,程序在运行时提示错误,弹出如图2所示对话框:图2 未初始化控制卡时的错误提示注意:程序在结束运行时,必须关闭运动控制卡,以释放系统资源,否则控制卡将一直占用系统资源,导致再次运行该应用程序时产生错误。

关闭控制卡的方法及说明如下:相关函数:Void d2410_board_close (void)函数功能:释放控制卡占用的系统资源。

运动控制卡C程序示例

运动控制卡C程序示例

2. VC编程示例2.1 准备工作(1)新建一个项目,保存为“VCExample.dsw”;(2)根据前面讲述的方法,将静态库“8840.lib”加载到项目中;2.2 运动控制模块(1) 在项目中添加一个新类,头文件保存为“CtrlCard.h”,源文件保存为“CtrlCard.cpp”;(2) 在运动控制模块中首先自定义运动控制卡初始化函数,对需要封装到初始化函数中的库函数进行初始化;(3)继续自定义相关的运动控制函数,如:速度设定函数,单轴运动函数,差补运动函数等;(4)头文件“CtrlCard.h”代码如下:# ifndef __ADT8840__CARD__# define __ADT8840__CARD__/*********************** 运动控制模块********************为了简单、方便、快捷地开发出通用性好、可扩展性强、维护方便的应用系统,我们在控制卡函数库的基础上将所有库函数进行了分类封装。

下面的示例使用一块运动控制卡********************************************************/#define MAXAXIS 4 //最大轴数class CCtrlCard{public:int Setup_HardStop(int value, int logic);int Setup_Stop1Mode(int axis, int value, int logic);(设置stop1信号方式)int Setup_Stop0Mode(int axis, int value, int logic);(设置stop0信号方式)int Setup_LimitMode(int axis, int value1, int value2, int logic);(设置限位信号方式)int Setup_PulseMode(int axis, int value); (设置脉冲输出方式)int Setup_Pos(int axis, long pos, int mode); (设置位置计数器)int Write_Output(int number, int value);(输出单点函数)int Read_Input(int number, int &value);(读入点)int Get_CurrentInf(int axis, long &LogPos, long &ActPos, long &Speed); (获取运动信息)int Get_Status(int axis, int &value, int mode); (获取轴的驱动状态)int StopRun(int axis, int mode); (停止轴驱动)int Interp_Move4(long value1, long value2, long value3, long value4);(四轴差补函数)int Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3);(三轴差补函数)int Interp_Move2(int axis1, int axis2, long value1, long value2);(双轴差补函数)int Axis_Pmove(int axis ,long value);(单轴驱动函数)int Axis_Cmove(int axis ,long value);(单轴连续驱动函数)int Setup_Speed(int axis ,long startv ,long speed ,long add );(设置速度模块)int Init_Board(int dec_num);(函数初始化)(设置速度模块)CCtrlCard(); (定义了一个同名的无参数的构造函数)int Result; //返回值};#endif(5) 源文件“CtrlCard.cpp”代码如下:#include "stdafx.h"#include "DEMO.h"#include "CtrlCard.h"#include "adt8840.h"int devnum=-1;CCtrlCard::CCtrlCard()(构造函数,为什么是空的?){}/*******************初始化函数************************该函数中包含了控制卡初始化常用的库函数,这是调用其他函数的基础,所以必须在示例程序中最先调用返回值<=0表示初始化失败,返回值>0表示初始化成功*****************************************************/int CCtrlCard::Init_Board(int devnum){/***********************************************************/int mode =0;//应答模式为1时,响应串口接收有效,0时无效if(devnum==0)(devnum:设备号){for (int i = 1; i<=MAXAXIS(最大轴数); i++){Result=adt8840a_set_command_pos(devnum, mode,i,0);(设定逻辑计数器)adt8840a_set_actual_pos(devnum, mode,i,0);(设定实位计数器)adt8840a_set_startv(devnum, mode,i,0);(设定初始速度)adt8840a_set_speed(devnum, mode,i,0);(设定驱动速度)adt8840a_set_acc(devnum, mode,i,0);(设定加速度)}if(Result==0 )return 1;elsereturn Result;}elsereturn -1;}/**********************设置速度模块***********************依据参数的值,判断是匀速还是加减速设置轴的初始速度、驱动速度和加速度参数:axis -轴号startv - 初始速度speed -驱动速度add -加速度返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Speed(int axis(轴号), long startv(初始速度), long speed(驱动速度), long add (加速度)) {if (startv - speed >= 0) //匀速运动{Result = adt8840a_set_startv(devnum,axis, startv); (设定初始速度)adt8840a_set_speed (devnum,axis, startv);(设定驱动速度)}else //加减速运动{Result = adt8840a_set_startv(devnum,axis, startv); (设定初始速度)adt8840a_set_speed (devnum,axis, speed); (设定驱动速度)adt8840a_set_acc (devnum,axis, add); (设定加速度)}return Result;}/*********************单轴驱动函数*********************该函数用于驱动单个运动轴运动参数:axis-轴号,value-输出脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Axis_Pmove(int axis, long value){Result = adt8840a_pmove(devnum,axis, value(脉冲数));return Result;}/*******************任意两轴插补函数********************该函数用于驱动任意两轴进行插补运动参数:axis1,axis2-轴号、value1,value2-脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Interp_Move2(int axis1, int axis2, long value1, long value2){Result = adt8840a_inp_move2(devnum,axis1, axis2, value1, value2);return Result;}/*******************任意三轴插补函数********************该函数用于驱动任意三轴进行插补运动参数:axis1,axis2,axis3-轴号、value1,value2,value3-脉冲数返回值=0正确,返回值=1错误*******************************************************/int CCtrlCard::Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3) {Result = adt8840a_inp_move3(devnum,axis1, axis2, axis3, value1, value2, value3);return Result;}/*******************四轴插补函数****************************该函数用于驱动XYZW四轴进行插补运动参数:value1,value2,value3,value4-输出脉冲数返回值=0正确,返回值=1错误***********************************************************/int CCtrlCard::Interp_Move4(long value1, long value2, long value3, long value4){Result = adt8840a_inp_move4(devnum,value1, value2, value3, value4);return Result;}/************************停止轴驱动***********************该函数用于立即或减速停止轴的驱动参数:axis-轴号、mode-减速方式(0-立即停止, 1-减速停止)返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::StopRun(int axis, int mode){if(mode == 0) //立即停止{Result = adt8840a_sudden_stop(devnum, axis);}else //减速停止{Result = adt8840a_dec_stop(devnum, axis);}return Result;}/*****************获取轴的驱动状态************************** 该函数用于获取单轴的驱动状态或插补驱动状态参数:axis-轴号,value-状态指针(0-驱动结束,非0-正在驱动)mode(0-获取单轴驱动状态,1-获取插补驱动状态)返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::Get_Status(int axis, int &value, int mode){if (mode==0) //获取单轴驱动状态Result=adt8840a_get_status(devnum,axis,&value);else //获取插补驱动状态Result=adt8840a_get_inp_status(devnum,&value);return Result;}/*****************获取运动信息****************************** 该函数用于反馈轴当前的逻辑位置,实际位置和运行速度参数:axis-轴号,LogPos-逻辑位置,ActPos-实际位置,Speed-运行速度返回值=0正确,返回值=1错误************************************************************/int CCtrlCard::Get_CurrentInf(int axis, long &LogPos, long &ActPos, long &Speed ) {Result = adt8840a_get_command_pos(devnum,axis, &LogPos);(获取逻辑位置)adt8840a_get_actual_pos (devnum, axis, &ActPos); (获取实际位置)adt8840a_get_speed (devnum, axis, &Speed);(获取驱动速度)return Result;}/***********************读取输入点******************************* 该函数用于读取单个输入点参数:number-输入点(0 ~ 39)返回值:0 -低电平,1 -高电平,-1 -错误****************************************************************/int CCtrlCard::Read_Input(int number,int &value){Result = adt8840a_read_bit(devnum, number, &value);return Result;}/*********************输出单点函数****************************** 该函数用于输出单点信号参数:number-输出点(0 ~ 15),value 0-低电平、1-高电平返回值=0正确,返回值=1错误****************************************************************/int CCtrlCard::Write_Output(int number, int value){Result = adt8840a_write_bit(devnum, number, value);return Result;}/*******************设置位置计数器******************************* 该函数用于设置逻辑位置和实际位置参数:axis-轴号,pos-设置的位置值mode 0-设置逻辑位置,非0-设置实际位置返回值=0正确,返回值=1错误****************************************************************/int CCtrlCard::Setup_Pos(int axis, long pos, int mode){if(mode==0){Result = adt8840a_set_command_pos(devnum,axis, pos);(设置逻辑计数器)}else{Result = adt8840a_set_actual_pos(devnum, axis, pos);(设置实位计数器)}return Result;}/********************设置脉冲输出方式**********************该函数用于设置脉冲的工作方式参数:axis-轴号, value-脉冲方式0-脉冲+脉冲方式1-脉冲+方向方式返回值=0正确,返回值=1错误默认脉冲方式为脉冲+方向方式本程序采用默认的正逻辑脉冲和方向输出信号正逻辑*********************************************************/int CCtrlCard::Setup_PulseMode(int axis, int value){Result = adt8840a_set_pulse_mode(devnum,axis, value, 0, 0);(设置脉冲模式)return Result;}/********************设置限位信号方式********************** 该函数用于设定正/负方向限位输入nLMT信号的模式参数:axis-轴号value1 0-正限位有效1-正限位无效value2 0-负限位有效1-负限位无效logic 0-低电平有效1-高电平有效默认模式为:正限位有效、负限位有效、低电平有效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_LimitMode(int axis, int value1, int value2, int logic) {Result = adt8840a_set_limit_mode(devnum,axis, value1, value2, logic);return Result;}/********************设置stop0信号方式********************** 该函数用于设定stop0信号的模式参数:axis-轴号value 0-无效1-有效logic 0-低电平有效1-高电平有效默认模式为:无效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Stop0Mode(int axis, int value, int logic){Result = adt8840a_set_stop0_mode(devnum,axis, value ,logic);return Result;}/********************设置stop1信号方式********************** 该函数用于设定stop1信号的模式参数:axis-轴号value 0-无效1-有效logic 0-低电平有效1-高电平有效默认模式为:无效返回值=0正确,返回值=1错误*********************************************************/int CCtrlCard::Setup_Stop1Mode(int axis, int value, int logic){Result = adt8840a_set_stop1_mode(devnum,axis, value, logic);return Result;}/************************单轴连续驱动函数*********************** 该函数用于驱动单个运动轴运动参数:axis-轴号,value-脉冲方向返回值=0正确,返回值=1错误***********************************************************/int CCtrlCard::Axis_Cmove(int axis, long value){Result = adt8840a_continue_move(devnum,axis, value);return Result;}2.3 功能实现模块2.3.1 界面设计说明:(1)速度设定部分—用于设定各轴的起始速度、驱动速度和加速度;位置设定—设定各轴的驱动脉冲;驱动信息—实时显示各轴的逻辑位置、实际位置和运行速度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

运动控制卡应用编程技巧内容来源网络,由“深圳机械展(11万㎡,1100多家展商,超10万观众)”收集整理!更多cnc加工中心、车铣磨钻床、线切割、数控刀具工具、工业机器人、非标自动化、数字化无人工厂、精密测量、3D打印、激光切割、钣金冲压折弯、精密零件加工等展示,就在深圳机械展.关于源代码的阅读,需要读者有一定的C++编程基础,至少对以下表示形式不会产生误解:const char *pString; //指定pString邦定的数据不能被修改char * const pString; //指定pString的地址不能被修改const char * const pString; //含上面两种指定功能当然,随便提醒一下,这些源代码若需要加入你的软件工程当中,还需要作一些调整和修改,因此,这些源代码实质上称为伪代码也可以,之所以展现它们,是让程序员们有个可视化的快感,特别是那些认为源代码就是一切的程序员。

同时,为了提高针对性,大部分控制卡调用的函数会明确指出是邦定哪些卡的,实际应用时,程序员可自行选择,以体现一下自己的智商是可以写写软件的。

一、控制卡类的单一实例实现把控制卡类作一个类来处理,几乎所有C++程序员都为举双手表示赞同,故第一个什么都没有的伪代码就此产生,如下表现:class CCtrlCard{public:…Functionpublic:…attrib}于是,用这个CctrlCard可以产生n多个控制卡实例,只要内存足够。

然而,针对现实世界,情况并不那么美好。

通常情况下,PC机内只插同种类型的控制卡1到2张,在通过调用d1000_board_init或d3000_board_init函数时,它们会负责返回有效卡数nCards,然后从0-nCards*4- 1自行按排好轴数。

初始化函数就是C++的new或malloc的操作,取得系统的资源,但是控制卡的资源与内存不一样,取得资源后必需要释放才可以再次获取,即控制卡资源是唯一的。

既然控制卡资源是唯一的,那么最好Cctrlcard产生的实例也是唯一的,这样,我们可以方便的需要定义一个全局变量即可:CctrlCard g_Dmcard;在其它需要调用的地方,进行外部呼叫:extern CctrlCard g_DmcCard;以上方法实在太简单了,很多人都会开心起来。

实质上,方法还有很多,即然可以产生n 多对实例,我们的核心是只要保证调用board_init函数一次即可,故也可以单独定义一个InitBoard函数:class CctrlCard{public:static int InitBoard(); //定义一个静态函数,以表警示}int CctrlCard::InitBoard(){return d1000_board_init();}还有一种方法,情况稍加复杂,但表达的功能也要强一些,以下展现可以稍微安慰一下代码狂。

Class CctrlCard{public: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();return n;//这样,即使多次调用也不样怕了,呵呵,雕虫小技也可以除虫啊}必须额外声明一下,不是不重视资源的释放,而是作为一个C++程序员写下这些代码是基本的义务(这也是我为什么要交待读者必须要有一定的C++基础):class CctrlCard{public:~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,oy;double ex,ey;int dir;}ARC;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),scc(scc){}double start;double speed;double accel;double decel;double scc;}SPEED;以上两个ARC和SPEED的结构定义,把几个参数变成一个参数。

比如要实现的单轴驱动函数,就变得非常明了:void Move( int nAxis, double fMM, const SPEED &speed, int nFlag = M_ABS );//往后我们再具体完善其实现。

以上的结构具有类的特性,但是由于其每个成员都可以给外部直接使用,故就不需要什么类的public及其析构函数的定义了。

之所以全都采用double的数据类型,是面向客户习惯及单位计算方便的。

接下来是对控制卡常用的单位计算及部分常用变量的声明:class Cctrlcard{public:…(其它略去)public://属性mutable int ORGIN; //指定原点状态位mutable int LIMIT_A, LIMIT_B; //指定左右限位状态位private://以下的属性不给外部访问的struct tag_AXIS{//单轴属性double fUnitPM; //脉冲当量long nRP; //每转脉冲数double fJourey; //行程};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_IN == g_IN )If( nStatus & g_DmcCard.LIMIT_A == g_DmcCard.LIMIT_A )If( nStatus & g_DmcCard.LIMIT_B == g_DmcCard.LIMIT_B );No.2你可以扩展不同的卡,当外部调用的程序逻辑已被确定时,当你需要从DMC1000控制卡升级到DMC3000控制卡时,只需要给ORGIN等状态位指定不同的值即可。

指定状态位的值也有一个小小的技巧,以ORGIN为例,在DMC1000控制卡,其位值在2位,则可以这样:ORGIN = 1<<2;在DMC3000控制卡,其值在第9位,则这样:ORGIN = 1<<9;方法都很简单,关键是要想得到。

相关文档
最新文档