C++程序示例.docx

上传人:b****8 文档编号:10853941 上传时间:2023-02-23 格式:DOCX 页数:25 大小:69.50KB
下载 相关 举报
C++程序示例.docx_第1页
第1页 / 共25页
C++程序示例.docx_第2页
第2页 / 共25页
C++程序示例.docx_第3页
第3页 / 共25页
C++程序示例.docx_第4页
第4页 / 共25页
C++程序示例.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

C++程序示例.docx

《C++程序示例.docx》由会员分享,可在线阅读,更多相关《C++程序示例.docx(25页珍藏版)》请在冰豆网上搜索。

C++程序示例.docx

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;

//********设置默认目

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1