运动控制卡C程序示例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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) // 匀速运动
加速度) )
}
}