运动控制卡C程序示例.docx
- 文档编号:24096982
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:25
- 大小:69.64KB
运动控制卡C程序示例.docx
《运动控制卡C程序示例.docx》由会员分享,可在线阅读,更多相关《运动控制卡C程序示例.docx(25页珍藏版)》请在冰豆网上搜索。
运动控制卡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__
/***********************运动控制模块********************
为了简单、方便、快捷地开发出通用性好、可扩展性强、
维护方便的应用系统,我们在控制卡函数库的基础上将
所有库函数进行了分类封装。
下面的示例使用一块运动
控制卡
********************************************************/
#defineMAXAXIS4//最大轴数
classCCtrlCard
{
public:
intSetup_HardStop(intvalue,intlogic);
intSetup_Stop1Mode(intaxis,intvalue,intlogic);(设置stop1信号方式)
intSetup_Stop0Mode(intaxis,intvalue,intlogic);(设置stop0信号方式)
intSetup_LimitMode(intaxis,intvalue1,intvalue2,intlogic);(设置限位信号方式)
intSetup_PulseMode(intaxis,intvalue);(设置脉冲输出方式)
intSetup_Pos(intaxis,longpos,intmode);(设置位置计数器)
intWrite_Output(intnumber,intvalue);(输出单点函数)
intRead_Input(intnumber,int&value);(读入点)
intGet_CurrentInf(intaxis,long&LogPos,long&ActPos,long&Speed);(获取运动信息)
intGet_Status(intaxis,int&value,intmode);(获取轴的驱动状态)
intStopRun(intaxis,intmode);(停止轴驱动)
intInterp_Move4(longvalue1,longvalue2,longvalue3,longvalue4);(四轴差补函数)
intInterp_Move3(intaxis1,intaxis2,intaxis3,longvalue1,longvalue2,longvalue3);(三轴差补函数)
intInterp_Move2(intaxis1,intaxis2,longvalue1,longvalue2);(双轴差补函数)
intAxis_Pmove(intaxis,longvalue);(单轴驱动函数)
intAxis_Cmove(intaxis,longvalue);(单轴连续驱动函数)
intSetup_Speed(intaxis,longstartv,longspeed,longadd);(设置速度模块)
intInit_Board(intdec_num);(函数初始化)(设置速度模块)
CCtrlCard();(定义了一个同名的无参数的构造函数)
intResult;//返回值
};
#endif
(5)源文件“CtrlCard.cpp”代码如下:
#include"stdafx.h"
#include"DEMO.h"
#include"CtrlCard.h"
#include"adt8840.h"
intdevnum=-1;
CCtrlCard:
:
CCtrlCard()(构造函数,为什么是空的?
)
{
}
/*******************初始化函数************************
该函数中包含了控制卡初始化常用的库函数,这是调用
其他函数的基础,所以必须在示例程序中最先调用
返回值<=0表示初始化失败,返回值>0表示初始化成功
*****************************************************/
intCCtrlCard:
:
Init_Board(intdevnum)
{
/***********************************************************/
intmode=0;//应答模式为1时,响应串口接收有效,0时无效
if(devnum==0)(devnum:
设备号)
{
for(inti=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)
return1;
else
returnResult;
}
else
return-1;
}
/**********************设置速度模块***********************
依据参数的值,判断是匀速还是加减速
设置轴的初始速度、驱动速度和加速度
参数:
axis-轴号
startv-初始速度
speed-驱动速度
add-加速度
返回值=0正确,返回值=1错误
*********************************************************/
intCCtrlCard:
:
Setup_Speed(intaxis(轴号),longstartv(初始速度),longspeed(驱动速度),longadd(加速度))
{
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);(设定加速度)
}
returnResult;
}
/*********************单轴驱动函数*********************
该函数用于驱动单个运动轴运动
参数:
axis-轴号,value-输出脉冲数
返回值=0正确,返回值=1错误
*******************************************************/
intCCtrlCard:
:
Axis_Pmove(intaxis,longvalue)
{
Result=adt8840a_pmove(devnum,axis,value(脉冲数));
returnResult;
}
/*******************任意两轴插补函数********************
该函数用于驱动任意两轴进行插补运动
参数:
axis1,axis2-轴号、value1,value2-脉冲数
返回值=0正确,返回值=1错误
*******************************************************/
intCCtrlCard:
:
Interp_Move2(intaxis1,intaxis2,longvalue1,longvalue2)
{
Result=adt8840a_inp_move2(devnum,axis1,axis2,value1,value2);
returnResult;
}
/*******************任意三轴插补函数********************
该函数用于驱动任意三轴进行插补运动
参数:
axis1,axis2,axis3-轴号、value1,value2,value3-脉冲数
返回值=0正确,返回值=1错误
*******************************************************/
intCCtrlCard:
:
Interp_Move3(intaxis1,intaxis2,intaxis3,longvalue1,longvalue2,longvalue3)
{
Result=adt8840a_inp_move3(devnum,axis1,axis2,axis3,value1,value2,value3);
returnResult;
}
/*******************四轴插补函数****************************
该函数用于驱动XYZW四轴进行插补运动
参数:
value1,value2,value3,value4-输出脉冲数
返回值=0正确,返回值=1错误
***********************************************************/
intCCtrlCard:
:
Interp_Move4(longvalue1,longvalue2,longvalue3,longvalue4)
{
Result=adt8840a_inp_move4(devnum,value1,value2,value3,value4);
returnResult;
}
/************************停止轴驱动***********************
该函数用于立即或减速停止轴的驱动
参数:
axis-轴号、mode-减速方式(0-立即停止,1-减速停止)
返回值=0正确,返回值=1错误
************************************************************/
intCCtrlCard:
:
StopRun(intaxis,intmode)
{
if(mode==0)//立即停止
{
Result=adt8840a_sudden_stop(devnum,axis);
}
else//减速停止
{
Result=adt8840a_dec_stop(devnum,axis);
}
returnResult;
}
/*****************获取轴的驱动状态**************************
该函数用于获取单轴的驱动状态或插补驱动状态
参数:
axis-轴号,value-状态指针(0-驱动结束,非0-正在驱动)
mode(0-获取单轴驱动状态,1-获取插补驱动状态)
返回值=0正确,返回值=1错误
************************************************************/
intCCtrlCard:
:
Get_Status(intaxis,int&value,intmode)
{
if(mode==0)//获取单轴驱动状态
Result=adt8840a_get_status(devnum,axis,&value);
else//获取插补驱动状态
Result=adt8840a_get_inp_status(devnum,&value);
returnResult;
}
/*****************获取运动信息******************************
该函数用于反馈轴当前的逻辑位置,实际位置和运行速度
参数:
axis-轴号,LogPos-逻辑位置,ActPos-实际位置,Speed-运行速度
返回值=0正确,返回值=1错误
************************************************************/
intCCtrlCard:
:
Get_CurrentInf(intaxis,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);(获取驱动速度)
returnResult;
}
/***********************读取输入点*******************************
该函数用于读取单个输入点
参数:
number-输入点(0~39)
返回值:
0-低电平,1-高电平,-1-错误
****************************************************************/
intCCtrlCard:
:
Read_Input(intnumber,int&value)
{
Result=adt8840a_read_bit(devnum,number,&value);
returnResult;
}
/*********************输出单点函数******************************
该函数用于输出单点信号
参数:
number-输出点(0~15),value0-低电平、1-高电平
返回值=0正确,返回值=1错误
****************************************************************/
intCCtrlCard:
:
Write_Output(intnumber,intvalue)
{
Result=adt8840a_write_bit(devnum,number,value);
returnResult;
}
/*******************设置位置计数器*******************************
该函数用于设置逻辑位置和实际位置
参数:
axis-轴号,pos-设置的位置值
mode0-设置逻辑位置,非0-设置实际位置
返回值=0正确,返回值=1错误
****************************************************************/
intCCtrlCard:
:
Setup_Pos(intaxis,longpos,intmode)
{
if(mode==0)
{
Result=adt8840a_set_command_pos(devnum,axis,pos);(设置逻辑计数器)
}
else
{
Result=adt8840a_set_actual_pos(devnum,axis,pos);(设置实位计数器)
}
returnResult;
}
/********************设置脉冲输出方式**********************
该函数用于设置脉冲的工作方式
参数:
axis-轴号,value-脉冲方式0-脉冲+脉冲方式1-脉冲+方向方式
返回值=0正确,返回值=1错误
默认脉冲方式为脉冲+方向方式
本程序采用默认的正逻辑脉冲和方向输出信号正逻辑
*********************************************************/
intCCtrlCard:
:
Setup_PulseMode(intaxis,intvalue)
{
Result=adt8840a_set_pulse_mode(devnum,axis,value,0,0);(设置脉冲模式)
returnResult;
}
/********************设置限位信号方式**********************
该函数用于设定正/负方向限位输入nLMT信号的模式
参数:
axis-轴号
value10-正限位有效1-正限位无效
value20-负限位有效1-负限位无效
logic0-低电平有效1-高电平有效
默认模式为:
正限位有效、负限位有效、低电平有效
返回值=0正确,返回值=1错误
*********************************************************/
intCCtrlCard:
:
Setup_LimitMode(intaxis,intvalue1,intvalue2,intlogic)
{
Result=adt8840a_set_limit_mode(devnum,axis,value1,value2,logic);
returnResult;
}
/********************设置stop0信号方式**********************
该函数用于设定stop0信号的模式
参数:
axis-轴号
value0-无效1-有效
logic0-低电平有效1-高电平有效
默认模式为:
无效
返回值=0正确,返回值=1错误
*********************************************************/
intCCtrlCard:
:
Setup_Stop0Mode(intaxis,intvalue,intlogic)
{
Result=adt8840a_set_stop0_mode(devnum,axis,value,logic);
returnResult;
}
/********************设置stop1信号方式**********************
该函数用于设定stop1信号的模式
参数:
axis-轴号
value0-无效1-有效
logic0-低电平有效1-高电平有效
默认模式为:
无效
返回值=0正确,返回值=1错误
*********************************************************/
intCCtrlCard:
:
Setup_Stop1Mode(intaxis,intvalue,intlogic)
{
Result=adt8840a_set_stop1_mode(devnum,axis,value,logic);
returnResult;
}
/************************单轴连续驱动函数***********************
该函数用于驱动单个运动轴运动
参数:
axis-轴号,value-脉冲方向
返回值=0正确,返回值=1错误
***********************************************************/
intCCtrlCard:
:
Axis_Cmove(intaxis,longvalue)
{
Result=adt8840a_continue_move(devnum,axis,value);
returnResult;
}
2.3功能实现模块
2.3.1界面设计
说明:
(1)速度设定部分—用于设定各轴的起始速度、驱动速度和加速度;位置设定—设定各轴的驱动脉冲;驱动信息—实时显示各轴的逻辑位置、实际位置和运行速度。
(2)驱动对象—通过选择驱动对象,确定参与联动或插补的轴;
(3)联动—用于向所选驱动对象的所有轴发出单轴驱动指令;插补—用于向所选驱动对象的所有轴发出插补指令;停止—停止所有轴的脉冲输出;
以上所有数据均以脉冲为单位。
2.3.2运动控制卡初始化代码位于窗体初始化中,用户新增代码如下:
SetDlgItemText(IDC_EDIT_OPPIP,"192.168.0.123");//指定控制卡IP地址
SetDlgItemText(IDC_EDIT_MAC,"00-AB-CD-00-01-23");//指定网卡地址SetDlgItemText(IDC_EDIT_INFO,"请先执行初始化");
DeviceAddr_init();//设备接口地址初始化
//*******设置默认初始速度为100*********
m_nStartvX=100;
m_nStartvY=100;
m_nStartvZ=100;
m_nStartvA=100;
//*********设置默认驱动速度为2000********
m_nSpeedX=2000;
m_nSpeedY=2000;
m_nSpeedZ=2000;
m_nSpeedA=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运动 控制 程序 示例