运动控制卡C程序示例.docx
- 文档编号:16205809
- 上传时间:2023-07-11
- 格式:DOCX
- 页数:23
- 大小:250.10KB
运动控制卡C程序示例.docx
《运动控制卡C程序示例.docx》由会员分享,可在线阅读,更多相关《运动控制卡C程序示例.docx(23页珍藏版)》请在冰点文库上搜索。
运动控制卡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=2000;
//*********设置默认加速度为2500**********
m_nAddX=2500;
m_nAddY=2500;
m_nAddZ=2500;
m_nAddA=2500;
设置默认目标位置为1000000******
UpdateData(TRUE);
longStartv[]={m_nStartvX,m_nStartvY,m_nStartvZ,m_nStartvA};//初始速度longSpeed[]={m_nSpeedX,m_nSpeedY,m_nSpeedZ,m_nSpeedA};//驱动速度longAdd[]={m_nAddX,m_nAddY,m_nAddZ,m_nAddA};//加速度if(m_bX)
if(m_bA)
g_CtrlCard.Axis_Pmove(4,m_nPulseA);
if((!
m_bX)&&(!
m_bY)&&(!
m_bZ)&&(!
m_bA))
MessageBox("请选择联动轴!
","提示");
}
2.3.4插补代码位于插补按钮点击消息中,其中依据选择对象的不同发出对应的驱动指令,代码如下:
/*********************************
插补按钮动作
voidCVCExampleDlg:
:
OnButtonInpmove()
{
UpdateData();
longStartv[]={m_nStartvX,m_nStartvY,m_nStartvZ,m_nStartvA};//初始速度
longSpeed[]={m_nSpeedX,m_nSpeedY,m_nSpeedZ,m_nSpeedA};//驱动速度longAdd[]={m_nAddX,m_nAddY,m_nAddZ,m_nAddA};//加速度
longPulse[]={m_nPulseX,m_nPulseY,m_nPulseZ,m_nPulseA};//轴的驱动脉冲数
if(m_bX&&m_bY&&!
m_bZ&&!
m_bA)//XY两轴插补
{
g_CtrlCard.Setup_Speed(1,Startv[0],Speed[0],Add[0]);g_CtrlCard.Interp_Move2(1,2,Pulse[0],Pulse[1]);
}
elseif(m_bX&&!
m_bY&&m_bZ&&!
m_bA)//XZ两轴插补
{
g_CtrlCard.Setup_Speed(1,Startv[0],Speed[0],Add[0]);g_CtrlCard.Interp_Move2(1,3,Pulse[0],Pulse[2]);
}
elseif(m_bX&&!
m_bY&&!
m_bZ&&m_bA)//XW两轴插补
{
g_CtrlCard.Setup_Speed(1,Startv[0],Speed[0],Add[0]);g_CtrlCard.Interp_Move2(1,4,Pulse[0],Pulse[3]);
//YZ两轴插补
}
elseif(!
m_bX&&m_bY&&m_bZ&&!
m_bA)
{
g_CtrlCard.Setup_Speed(2,Startv[1],Speed[1],Add[1]);g_CtrlCard.Interp_Move2(2,3,Pulse[1],Pulse[2]);
}
elseif(!
m_bX&&m_bY&&!
m_bZ&&m_bA)//YW两轴插补
{
g_CtrlCard.Setup_Speed(2,Startv[1],Speed[1],Add[1]);g_CtrlCard.Interp_Move2(2,4,Pulse[1],Pulse[3]);
}
elseif(!
m_bX&&!
m_bY&&m_bZ&&m_bA)//ZW两轴插补
{
g_CtrlCard.Setup_Speed(3,Startv[2],Speed[2],Add[2]);g_CtrlCard.Interp_Move2(3,4,Pulse[2],Pulse[3]);
}
elseif(m_b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运动 控制 程序 示例