当前位置:首页 >> 机械/仪表 >>

ADT850用户手册


ADT850 四轴运动控制卡

ADT-850
四轴运动控制卡

说 明 书

深圳市众为兴数控技术有限公司
地址:深圳市南山区马家垅工业区 36 栋 5 楼 邮编:518052 电话:0755-26722719(20 线) 传真:0755-26722718
1
http://ww

w.adtechcn.com

ADT850 四轴运动控制卡

版权声明
本用户手册的所有部分,其著作财产权归属众为兴数控技术有限 公司(以下简称众为兴)所有,未经众为兴许可,任何人不可任意地 仿制,拷贝、誊抄或转译。本用户手册没有任何形式的担保,立场表 达或其他暗示。 若有任何因本用户手册或其所提到之产品的所有信息, 所引起的直接或间接的资料流出,利益损失或事业终止,众为兴及其 所属员工恕不担负任何责任。除此之外,本用户手册提到的产品规格 及资料仅供参考,内容有可能会更新,恕不另行通知。

商标声明 用户手册中所涉及到的产品名称仅作识别之用,而这些名称可能 是属于其它不同的商标或版权,在此声明如下: ※ INTEL,PENTIUM 是 INTEL 公司的商标。 ※ WINDOWS,MS—DOS 是 MICROSOFT 公司产品标识。 ※ ADT—850 是众为兴公司的商标。 ※ 其它末提到的标识,均属各注册公司所拥有。

版权所有,不得翻印。 众为兴数控技术有限公司

2
http://www.adtechcn.com

ADT850 四轴运动控制卡

目 录
第一章 概要 ............................................................................................ 5 ? 产品简介......................................................................................... 5 ? 主要性能......................................................................................... 6 ? 应用范围......................................................................................... 6 第二章 硬件安装 .................................................................................... 7 ? 配件................................................................................................. 7 ? 安装................................................................................................. 7 第三章 电气连接 .................................................................................... 8 ? J1 线号说明 .................................................................................. 9 ? J2 线号说明 .................................................................................11 ? J3 线号说明 ................................................................................ 12 ? J4 线号说明 .................................................................................. 14 ? 脉冲/方向输出信号的连接........................................................... 15 ? 编码器输入信号的连接 ................................................................ 17 ? 数字输入的连接............................................................................ 17 ? 数字输出的连接............................................................................ 19 第四章 软件安装 .................................................................................. 21 ? WIN2000 下驱动程序的安装........................................................ 21 ? WINXP 下驱动程序的安装 .......................................................... 24 第五章 功能说明 .................................................................................. 27 ? 定量驱动....................................................................................... 27 ? 连续驱动....................................................................................... 27 ? 速度曲线....................................................................................... 28 ? 位置管理....................................................................................... 33 ? 插补............................................................................................... 35 ? 脉冲输出方式............................................................................... 41 ? 硬件限制信号............................................................................... 42 ? 伺服马达对应的信号 ................................................................... 42 第六章 ADT850基本库函数列表 ....................................................... 43 第七章 ADT850基本库函数详解 ....................................................... 46 ? 基本参数设置类............................................................................ 46 ? 驱动状态检查类........................................................................... 54 ? 运动参数设定类........................................................................... 56
3
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 运动参数检查类........................................................................... 60 ? 驱动类........................................................................................... 61 ? 开关量输入输出类 ....................................................................... 66 第八章 运动控制函数库使用导航 ...................................................... 69 第九章 运动控制开发要点 .................................................................. 72 ? 卡的初始化 ................................................................................. 72 ? 速度的设定 ................................................................................. 72 ? 插补错误清除函数的使用 ....................................................... 74 ? STOP0、STOP1、STOP2 信号.............................................. 75 ? 伺服信号 ..................................................................................... 75 第十章 运动控制开发编程示例 .......................................................... 76 ? VB 编程示例 ................................................................................. 76 ? VC 编程示例 ................................................................................. 90 第十一章 常见故障及解决方案 ........................................................ 109 ? 电机运行异常............................................................................. 109 ? 开关量输入异常...........................................................................110 附录A 电机驱动器典型接线图 ......................................................... 113 附录B 应用型函数库说明 ................................................................. 115

4
http://www.adtechcn.com

ADT850 四轴运动控制卡

第一章 概要
? 产品简介
ADT850 卡是基于 PCI 总线的高性能四轴伺服/步进控制卡,一个系统中可 支持多达 16 块控制卡,可控制 64 路伺服/步进电机,支持即插即用.。 脉冲输出方式可用单脉冲(脉冲+方向)或双脉冲(脉冲+脉冲)方式,最 大脉冲频率 4MHz,采用先进技术,保证在输出频率很高的时候,频率误差小于 0.1%。 位置管理采用两个加/减计数器,一个用于内部管理驱动脉冲输出的逻辑位 置计数器,一个用于接收外部的输入,输入信号可以是 A/B 相输入的编码器或 光栅尺,也可是上/下脉冲的输入信号,作为实际位置计数器,计数器位数高达 32 位,最大范围–2,147,483,648~+2,147,483,647。外部输入也可用于手轮输入, 作为普通的计数。 提供伺服接口信号,如编码器信号,到位信号(INPOS),报警信号 (ALARM),伺服开启(SERVO ON)等。 多种控制方式,如定量运动,连续运动,回零运动,多轴插补,圆弧插补, 连续插补等。插补一般用定速运动,也可用直线/S 曲线加减速,(S 曲线加减 速不能用于圆弧插补)。 插补带有连续插补功能,即在插补过程中输入下一点的插补数据,以保证 脉冲的连续,使插补达到更快更好的性能。最大插补速度可达 2Mhz。 速度控制可用定速和直线/S 曲线加减速,可做非对称直线加减速,可用自 动/手动减速,在定量驱动时可防止速度曲线产生三角波形。 每轴有 2 个 32 位比较寄存器,可用于软件限位。 每轴有 8 个输入信号,包括 2 个正负限位信号,3 个停止信号,1 个伺服到 位信号,1 个伺服报警信号和 1 个通用输入信号,除 2 个限位信号外,其余信号 可通过设置成无效来作为通用输入信号,3 个停止信号可作为原点、减速、编码 器 Z 相搜寻使用,所有数字输入信号均有积分型的滤波器,可选 8 种滤波时间 常数,以防止干扰。 提供 DOS、WINDOWS95/98/NT/2000/XP、WINCE 开发库,可用 VC++、 VB、BC++、C++builder、LabVIEW、Delphi 等进行软件开发。

5
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 主要性能
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 32 位 PCI 总线,即插即用 所有输入、输出均采用光耦隔离,抗干扰性强 4 轴伺服/步进电机控制,既可独立控制,互不影响 脉冲输出的频率误差小于 0.1% 最大脉冲输出频率为 4MHz 脉冲输出可用单脉冲(脉冲+方向)或双脉冲(脉冲+脉冲)方式 4 轴 均有位置反馈输入,32 位计数,最大计数范围 -2,147,483,648~+2,147,483,647 直线或 S 曲线进行加/减速 非对称直线加/减速运动 2-4 轴直线插补 CW、CCW 圆弧插补 可用连续插补功能,最大驱动速度频率 2MHz 每轴都有 2 个 32 位比较寄存器用于逻辑位置计数器或者实际位置计 数器的位置大小比较,可用于软件限位 可接收伺服马达驱动器的各种信号,如编码器 Z 相信号、到位信号、 报警信号等 每轴有 3 个 STOP 信号,可用于原点搜寻、编码器 Z 相搜寻 运动中可实时改变速度 运动中可以实时读出逻辑位置、实际位置、驱动速度、加速度、驱动 状态 每轴有 8 入 8 出数字 I/O, 2 限位信号外均可作为通用 I/O 使用, 除 数 字输出可用于伺服开启,伺服报警复位等信号 位置计数器具有可变环形功能,逻辑位置计数器和实际位置计数器是 32 位长的上/下环形计数器 每一个输入信号的输入端都装备积分型的滤波器,可以设定哪一个输 入信号的滤波器功能变为有效或无效,滤波器的时间常数从 8 个种类 里可以选择 1 个 支持在一个系统中使用多达 16 个控制卡 支持 DOS、WINDOWS95/98/NT/2000/XP、WINCE 等操作系统

? a)

? 应用范围
? 多轴雕铣系统 ? 机器人系统 ? 间座标测量系统

? 基于 PC 的数控系统

6
http://www.adtechcn.com

ADT850 四轴运动控制卡

第二章 硬件安装
? 配件
1. ADT-850 用户手册(本手册) 2. ADT-850 四轴 PCI 总线高性能运动控制卡 3. ADT-850 用户光盘 4. ADT-9137 37 芯信号接线板 2 块(选件) 5. ADT-D37 37 芯屏蔽连接线 2 条(选件) 25 芯屏蔽连接线 2 条(选件) 6. ADT-9125 25 芯开关信号接线板 2 块(选件) 7. ADT-D25 8. ADT-DB25 25 芯扁平线 2 条 9. ADT-DB37 37 芯扁平线 1 条

? 安装
1. 2. 3. 4. 5. 关闭电脑电源(注:ATX 电源需总电源关闭) 。 打开电脑机箱后盖。 选择一条未占用的 PCI 插槽,插入 ADT-850。 确保 ADT-850 的金手指完整插入 PCI 插槽,拧整螺丝。 根据用户情况决定是否安装 J2、J3、J4 接口线。

7
http://www.adtechcn.com

ADT850 四轴运动控制卡

第三章 电气连接

一块 Adt850 卡有四个输入/输出接口,其中 J1、P2 为 37 针插座,J3、J4 为 25 针插座。

J1 为 X、Y、Z 轴的脉冲输出、开关量输入和开关量输出 OUT0-OUT5 的信号接 线;J2 为 X、Y、Z、W 轴的编码器输入和开关量输入的信号接线;J3 为 W 轴 的脉冲输出、开关量输入和开关量输出 OUT6-OUT15 信号的接线;J4 为开关量
输出 OUT16-OUT31 的信号的接线 信号定义如下:

8
http://www.adtechcn.com

ADT850 四轴运动控制卡

? J1

线号说明

线 号 1 2 3 4 5 6 7 8 9 10 11 12 13 14

符 号 XPU+/CW+ XPU-/CWXDR+/CCW+ XDR-/CCWYPU+/CW+ YPU-/CWYDR+/CCW+ YDR-/CCWZPU+/CW+ ZPU-/CWZDR+/CCW+ ZDR-/CCWVCC VCC X 脉冲信号+ X 脉冲信号X 方向信号+ X 方向信号Y 脉冲信号+ Y 脉冲信号Y 方向信号+ Y 方向信号Z 脉冲信号+ Z 脉冲信号Z 方向信号+ Z 方向信号内部+5V 电源正端 内部+5V 电源正端

说 明

不可接外接电源 不可接外接电源 9
http://www.adtechcn.com

ADT850 四轴运动控制卡

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

VCC INCOM1 XLMT+ XLMTXSTOP0 XSTOP1 YLMT+ YLMTYSTOP0 YSTOP1 ZLMT+ ZLMTZSTOP0 ZSTOP1 GND EXT-GND OUT0 OUT1 OUT2 OUT3 OUT4 OUT5 +12V

内部+5V 电源正端

不可接外接电源

光耦输入公共端(下面的信号) X 正向限位信号 X 反向限位信号 X 停止信号 0,可做通用输入信号 X 停止信号 1,可做通用输入信号 Y 正向限位信号 Y 反向限位信号 Y 停止信号 0,可做通用输入信号 Y 停止信号 1,可做通用输入信号 Z 正向限位信号 Z 反向限位信号 Z 停止信号 0,可做通用输入信号 Z 停止信号 1,可做通用输入信号 内部电源地线 OUT0-5 开关量输出点公共地线 开关量输出点

内部+12V 电源正端

不可接外接电源

10
http://www.adtechcn.com

ADT850 四轴运动控制卡

? J2

线号说明

线号 1 2 3 4 5 6 7 8 9 10 11 12 13

符号 XECA+ XECAXECB+ XECBYECA+ YECAYECB+ YECBZECA+ ZECAZECB+ ZECBWECA+

说明 X 轴编码器 A 相输入+ X 轴编码器 A 相输入X 轴编码器 B 相输入+ X 轴编码器 B 相输入Y 轴编码器 A 相输入+ Y 轴编码器 A 相输入Y 轴编码器 B 相输入+ Y 轴编码器 B 相输入Z 轴编码器 A 相输入+ Z 轴编码器 A 相输入Z 轴编码器 B 相输入+ Z 轴编码器 B 相输入W 轴编码器 A 相输入+ 11
http://www.adtechcn.com

ADT850 四轴运动控制卡

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

WECAWECB+ WECBINCOM2 XSTOP2 XINPOS XALARM XIN YSTOP2 YINPOS YALARM YIN INCOM3 ZSTOP2 ZINPOS ZALARM ZIN WSTOP2 WINPOS WALARM WIN GND VCC +12V

W 轴编码器 A 相输入W 轴编码器 B 相输入+ W 轴编码器 B 相输入光耦输入公共端(下面的信号) X 停止信号 2,可做通用输入信号 X 伺服到位信号,可做通用输入信号 X 伺服报警信号,可做通用输入信号 X 通用输入信号 Y 停止信号 2,可做通用输入信号 Y 伺服到位信号,可做通用输入信号 Y 伺服报警信号,可做通用输入信号 Y 通用输入信号 光耦输入公共端(下面的信号) Z 停止信号 2,可做通用输入信号 Z 伺服到位信号,可做通用输入信号 Z 伺服报警信号,可做通用输入信号 Z 通用输入信号 W 停止信号 2,可做通用输入信号 W 伺服到位信号,可做通用输入信号 W 伺服报警信号,可做通用输入信号 W 通用输入信号 内部电源地线 内部+5V 电源正端 内部+12V 电源正端 不可接外接电源 不可接外接电源

? J3

线号说明

12
http://www.adtechcn.com

ADT850 四轴运动控制卡

线 号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

符 号 WPU+/CW+ WPU-/CWWDR+/CCW+ WDR-/CCWINCOM4 WLMT+ WLMTWSTOP0 WSTOP1 OUT6 OUT7 OUT8 OUT9 OUT10 OUT11 OUT12 OUT13 OUT14 W 脉冲信号+ W 脉冲信号W 方向信号+ W 方向信号-

说 明

光耦输入公共端(下面的信号) W 正向限位信号 W 反向限位信号 W 停止信号 0,可做通用输入信号 W 停止信号 1,可做通用输入信号 开关量输出点

13
http://www.adtechcn.com

ADT850 四轴运动控制卡

19 20 21 22 23 24 25

OUT15 EXT-GND GND GND VCC VCC +12V OUT6-15 开关量输出点公共地线 内部电源地线 内部电源地线 内部+5V 电源正端 内部+5V 电源正端 内部+12V 电源正端

?

J4 线号说明

线 号 1 2 3 4 5 6 7 8

符 号 OUT16 OUT17 OUT18 OUT19 OUT20 OUT21 OUT22 OUT23 开关量输出点

说 明

14
http://www.adtechcn.com

ADT850 四轴运动控制卡

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

OUT24 OUT25 OUT26 OUT27 OUT28 OUT29 OUT30 OUT31 GND GND GND GND VCC VCC VCC VCC +12V 内部+12V 电源正端 内部+5V 电源正端 内部电源地线

?

脉冲/方向输出信号的连接

脉冲输出为差动输出方式 可与步进/伺服驱动器很方便的连接 下图为脉冲与方向的阳极已连通的接法

15
http://www.adtechcn.com

ADT850 四轴运动控制卡

下图为脉冲与方向信号独立的接法,建议采用此种方法,因为是差动接法, 抗干扰性强。

说明:步进电机驱动器、常用伺服电机驱动器和端子板的接线图参见附录 A。

16
http://www.adtechcn.com

ADT850 四轴运动控制卡

?

编码器输入信号的连接

?

数字输入的连接

说明: (1) 为 了 使 输 入 信 号 有 效 , 首 先 必 须 确 保 对 应 输 入 信 号 的 ” 光 耦 公 共 端”(INCOM1 或 INCOM2 或 INCOM3 或 INCOM4)已经和 12V 或 24V 的电源正端相连; 其次普通开关的一端或接近开关的地线和电源负端(地线)相连;最后普通开关的 17
http://www.adtechcn.com

ADT850 四轴运动控制卡

另一端或接近开关的控制端必须和端子板对应的输入端相连。 (2)下面是普通开关和接近开关在使用外部电源给“光耦公共端”供电的实 际接线图。

(3) 下面是普通开关和接近开关在使用内部电源给“光耦公共端”供电的实 际接线图

18
http://www.adtechcn.com

ADT850 四轴运动控制卡

?

数字输出的连接

19
http://www.adtechcn.com

ADT850 四轴运动控制卡

说明: (1)为了使输出信号有效,在使用外部电源时,必须确保输出公共端 EXT-GND 和外部电源负端(地线)相连;在使用内部电源时,必须确保内部电源地线(GND) 和地相连。继电器线圈的一端接电源正端;另一端接端子板对应的输出端。 (2)当 J4 端子板在使用外部电源时,可以将输出公共端 GND 与外部电源负端 (地线)相连,使输出信号有效。J4 端子板建议使用内部电源。 (3)任何情况下都不要将外部电源正端和内部电源正端短接。 (4) 下图是继电器采用外部电源供电的实际接线图。

20
http://www.adtechcn.com

ADT850 四轴运动控制卡

第四章 软件安装
ADT850 卡在 Win95/Win98/NT/Win2000/WinXP 下必须安装驱动程序才能使
用,在 DOS 下则无须安装驱动程序。 以下以 Win2000、 WinXP 为例,其余系统可参考。 控制卡驱动程序位于光盘上“开发包\驱动\控制卡驱动程序”文件夹下面, 驱动程序文件名为 ADT850.INF。

?

