运动控制卡C程序示例

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

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;

else

return Result;

}

else

return -1;

设置速度模块

依据参数的值 ,判断是匀速还是加减速

设置轴的初始速度、驱动速度和加速度 参数: axis - 轴号 startv - 初始速度 speed -驱动速度 add

-加速度

返回值 =0 正确 ,返回值 =1 错误

int CCtrlCard::Setup_Speed(int axis (轴号) , long startv (初始速度) , long speed (驱动速度) , long add {

if (startv - speed >= 0) // 匀速运动

加速度) )

}

}

相关文档
最新文档