Win2000 下驱动程序的安装
以下用 Win2000 Professional 中文版为例, 说明驱动程序的安装, 其余版

本的 Win2000 与此类似。 在将 ADT850 卡安装到电脑上的 PCI 插槽后,开机时应以管理员身份登 录,电脑开机后应发现新硬件,出现如下画面:

单击“下一步”后,再显示如下画面

21
http://www.adtechcn.com

ADT850 四轴运动控制卡

按上图选择后,再单击“下一步”后,出现如下画面

再按上图选择“指定一个位置” ,单击“下一步” ,出现如下画面 22
http://www.adtechcn.com

ADT850 四轴运动控制卡

点击“浏览”按钮,选择光盘“开发包\驱动\控制卡驱动程序” ,即可找到 ADT850.INF 文件的路径,点击“确定” ,出现如下界面

单击”下一步”后出现如下画面

23
http://www.adtechcn.com

ADT850 四轴运动控制卡

单击“完成”后,即完成 ADT850 卡的安装

?

WinXP 下驱动程序的安装
WinXP 下的安装与上面类似,参考下图:

单击”下一步”后出现如下画面

24
http://www.adtechcn.com

ADT850 四轴运动控制卡

单击”下一步”后出现如下画面

点击“浏览”按钮,选择光盘“开发包\驱动\控制卡驱动程序” ,点击“下一 步” ,出现如下界面

25
http://www.adtechcn.com

ADT850 四轴运动控制卡

单击“完成”后,即完成 ADT850 卡的安装

26
http://www.adtechcn.com

ADT850 四轴运动控制卡

第五章 功能说明
? 定量驱动
定量驱动的意思是以固定速度或加/减速度输出指定数量的脉冲。需要移动 到确定的位置或进行确定的动作时,使用此功能。加/减速的定量驱动如下图所 示,输出脉冲的剩余数比加速累计的脉冲数少时就开始减速,输出指定的脉冲 数后驱动结束。 进行加/减速的定量驱动需要设定下列参数: a) 范围 R b) c) d) e) 加/减速 A/D 初始速度 SV 驱动速度 V 输出脉冲数 P

加/减速定量驱动是一般如上图所示从计算的减速点开始自动减速,此外也可 以用手动减速。 在下列的情况下, 不能正确地计算自动减速点或无法算出此减速点, 所以需要手动地计算减速点: ? ? 直线加/减速定量驱动中需要经常变更速度。 用加/减速运行圆弧插补、连续插补。 需要改为手动减速模式,设定减速点。

? 连续驱动
27
http://www.adtechcn.com

ADT850 四轴运动控制卡

在连续驱动中,连续输出驱动脉冲直至高位的停止命令或外部的停止信号有 效。需要运行原点搜寻、扫描操作、控制马达旋转速度时,使用此功能。 有两种停止命令,一种是减速停止,另一种是立即停止。每个轴都有用于减速 /立即停止的STOP0、STOP1、STOP2的3个外部信号。每个信号都可以设定有效/无 效电平。STOP0、STOP1、STOP2信号在加/减速驱动中为减速停止,在定速驱动中, 为立即停止。 连续驱动在原点搜寻动作的应用 把原点接近信号、 原点信号、 编码器Z相信号等安排在STOP0、 STOP1、 STOP2。 在各轴上设定各信号的有效/无效和逻辑电平,高速搜寻时,用加/减速连续驱动, 当设定的有效信号处于激活电平时就减速停止。低速搜寻时,用定速连续驱动。当 设定的有效信号处于激活电平时,就立即停止。为了以加/减速连续驱动,需要设定 和定量驱动时除输出脉冲数之外一样的参数。

? 速度曲线
3.1 定速驱动
定速驱动就是以一成不变的速度输出驱动脉冲。 如果设定驱动速度小于初始速 度,就没有加/减速驱动,而是定速驱动。使用搜寻原点、编码器Z相等信号时,找 到信号后马上要立即停止的话,不必进行加/减速驱动,只需运行低速的定速驱动。 为了定速驱动,下列参数需预先设定: ? ? ? 范围 R 初始速度 SV 驱动速度 V

28
http://www.adtechcn.com

ADT850 四轴运动控制卡

3.2 直线加/速减速驱动
直线加/减速驱动是线性地从驱动的初始速度加速到指定的驱动速度。 定量驱动时,加速的计数器记录加速所累计的脉冲数。当剩余输出脉冲数少于 加速脉冲后,就开始减速(自动减速)。减速时将用指定的减速度线性地减速至初 始速度。 为了直线加/减速驱动,下列参数需预先设定: ? ? ? ? 范围 R 加速度 A 加速度和减速度 减速度 D 加/减速度个别设定时的减速度( 必要时) 初始速度 SV 驱动速度 V

?

29
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 定量驱动的三角防止
在直线加减速的定量驱动中, 如果输出脉冲数小于加速到驱动速度所要求的脉 冲数时,会产生如上图的三角波形,此时三角防止功能会启动。 三角防止功能是在直线加减速的定量驱动中, 哪怕输出脉冲数小于要求的数也 防止三角波形, 在加速中加速时和减速时消费的脉冲数大于总输出脉冲数的1/2 后, 停止加速, 保持在定速域。 因此哪怕输出脉冲小于输出脉冲数的1/2 , 也在定速域。

30
http://www.adtechcn.com

ADT850 四轴运动控制卡

3.3 非对称直线加/减速驱动
在竖直方向移动物体时,物体有重力加速度的负担,所以在这种加速度和减速 度不同的非对称直线加减速的定量驱动中,最好变更上下移动的加速度和减速度。 此时可以进行自动减速, 事先不用设定手动减速点。 图1是加速度比减速度小的例子, 图2是减速度比加速度小的例子。

另外跟通常的直线加减速驱动一样需要设定下述的参数: 31
http://www.adtechcn.com

ADT850 四轴运动控制卡

? ? ? ? ?

范围 R 加速度 A 减速度 D 初始速度 SV 驱动速度 V

3.4 S 曲线加/速驱动
驱动速度加/减速时,可线性地增加/减少加速度/减速度以产生S型速度曲线, S曲线加/减速驱动如下图所示运行。

驱动开始加速时, 加速度以指定的加速度增加率(K) 从0线性增加至指定的 数值(A)。 因此,这个速度曲线成为二次级抛物线(a 区间)。加速度达到指定数 值(A)后保持此数值,这时速度曲线是直线型的,速度在加速中(b区间)。目 32
http://www.adtechcn.com

ADT850 四轴运动控制卡

标速度(V)和当前速度的差值比相应时间增加所增加的速度少时,加速度趋向 0。减少率和增加率一样,以指定的减速度减少率(K)线性地减少,这时速度 曲线成为二次抛物线(C区间)。本书定义这种具有部分固定加速度的加速为部 分S曲线加速。 另一方面,在a区间若在加速度达到指定数值(A)前,目标速度(V)和当前 速度的差值比相应时间增加所增加的速度少时, b区间就消失, 只有a和c区间。 这种 没有固定加速度的加速称为完全S曲线加速。 要执行S曲线加/减速,用户必须设定加速方式为S曲线加速,然后设定下列 参数: ? 范围 R ? 加速度/减速度的变化率 K ? 加速度 A ? 减速度 D(必要时) ? 初始速度 SV ? 驱动速度 V 运行S 曲线加/减速驱动时的注意点: ? 运行S曲线加/减速定量驱动时驱动中不能变更驱动速度。 ? 运行S曲线加/减速时不能驱动圆弧插补、连续插补。

? 位置管理

4.1 逻辑位置计数器和实位计数器
逻辑位置计数器是计数ADT850卡中的正/负方向输出脉冲,输出一个正向 脉冲时,向上计1,输出一个负方向脉冲时,向下计1。 实位计数器计数来自外部编码器的输入脉冲,可以用命令选择输入脉冲的 33
http://www.adtechcn.com

ADT850 四轴运动控制卡

类型为A/B相信号或者独立2脉冲向上/下计数信号,计数方向可设定。 可以在任何时候写入或读出2个计数器的数据,计数范围在 -2,147,483,648~+2,147,483,647之间

4.2 比较寄存器和软件限位
每轴有2个32位寄存器(COMP+ COMP-),能与逻辑位置计数器和实位计 数器比较大小。把2个比较寄存器的比较对象定为逻辑计数器还是实位计数器是 可以设定的,COMP+寄存器主要用来检测逻辑/实位计数器某个范围的上限, COMP-寄存器主要用来检测逻辑/实位计数器某个范围的下限。 软件限位设为有效后,在驱动中,如果逻辑/实位计数器的值大于COMP+ 的值就执行减速停止,此后只能执行负方向驱动命令直至逻辑/实位计数器的值 小于COMP+的值。 同样, 如果逻辑/实位计数器的值小于COMP-的值就执行减速 停止,此后只能执行正方向驱动命令直至逻辑/实位计数器的值大于COMP-的 值。 可以在任何时候写COMP+寄存器和COMP-寄存器。

4.3 位置计数器的可变环形
逻辑位置计数器及实位数器是32位长的上/下环形计数器,因此从32位长的 最大数值FFFFFFFFh往(+)正方向计数的话,最后计数计到0,从0往(-)负方 向计数的话最后计数计到FFFFFFFFh。可变环功能是可以把这个环形计数器的 最大数值任选设定,如果定位不是直线而是旋转运动的话,用此功能控制位置 很方便。 使可变环功能有效后, COMP+寄存器设定逻辑位置计数器的最大数值, 在COMP-寄存器设定实位计数器的最大数值。 如在X轴为旋转轴时,假设X轴为10000个脉冲旋转一圈,设定可变环功能 34
http://www.adtechcn.com

ADT850 四轴运动控制卡

有效,在COMP+寄存器设定9999,同时使用实位计数器的话,在COMP-寄存器 设定9,999。 这时计数动作: 往+方向,向上计数时:… → 9998 → 9999 → 0 → 1 … 往-方向,向下计数时:… → 1 → 0 → 9999 → 9998 …

这样就不需要考虑计数值超过10000时的计算问题, 计数范围一定在0-9999 之间。 ? 注意 ? ? 每个轴都要设定可变环功能的有效/无效但是不能 分别设定逻辑位置计数器和实位计数器的有效/无效 使可变环功能有效后不能使用软件限制功能

? 插补
ADT850卡可以进行2-4轴的直线插补、2轴圆弧插补。 在插补驱动过程中,插补运算是在指定X轴的基本脉冲时序下运行的,因 此进行插补命令之前,先要设定指定X轴的初始速度、驱动速度等参数。(Z-W 插补时是以Z轴速度为基准) ? 插补时的越限错误 35
http://www.adtechcn.com

ADT850 四轴运动控制卡

插补驱动时每个驱动轴都能进行硬件限制和软件限制,在插补驱动中任何 轴的限制有动作,插补驱动就停止。 ? 注意 运行圆弧插补时任何方向(+方向/-方向)的硬件限制、软件限制有效,插 补都会停止。因此,使用圆弧插补要非常小心,不能脱离限制区域。 ? 伺服马达的到位信号 在插补驱动中,各轴到位信号INPOS一旦有效插补驱动就结束,结束后所 有轴的INPOS信号处于有效电平。 5.1 2-4轴直线插补 设定相对于当前位置的终点坐标后就开始进行线性插补。直线插补的坐标 范围是带符号的24位字长,插补范围为从各轴当前位置到-8,388,607~+8,388,607 之间。

如上图所示,对指定直线的位置精确度,在整个插补范围内有±0.5LSB。 上图还有直线插补的驱动脉冲输出例子,在设定的终点数值中绝对值最大的轴 是长轴,在插补驱动中此轴一直输出脉冲,其它的轴是短轴,根据直线插补算 术的结果,有时输出脉冲,有时不输出脉冲。 圆弧插补 设定相对于当前位置始点的圆弧中心坐标及终点坐标后执行圆弧插补。 36
http://www.adtechcn.com

5.2

ADT850 四轴运动控制卡

CW圆弧插补从当前坐标至终点坐标以顺时针方向绕中心坐标画圆弧, CCW圆弧插补以逆时针方向绕中心坐标画圆弧,如果终点设为(0,0)能画整 个圆。 至于圆弧插补的算法如下图所示由X轴和Y轴定义一个平面, 绕中心坐标把 它分为0~7的8个象限,如图所示在0象限的插补坐标(X,Y)上,Y绝对值一直 比X的绝对值小,绝对值小的轴为短轴。1、2、 5、6象限是X轴,0、3、4、7 象限是Y轴,短轴在这些象限之间一直输出驱动脉冲,长轴根据圆弧插补运算结 果,有时输出脉冲,有时不输出脉冲。

37
http://www.adtechcn.com

ADT850 四轴运动控制卡

下面是输出一个整圆的例子,以及输出脉冲的示例

38
http://www.adtechcn.com

ADT850 四轴运动控制卡

?

终点判断 对于圆弧插补,在插补驱动开始前,把当前坐标设为(0, 0),根据中心

坐标的数值决定半径画圆。 圆弧算法的误差在插补驱动范围内有1个脉冲, 因此, 指定的终点可能不在圆的轨迹上。圆弧插补进入终点所在的象限时,只要结束 点值与终点的短轴数值一致圆弧插补就结束。 连续插补 对于没有连续插补功能的控制卡,如果需要在上一插补点结束后继续下一 插补,只能不断查询上一插补是否完成,然后输出下一插补的数据,如果上位 机的速度较慢,或者上位机运行多任务操作系统,在两次插补之间就会出现停 顿,会影响插补的效果,而且插补速度很难提高。 而ADT850卡带有连续插补功能, 可以很好的解决这一问题, 它可在上一插 补未结束时,输出下一插补的数据,即使在很慢的电脑上,也可达到好的效果。 在连续插补驱动中,先读取连续插补的允许写入状态和插补驱动状态,如 果插补未结束并且允许写入,即可写入下一插补命令。因此,在所有的插补节 点中,从连续插补驱动开始至结束的时间,必须长于设定下一个插补节点的数 39
http://www.adtechcn.com

5.3

ADT850 四轴运动控制卡

据和发命令的时间。 ? 连续插补中发生的错误 在连续插补驱动过程中,若发生越限等错误驱动,就立即在当前插补节点 上停止。在停止的插补节点上,下一节点的数据和命令虽在,但命令是无效的。 此外,在发插补命令前,必须检查错误,若没有检查,当发生错误停止驱动后, 这些数据和命令将无效,而从下面第2个插补节点开始运行,一定要进行检查, 若发现错误的话,要脱离连续插补的循环。 连续插补中有圆弧插补时,圆弧插补终点的短轴数值也许会比真值偏差1 个脉冲,因此为了避免累积每个节点的误差,事先要确认每个圆弧插补的终点, 然后考虑怎么运行连续插补。 5.4 加/减速驱动的插补 插补一般用定速驱动,不过ADT850卡可以用直线加/减速驱动或S 曲线加/减 速驱动(只可做直线插补)运行插补。 在连续插补时为了实现加/减速驱动,可以使用减速有效命令 和减速无效命 令。在插补驱动时,减速有效命令是使自动减速或手动减速变为有效,减速无效命 令是使其变为无效。用加/减速单独运行插补驱动时,驱动开始之前一定要设定成减 速有效状态,否则在驱动中即使写入减速有效命令也不能使其变为减速有效。 ? ? 直线插补的加/减速驱动 在直线插补中可以运行直线加/减速驱动、S曲线加减速驱动及自动减速 圆弧插补的加/减速驱动 在圆弧插补位模式插补中只能用手动减速的直线加/ 减速驱动而不能使用S曲 线加/减速驱动及自动减速 ? 连续插补的加/减速驱动 在连续插补中,只能用手动减速的直线加/减速驱动,不能用S曲线加/减速 驱动及自动减速。在连续插补中,要事先设定手动减速点,这个手动减速点设 定在运行减速的最终节点上, 并设定从X轴输出的基本脉冲的数值, 连续插补时, 先把插补减速设定为禁止,然后开始插补驱动,在要减速的最终插补节点上, 写入插补命令之前,写入允许减速命令,开始最终插补节点的驱动时,减速就 有效。从最终插补节点的X轴输出的基本脉冲数大于手动减速点的数值时,开始 减速。 比如从插补节点1至5的连续插补中,在最终节点5上用手动减速的话,有下 40
http://www.adtechcn.com

ADT850 四轴运动控制卡

述的程序。 对主轴设定加/减速模式和参数 ↓ 写手动减速点 ↓ 写禁止减速命令 ↓ 节点1插补命令 ↓ 检查错误,等待写入下一个数据 ↓ 节点2插补命令 : 检查错误,等待写入下一个数据 ↓ 写允许减速命令 ↓ 节点5插补命令 由从节点5 开始的X轴基本脉冲数的数值来设定手动减速点,比如假定减 速花费2,000 脉冲,在节点5上输出的基本脉冲的总脉冲数是5,000 的话,手动 减速点就设定为5,000-2,000=3,000。 减速从开始至停止一定要在1个节点内运行,减速停止的最终插补节点从X或Z 轴输出的基本脉冲总数要大于在减速中花费的脉冲数。

? 脉冲输出方式
驱动输出脉冲有下图所示的2种脉冲输出方式,以独立2脉冲方式,正方向 驱动时由PU/CW 输出驱动脉冲,负方向驱动时由DR/CCW输出驱动脉冲,采用 1脉冲方式则由PU/CW输出驱动脉冲,由DR/CCW输出方向信号。

41
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 硬件限制信号
硬件限制信号(LMT+,LMT-)是限定正方向和负方向驱动脉冲的输入信 号,当限制信号的逻辑电平和限制信号有效时,可以由命令选择减速停止或立 即停止。

? 伺服马达对应的信号
与伺服马达驱动器连接的输入信号有到位信号(INPOS) 和报警信号 (ALARM)。每个信号的有效/无效及逻辑电平都可以设定。 INPOS 输入信号与伺服马达定位完毕信号对应,设定模式为有效时,一个 驱动结束后,等待INPOS 输入信号有效,驱动状态返回结束。ALARM 输入信 号接受伺服马达驱动器的报警信号,设定为有效时,一直监视ALARM 输入信 号,若信号有效,在驱动中立即停止驱动。这些用于伺服马达驱动器的输入信 号可以用通用I/O函数读其状态,通用输出信号可用于偏置计数器清除、报警复 位、伺服开启等。

42
http://www.adtechcn.com

ADT850 四轴运动控制卡

第六章 ADT850 基本库函数列表
函数类别 函数名称 adt850_initial adt850_end set_stop0_mode set_stop1_mode set_stop2_mode set_actualcount_mode set_pulse_mode set_limit_mode 基本参数 set_softlimit_mode1 set_softlimit_mode2 set_softlimit_mode3 set_inpos_mode set_alarm_mode set_ad_mode set_dec1_mode set_dec2_mode set_circle_mode 功能描述 初始化卡 释放卡 停止模式 停止模式 停止模式 实位计数器方式 脉冲模式 限位模式 软限位模式 软限位模式 软限位模式 伺服到位模式 伺服报警模式 加/减速方式 非对称加减速设定 减速方式 可变环模式 页码 46 46 47 47 47 48 49 49 50 50 51 51 51 52 52 52 52
43
http://www.adtechcn.com

ADT850 四轴运动控制卡

set_input_fiilter set_filer_time get_status get_stopdata 驱动状态检查 get_inp_status get_inp_status2 set_range set_acac set_acc set_dec set_startv 运动参数设定 set_speed set_command_pos set_actual_pos set_comp1 set_comp2 set_dec_pos get_command_pos 运动参数检查 get_actual_pos get_speed

信号滤波 信号滤波时间 获取单轴驱动状态 获取错误停止信息 获取插补驱动状态 连续插补写入状态 设定范围 设定加速度变化率 设定加速度 设定减速度 设定初始速度 设定驱动速度 设定逻辑计数器 设定实位计数器 设定寄存器 设定寄存器 设定减速点 获取逻辑位置 获取实际位置 获取驱动速度

53 53 54 54 55 55 56 56 57 58 58 58 59 59 60 60 60 60 61 61
44

http://www.adtechcn.com

ADT850 四轴运动控制卡

get_ad pmove continue_move dec_stop sudden_stop inp_move2 驱动类 inp_cw_arc inp_ccw_arc inp_move3 inp_move4 inp_dec_enable inp_dec_disable inp_clear read_di write_do 开关量类 read_bit write_bit

获取加速度 单轴定量驱动 连续驱动 减速停止 立即停止 两轴插补 顺时针圆弧插补 逆时针圆弧插补 三轴插补 四轴插补 插补减速允许 插补减速禁止 插补错误清除 读所有输入点 设置所有输出 读单个输入点 输出单点

61 62 62 62 63 63 63 64 64 65 65 65 65 66 67 67 68

45
http://www.adtechcn.com

ADT850 四轴运动控制卡

第七章 ADT850 基本库函数详解
? 基本参数设置类

1.1 初始化卡 int adt850_initial(void); (1)返回值>0 时,表示 adt850 卡的数量。如果为 3,则下面的可用卡号分 别为 0、1、2; (2)返回值=0 时,说明没有安装 adt850 卡; (3)返回值<0 时,-1 表示没有安装端口驱动程序,-2 表示 PCI 桥故障。 初始化后各状态为: 脉冲输出方式为 脉冲+方向方式 反馈输入为 A/B 相编码脉冲输入,4 倍频 停止信号 STOP0,STOP1,STOP2 均为无效 限位信号 LMT+,LMT- 为低电平有效,立即停止 软件限位无效 伺服到位信号 nINPOS 无效 伺服报警信号 nALARM 无效 加速方式为直线加/减速,对称加/减速,自动减速 计数器的可变环功能无效 输入滤波无效 注意:初始化函数是调用其它函数的前提,所以必须最先调用,以确认 可使用的卡数以及初始化一些参数。 1.2 释放adt850卡 int adt850_end(void); 0:正确 1:错误 返回值

此函数应在程序结束时调用。 (仅用于 Windows NT/2000) 。 46
http://www.adtechcn.com

ADT850 四轴运动控制卡

用于将 ADT850 卡占用的资源释放。 1.3 设置stop0信号的有效/无效和逻辑电平 int set_stop0_mode(int cardno, int axis, int value,int logic); cardno axis value logic 返回值 卡号 轴号(1-4) 0:无效 0:低电平停止 0:正确 1:有效 1:高电平停止 1:错误

默认模式为:无效,低电平停止 ? 注意:停止方式取决于是加减速驱动还是匀速驱动,对加减速驱 动,是减速停止,对匀速驱动,是立即停止。STOP1、STOP2 信号也是一样。 1.4 设置stop1信号的有效/无效和逻辑电平 int set_stop1_mode(int cardno, int axis, int value,int logic); cardno axis value logic 返回值 卡号 轴号(1-4) 0:无效 0:低电平停止 0:正确 1:有效 1:高电平停止 1:错误

默认模式为:无效,低电平停止 1.5 设置stop2信号的有效/无效和逻辑电平 int set_stop2_mode(int cardno, int axis, int value,int logic); cardno axis value logic 返回值 卡号 轴号(1-4) 0:无效 0:低电平停止 0:正确 1:有效 1:高电平停止 1:错误

默认模式为:无效,低电平停止

47
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 注意:STOP2 信号有效时同时可清除实位计数器。 因为由于伺服系统或机械系统的延迟,如果在停止驱动后再 用软件清除实位计数器,会使原点位置有一定的误差,可使 用本功能达到更高的精度。 只有 STOP2 有此功能。 1.6 设置实位计数器(编码器输入)的工作方式 int set_actualcount_mode(int cardno, int axis, int value,int dir,int freq); cardno axis 卡号 轴号(1-4) 0:A/B 脉冲输入 dir 计数方向 0: A 超前 B 或 PPIN 脉冲输入向上计数 B 超前 A 或 PMIN 脉冲输入向下计数 1: B 超前 A 或 PMIN 脉冲输入向上计数 A 超前 B 或 PPIN 脉冲输入向下计数 freq A/B 脉冲输入时的倍频,上/下脉冲输入时无效 0:4 倍频 1:2 倍频 2:不倍频 返回值 0:正确 1:错误 默认模式为:A/B 相脉冲输入,方向为 0,4 倍频

value 输入脉冲方式 1:上/下(PPIN/PMIN)脉冲输入

48
http://www.adtechcn.com

ADT850 四轴运动控制卡

对于大多数位置反馈装置,均采用编码器或光栅尺,应设置为 A/B 相脉 冲输入方式,对此种方式,可采用倍频技术提高精度,可设定为 4 倍频 或 2 倍频,也可不使用倍频,对于 4 倍频,如果采用每转 1000 个脉冲的 编码器,正转一圈,计数值应增加 4000,即精度提高了 4 倍 1.7 设置输出脉冲的工作方式 int set_pulse_mode(int cardno, int axis, int value,int logic,int dir_logic); cardno axis value 卡号 轴号(1-4) 0: 脉冲+脉冲方式 1:脉冲+方向方式

logic

0: 正逻辑脉冲

1: 负逻辑脉冲

dir-logic

0:方向输出信号正逻辑 1:方向输出信号负逻辑

返回值

0:正确

1:错误

默认模式为:脉冲+方向方式,正逻辑脉冲,方向输出信号正逻辑

1.8 设定正/负方向限位输入nLMT信号的模式设定 int set_limit_mode(int cardno, cardno 卡号 49
http://www.adtechcn.com

int axis,

int value,int logic);

ADT850 四轴运动控制卡

axis value logic 返回值

轴号(1-4) 0:有效时立即停止 0:低电平有效 0:正确 1:有效时减速停止 1:高电平有效 1:错误

默认模式为:立即停止,低电平有效

? 注意: 限位信号不能设置成有效/无效。

1.9 COMP+寄存器做软件限制的设定 int set_softlimit_mode1(int cardno, cardno axis value 返回值 卡号 轴号(1-4) 0:无效 0:正确 1:有效 1:错误 int axis, int value);

默认模式为: 无效 ? 注意:软件限位总是减速停止,那么计数值就可能会超出设定值, 因此在设定范围时应考虑到这一点。

1.10 COMP-寄存器做软件限制的设定 int set_softlimit_mode2(int cardno, cardno axis value 返回值 卡号 轴号(1-4) 0:无效 0:正确 1:有效 1:错误 int axis, int value);

默认模式为: 无效 ? 注意:软件限位总是减速停止,那么计数值就可能会超出设定值, 因此在设定范围时应考虑到这一点。

50
http://www.adtechcn.com

ADT850 四轴运动控制卡

1.11 COMP+/-寄存器的比较对象设定 int set_softlimit_mode3(int cardno, cardno axis value 返回值 卡号 轴号(1-4) 0:逻辑位置计数器 0:正确 1:实际位置计数器 1:错误 int axis, int value);

默认模式为 : 逻辑位置计数器 此函数是设定软件限位的比较对象。 1.12 伺服到位信号nINPOS的设定 int set_inpos_mode(int cardno, cardno axis value logic 返回值 卡号 轴号(1-4) 0:无效 0:低电平有效 0:正确 1:有效 1:高电平有效 1:错误 int axis, int value,int logic);

默认模式为 : 无效,低电平有效 ? 注意:如果 nINPOS 未与伺服接线,或者使用步进电机,请不要设成有 效。 1.13 伺服报警信号nALARM的设定 int set_alarm_mode(int cardno, cardno axis value logic 返回值 卡号 轴号(1-4) 0:无效 0:低电平有效 0:正确 1:有效 1:高电平有效 1:错误 int axis, int value,int logic);

默认模式为 : 无效,低电平有效 ? 注意:如果 nALARM 未与伺服接线,或者使用步进电机,请不要设 成有效。 51
http://www.adtechcn.com

ADT850 四轴运动控制卡

1.14 加/减速方式的设定 int set_ad_mode(int cardno, cardno axis value 返回值 卡号 轴号(1-4) 0:直线加/减速 0:正确 1:S曲线加/减速 1:错误 int axis, int value);

默认模式为 : 直线加/减速

1.15 非对称梯形加/减速的设定 int set_dec1_mode(int cardno, cardno axis value 卡号 轴号(1-4) 减速度使用 0:加速度的值(即对称加减速) 1:减速度的值(即非对称加减速) 返回值 0:正确 1:错误 默认模式为 : 对称加减速 1.16 加/减速定量驱动的减速方式的设定 int set_dec2_mode(int cardno, cardno axis value 返回值 卡号 轴号(1-4) 0:自动减速 0:正确 1:手动减速 1:错误 int axis, int value); int axis, int value);

默认模式为 : 自动减速 ? 注意:大部分情况可使用自动减速,使用手动减速应设定好减速点。 1.17 计数器的可变环功能的设定 int set_circle_mode(int cardno, int axis, int value); 52
http://www.adtechcn.com

ADT850 四轴运动控制卡

cardno axis value 返回值

卡号 轴号(1-4) 0:无效 0:正确 1:有效 1:错误

默认模式为 : 无效 可变环功能说明参见前面。 1.18 输入信号滤波功能设置 int set_input_filter(int cardno,int axis,int number,int value); cardno axis number 卡号 轴号 输入类别 1:LMT+、LMT-、STOP0、STOP1 2:STOP2 3:nINPOS、nALARM 4:nIN 即可分别设置上面四类输入信号的滤波状态 value 0:滤波无效 1:滤波有效 默认模式为 : 无效 1.19 输入信号滤波时间常数设置 int set_filter_time(int cardno,int axis,int value); cardno axis 卡号 轴号

value 范围1-8,含义如下:

53
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 驱动状态检查类
2.1 获取各轴的驱动状态 int get_status(int cardno,int axis,int *value) 卡号 轴号(1-4) 驱动状态的指针 0:驱动结束 非 0:value 为两个字节长度的值,各位的含义如下: D0 为最低位 D15 为最高位

cardno axis value

D0:表示逻辑/实位计数器和 COMP+寄存器的大小关系 1 逻辑/实位计数器>=COMP+寄存器 0 逻辑/实位计数器<COMP+寄存器 D1:表示逻辑/实位计数器和COMP-寄存器的大小关系 1 逻辑/实位计数器>=COMP-寄存器 0 逻辑/实位计数器<COMP-寄存器 D2:在加/减速驱动中,加速时为1 D3:在加/减速驱动中,定速时为1 D4:在加/减速驱动中,减速时为1 D5:在S曲线加/减速驱动中,加速度/减速度增加时为1 D6:在S曲线加/减速驱动中,加速度/减速度不变时为1 D7:在S曲线加/减速驱动中,加速度/减速度减少时为1 D8-D15:未用 返回值 2.2 0:正确 1:错误

获取各轴的错误停止信息 int get_stopdata(int cardno,int axis,int *value) cardno axis value 卡号 轴号 错误状态的指针 0:无错误 54
http://www.adtechcn.com

ADT850 四轴运动控制卡

非 0:value 为两个字节长度的值,各位的含义如下: D0 为最低位 D15 为最高位

D0:由STOP0停止 D1:由STOP1停止 D2:由STOP2停止 D3;由正限位LMT+停止 D4:由负限位LMT-停止 D5:由伺服报警停止 D6:COMP+ 寄存器限位驱动停止 D7:COMP- 寄存器限位驱动停止 D8-D15:未用 返回值 2.3 0:正确 1:错误

获取插补的驱动状态 int get_inp_status(int card,int no,int *value) cardno no value 返回值 卡号 1:X-Y 轴插补或 3 轴以上插补 2:Z-W 轴插补 插补状态的指针 0:插补结束 0:正确 1:正在插补 1:错误

2.4 取连续插补的允许写入状态 int get_inp_status2(int card,int no,int *value) cardno no 卡号 1:X-Y 轴插补或 3 轴以上插补 2:Z-W 轴插补 value 状态的指针 0:不允许写入 返回值 0:正确 1:允许写入 1:错误

? 注意:如果驱动结束,则状态也为 0,因此在连续插补时,还须注意 是否有错误发生,以便退出连续插补。

55
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 运动参数设定类
? 注意:以下参数在初始化后值不确定,使用前必须设定 范围设定 int set_range(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号

3.1

value R值 范围(8000000-16000) 0:正确 1:错误

? 注意:范围是决定速度、加/减速度、加/减速度的变化率的倍 率参数,假设把范围数值作为R 倍率是下述的算式 倍率=8000000/R 因为驱动速度、初始速度、加/减速度等参数的设定范围在1~8000。若需要 设定为大于8000的数值的话,必须提高倍率。提高倍率后可以高速驱动, 但是速度分辨率变粗。请在使用的速度范围内设定最小的数值。比如如果 需要40KPPS 的速度, 在速度范围内1~8000 倍率中最好是5, 即设定R 为 1600000。 R值范围是8000000-16000,相应的倍率为1-500。 在驱动中请不要变更范围(R) 否则速度会变乱。 如: set_range(0,1,800000); 为设定第一块卡的X轴的倍率为8000000/800000=10倍 set_range(0,3,16000); 为设定第一块卡的Z轴的倍率为8000000/16000=500倍 3.2 加/减速度的变化率设定 int set_acac(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号

value K值(1-65535) 0:正确 1:错误 56
http://www.adtechcn.com

ADT850 四轴运动控制卡

加/减速度的变化率设定值是决定S曲线加/减速的加速度及减速度在单位时 间内增加/减少率的参数。把加/减速度的变化率的设定值作为K的话,加/减 速度的变化率由下述算式表示。 加减速度的变化率(PPS / SEC2 )=(62500000/K)*倍率 即: 加减速度的变化率(PPS / SEC2 )=(62500000/K)*(8000000/R) 加/减速度的变化率设定值K的设定范围是1~65,535 如: set_range(0,1,800000); set_acac(0,1,100); 则加减速度的变化率为 (62500000/100)(8000000/800000) * =6250000 PPS/SEC2 3.3 加速度设定 int set_acc(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号

value A值(1-8000) 0:正确 1:错误 它是作为直线加减速驱动中直线加速及减速的参数,在S 曲线加/减速驱动 中,加速度及减速度线性从0 增加至加速度的设定值。 加速度设定值为A 加速度是下述算式 加速度(PPS/SEC)=A*125*倍率 即 加速度(PPS/SEC)=A*125*(8000000/R) 加速度设定值A 的设定范围是1~8,000。 如: set_range(0,1,80000); set_acc(0,1,100); 则加速度为: 100*125*(8000000/80000)=1250000 PPS/SEC 减速度设定 57
http://www.adtechcn.com

3.4

ADT850 四轴运动控制卡

int set_dec(int cardno,int axis,long value); cardno axis 返回值 减速度参数。 在这个模式的S曲线加/减速驱动中,减速度线性从0增加至减速度的设定 值。减速度设定值为D,减速度是下述算式 减速度(PPS/SEC)=D*125*倍率 即 减速度(PPS/SEC)=D*125*(8000000/R) 3.5 初始速度设定 int set_startv(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号 卡号 轴号

value D值(1-8000) 0:正确 1:错误 在加速度/减速度的分别设定模式中,它是直线加/ 减速度驱动在减速时的

value SV值(1-8000) 0:正确 1:错误 它是加/ 减速驱动的加速开始时的速度和减速结束时的速度,初始速度设 定数值为SV 的话,初始速度是下述算式 初始速度(PPS)=SV*倍率 即 初始速度(PPS)=SV*(8000000/R) 3.6 驱动速度设定 int set_speed(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号

value V值(1-8000) 0:正确 1:错误 它是加/减速驱动中达到定速区域的速度。定速驱动从该速度开始运行。驱 动速度设定小于初始速度的话,不运行加/减速驱动,将运行定速驱动。驱 动速度设定数值为V 的话,驱动速度是下述算式 驱动速度(PPS)=V*倍率 58
http://www.adtechcn.com

ADT850 四轴运动控制卡

即 驱动速度(PPS)=V*(8000000/R) 在驱动中可以变更驱动速度,在加/减速度驱动的定速区域中,如果重新设 定驱动速度,将加速或减速到重新设定的速度,达到重新设定的速度后, 开始运行定速驱动。

? 注意事项
S曲线加/减速的定量脉冲驱动在驱动中不能变更驱动速度。 此外S曲线 加/减速的连续驱动如果在加速中,减速中变更速度,就不能运行正确的S 曲线,所以请在定速区域内变更运行。 直线加/减速的定量脉冲驱动时,在驱动中如果经常变更驱动速度,则 在输出脉冲结束的减速时,出现以初始速度拖曳驱动的可能性较大。 3.7 逻辑位置计数器设定 设定逻辑位置计数器的数值 int set_command_pos(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号

value 范围值(-2147483648~+2147483647) 0:正确 1:错误 逻辑位置计数器任何时候都能写、任何时候都能读 3.8 实际位置计数器设定 设定实际位置计数器的数值 int set_actual_pos(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号

value 范围值(-2147483648~+2147483647) 0:正确 1:错误 实际位置计数器任何时候都能写、任何时候都能读 3.9 COMP+寄存器设定 设定COMP+寄存器的数值 int set_comp1(int cardno,int axis,long value); cardno axis 卡号 轴号

value 范围值(-2147483648~+2147483647) 59
http://www.adtechcn.com

ADT850 四轴运动控制卡

返回值

0:正确

1:错误

COMP+寄存器任何时候都能写 3.10 COMP-寄存器设定 设定COMP-寄存器的数值 int set_comp2(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号

value 范围值(-2147483648~+2147483647) 0:正确 1:错误

COMP-寄存器任何时候都能写 3.11 手动减速点设定 设定手动减速点的数值 int set_dec_pos(int cardno,int axis,long value); cardno axis 返回值 卡号 轴号

value 范围值(0~268435455) 0:正确 1:错误 设定在手动减速模式的加减速定量驱动上的减速点 手动减速点 = 输出脉冲数 – 花费在减速上的脉冲数 在使用手动减速模式时必须设定好手动减速点

? 运动参数检查类
以下函数在任何时候均可调用
4.1 获取各轴的逻辑位置 int get_command_pos(int cardno,int axis,long *pos) cardno axis pos 返回值 的当前位置。 60
http://www.adtechcn.com

卡号 轴号 逻辑位置值的指针 0:正确 1:错误

此函数可随时得到轴的逻辑位置,在电机未失步的情况下,pos 的值表示轴

ADT850 四轴运动控制卡

4.2

获取各轴的实际位置(即编码器反馈输入值) int get_actual_pos(int cardno,int axis,long *pos) cardno axis pos 返回值 卡号 轴号 实际位置值的指针 0:正确 1:错误

此函数可随时得到轴的实际位置, 在电机有失步的情况下, 的值依然表示轴 pos 的实际位置。 4.3 获取各轴的当前驱动速度 int get_speed(int cardno,int axis,long *speed) cardno axis speed 返回值 卡号 轴号 当前驱动速度的指针 0:正确 1:错误

数据的单位和驱动设定数值V一样。 此函数可随时得到轴的驱动速度。 获取各轴的当前加速度 int get_ad(int cardno,int axis,long *ad) cardno axis ad 返回值 卡号 轴号 当前加速度的指针 0:正确 1:错误

4.4

数据的单位和驱动加速度设定数值A一样。 此函数可随时得到轴的驱动加速度。

? 驱动类
5.1 定量驱动 int pmove(int cardno,int axis,long pulse) 61
http://www.adtechcn.com

ADT850 四轴运动控制卡

cardno axis pulse

卡号 轴号 输出的脉冲数 >0:正方向移动 <0:负方向移动 范围(-268435455~+268435455)

返回值

0:正确

1:错误

注意:写入驱动命令之前一定要正确地设定速度曲线所需的参数 连续驱动 int continue_move(int cardno,int axis,int dir) cardno axis dir 卡号 轴号 驱动的方向 0:正方向移动 1:负方向移动 返回值 0:正确 1:错误 写入驱动命令之前一定要正确地设定速度曲线所需的参数 驱动减速停止 int dec_stop(int cardno,int axis) cardno axis 返回值 卡号 轴号 0:正确 1:错误

5.2

5.3

在驱动脉冲输出过程中,此命令作出减速停止,驱动速度比初始速度 慢的时候也可以用本命令立即停止。 注意:直线插补时,如需要减速停止,应当对插补轴中轴号最小的轴使用 此指令,否则可能不能达到预定的结果。 驱动立即停止 int sudden_stop(int cardno,int axis) 62
http://www.adtechcn.com

5.4

ADT850 四轴运动控制卡

cardno axis 返回值

卡号 轴号 0:正确 1:错误

立即停止正在驱动中的脉冲输出,在加/减速驱动中也立即停止。 注意:直线插补时,如需要立即停止,应当对插补轴中轴号最小的轴 使用此指令,否则可能不能达到预定的结果。 两轴直线插补 int inp_move2(int card,int no,long pulse1,long pulse2) cardno no 卡号 参与插补的轴号 1:X-Y 2:Z-W pulse1,pulse2 返回值 移动的相对距离 范围(-8388608~+8388607) 0:正确 1:错误 注意:X-Y插补的速度以X轴速度为基准,Y无须设定。Z-W插补的速度以 Z轴速度为基准,W无须设定。 顺时针CW圆弧插补 int inp_cw_arc(int card,int no,long x,long y,long i,long j) cardno no 卡号 参与插补的轴号 1:X-Y 2:Z-W x,y 圆弧插补的终点位置(相对于起点) 范围(-8388608~+8388607) i,j 返回值 圆弧插补的圆心点位置(相对于起点) 范围(-8388608~+8388607) 0:正确 1:错误

5.5

5.6

63
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 注意:X-Y插补的速度以X轴速度为基准,Y无须设定。Z-W插补的速 度以Z轴速度为基准,W无须设定。 逆时针CCW圆弧插补 int inp_ccw_arc(int card,int no,long x,long y,long i,long j) cardno no 卡号 1:X-Y 2:Z-W x,y 圆弧插补的终点位置(相对于起点) 范围(-8388608~+8388607) i,j 返回值 圆弧插补的圆心点位置(相对于起点) 范围(-8388608~+8388607) 0:正确 1:错误 ? 注意:X-Y插补的速度以X轴速度为基准,Y无须设定。Z-W插补的速 度以Z轴速度为基准,W无须设定。 三轴直线插补 int inp_move3(int cardno,long pulse1,long pulse2,long pulse3) cardno 卡号

5.7

5.8

pulse1,pulse2,pulse3 X-Y-Z轴移动的相对距离 范围(-8388608~+8388607) 三轴插补只能进行X、Y、Z轴三轴插补 返回值 0:正确 1:错误

? 注意:三轴插补的速度以X轴速度为基准,Z轴的倍率和驱动速度 应设置成和X轴的倍率和驱动速度相同,Z轴的初始速度应 设置成和X轴的驱动速度一样(不是X轴的初始速度) 。Y无 须设定。 四轴直线插补 int inp_move4(int cardno,long pulse1,long pulse2,long pulse3,long pulse4) 64
http://www.adtechcn.com

5.9

ADT850 四轴运动控制卡

cardno

卡号

pulse1,pulse2,pulse3,pulse4 X-Y-Z-W轴移动的相对距离 范围(-8388608~+8388607) 返回值 0:正确 1:错误 ? 注意:四轴插补的速度以X轴速度为基准,Z轴的倍率和驱动速度 应设置成和X轴的倍率和驱动速度相同,Z轴的初始速度应 设置成和X轴的驱动速度一样(不是X轴的初始速度) 。Y、W无 须设定。 5.10 插补减速允许 int inp_dec_enable(int cardno,int no) cardno no 返回值 卡号 1:X-Y或X-Y-Z或X-Y-Z-W插补 2:Z-W插补 0:正确 1:错误

5.11 插补减速禁止 int inp_dec_disable(int cardno,int no) cardno 卡号 no 1:X-Y或X-Y-Z或X-Y-Z-W插补 2:Z-W插补 返回值 0:正确 1:错误 此函数与上一函数用于加/减速驱动的插补驱动,对于单个插补驱动,应设为 允许,对连续插补,应先设为禁止,在最后一点再设为允许。具体应用可见 后面的例子。 5.12 插补错误清除 int inp_clear(int cardno); cardno 返回值 卡号 0:正确 1:错误

三轴、四轴插补在不正常停止时,Z、W轴会一直停在驱动状态,需要使用 上述函数使其恢复到正常状态。不正常停止是指在驱动过程中使用了停止命令 或产生了限位动作等情况。两轴插补不需要使用。 65
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 开关量输入输出类
6.1 读所有开关量输入状态 int read_di(int cardno,unsigned long *value) cardno 卡号 value 输入状态值的指针 value为四个字节的值 D0为低位 D31为高位 相应位为0为输入低电平 为1为输入高电平 D0:X LMT+ D2:X STOP0 D4:X STOP2 D6:X ALARM D8:Y LMT+ D10:Y STOP0 D12:YSTOP2 D14:Y ALARM D16:Z LMT+ D18:Z STOP0 D20:Z STOP2 D22:Z ALARM D24:W LMT+ D26:W STOP0 D28:W STOP2 D30:W ALARM 返回值 0:正确 1:错误 D1:X LMTD3:X STOP1 D5:X INPOS D7:X IN D9:Y LMTD11:Y STOP1 D13:Y INPOS D15:Y IN D17:Z LMTD19:Z STOP1 D21:Z INPOS D23:Z IN D25:W LMTD27:W STOP1 D29:W INPOS D31:W IN

6.2

设置所有开关量输出状态 int write_do(int cardno,unsigned long value) 66
http://www.adtechcn.com

ADT850 四轴运动控制卡

cardno value

卡号 输出状态值 value为四个字节的值 D0为低位 D31为高位 相应位为0为输出低电平 为1为输出高电平 D0:OUT0 D1:OUT1 。。 。 D31:OUT31

返回值 读单个输入点

0:正确

1:错误

6.3

int read_bit(int cardno,int number) cardno number 返回值 卡号 输入点(0-31) 0:低电平 1:高电平 -1:错误 输入点数含义如下: 0:X LMT+ 2:X STOP0 4:X STOP2 6:X ALARM 8:Y LMT+ 10:Y STOP0 12:YSTOP2 14:Y ALARM 16:Z LMT+ 18:Z STOP0 20:Z STOP2 22:Z ALARM 1:X LMT3:X STOP1 5:X INPOS 7:X IN 9:Y LMT11:Y STOP1 13:Y INPOS 15:Y IN 17:Z LMT19:Z STOP1 21:Z INPOS 23:Z IN 67
http://www.adtechcn.com

ADT850 四轴运动控制卡

24:W LMT+ 26:W STOP0 28:W STOP2 30:W ALARM 输出单点

25:W LMT27:W STOP1 29:W INPOS 31:W IN

6.4

int write_bit(int cardno,int number,int value) cardno number value 返回值 卡号 输出点(0-31) 0:低 0:正确 1:错误 输出数对应相应的输出号。 1:高

68
http://www.adtechcn.com

ADT850 四轴运动控制卡

第八章
1.

运动控制函数库使用导航

ADT850 函数库概述
ADT850 函数库实质是用户操作运动控制卡的接口, 用户通过调用接口函数,

即可控制运动控制卡完成相应的功能。 运动控制卡提供了 DOS 下的运动函数库和 Windows 下的动态链接库,下面 分别介绍 DOS 和 Windows 下的函数库的调用方法。

2.

Windows 下动态链接库的调用
Windows 下的动态链接库“Adt850.dll”利用 VC 编写而成,位于光盘“开发

包\驱动\动态链接库”下,适用于 Window 下常用的编程语言工具:VB、VC、 C++Builder、VB.NET、VC.NET、Delphi 和组态软件 LabView 等。

2.1 VC 中的调用
(1) 新建一个项目; (2) 将光盘“开发包\VC”下的“Adt850.lib”和“Adt850.h”文件拷贝到新 建项目的路径下; (3) 在新建项目”工作区”的”文件视图”中,右击鼠标,选择“Add Files to Project”,在插入文件对话框中,文件类型选择为“Library Files(.lib)”, 搜索出“Adt850.lib”并且选择,点击“OK”,完成静态库的加载; (4) 在源程序文件或头文件或全局头文件“StdAfx.h”的申明部分加上 #include “Adt850.h“; 经过上述四步,用户即可调用动态链接库中的函数。 说明:VC.NET 中的调用方法和 VC 相似。

2.2 VB 中的调用
(1) 新建一个项目; (2) 将光盘“开发包\VB”下的“adt850lib.bas”文件拷贝到新建项目的路径 下; (3) 选择“工程\添加模块”菜单命令,选择对话框中的“现存” 标签页,搜索出“adt850lib.bas”模块文件,点击打开按钮; 经过上述三步,即可在程序中调用动态链接库的函数。 说明:VB.NET 中的调用方法和 VB 相似。 69
http://www.adtechcn.com

ADT850 四轴运动控制卡

2.3 C++Builder 中的调用
(1) 新建一个项目; (2) 将光盘中“开发包\C++Builder”中的“adt850.lib”和“adt850.h”拷贝 到新建项目路径下; (3) 选择“Project\Add to Project”菜单命令,在对话框中,文件类型选择为 “Library files(*.lib)”,搜索出“adt850.lib”文件,点击“打开”按钮; (4) 在程序文件的申明部分加上#include “adt850.h”; 经过上述三步,即可在程序中调用动态链接库。

2.4 LabView 8 中的调用
(1) 新建一个 VI; (2) 将光盘中“开发包\驱动\动态链接库”中“adt850.dll”拷贝到新建路径 下; (3) 在需要调用库函数的地方,在程序框图的窗口中,在函数模板中选择 “Connectivity\Libraries & Executables”下面的“Call Library Function Node”节点,添加到调用处; (4) 双击节点,首先在“Call Library Function”对话框中选择“adt850.dll” 动态链接库,其次选择需要的库函数,最后配置好函数的返回值和参数 属性; 经过上述四步,即可在程序中调用动态链接库。

3.

DOS 下库函数的调用
DOS 下的函数库是利用 Borland C3.1 编译而成,存放在光盘“开发包 \BC 或 C” 库函数分为大模式和巨模式两种, 下, 适用于标准 C 和 Borland C3.1 或以上版本。 Borland C 调用函数库的方法如下: (1) 在 Borland C 的开发环境下,选择“Project\Open Project”命令新 建一个项目; (2) 将光盘中 “开发包\BC” 下面的 “ADT850H.LIB” “ADT850L.LIB” 或 和“ADT850.H”文件拷贝到新建项目路径下; (3) 选择“Project\Add Item”命令,在对话框中选择“ADT850H.LIB” 或“ADT850L.LIB”,单击“Add”按钮; 70
http://www.adtechcn.com

ADT850 四轴运动控制卡

(4) 在用户程序文件中增加#include “adt850.h”申明; 经过上述四步,即可在程序中调用库函数。

4.

库函数返回值及其含义
为了保证用户在使用库函数时, 正确掌控库函数的执行情况, 函数库中的每

个库函数都会在执行结束后,返回库函数的执行结果。用户依据返回值,可以很 方便地判断出函数调用是否成功。 函数库中除 “int adt850_initial(void)” “int read_bit(int 和 调用正确,“1”表示调用失败。 下面以列表的形式介绍函数返回值的含义。 函数名 返回值 -1 -2 Adt850_initial 0 >0 0 Read_bit 1 -1 其他所有函数 0 1 含义 未安装端口驱动程序 PCI 插槽故障 没有安装控制卡 代表控制卡的数量 低电平 高电平 代表卡号或输入点超限错误 正确 错误 cardno, int number)” 的返回值特殊外,其他函数的返回值只有“0”和“1”两种情况,其中“0”表示

说明:返回值 1 错误,正常是由于调用库函数的过程中,传递的参数值 cardno(卡号)或 axis(轴号)错误引起的。卡号的值从 0、1、2 依次向上编号,所以 在只用一块卡的情况下,卡号必须为 0;轴号的值只能是 1、2、3、4,其他的值 都是错误的。

]

71
http://www.adtechcn.com

ADT850 四轴运动控制卡

第九章

运动控制开发要点

本卡在编程时常会遇到一些问题,其实,大部分问题是由于对本控制卡的 原理不理解而产生的,以下就一些常见的、易产生误解的情况作一些说明。

? 卡的初始化
在程序的开始首先应调用adt850_initial()函数,确认adt850卡的安装是否正 确,然后设置脉冲输出的模式,限位开关的工作模式,以上参数应根据具体的 机器来设置,一般只应在程序初始化时设置一次,以后不应再设置。 另外范围设定 set_range 函数一般应根据使用的最大脉冲频率来设定,此 后一般不应再变化,每轴范围设定可以不同,如X轴最大频率为100K,因 set_speed 最大值为8000,倍率应为100000/8000=12.5,则范围R值应为 8000000/12.5=640000,即 set_range(cardno,1,640000); 当要输出100K频率时 set_speed(cardno,1,8000) 当要输出10K频率时 set_speed(cardno,1,800) 最低输出频率为1*12.5=12.5Hz 通常应根据可能使用的最大使用频率确定R值,除非最低频率不能满足使 用要求,否则在使用过程中不应改变 R 值, 说明:库函数“adt850_initial”是通往ADT850卡的“门户” ,只有在调用 该函数对运动控制卡初始化成功后,再调用其他函数才有意义。

? 速度的设定
2.1 匀速运动
参数的设置很简单,只需要将驱动速度设置成等于起始速度,其余的参数 不用设置。 相关函数: set_startv set_speed 72
http://www.adtechcn.com

ADT850 四轴运动控制卡

? 注意:函数使用的值应乘上倍率才为实际的速度。

2.2 对称直线加减速
这是最常用的一种方式,需设置起始速度、驱动速度,加速度,采用自动 减速。 相关函数: set_startv set_speed set_acc set_ad_mode set_dec1_mode set_dec2_mode (设为直线加减速方式) (设为对称方式) (设为自动减速)

? 注意:加速度函数使用的值应乘上倍率再乘上125才为实际的加速度。

2.3 非对称直线加减速
此方式一般用于往垂直方向移动对象物时,加速时间与减速时间不相同, 需比上面多设定减速度的值 相关函数: set_startv set_speed set_acc set_dec set_ad_mode set_dec1_mode set_dec2_mode (设为直线加减速方式) (设为非对称方式) (设为自动减速)

2.4 S曲线加减速
对于一些负载较重的方式,为了达到较好的加速效果,采用S曲线加速,此 时加加速度的值需设置,加加速度的计算对S曲线的形状有很大的影响,可参考 前面的例子。 相关函数: set_startv set_speed set_acc set_acac 73
http://www.adtechcn.com

ADT850 四轴运动控制卡

set_ad_mode set_dec2_mode

(设为S曲线加减速方式) (设为自动减速)

2.5 手动减速
手动减速只用于自动减速不能正常使用的情况下,如圆弧插补的加减速驱 动,连续插补的加减速驱动,此时要计算手动减速点,具体可参考前面的例子。

2.6 插补速度
关于插补的速度,虽然是设置X轴(或Z轴)的速度,但并不是代表X轴是 以这个速度运动,而是长轴的速度,如: 在X-Y直线插补时,X移动距离大于Y移动距离时,X为长轴,X轴的驱动 速度为设定的速度,X移动距离小于Y移动距离时,Y为长轴,Y轴的驱动速度 为设定的速度。 在X-Y圆弧插补时,长轴的确定是以象限来确定,详细的说明可见前面的 “插补”的说明。 对于两轴插补,只需设定X轴(或Z轴)的参数即可, 对于三轴、四轴插补,是设X轴的参数,同时Z轴的倍率应与X轴相同,Z 轴的起始速度应与X轴的驱动速度(不是起始速度)相同,Z轴的驱动速度应与 X轴的驱动速度相同,才能保证插补正确运行。 对于插补,一般使用匀速驱动,因此只要设定起始速度和驱动速度即可, 加减速插补也可使用,只要设定好X轴参数即可,但要注意的是S曲线插补不能 用于圆弧插补和连续插补。 另外插补减速允许和插补减速禁止函数的使用, 默认情况是插补减速禁止, 即如果使用加减速插补,在驱动时只有加速,而没有减速过程,此情况用于连 续插补,如果只用单个插补,应在驱动前使用插补减速允许命令。 以上关于速度之所以设置较多,是为了能达到更好的性能,充分发挥本卡 的功能,其实对于绝大部分应用,许多功能不会用上,通常只有要求达到很快 的运行速度时,又要保证效果时才用到。此时的设置较复杂也是应该的。

? 插补错误清除函数的使用
对于三轴、四轴插补,如果没有正确走完,如在驱动过程中发出了停止命 令,撞到了限位开关,软件限位有效等,即只要没有走完要求的距离,就产生 了错误,应调用插补错误清除函数清除这个错误,否则Z、W轴的运动将回不正 常。 74
http://www.adtechcn.com

ADT850 四轴运动控制卡

对两轴插补则不用使用此函数。

? STOP0、STOP1、STOP2 信号
STOP0、STOP1、STOP2为每个轴都有的信号,因此共有12个STOP信号, 此信号主要用于机器回原点时使用,回原点方式可根据情况使用一个或多个信 号,但需注意的是此信号为减速停止,对于采用高速回零时应注意,可采用原 点开关前加一减速开关,即采用两个STOP信号,一个作为原点开关,一个作为 减速开关。也可只用一个信号,在碰到STOP信号后减速停止后,反向匀速运动 再次碰到时停止。 STOP2有一特殊功能,即设置在有效时,如果用STOP2信号停止时,实际 位置计数器会由STOP2清零,这是为了保证在原点位置处计数器同时为0,因其 他的控制卡一般为在驱动停止后用软件将计数器置零,此时对于伺服驱动时, 即使脉冲已停止发出,因伺服中有累积,仍会前进一点,造成位置有一点误差, 而采用本卡上述方法回零,在回零后如果实际位置不为零,而是有一点数值, 这是正常的,不用再调用函数将位置清零。

? 伺服信号
伺服到位信号和伺服报警信号必须在确认信号已接上时才能使用, 如果未接伺 服到位信号,而使伺服到位信号有效,将会出现驱动状态总是不会停止,这是因为 此时是以到位信号作为驱动结束的标志。 其余的伺服信号,如伺服ON信号,报警清除信号可用通用输出信号驱动。

75
http://www.adtechcn.com

ADT850 四轴运动控制卡

第十章

运动控制开发编程示例

所有运动控制函数均为立即返回,当驱动命令发出后,运动过程由运 动控制卡控制完成,此时用户的上位机软件既可以对整个运动过程进 行实时监控,也可强制停止运动过程。 说明:轴在运动过程中,不允许向运动轴发新的驱动指令,否则会放 弃上次的驱动,而执行后面的驱动指令。

尽管编程语言“五花八门” ,种类繁多,但就其本质而言,最终可以 “九九归一” 。概括起来就是“三大结构和一个思想” ,其中“三大结构”是指 所有编程语言中都强调的顺序结构、循环结构和分支结构,一个思想主要指完 成设计任务时所用到的算法以及模块划分,这是整个程序设计的重点和难点。 为了保证程序具有通用性、规范性、可扩展性以及维护方便等特点,下面 所有的示例从项目设计的角度着眼,将示例划分为以下几个模块:运动控制模 块(对控制卡提供的库函数进一步进行封装),功能实现模块(配合具体工艺的代 码段),监控模块和停止处理模块。 下面我们简单介绍ADT850卡函数库在VB和VC编程语言中的应用,如果使 用其它编程语言可参照VB和VC示例程序。

?

VB 编程示例
1.1 准备工作
(1) 新建一个项目,保存为“test.vbp” ;

(2) 按照前面讲述的方法,在项目中添加“adt850.bas”模块; 1.2 运动控制模块
(1) (2) 在项目中添加一个新模块,保存为“ctrlcard.bas” ; 在运动控制模块中首先自定义运动控制卡初始化函数, 对需要封装到初 始化函数中的库函数进行初始化; (3) 继续自定义相关的运动控制函数,如:速度设定函数,单轴运动函数, 差补运动函数等; 76
http://www.adtechcn.com

ADT850 四轴运动控制卡

(4)

ctrcard.bas 的源代码为:

'********************** 运动控制模块 ******************** '为了简单、方便、快捷地开发出通用性好、可扩展性强、 '维护方便的应用系统,我们在控制卡函数库的基础上将 '所有库函数进行了分类封装。下面的示例使用一块运动 '控制卡 '******************************************************** Public Result As Integer Public Const MULTIPLE = 10 Const MAXAXIS = 4 '倍率 '最大轴数

'*******************初始化函数************************ '该函数中包含了控制卡初始化常用的库函数,这是调用 '其他函数的基础,所以必须在示例程序中最先调用 '返回值<=0 表示初始化失败,返回值>0 表示初始化成功 '***************************************************** Public Function Init_Card() As Integer Result = adt850_initial If Result <= 0 Then Init_Card = Result Exit Function End If For i = 1 To MAXAXIS set_range 0, i, 8000000 / MULTIPLE '设定范围 set_command_pos 0, i, 0 set_actual_pos 0, i, 0 '清逻辑计数器 '清实位计数器 '设定起始速度 '设定驱动速度 '卡初始化函数

set_startv 0, i, 1000/ MULTIPLE set_speed 0, i, 1000/ MULTIPLE Next i Init_Card = Result End Function

'**********************设置速度模块*********************** 77
http://www.adtechcn.com

ADT850 四轴运动控制卡

'依据参数的值,判断是匀速还是加减速 '返回值=0 正确,返回值=1 错误 '********************************************************* Public Function Setup_Speed(ByVal axis As Integer, ByVal StartV As Long, ByVal Speed As Long, ByVal Add As Long) As Integer If (StartV - Speed >= 0) Then Result = set_startv(0, axis, StartV/ MULTIPLE) set_speed 0, axis, StartV/ MULTIPLE Else Result = set_startv(0, axis, StartV/ MULTIPLE) set_speed 0, axis, Speed/ MULTIPLE set_acc 0, axis, Add/ 125/MULTIPLE End If Setup_Speed = Result End Function '*********************单轴驱动函数********************** '该函数用于驱动单个运动轴运动 '返回值=0 正确,返回值=1 错误 '******************************************************* Public Function Axis_Pmove(ByVal axis As Integer, ByVal value As Long) As Integer Result = pmove(0, axis, value) Axis_Pmove = Result End Function '**********************两轴插补函数******************** '该函数用于驱动 XY 或 ZW 两轴进行插补运动 '返回值=0 正确,返回值=1 错误 '******************************************************* Public Function Interp_Move2(ByVal no As Integer, ByVal value1 As Long, ByVal value2 As Long) As Integer Result = inp_move2(0, no, value1, value2) Interp_Move2 = Result 78
http://www.adtechcn.com

ADT850 四轴运动控制卡

End Function '*********************三轴插补函数*********************** '该函数用于驱动 XYZ 三轴进行插补运动 '返回值=0 正确,返回值=1 错误 '********************************************************* Public Function Interp_Move3(ByVal value1 As Long, ByVal value2 As Long, ByVal value3 As Long) As Integer Result = inp_move3(0, value1, value2, value3) Interp_Move3 = Result End Function '*******************四轴插补函数**************************** '该函数用于驱动四轴进行插补运动 '返回值=0 正确,返回值=1 错误 '*********************************************************** Public Function Interp_Move4(ByVal value1 As Long, ByVal value2 As Long, ByVal value3 As Long, ByVal value4 As Long) As Integer

Result = inp_move4(0, value1, value2, value3, value4) Interp_Move4 = Result End Function '*******************圆弧插补函数**************************** '该函数用于驱动 XY 或 ZW 轴进行圆弧插补运动 'x,y 表示终点位置,i,j 表示圆心位置 '返回值=0 正确,返回值=1 错误 '*********************************************************** Public Function Interp_Arc(ByVal no As Integer, ByVal X As Long, ByVal Y As Long, ByVal i As Long, ByVal j As Long, ByVal mode As Integer) As Integer If mode = 0 Then result = inp_cw_arc(0, no, X, Y, i, j) Else result = inp_ccw_arc(0, no, X, Y, i, j) End If 79
http://www.adtechcn.com

ADT850 四轴运动控制卡

Interp_Arc = result End Function '*****************获取运动信息****************************** '该函数用于反馈轴当前的逻辑位置,实际位置和运行速度 '返回值=0 正确,返回值=1 错误 '*********************************************************** Public Function Get_CurrentInf(ByVal axis As Integer, value() As Long) As Integer Result = get_command_pos(0, axis, value(0)) get_actual_pos 0, axis, value(1) get_speed 0, axis, value(2) value(2)=value(2)* MULTIPLE Get_CurrentInf = Result End Function '*******************停止轴驱动函数************************** '该函数提供立即停止模式和减速停止模式 '返回值=0 正确,返回值=1 错误 '*********************************************************** Public Function StopRun(ByVal axis As Integer, ByVal mode As Integer) If mode = 0 Then Result = sudden_stop(0, axis) Else Result = dec_stop(0, axis) End If StopRun = Result End Function '**********************设定减速方式************************ ' ' 该函数用于设定对称或非对称和自动或手动减速 返回值=0 正确 返回值=1 错误

'********************************************************** Public Function Set_DecMode(ByVal axis As Integer, ByVal mode1 As Integer, ByVal mode2 As Integer) 80
http://www.adtechcn.com

ADT850 四轴运动控制卡

Dim result1 As Integer Dim result2 As Integer result1 = set_dec1_mode(0, axis, mode1) result2 = set_dec2_mode(0, axis, mode2) result = (result1 And result2) Set_DecMode = result End Function '**********************设定减速点************************ ' ' 该函数用于设定手动减速过程中的减速点 返回值=0 正确 返回值=1 错误

'********************************************************** Public Function Set_DecPos(ByVal axis As Integer, ByVal value As Long, ByVal StartV As Long, ByVal Speed As Long, ByVal Add As Long) Dim addtime As Double Dim DecPulse As Long addtime = (Speed - StartV) / Add DecPulse = (StartV + Speed) * addtime / 2 result = set_dec_pos(0, axis, value - DecPulse) Set_DecPos = result End Function

1.3 功能实现模块
1.31 界面设计

81
http://www.adtechcn.com

ADT850 四轴运动控制卡

说明: (1) 速度设定部分—用于设定各轴的起始速度、驱动速度和加速度;位 置设定—设定各轴的驱动脉冲;驱动信息—实时显示各轴的逻辑位置、 实际位置和运行速度。 (2) 驱动对象—通过选择驱动对象,确定参与联动或插补的轴; (3) 联动—用于向所选驱动对象的所有轴发出单轴驱动指令;插补—用 于向所选驱动对象的所有轴发出插补指令;停止—停止所有轴的脉冲输 出; 以上所有数据均以脉冲为单位。 1.3.2 初始化代码位于窗体加载事件中,代码如下: Private Sub Form_Load() If Init_Card <= 0 Then MsgBox "控制卡初始化失败!" End Else MsgBox "运动控制卡可以使用!" End If

For i = 0 To 3 StartV(i).Text = 100 82
http://www.adtechcn.com

ADT850 四轴运动控制卡

Speed(i).Text = 200 Add(i).Text = 100 Next i For i = 0 To 3 Pos(i).Text = 10000 Next i End Sub 1.3.3 联动代码位于CmdPmove按钮的点击事件中,其中依据选择对象的不同 发出对应的驱动指令,四个复选框(选择对象)名称分别为X、Y、Z、W,代码如下: Private Sub CmdPmove_Click() If X.value = 1 And Y.value = 1 And Z.value = 1 And W.value = 1 Then For i = 1 To 4 Setup_Speed i, StartV(i - 1).Text, Speed(i - 1).Text, Add(i - 1).Text Axis_Pmove i, Pos(i - 1).Text Next i ElseIf X.value = 1 And Y.value = 1 And Z.value = 1 Then For i = 1 To 3 Setup_Speed i, StartV(i - 1).Text, Speed(i - 1).Text, Add(i - 1).Text Axis_Pmove i, Pos(i - 1).Text Next i ElseIf X.value = 1 And Y.value = 1 And W.value = 1 Then For i = 1 To 4 If i <> 3 Then Setup_Speed i, StartV(i - 1).Text, Speed(i - 1).Text, Add(i - 1).Text Axis_Pmove i, Pos(i - 1).Text

End If Next i ElseIf X.value = 1 And Z.value = 1 And W.value = 1 Then For i = 1 To 4 If i <> 2 Then 83
http://www.adtechcn.com

ADT850 四轴运动控制卡

Setup_Speed i, StartV(i - 1).Text, Speed(i - 1).Text, Add(i - 1).Text Axis_Pmove i, Pos(i - 1).Text End If Next i ElseIf Y.value = 1 And Z.value = 1 And W.value = 1 Then For i = 1 To 4 If i <> 1 Then Setup_Speed i, StartV(i - 1).Text, Speed(i - 1).Text, Add(i - 1).Text Axis_Pmove i, Pos(i - 1).Text End If Next i ElseIf X.value = 1 And Y.value = 1 Then For i = 1 To 2 Setup_Speed i, StartV(i - 1).Text, Speed(i - 1).Text, Add(i - 1).Text Axis_Pmove i, Pos(i - 1).Text Next i ElseIf X.value = 1 And Z.value = 1 Then Setup_Speed 1, StartV(0).Text, Speed(0).Text, Add(0).Text Axis_Pmove 1, Pos(0).Text Setup_Speed 3, StartV(2).Text, Speed(2).Text, Add(2).Text Axis_Pmove 3, Pos(2).Text ElseIf X.value = 1 And W.value = 1 Then Setup_Speed 1, StartV(0).Text, Speed(0).Text, Add(0).Text Axis_Pmove 1, Pos(0).Text

Setup_Speed 4, StartV(3).Text, Speed(3).Text, Add(3).Text Axis_Pmove 4, Pos(3).Text ElseIf Y.value = 1 And Z.value = 1 Then Setup_Speed 2, StartV(1).Text, Speed(1).Text, Add(1).Text Axis_Pmove 2, Pos(1).Text Setup_Speed 3, StartV(2).Text, Speed(2).Text, Add(2).Text Axis_Pmove 3, Pos(2).Text 84
http://www.adtechcn.com

ADT850 四轴运动控制卡

ElseIf Y.value = 1 And W.value = 1 Then Setup_Speed 2, StartV(1).Text, Speed(1).Text, Add(1).Text Axis_Pmove 2, Pos(1).Text Setup_Speed 4, StartV(3).Text, Speed(3).Text, Add(3).Text Axis_Pmove 4, Pos(3).Text ElseIf Z.value = 1 And W.value = 1 Then Setup_Speed 3, StartV(2).Text, Speed(2).Text, Add(2).Text Axis_Pmove 3, Pos(2).Text Setup_Speed 4, StartV(3).Text, Speed(3).Text, Add(3).Text Axis_Pmove 4, Pos(3).Text ElseIf X.value = 1 Then Setup_Speed 1, StartV(0).Text, Speed(0).Text, Add(0).Text Axis_Pmove 1, Pos(0).Text ElseIf Y.value = 1 Then Setup_Speed 2, StartV(1).Text, Speed(1).Text, Add(1).Text Axis_Pmove 2, Pos(1).Text ElseIf Z.value = 1 Then Setup_Speed 3, StartV(2).Text, Speed(2).Text, Add(2).Text Axis_Pmove 3, Pos(2).Text ElseIf W.value = 1 Then Setup_Speed 4, StartV(3).Text, Speed(3).Text, Add(3).Text Axis_Pmove 4, Pos(3).Text End If End Sub 1.3.4 插补代码位于CmdInp按钮的点击事件中,其中依据选择对象的不同发出 对应的驱动指令,四个复选框(选择对象)名称分别为X、Y、Z、W,代码如下: Private Sub CmdInp_Click() If X.value = 1 And Y.value = 1 And Z.value = 1 And W.value = 1 Then set_range 0, 3, MULTIPLE Setup_Speed 1, StartV(0).Text, Speed(0).Text, Add(0).Text Setup_Speed 3, Speed(0).Text, Speed(0).Text, 0 85
http://www.adtechcn.com

ADT850 四轴运动控制卡

Interp_Move4 Pos(0).Text, Pos(1).Text, Pos(2).Text, Pos(3).Text ElseIf X.value = 1 And Y.value = 1 And Z.value = 1 Then set_range 0, 3, MULTIPLE Setup_Speed 1, StartV(0).Text, Speed(0).Text, Add(0).Text Setup_Speed 3, Speed(0).Text, Speed(0).Text, 0 Interp_Move3 Pos(0).Text, Pos(1).Text, Pos(2).Text

ElseIf X.value = 1 And Y.value = 1 Then Setup_Speed 1, StartV(0).Text, Speed(0).Text, Add(0).Text Interp_Move2 1, Pos(0).Text, Pos(1).Text ElseIf Z.value = 1 And W.value = 1 Then Setup_Speed 3, StartV(2).Text, Speed(2).Text, Add(2).Text Interp_Move2 2, Pos(2).Text, Pos(3).Text Else MsgBox "选取的轴不能进行插补!" End If End Sub 1.3.5 连续插补代码位于CmdContinueInp按钮的点击事件中,其中只演示了4段XY 轴两轴插补构成的连续插补指令,代码如下: Private Sub CmdContinueInp_Click() '本程序只演示4段XY轴两轴插补构成的连续插补 Dim no As Integer Dim status1 As Long Dim status2 As Long If X.value = 1 And Y.value = 1 And Not Z.value = 1 And Not W.value = 1 Then no = 1 Else Exit Sub End If Setup_Speed 1, StartV(0).Text, Speed(0).Text, Add(0).Text If StartV(0).Text <= Speed(0).Text Then Set_DecMode 1, 0, 1 Set_DecPos 1, Pos(0).Text, StartV(0).Text, Speed(0).Text, Add(0).Text 86
http://www.adtechcn.com

ADT850 四轴运动控制卡

End If '*********************第一段********************* inp_dec_disable 0, no Interp_Move2 no, Pos(0).Text, Pos(1).Text Do While True DoEvents get_stopdata 0, 1, status1 If status1 <> 0 Then GoTo Err get_inp_status2 0, no, status2 If status2 <> 0 Then Exit Do

Loop '*********************第二段********************* Interp_Move2 no, Pos(0).Text, Pos(1).Text Do While True DoEvents get_stopdata 0, 1, status1 If status1 <> 0 Then GoTo Err get_inp_status2 0, no, status2 If status2 <> 0 Then Exit Do Loop '*********************第三段********************* Interp_Move2 no, Pos(0).Text, Pos(1).Text Do While True DoEvents get_stopdata 0, 1, status1 If status1 <> 0 Then GoTo Err get_inp_status2 0, no, status2 If status2 <> 0 Then Exit Do Loop '********************最后一段********************* inp_dec_enable 0, no 87
http://www.adtechcn.com

ADT850 四轴运动控制卡

Interp_Move2 no, Pos(0).Text, Pos(1).Text Do While True DoEvents get_stopdata 0, 1, status1 If status1 <> 0 Then GoTo Err get_inp_status 0, no, status2 If status2 = 0 Then Exit Do Loop Err: End Sub 1.3.6 圆弧插补代码位于CmdInpArc按钮的点击事件中, 其中依据选择对象的不同发 出对应的驱动指令,代码如下: Private Sub CmdInpArc_Click() '本程序只演示以选取的两轴的数据为圆心的顺时针圆弧插补画以半圆,XY为顺时 针,ZW为逆时针 Dim value As Long If X.value = 1 And Y.value = 1 And Not Z.value And Not W.value Then Setup_Speed 1, StartV(0).Text, Speed(0).Text, Add(0).Text If StartV(0).Text <= Speed(0).Text Then Set_DecMode 1, 0, 1 value = (Sqr(Pos(0).Text * Pos(0).Text + Pos(1).Text * Pos(1).Text) / 1.414) * 8 Set_DecPos 1, value, StartV(0).Text, Speed(0).Text, Add(0).Text End If Interp_Arc 1, Pos(0).Text * 2, Pos(1).Text * 2, Pos(0).Text, Pos(1).Text, 0 ElseIf Z.value = 1 And W.value = 1 And Not X.value And Not Y.value Then Setup_Speed 3, StartV(2).Text, Speed(2).Text, Add(2).Text If StartV(2).Text <= Speed(2).Text Then Set_DecMode 3, 0, 1 value = (Sqr(Pos(2).Text * Pos(2).Text + Pos(3).Text * Pos(3).Text) / 1.414) * 8 Set_DecPos 3, value, StartV(2).Text, Speed(2).Text, Add(2).Text End If 88
http://www.adtechcn.com

ADT850 四轴运动控制卡

Interp_Arc 2, Pos(2).Text * 2, Pos(3).Text * 2, Pos(2).Text, Pos(3).Text, 1 End If End Sub

1.4 监控模块
监控模块用于实时获取所有轴的驱动信息,显示运动信息,同时控制在驱动进 行过程中,不允许发出新的驱动指令。监控模块利用定时器事件完成,代码如下: Private Sub Timer1_Timer() Dim value(3) As Long Dim status(4) As Long '获取轴的驱动信息 For i = 1 To 4 Get_CurrentInf i, value For m = 0 To 2 Inf((i - 1) * 3 + m).Caption = value(m) Next m Next i

For i = 1 To 4 get_status 0, i, status(i - 1) Next i '获取轴的驱动状态 If status(0) = 0 And status(1) = 0 And status(2) = 0 And status(3) = 0 Then CmdPmove.Enabled = True CmdInp.Enabled = True CmdContinueInp.Enabled = True CmdInpArc.Enabled = True Else CmdPmove.Enabled = False CmdInp.Enabled = False CmdContinueInp.Enabled = False CmdInpArc.Enabled = False End If 89
http://www.adtechcn.com

ADT850 四轴运动控制卡

End Sub

1.5 停止模块
停止模块主要用于控制驱动过程中的突发事件,需要立即终止所有轴的驱动。 停止模块的代码位于CmdStop按钮的点击事件中,代码如下: Private Sub CmdStop_Click() For i = 1 To 4 StopRun i, 0 Next i End Sub

?

VC 编程示例
2.1 准备工作
(1) (2) 新建一个项目,保存为“VCExample.dsw” ; 根据前面讲述的方法,将静态库“adt850.lib”加载到项目中; 在项目中添加一个新类,头文件保存为“CtrlCard.h”,源文件保存为 在运动控制模块中首先自定义运动控制卡初始化函数, 对需要封装到初 继续自定义相关的运动控制函数,如:速度设定函数,单轴运动函数, 头文件 “CtrlCard.h”代码如下:

2.2 运动控制模块
(1) “CtrlCard.cpp” ; (2) 始化函数中的库函数进行初始化; (3) 差补运动函数等; (4)

# ifndef __ADT850__CARD__ # define __ADT850__CARD__ /*********************** 运动控制模块 ******************** 为了简单、方便、快捷地开发出通用性好、可扩展性强、 维护方便的应用系统,我们在控制卡函数库的基础上将 所有库函数进行了分类封装。下面的示例使用一块运动 控制卡 ********************************************************/ 90
http://www.adtechcn.com

ADT850 四轴运动控制卡

#define #define

MULTIPLE

10

//倍率 //最大轴数

MAXAXIS 4

class CCtrlCard { public: int Get_AllowInpStatus(int no,int &value); int Get_ErrorInf(int axis,int &value); int Get_InpStatus(int no,int &value); int ForbidDec(int no); int AllowDec(int no); int Get_Status(int axis, int &value); int StopRun(int axis,int mode); int Get_CurrentInf(int axis,long &LogPos,long &ActPos, long &Speed); int Interp_Move4(long value1,long value2,long value3,long value4); int Interp_Move3(long value1,long value2,long value3); int Interp_Move2(int no,long value1,long value2); int Interp_Arc(int no,long x,long y,long i,long j); int Axis_Pmove(int axis, long value); int Setup_Speed(int axis,long startv,long speed,long add); int Init_Board(); CCtrlCard(); int Result; }; # endif (5) 源文件 “CtrlCard.cpp”代码如下:

# include "stdafx.h" # include "adt850.h" # include "CtrlCard.h" # include "VCExample.h"

CCtrlCard::CCtrlCard() { 91
http://www.adtechcn.com

ADT850 四轴运动控制卡

} /*******************初始化函数************************ 该函数中包含了控制卡初始化常用的库函数,这是调用 其他函数的基础,所以必须在示例程序中最先调用 返回值<=0表示初始化失败,返回值>0表示初始化成功 *****************************************************/ int CCtrlCard::Init_Board() { Result = adt850_initial() ; if (Result <= 0) return Result; for (int i = 1; i<=MAXAXIS; i++){ set_range (0, i, 8000000 / MULTIPLE); //设定范围 set_command_pos (0, i, 0); set_actual_pos (0, i, 0); //清逻辑计数器 //清实位计数器 //设定起始速度 //设定驱动速度 //卡初始化函数

set_startv (0, i, 1000/ MULTIPLE); set_speed (0, i, 1000/ MULTIPLE); } return 1; }

/**********************设置速度模块*********************** 依据参数的值,判断是匀速还是加减速 返回值=0正确,返回值=1错误 *********************************************************/ int CCtrlCard::Setup_Speed(int axis, long startv, long speed, long add) { if (startv - speed >= 0) { Result = set_startv(0, axis, startv/ MULTIPLE); set_speed (0, axis, startv/ MULTIPLE); } else{ Result = set_startv(0, axis, startv/ MULTIPLE); 92
http://www.adtechcn.com

ADT850 四轴运动控制卡

set_speed (0, axis, speed// MULTIPLE); set_acc (0, axis, add/ 125/MULTIPLE); } return Result; } /*********************单轴驱动函数********************** 该函数用于驱动单个运动轴运动 返回值=0正确,返回值=1错误 *******************************************************/ int CCtrlCard::Axis_Pmove(int axis, long value) { Result = pmove(0, axis, value); return Result; } /*******************两轴插补函数******************** 该函数用于驱动XY或ZW两轴进行插补运动 返回值=0正确,返回值=1错误 *******************************************************/ int CCtrlCard::Interp_Move2(int no, long value1, long value2) { Result = inp_move2(0, no, value1, value2); return Result; } /*******************三轴插补函数*********************** 该函数用于驱动XYZ三轴进行插补运动 返回值=0正确,返回值=1错误 **********************************************************/ int CCtrlCard::Interp_Move3(long value1, long value2, long value3) { Result = inp_move3(0,value1, value2, value3); return Result; } 93
http://www.adtechcn.com

ADT850 四轴运动控制卡

/*******************四轴插补函数**************************** 该函数用于驱动四轴进行插补运动 返回值=0正确,返回值=1错误 ***********************************************************/ int CCtrlCard::Interp_Move4(long value1, long value2, long value3, long value4) { Result = inp_move4(0, value1, value2, value3, value4); return Result; } /*******************圆弧插补函数**************************** 该函数用于驱动XY或ZW轴进行圆弧插补运动 返回值=0正确,返回值=1错误 ***********************************************************/ int CCtrlCard::Interp_Arc(int no, long x, long y, long i,long j) { Result = inp_cw_arc(0,no,x,y,i,j); return Result; } /*****************获取运动信息****************************** 该函数用于反馈轴当前的逻辑位置,实际位置和运行速度 返回值=0正确,返回值=1错误 ***********************************************************/ int CCtrlCard::Get_CurrentInf(int axis,long &LogPos,long &ActPos,long &Speed) { Result = get_command_pos(0, axis, &LogPos); get_actual_pos (0, axis, &ActPos); get_speed (0, axis, &Speed); Speed=Speed* MULTIPLE; return Result; } /*****************停止轴驱动****************************** 94
http://www.adtechcn.com

ADT850 四轴运动控制卡

该函数用于立即或减速停止轴的驱动 返回值=0正确,返回值=1错误 ************************************************************/ int CCtrlCard::StopRun(int axis, int mode) { if (mode= = 0) Result = sudden_stop(0, axis); else Result = dec_stop(0, axis); return Result; } /*****************获取轴的驱动状态************************** 该函数用于获取单轴的驱动状态或插补驱动状态 返回值=0正确,返回值=1错误 ************************************************************/ int CCtrlCard::Get_Status(int axis, int &value) { Result=get_status(0,axis,&value); return Result; } /*****************获取轴的插补状态************************** 该函数用于获取插补驱动状态 返回值=0正确,返回值=1错误 ************************************************************/ int CCtrlCard::Get_InpStatus(int no, int &value) { Result=get_inp_status(0,no,&value); return Result; } /*****************允许减速函数****************************** 该函数用于驱动过程中允许减速 95
http://www.adtechcn.com

ADT850 四轴运动控制卡

返回值=0正确 返回值=1错误 ************************************************************/ int CCtrlCard::AllowDec(int no) { Result=inp_dec_enable(0,no); return Result; } /*****************禁止减速函数****************************** 该函数用于驱动过程中禁止减速 返回值=0正确 返回值=1错误 ************************************************************/ int CCtrlCard::ForbidDec(int no) { Result=inp_dec_disable(0,no); return Result; } /*******************获取轴的错误停止信息****************** 该函数用于获取轴停止的信息 返回值=0正确 返回值=1错误 ************************************************************/ int CCtrlCard::Get_ErrorInf(int axis, int &value) { Result=get_stopdata(0,axis,&value); return Result; } /*******************获取连续插补状态****************** 该函数用于获取连续插补允许写入状态 返回值=0正确 返回值=1错误 ************************************************************/ int CCtrlCard::Get_AllowInpStatus(int no, int &value) { Result=get_inp_status2(0,no,&value); 96
http://www.adtechcn.com

ADT850 四轴运动控制卡

return Result; } /**********************设定减速方式************************ 该函数用于设定对称或非对称和自动或手动减速 返回值=0正确 返回值=1错误 **********************************************************/ int CCtrlCard::Set_DecMode(int axis, int mode1, int mode2) { int result1,result2; result1=set_dec1_mode(0,axis,mode1); result2=set_dec2_mode(0,axis,mode2); Result=result1&result2; return Result; } /**********************设定减速点************************ 该函数用于设定手动减速过程中的减速点 返回值=0正确 返回值=1错误 **********************************************************/ int CCtrlCard::Set_DecPos(int axis, long value, long startv, long speed, long add) { float addtime; long DecPulse; //减速时花费的脉冲

addtime=float(speed-startv)/add; DecPulse=long((startv+speed)*addtime)/2; Result=set_dec_pos(0,axis,value-DecPulse); return Result; } /**********************设定范围************************ 该函数用于设定速度、加减速、加减速的变化率的倍率 返回值=0正确 返回值=1错误 **********************************************************/ int CCtrlCard::Setup_Range(int axis, long value) { 97
http://www.adtechcn.com

ADT850 四轴运动控制卡

Result=set_range(0,axis,value); return Result; }

2.3 功能实现模块
2.3.1 界面设计

说明: (1)速度设定部分—用于设定各轴的起始速度、驱动速度和加速度;位置 设定—设定各轴的驱动脉冲;驱动信息—实时显示各轴的逻辑位置、实 际位置和运行速度。 (2)驱动对象—通过选择驱动对象,确定参与联动或插补的轴; (3)联动—用于向所选驱动对象的所有轴发出单轴驱动指令;插补—用于 向所选驱动对象的所有轴发出插补指令;停止—停止所有轴的脉冲输 出; 以上所有数据均以脉冲为单位。 2.3.2 运动控制卡初始化代码位于窗体初始化中,用户新增代码如下: if (g_CtrlCard.Init_Board() <= 0){ MessageBox( "控制卡初始化失败!"); return false; } 98
http://www.adtechcn.com

ADT850 四轴运动控制卡

else MessageBox ("运动控制卡可以使用!"); UINT nID1[]={IDC_EDIT_STARTX,IDC_EDIT_STARTY,IDC_EDIT_STARTZ,ID C_EDIT_STARTW}; UINT nID2[]={IDC_EDIT_XSPEED,IDC_EDIT_YSPEED,IDC_EDIT_ZSPEED,ID C_EDIT_WSPEED}; UINT nID3[]={IDC_EDIT_ADDX,IDC_EDIT_ADDY,IDC_EDIT_ADDZ,IDC_EDI T_ADDW}; UINT nID4[]={IDC_EDIT_POSX,IDC_EDIT_POSY,IDC_EDIT_POSZ,IDC_EDIT_ POSW}; CEdit *pEdit; for (int i = 0 ; i<4; i++){ pEdit=(CEdit*)GetDlgItem(nID1[i]); pEdit->SetWindowText("100"); pEdit=(CEdit*)GetDlgItem(nID2[i]);

pEdit->SetWindowText("200"); pEdit=(CEdit*)GetDlgItem(nID3[i]); pEdit->SetWindowText("100"); pEdit=(CEdit*)GetDlgItem(nID4[i]); pEdit->SetWindowText("10000"); } SetTimer(1001,100,NULL); 2.3.3 联动代码位于联动按钮点击消息中,其中依据选择对象的不同发出对应 的驱动指令,代码如下: void CVCExampleDlg::OnButtonPmove() { 99
http://www.adtechcn.com

ADT850 四轴运动控制卡

UpdateData(TRUE); long startv[]={m_nStartX,m_nStartY,m_nStartZ,m_nStartW}; long Speed[]={m_nXSpeed,m_nYSpeed,m_nZSpeed,m_nWSpeed}; long Add[]={m_nAddX,m_nAddY,m_nAddZ,m_nAddW}; long Pos[]={m_nPosX,m_nPosY,m_nPosZ,m_nPosW}; if (m_bX && m_bY && m_bZ && m_bW){ for (int i = 1; i<5; i++){ g_CtrlCard.Setup_Speed(i, startv[i-1], Speed[i-1], Add[i-1]); g_CtrlCard.Axis_Pmove(i, Pos[i-1]); } } else if(m_bX && m_bY && m_bZ){ for (int i = 1; i<4; i++){ g_CtrlCard.Setup_Speed(i, startv[i-1], Speed[i-1], Add[i-1]); g_CtrlCard.Axis_Pmove(i, Pos[i-1]); } } else if(m_bX && m_bY && m_bW){ for (int i = 1; i<5; i++){ if (i != 3){ g_CtrlCard.Setup_Speed(i, startv[i-1], Speed[i-1], Add[i-1]); } } } else if(m_bX && m_bZ && m_bW){ for (int i = 1; i<5; i++){ if (i !=2){ g_CtrlCard.Setup_Speed(i, startv[i-1], Speed[i-1], Add[i-1]); g_CtrlCard.Axis_Pmove(i, Pos[i-1]); } } } 100
http://www.adtechcn.com

ADT850 四轴运动控制卡

else if (m_bY && m_bZ && m_bW){ for (int i = 1; i<5; i++){ if (i !=1){ g_CtrlCard.Setup_Speed(i, startv[i-1], Speed[i-1], Add[i-1]); } } } else if( m_bX && m_bY){ for (int i = 1 ; i<3; i++){ g_CtrlCard.Setup_Speed(i,startv[i-1],Speed[i-1],Add[i-1]); g_CtrlCard.Axis_Pmove(i,Pos[i-1]); } } else if( m_bX && m_bZ){ g_CtrlCard.Setup_Speed(1,startv[0],Speed[0],Add[0]); g_CtrlCard.Axis_Pmove(1,Pos[0]); g_CtrlCard.Setup_Speed(3,startv[2],Speed[2],Add[2]); g_CtrlCard.Axis_Pmove(3,Pos[2]); } else if( m_bX && m_bW){ g_CtrlCard.Setup_Speed(1,startv[0],Speed[0],Add[0]); g_CtrlCard.Axis_Pmove(1,Pos[0]); g_CtrlCard.Setup_Speed(4,startv[3],Speed[3],Add[3]); g_CtrlCard.Axis_Pmove(4,Pos[3]); } else if( m_bY && m_bZ){ g_CtrlCard.Setup_Speed(2,startv[1],Speed[1],Add[1]); g_CtrlCard.Axis_Pmove(2,Pos[1]); g_CtrlCard.Setup_Speed(3,startv[2],Speed[2],Add[2]); g_CtrlCard.Axis_Pmove(3,Pos[2]); } else if( m_bY && m_bW){ 101
http://www.adtechcn.com

ADT850 四轴运动控制卡

g_CtrlCard.Setup_Speed(2,startv[1],Speed[1],Add[1]); g_CtrlCard.Axis_Pmove(2,Pos[1]); g_CtrlCard.Setup_Speed(4,startv[3],Speed[3],Add[3]); g_CtrlCard.Axis_Pmove(4,Pos[3]); } else if( m_bZ && m_bW){ g_CtrlCard.Setup_Speed(3,startv[2],Speed[2],Add[2]); g_CtrlCard.Axis_Pmove(3,Pos[2]); g_CtrlCard.Setup_Speed(4,startv[3],Speed[3],Add[3]); g_CtrlCard.Axis_Pmove(4,Pos[3]); } else if( m_bX){ g_CtrlCard.Setup_Speed(1,startv[0],Speed[0],Add[0]); g_CtrlCard.Axis_Pmove(1,Pos[0]); } else if( m_bY){ g_CtrlCard.Setup_Speed(2,startv[1],Speed[1],Add[1]); g_CtrlCard.Axis_Pmove(2,Pos[1]); } else if( m_bZ){ g_CtrlCard.Setup_Speed(3,startv[2],Speed[2],Add[2]); g_CtrlCard.Axis_Pmove(3,Pos[2]); } else if( m_bW){ g_CtrlCard.Setup_Speed(4,startv[3],Speed[3],Add[3]); g_CtrlCard.Axis_Pmove(4,Pos[3]); } } 2.3.4 插补代码位于插补按钮点击消息中,其中依据选择对象的不同发出对应 的驱动指令,代码如下: void CVCExampleDlg::OnButtonInpmove() 102
http://www.adtechcn.com

ADT850 四轴运动控制卡

{ UpdateData(TRUE); long startv[]={m_nStartX,m_nStartY,m_nStartZ,m_nStartW}; long Speed[]={m_nXSpeed,m_nYSpeed,m_nZSpeed,m_nWSpeed}; long Add[]={m_nAddX,m_nAddY,m_nAddZ,m_nAddW}; long Pos[]={m_nPosX,m_nPosY,m_nPosZ,m_nPosW};

if(m_bX && m_bY && m_bZ && m_bW){ g_CtrlCard.Setup_Range(3,MULTIPLE); g_CtrlCard.Setup_Speed(1,startv[0],Speed[0],Add[0]); g_CtrlCard.Setup_Speed(3,Speed[0],Speed[0],1); g_CtrlCard.Interp_Move4(Pos[0],Pos[1],Pos[2],Pos[3]); } else if(m_bX && m_bY && m_bZ){ g_CtrlCard.Setup_Range(3,MULTIPLE); g_CtrlCard.Setup_Speed(1,startv[0],Speed[0],Add[0]); g_CtrlCard.Setup_Speed(3,Speed[0],Speed[0],1); g_CtrlCard.Interp_Move3(Pos[0],Pos[1],Pos[2]); } else if(m_bX && m_bY&&!m_bZ&&!m_bW){ g_CtrlCard.Setup_Speed(1,startv[0],Speed[0],Add[0]); g_CtrlCard.Interp_Move2(1,Pos[0],Pos[1]); } else if(m_bZ && m_bW&&!m_bX&&!m_bY){ g_CtrlCard.Setup_Speed(3,startv[2],Speed[2],Add[2]); g_CtrlCard.Interp_Move2(2,Pos[2],Pos[3]); } else{ MessageBox("选取的轴不能进行插补!"); } } 103
http://www.adtechcn.com

ADT850 四轴运动控制卡

2.3.5 连续插补代码位于连续插补按钮点击消息中,其中只演示 4 段 XY 两 轴插补构成的连续插补,代码如下: void CVCExampleDlg::OnButtonInpcontinue() { //本程序只演示 XY 轴 4 段插补构成的连续插补 UpdateData(TRUE); int no; int status1,status2; long startv[]={m_nStartX,m_nStartY,m_nStartZ,m_nStartW}; long Speed[]={m_nXSpeed,m_nYSpeed,m_nZSpeed,m_nWSpeed}; long Add[]={m_nAddX,m_nAddY,m_nAddZ,m_nAddW}; long Pos[]={m_nPosX,m_nPosY,m_nPosZ,m_nPosW}; if(m_bX && m_bY&&!m_bZ&&!m_bW){ else return; no=1; }

g_CtrlCard.Setup_Speed(1,startv[0],Speed[0],Add[0]); //------------第一段---------------------g_CtrlCard.ForbidDec(no); g_CtrlCard.Interp_Move2(1,Pos[0],Pos[1]); while(true) { DoEvent(); g_CtrlCard.Get_ErrorInf(1,status1); if(status1!=0)goto err; g_CtrlCard.Get_AllowInpStatus(no,status2); if(status2!=0)break; } //------------第二段---------------------g_CtrlCard.Interp_Move2(1,Pos[0],Pos[1]); while(true) { DoEvent(); 104
http://www.adtechcn.com

ADT850 四轴运动控制卡

g_CtrlCard.Get_ErrorInf(1,status1); if(status1!=0)goto err; g_CtrlCard.Get_AllowInpStatus(no,status2); if(status2!=0)break; } //------------第三段---------------------g_CtrlCard.Interp_Move2(1,Pos[0],Pos[1]); while(true) { DoEvent(); g_CtrlCard.Get_ErrorInf(1,status1); if(status1!=0)goto err; g_CtrlCard.Get_AllowInpStatus(no,status2); if(status2!=0)break; } //------------最后一段---------------------g_CtrlCard.AllowDec(no); g_CtrlCard.Interp_Move2(1,Pos[0],Pos[1]); while(true) { DoEvent(); g_CtrlCard.Get_ErrorInf(1,status1); if(status1!=0)goto err; g_CtrlCard.Get_InpStatus(no,status2); if(status2==0)break; } return; err: MessageBox("错误!"); return; } 105
http://www.adtechcn.com

ADT850 四轴运动控制卡

2.3.6 圆弧插补代码位于圆弧插补按钮点击消息中,其中依据选择对象的不 同发出对应的驱动指令,代码如下: void CVCExampleDlg::OnButtonInparc() { //本程序只演示以选取的两轴的数据为圆心的顺时针圆弧插补画以半圆 UpdateData(TRUE); long startv[]={m_nStartX,m_nStartY,m_nStartZ,m_nStartW}; long Speed[]={m_nXSpeed,m_nYSpeed,m_nZSpeed,m_nWSpeed}; long Add[]={m_nAddX,m_nAddY,m_nAddZ,m_nAddW}; long Pos[]={m_nPosX,m_nPosY,m_nPosZ,m_nPosW};

if(m_bX && m_bY&&!m_bZ&&!m_bW){ g_CtrlCard.Setup_Speed(1,startv[0],Speed[0],Add[0]); g_CtrlCard.Interp_Arc(1, Pos[0]*2,Pos[1]*2,Pos[0],Pos[1]); } else if(m_bZ && m_bW&&!m_bX&&!m_bY){ g_CtrlCard.Setup_Speed(3,startv[2],Speed[2],Add[2]); g_CtrlCard.Interp_Arc(2, Pos[2]*2,Pos[3]*2,Pos[2],Pos[3]); } else{ MessageBox("选取的轴不能进行圆弧插补!"); } }

2.4 监控模块
监控模块用于实时获取所有轴的驱动信息,显示运动信息,同时控制在驱动进 行过程中,不允许发出新的驱动指令。监控模块利用定时器消息完成,代码如下: void CVCExampleDlg::OnTimer(UINT nIDEvent) { long log,act,spd; UINT nID1[]={IDC_STATIC_LOGX,IDC_STATIC_LOGY,IDC_STATIC_ LOGZ,IDC_STATIC_LOGW}; 106
http://www.adtechcn.com

ADT850 四轴运动控制卡

UINT nID2[]={IDC_STATIC_ACTX,IDC_STATIC_ACTY,IDC_STATIC_ ACTZ,IDC_STATIC_ACTW}; UINT nID3[]={IDC_STATIC_SPEEDX,IDC_STATIC_SPEEDY,IDC_STAT IC_SPEEDZ,IDC_STATIC_SPEEDW}; CStatic *lbl; CString str; int status[4]; for (int i=1; i<5; i++){ g_CtrlCard.Get_CurrentInf(i,log,act,spd); str.Format("%ld",log); lbl=(CStatic*)GetDlgItem(nID1[i-1]); str.Format("%ld",log); lbl->SetWindowText(str); lbl=(CStatic*)GetDlgItem(nID2[i-1]); str.Format("%ld",act); lbl->SetWindowText(str); lbl=(CStatic*)GetDlgItem(nID3[i-1]); str.Format("%ld",spd); lbl->SetWindowText(str); g_CtrlCard.Get_Status(i,status[i-1]); } CButton *btn; if (status[0]==0 && status[1]==0 && status[2]==0 && status[3]==0) { btn=(CButton*)GetDlgItem(IDC_BUTTON_PMOVE); btn->EnableWindow(TRUE); btn=(CButton*)GetDlgItem(IDC_BUTTON_INPMOVE); btn->EnableWindow(TRUE); btn=(CButton*)GetDlgItem(IDC_BUTTON_INPCONTINUE); btn->EnableWindow(TRUE); 107
http://www.adtechcn.com

ADT850 四轴运动控制卡

btn=(CButton*)GetDlgItem(IDC_BUTTON_INPARC); btn->EnableWindow(TRUE); } else { btn=(CButton*)GetDlgItem(IDC_BUTTON_PMOVE); btn->EnableWindow(FALSE); btn=(CButton*)GetDlgItem(IDC_BUTTON_INPMOVE); btn->EnableWindow(FALSE); btn=(CButton*)GetDlgItem(IDC_BUTTON_INPCONTINUE); btn->EnableWindow(FALSE); btn=(CButton*)GetDlgItem(IDC_BUTTON_INPARC); btn->EnableWindow(FALSE); } CDialog::OnTimer(nIDEvent); }

2.5 停止模块
停止模块主要用于控制驱动过程中的突发事件,需要立即终止所有轴的驱动。 停止模块的代码位于停止按钮的点击消息中,代码如下: void CVCExampleDlg::OnButtonStoprun() { for (int i = 1; i<5; i++){ g_CtrlCard.StopRun(i,0); } }

108
http://www.adtechcn.com

ADT850 四轴运动控制卡

第十一章
? 运动控制卡检测失败

常见故障及解决方案

在使用控制卡的过程中,如果遇到检测不到控制卡的现象,可以参照下面的方 法逐步进行排查。 (1) 务必按照控制卡安装说明,分步安装好控制卡的驱动程序,在Win2000和 WinXP下必须安装端口驱动,确保在系统目录(system32或System)下有 控制卡动态库文件; (2) 检查运动控制卡和插槽接触是否良好。 可以通过重插或更换插槽的方式测 试,另可用橡皮擦对控制卡的金手指的污诟的清除再装上测试; (3) 在系统设备管理器中,检查运动控制卡和其它硬件是否有冲突。使用PCI 卡时,可以先取下其它板卡,如:声卡,网卡等;PC104卡可以调整拨码 开关重新设定基地址, 程序中卡初始化时使用的基地址必须和实际基地址 相同; (4) 检查操作系统是否存在问题,可以通过重新安装其他版本的操作系统进 行测试; (5) 按照上面的步骤检查后,如果依然找不到运动控制卡,可以通过更换运动 控制卡,进一步进行检测,以便诊断运动控制卡是否已经损坏;

? 电机运行异常
在运动控制卡正常的前提下,电机出现异常现象时,可以参照下面的情况排除 故障。 (1) 运动控制卡发出脉冲时,电机不运动 ? ? ? ? ? ? ? ? ? ? ? 请检查控制卡和端子板的连接线是否接好; 电机驱动器的脉冲和方向信号线是否已经正确地连接到端子板; 伺服驱动器的外部电源是否已经连接好; 伺服、 步进电机驱动器是否存在报警状态,如有报警则按报警对应代 码检查原因所在; 伺服SON是否连接好,伺服电机是否有激磁状态等; 如果是伺服电机请检查驱动器的控制方式, 本公司的控制卡支持 “位 置控制方式” ; 电机、驱动器坏 控制器的速度过快, 请计算电机的速度, 步进电机每秒10~15转属于 正常范围; 机械部卡死或机器的阻力太大; 电机的选型不够,请更换大力矩型号电机; 请检查驱动器的电流和电压,电流设为电机的额定电流的1.2倍,供 109
http://www.adtechcn.com

(2) 步进电机运转时发出异常尖叫声,电机出现明显失步现象。

ADT850 四轴运动控制卡

?

电电压在驱动器的额定范围; 检查控制器起始速度,一般起始速度为0.5~1右左,加减速时间0.1 秒以上; 伺服驱动器的位置环增益和速度环增益太大,在定位精度允许的情 况下降低服驱动器的位置环增益和速度环增益; 机器刚性太差,调整机器的结构; 步进电机选型不够,请更换大力矩型号电机; 步进电机的速度处于电机的共振区域,请避开此共振区或增大细分 的办法来解决; 请检查机械丝杠螺距和电机每转脉冲数与实际应用系统所设定的参 数是否相符,即脉冲当量; 如果伺服电机,则增大位置环增益和速度环增益; 请检查机器的丝杠间隙,用千分表测试丝杠的反向间隙,如有间隙 请调整丝杠; 如果是不定时、不定位置的定位不准,则要检查外部干扰信号; 电机选型不够在运动中出现抖动或失步现象; 检查DR+ DR-接线有没有错误,是否接牢; 请确定控制卡采用的脉冲模式是否与实际驱动器模式相符,本控制 卡支持“脉冲+方向”和“脉冲+脉冲模式” 步进电机要检查电机线有没断线、接触不良等现象;

(3) 伺服、步进电机在加工过程中出现明显振动或噪音现象 ? ? ? ?

(4) 电机定位不准 ? ? ? ? ? ? ? ?

(5) 电机没有方向

? 开关量输入异常
在系统调试、运行过程中,某些输入信号检测异常,可以使用下面介绍的方法 进行检查。 (1) 没有信号输入 (1) 据前面讲述的普通开关和接近开关的接线图,检查线路是否正确, 确保输入信号的“光藕公共端”已经和内部或外部电源(+12V或24V) 的正端相连; (2) 本公司的I\O点的输入开关使用NPN型,如果没有请检查开关开型号 和接线方式; (3) 检查光藕是否已经损坏。在线路正常的情况下,输入点在断开和闭 合的情况下,输入状态不发生改变,可以利用万用表检测光藕是否 已经被击穿,通过更换光藕可以解决光藕被击穿的问题; (4) 检查开关电源的12V或24V是否正常; (5) 开关损坏; (2) 信号时有时无 110
http://www.adtechcn.com

ADT850 四轴运动控制卡

? ? ? ? ? ? ? ? ? ? ? ?

检查是否存在干扰,可以在I\O测试画面检测信号的状态;如果是干 扰情况则增加独石电容型号为104或采用屏蔽线等; 机械在正常运行过程中,出现明显的颤抖或异常停止现象,请检查 限位开关信号是否存在干扰或限位开关性能是否可靠; 外部接线是否接触良好; 速度太快,降低归零速度; 外部信号存在干扰,请检查干扰源; 归零方向错误; 归零开关安装位置不当或开关松动; 在I\O测试下检测限位开关是否有效; 手动、自动加工时速度太快; 外部信号存在干扰,请检查干扰源; 手动方向错误; 限位开关安装位置不当或开关松动;

(3) 归零不准

(4) 限位无效

?

开关量输出异常
开关量输出异常,可以依据下面介绍的方法进行排查。 (1) 输出异常 ? ? ? ? 依据前面讲述的输出点的接线图,检查线路是否正确,确保输出公 共端(地线)和所用电源的地线相连; 检查输出器件是否已经损坏; 检查光藕是否已经损坏,利用万用表检测光藕是否已经被击穿,通 过更换光藕可以解决光藕被击穿的问题; 安全要领。输出使用感性负载时一定要并联续流二级管,型号 IN4007或IN4001; 断开输出点上对外的接线,在输出点上接一10K左右的上拉电阻到电 源端, 此时输出的地线需接到电源的GND, 并用万用表的红表笔点有12V 的正极,黑表笔点在信号输出端同时用手点动测试画面的按钮看是否有 电压输出,如果有则检查外围线路,否则检查板卡的公共端是否接好、 内部光藕不良等;

(2) 输出不良判断方法

?

编码器异常
在使用编码器出现异常时,可以参照下面介绍的方法进行排查。 111
http://www.adtechcn.com

ADT850 四轴运动控制卡

(1) 检查编码器接线。 确保编码器的接线符合前面介绍的差动或集电极开路方 式; (2) 检测编码器电压。运动控制卡正常接受的是+5V的信号,如果选用的是 +12V或+24V编码器,务必在编码器A、B相和端子板A、B相之间串联 1K(+12V)电阻; (3) 编码器计数不准。编码器的外围接线一定要采用屏蔽双绞线,编码器线不 能跟强电等一些干扰较强的电线捆绑在一起,必须分开在30~50MM以 上;

112
http://www.adtechcn.com

ADT850 四轴运动控制卡

附录 A
下面的接线都以X轴为例。

电机驱动器典型接线图

?

步进电机驱动器共阳极接线图

?

步进电机驱动器差动接线图

?

安川伺服驱动器接线图
113
http://www.adtechcn.com

ADT850 四轴运动控制卡

?

松下A4伺服驱动器接线图

114
http://www.adtechcn.com

ADT850 四轴运动控制卡

附录 B 应用型函数库说明
为保证用户利用运动控制卡方便、快捷地编写出高质量的应用系统,公司结 合多年的实际开发经验,对基本库函数进行了封装,生成了应用型的函数库。 应用型函数库包含管理工具和库函数两部分内容。

? 应用型库函数管理工具

管理工具用于设定所有轴的系统参数和运动参数, 这是使用应用型库函数的 前提。正确设定好每个轴的参数后,点击保存按钮进行保存。该工具同时提供了 应用型库函数调式的工具,用户利用管理工具可以对设定的参数是否合理进行验 证。

? 应用型库函数列表
函数类别 初始化 函数名称 adt850_init_board home1 回原点 home2 home3 功能描述 初始化控制卡 单轴回原点 两轴回原点 三轴轴回原点 页码 118 118 118 118 115
http://www.adtechcn.com

ADT850 四轴运动控制卡

home4 work_move1 多轴联动 work_move2 work_move3 work_move4 work_inp2 插补运动 work_inp3 work_inp4 work_arc continue_move1 连续运动 continue_move2 continue_move3 continue_move4 手动移动 hand_move free_move1 自由运动 free_move2 free_move3 free_move4 停止驱动 one_stop all_stop get_logical_pos 获取信息 get_fact_pos get_move_speed 开关量 get_input set_output

四轴回原点 单轴运动 两轴联动 三轴联动 四轴联动 两轴直线插补 三轴直线插补 四轴直线插补 两轴圆弧插补 单轴连续运动 两轴连续运动 三轴连续运动 四轴连续运动 手动移动 单轴自由运动 两轴自由运动 三轴自由运动 四轴自由运动 停止单轴驱动 停止所有轴驱动 获取逻辑位置 获取实际位置 获取驱动速度 获取单点状态 输出单点

118 119 119 119 119 120 120 120 120 120 121 121 121 121 121 122 122 122 122 122 123 123 123 123 123

? 应用型库函数详解
116
http://www.adtechcn.com

ADT850 四轴运动控制卡

1.

adt850_init_board—初始化函数 原型: int adt850_init_board(void); 功能:读取参数文件,初始化卡,设定范围,脉冲模式,停止模式等。 返回值:-3—无参数文件(打开管理工具即可自动生成);-2—PCI 插槽错误; -1—未安装端口驱动(安装驱动中的端口驱动即可);0—未插卡;1 —初始化成功。

2.

home1—单轴回原点函数 原型:int home1(int axis,FUNCTION pfn); 功能:指定轴按照管理工具中设定的原点信号类型,回零方向和回零速度搜 索原点信号。其中信号类型为原点时,使用的是 stop0 信号;编码器 Z 相,使用 stop1 信号。 参数:axis—轴号; pfn—指针函数,用于转让控制权,以保证在驱动过程中,可以响应 外部信息,如:获取位置、获取速度、响应停止等; 返回值:-2—未检测到原点信号;-1—有禁用轴参与运动;0—外部终止;1 —成功。

3.

home2—两轴回原点函数 原型:int home2(int axis1,int axis2,FUNCTION pfn); 功能:和 home1 相同; 参数:axis1、axis2—轴号;pfn—指针函数; 返回值:和 home1 相同。

4.

home3—三轴回原点函数 原型:int home3(int axis1,int axis2,int axis3,FUNCTION pfn); 功能:和 home1 相同; 参数:axis1、axis2、axis3—轴号;pfn—指针函数; 返回值:和 home1 相同。

5.

home4—四轴回原点函数 原型:int home4(FUNCTION pfn); 功能:和 home1 相同。 参数:pfn—指针函数; 返回值:和 home1 相同。 117
http://www.adtechcn.com

ADT850 四轴运动控制卡

6. work_move1—单轴联动函数 原型:int work_move1(int axis,float d,int oppmode,int speedmode,FUNCTION pfn); 功能:指定轴以设定的模式运动到目标位置; 参数:axis—轴号;d—运动距离;pfn—指针函数; oppmode—0:相对运动(参照当前点);1:绝对运动(参照零点) ; speedmode—0:加工速度;1:空移速度 返回值:-3—限位信号停止;-2—软限位终止;-1—有禁用轴参与运动;0 —外部终止;1—成功。 7. work_move2—两轴联动函数 原型:int work_move2(int axis1,float d1,int axis2,float d2,int oppmode,int speedmode,FUNCTION pfn); 功能:指定轴以设定的模式运动到目标位置; 参数:axis1、axis2—轴号;d1、d2—运动距离;pfn—指针函数;oppmode —运动模式;speedmode—速度模式; 返回值:和 work_move1 相同。 8. work_move3—三轴联动函数 原型:int work_move3(int axis1,float d1,int axis2,float d2,int axis3,float d3,int oppmode,int speedmode,FUNCTION pfn); 功能:指定轴以设定的模式运动到目标位置; 参数:axis1、axis2、axis3—轴号;d1、d2、d3—运动距离;pfn—指针函数; oppmode—运动模式;speedmode—速度模式; 返回值:和 work_move1 相同。 9. work_move4—四轴联动函数 原型:int work_move4(float d1,,float d2,float d3,float d4,int oppmode,int speedmode,FUNCTION pfn); 功能:四轴以设定的模式运动到目标位置; 参数: d1、 d3、 d2、 d4—X、 Z、 轴的运动距离; Y、 W pfn—指针函数; oppmode —运动模式;speedmode—速度模式; 返回值:和 work_move1 相同。 10. work_inp2—两轴插补函数 118
http://www.adtechcn.com

ADT850 四轴运动控制卡

原型:int work_inp2(int axis1,float d1,int axis2,float d2,int oppmode,int speedmode,FUNCTION pfn); 功能:指定轴 axis1 和 axis2 以设定的模式直线插补运动到目标位置; 参数:参数和两轴联动相同 返回值:-4-参与插补的轴号错误,其它和 work_move1 相同。 11. work_inp3—三轴插补函数 原型:int work_inp3(float d1 ,float d2, float d3,int oppmode,int speedmode,FUNCTION pfn); 功能: XYZ 轴以设定的模式直线插补运动到目标位置; 参数: d2、 d1、 d3—运动距离; pfn—指针函数; oppmode—运动模式; speedmode —速度模式; 返回值:和 work_move1 相同 12. work_inp4—四轴插补函数 原型:int work_inp4(float d1,float d2,float d3,float d4,int oppmode,int speedmode,FUNCTION pfn); 功能:四轴以设定的模式直线插补运动到目标位置; 参数:参数和四轴联动相同; 返回值:和 work_move1 相同。 13. work_arc—两轴圆弧插补 原型:int work_arc(int axis1,int axis2,float cood[],int speedmode,FUNCTION pfn); 功能:XY 或 ZW 两轴以设定的速度模式进行圆弧插补运动; 参数:axis1、axis2—轴号;cood[]—圆弧上三点的坐标,含六个元素; 返回值:-5-参与插补的轴号错误,-4—三点不能构成圆弧,其它和 work_move1 相同。 14. continue_move1—单轴连续运动函数 原型:int continue_move1(int axis,int dir, int speedmode,FUNCTION pfn); 功能:单轴连续运动,直到有限位信号或外部强迫停止; 参数:axis—轴号;dir—方向(0:正方向,1:负方向);pfn—指针函数; 返回值:和 work_move1 相同。 15. continue_move2—两轴连续运动函数 119
http://www.adtechcn.com

ADT850 四轴运动控制卡

原型:int continue_move2(int axis1,int dir1,int axis2,int dir2, int speedmode, FUNCTION pfn); 功能:两轴连续运动,直到有限位信号或外部强迫停止; 参数:axis1、axis2—轴号;dir1、dir2—方向(0:正方向,1:负方向);pfn —指针函数; 返回值:和 work_move1 相同。 16. continue_move3—三轴连续运动函数 原型: continue_move3(int axis1,int dir1,int axis2,int dir2,int axis3,int dir3, int int speedmode,FUNCTION pfn); 功能:三轴连续运动,直到有限位信号或外部强迫停止; 参数:axis1、axis2、axis3—轴号;dir1、dir2、dir3—方向(0:正方向,1: 负方向);pfn—指针函数; 返回值:和 work_move1 相同。 17. continue_move4—四轴连续运动函数 原型:int continue_move4(int dir1,int dir2,int dir3,int dir4, int speedmode,FUNCTION pfn); 功能:四轴连续运动,直到有限位信号或外部强迫停止; 参数:dir1、dir2、dir3、dir4—方向(0:正方向,1:负方向);pfn—指针函 数; 返回值:和 work_move1 相同。 18. hand_move—手动函数 原型:int hand_move(int axis,int dir,FUNCTION pfn); 功能:指定轴以手动速度和设定方向连续运动,直到限位停止或外部停止; 参数:axis-轴号;dir—方向(0:正方向,1:负方向);pfn—指针函数; 返回值:-3—限位信号停止;-1—有禁用轴参与运动;0—外部终止。 19. free_move1—单轴自由运动 原型:int free_move1(int axis,float d,float startv,float speed,float addtime,int oppmode,FUNCTION pfn); 功能:指定轴以设定速度和设定运动模式运动到目标位置; 参数: axis—轴号; d—目标位置; startv—起始速度; speed—驱动速度; addtime —加速时间;oppmode—运动模式(0:相对运动,1:绝对运动); 120
http://www.adtechcn.com

ADT850 四轴运动控制卡

pfn—指针函数; 返回值:和 work_move1 相同。 20. free_move2—两轴自由运动 原型:int free_move2(int axis1,float d1,float startv1,float speed1,float addtime1,int axis2,float d2,float startv2,float speed2,float adtime2,int oppmode,FUNCTION pfn); 功能:指定轴以设定速度和设定运动模式运动到目标位置; 参数:参数含义和 free_move1 相似; 返回值:和 work_move1 相同。 21. free_move3—三轴自由运动 原型:int free_move3(int axis1,float d1,float startv1,float speed1,float addtime1,int axis2,float d2,float startv2,float speed2,float adtime2,int axis3, float d3,float startv3,float speed3,float addtime3,int oppmode,FUNCTION pfn); 功能:指定轴以设定速度和设定运动模式运动到目标位置; 参数:参数含义和 free_move1 相似; 返回值:和 work_move1 相同。 22. free_move4—四轴自由运动 原型:int free_move4(float d1,float startv1,float speed1,float addtime1,float d2,float startv2,float speed2,float adtime2, float d3,float startv3,float speed3,float addtime3, float d4,float startv4,float speed4,float addtime4,int oppmode,FUNCTION pfn); 功能:四轴以设定速度和设定运动模式运动到目标位置; 参数:参数含义和 free_move1 相似; 返回值:和 work_move1 相同。 23. one_stop—单轴停止 原型:int one_stop(int axis,int mode); 功能:以指定模式停止指定轴的驱动; 参数:axis—轴号;mode—停止模式(0:立即停止,1:减速停止)。 24. all_stop—所有轴停止 原型:int all_stop(int mode); 121
http://www.adtechcn.com

ADT850 四轴运动控制卡

功能:以指定模式停止所有轴的驱动; 参数:mode—停止模式(0:立即停止,1:减速停止)。 25. get_logical_pos—获取逻辑位置 原型:float get_logical_pos(int axis,int mode); 功能:以指定模式获取指定轴的逻辑位置; 参数:axis—轴号;mode—位置方式(0:距离方式,1:脉冲方式); 返回值:逻辑位置。 26. get_fact_pos—获取实际位置 原型:float get_fact_pos(int axis,int mode); 功能:以指定模式获取指定轴的实际位置; 参数:axis—轴号;mode—位置方式(0:距离方式,1:脉冲方式); 返回值:实际位置。 27. get_move_speed—获取运动速度 原型:float get_move_speed(int axis,int mode); 功能:以指定模式获取指定轴的运动速度; 参数:axis—轴号;mode—位置方式(0:距离方式,1:脉冲方式); 返回值:运动速度。 28. get_input—获取单点状态 原型:int get_input(int number); 功能:获取单个输入点状态; 参数:number—输入点; 返回值:0—低电平;1—高电平;-1—错误。 29. set_output—输出单点 原型:int set_output(int number,int value); 功能:设定指定输出点的状态; 参数:number—输出号;value—0:低;1:高; 返回值:0—正确;1:错误。

122
http://www.adtechcn.com


相关文章:
ADT850用户手册
(20 线) 传真:0755-26722718 1 http://www.adtechcn.com ADT850 四轴运动控制卡 版权声明本用户手册的所有部分,其著作财产权归属众为兴数控技术有限 公司(以下...
ADT-856用户手册
ADT-856用户手册_电子/电路_工程科技_专业资料。ADT-856用户手册 ADT-856 六轴运动控制卡 说明书 深圳市众为兴数控技术有限公司地址:深圳市南山区马家垅工业区 36...
andrid配置使用手册
andrid配置使用手册_计算机硬件及网络_IT/计算机_专业资料。Android 开发(工具选择...②下载 ADT(ADT 23.0.0) : 地址:http://pan.baidu.com/s/1i3vFkaT ...
QC功能用户手册1.0
28 质量管理体系 北京先进数通融安 QC 功能用户手册 ADTRAC-WD-YF-02-QR-06 1. 概述 1.1. 目的本手册为使用 HP Quality Center 管理功能测试过程提供说明,...
ADT_8937用户手册
ADT-8937 三轴运动+ 三轴运动+激光雕刻打标控制卡 用户手册 深圳市众为兴数控技术有限公司地址: 深圳市南山区艺园路田厦 IC 产业园 27-29 栋 5 楼 邮编:...
触摸屏调度台操作手册V5.0
2 久泰能源触摸屏调度台培训手册 第1章 系统概述 ADT 触屏调度台提供相互独立的两条链路的双手病,可同时与两个用户通 话或召开电话会议。 ADT 触屏调度台采用...
完整版ADB手册
完整版ADB手册_IT/计算机_专业资料。Android Debug ...注意,如果使用了安装有 ADT 插件的 Eclipse 开发...通过生成伪随机的大量的系统级的用户事件流来模拟 操作...
变频器使用说明
到315kW的G型机(恒定转矩控制方式)或者P型机(可变转矩控制方式), 供用户选用...(H) 立式机柜 850(L)×500(W)×1700(H) 注释:尺寸如有更改,恕不另行通知...
Android Studio开发手册
Android Studio 开发手册第一章 Android Studio简介...包括中止对 Eclipse ADT 插件以及Android Ant 编译系统...2.2 建立简单的用户界面 Android Studio 代码和界面...
DJ018B002A 5500焊接机用户手册
ADT -T V55 00 DJ 四轴焊接机控制系统 用户手册 深圳市众为兴数控技术有限公司地址: 深圳市南山区艺园路田厦 IC 产业园 27-29 栋 5 楼 邮编:518052 电话:...
更多相关标签:
micro850用户手册 | adt850 | rh850中文手册 | rh850 数据手册 | micro850编程手册 | 夏普850维修手册 | micro850 指令手册 | gl850g中文手册 |