运动控制卡C程序示例.docx_第1页
运动控制卡C程序示例.docx_第2页
运动控制卡C程序示例.docx_第3页
运动控制卡C程序示例.docx_第4页
运动控制卡C程序示例.docx_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

F 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.hint devnum=-1;CCtrlCard:CCtrlCard()(构造函数,为什么是空的?)/*初始化函数* 该函数中包含了控制卡初始化常用的库函数 ,这是调用 其他函数的基础 ,所以必须在示例程序中最先调用 返回值0表示初始化成功*/int CCtrlCard:Init_Board(int devnum)/*/int mode =0;/应答模式为1时 ,响应串口接收有效,0时无效if(devnum=0)(devnum:设备号)for (int i = 1; i= 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); (设定加速度)return Result;/*单轴驱动函数* 该函数用于驱动单个运动轴运动 参数: axis-轴号 ,value-输出脉冲数 返回值=0正确 ,返回值=1错误*/int CCtrlCard:Axis_Pmove(int axis, long value) Result = adt8840a_pmove(devnum,axis, value(脉冲数));return Result;/*任意两轴插补函数* 该函数用于驱动任意两轴进行插补运动 参数:axis1,axis2-轴号、value1,value2-脉冲数 返回值=0正确 ,返回值=1错误*/int CCtrlCard:Interp_Move2(int axis1, int axis2, long value1, long value2) Result = adt8840a_inp_move2(devnum,axis1, axis2, value1, value2);return Result;/*任意三轴插补函数* 该函数用于驱动任意三轴进行插补运动 参数:axis1,axis2,axis3-轴号、value1,value2,value3-脉冲数 返回值=0正确 ,返回值=1错误*/int CCtrlCard:Interp_Move3(int axis1, int axis2, int axis3, long value1, long value2, long value3) Result = adt8840a_inp_move3(devnum,axis1, axis2, axis3, value1, value2, value3);return Result;/*四轴插补函数* 该函数用于驱动XYZW四轴进行插补运动 参数:value1,value2,value3,value4-输出脉冲数 返回值=0正确 ,返回值=1错误*/int CCtrlCard:Interp_Move4(long value1, long value2, long value3, long value4) Result = adt8840a_inp_move4(devnum,value1, value2, value3, value4);return Result;/*停止轴驱动* 该函数用于立即或减速停止轴的驱动参数:axis-轴号、mode-减速方式(0立即停止, 1减速停止) 返回值=0正确 ,返回值=1错误*/int CCtrlCard:StopRun(int axis, int mode)if(mode = 0) /立即停止 Result = adt8840a_sudden_stop(devnum, axis); else /减速停止 Result = adt8840a_dec_stop(devnum, axis); return Result;/*获取轴的驱动状态* 该函数用于获取单轴的驱动状态或插补驱动状态 参数:axis-轴号 ,value-状态指针(0-驱动结束 ,非0正在驱动) mode(0-获取单轴驱动状态 ,1获取插补驱动状态) 返回值=0正确 ,返回值=1错误*/int CCtrlCard:Get_Status(int axis, int &value, int mode)if (mode=0) /获取单轴驱动状态Result=adt8840a_get_status(devnum,axis,&value);else /获取插补驱动状态Result=adt8840a_get_inp_status(devnum,&value);return Result;/*获取运动信息* 该函数用于反馈轴当前的逻辑位置 ,实际位置和运行速度 参数:axis-轴号,LogPos-逻辑位置,ActPos-实际位置,Speed-运行速度 返回值=0正确 ,返回值=1错误*/int CCtrlCard:Get_CurrentInf(int axis, 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);(获取驱动速度)return Result;/*读取输入点* 该函数用于读取单个输入点 参数:number-输入点(0 39) 返回值:0 低电平 ,1 高电平 ,-1 错误*/int CCtrlCard:Read_Input(int number,int &value) Result = adt8840a_read_bit(devnum, number, &value); return Result;/*输出单点函数* 该函数用于输出单点信号 参数: number-输出点(0 15),value 0-低电平、1高电平 返回值=0正确 ,返回值=1错误*/int CCtrlCard:Write_Output(int number, int value)Result = adt8840a_write_bit(devnum, number, value);return Result;/*设置位置计数器* 该函数用于设置逻辑位置和实际位置 参数:axis-轴号,pos-设置的位置值 mode 0设置逻辑位置,非0设置实际位置 返回值=0正确 ,返回值=1错误*/int CCtrlCard:Setup_Pos(int axis, long pos, int mode)if(mode=0)Result = adt8840a_set_command_pos(devnum,axis, pos);(设置逻辑计数器)elseResult = adt8840a_set_actual_pos(devnum, axis, pos);(设置实位计数器)return Result;/*设置脉冲输出方式*该函数用于设置脉冲的工作方式参数:axis-轴号 , value-脉冲方式 0脉冲脉冲方式 1脉冲方向方式 返回值=0正确 ,返回值=1错误 默认脉冲方式为脉冲方向方式 本程序采用默认的正逻辑脉冲和方向输出信号正逻辑*/int CCtrlCard:Setup_PulseMode(int axis, int value) Result = adt8840a_set_pulse_mode(devnum,axis, value, 0, 0);(设置脉冲模式)return Result;/*设置限位信号方式* 该函数用于设定正/负方向限位输入nLMT信号的模式 参数: axis轴号 value1 0正限位有效 1正限位无效 value2 0负限位有效 1负限位无效 logic 0低电平有效 1高电平有效 默认模式为:正限位有效、负限位有效、低电平有效 返回值=0正确 ,返回值=1错误 */int CCtrlCard:Setup_LimitMode(int axis, int value1, int value2, int logic) Result = adt8840a_set_limit_mode(devnum,axis, value1, value2, logic);return Result;/*设置stop0信号方式* 该函数用于设定stop0信号的模式 参数: axis轴号 value 0无效 1有效logic 0低电平有效 1高电平有效 默认模式为:无效 返回值=0正确 ,返回值=1错误 */int CCtrlCard:Setup_Stop0Mode(int axis, int value, int logic) Result = adt8840a_set_stop0_mode(devnum,axis, value ,logic);return Result;/*设置stop1信号方式* 该函数用于设定stop1信号的模式 参数: axis轴号 value 0无效 1有效 logic 0低电平有效 1高电平有效 默认模式为:无效 返回值=0正确 ,返回值=1错误 */int CCtrlCard:Setup_Stop1Mode(int axis, int value, int logic) Result = adt8840a_set_stop1_mode(devnum,axis, value, logic);return Result;/*单轴连续驱动函数* 该函数用于驱动单个运动轴运动 参数: axis-轴号 ,value-脉冲方向返回值=0正确 ,返回值=1错误*/int CCtrlCard:Axis_Cmove(int axis, long value)Result = adt8840a_continue_move(devnum,axis, value);return Result;2.3 功能实现模块2.3.1 界面设计说明:(1)速度设定部分用于设定各轴的起始速度、驱动速度和加速度;位置设定设定各轴的驱动脉冲;驱动信息实时显示各轴的逻辑位置、实际位置和运行速度。(2)驱动对象通过选择驱动对象 ,确定参与联动或插补的轴;(3)联动用于向所选驱动对象的所有轴发出单轴驱动指令;插补用于向所选驱动对象的所有轴发出插补指令;停止停止所有轴的脉冲输出;以上所有数据均以脉冲为单位。2.3.2 运动控制卡初始化代码位于窗体初始化中 ,用户新增代码如下: SetDlgItemText(IDC_EDIT_OPPIP,23);/指定控制卡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*m_nPulseX = 1000000;m_nPulseY = 1000000;m_nPulseZ = 1000000;m_nPulseA = 1000000; UpdateData(FALSE);SetTimer(MAINTIMER,100,NULL); /启动计时器2.3.3 联动代码位于联动按钮点击消息中 ,其中依据选择对象的不同发出对应的驱动指令 ,代码如下:/* 联动按钮动作*/void CVCExampleDlg:OnButtonPmove() UpdateData(TRUE);long Startv=m_nStartvX,m_nStartvY,m_nStartvZ,m_nStartvA; /初始速度long Speed=m_nSpeedX,m_nSpeedY,m_nSpeedZ,m_nSpeedA; /驱动速度long Add =m_nAddX,m_nAddY,m_nAddZ,m_nAddA; /加速度if(m_bX) /*X速度设定*/g_CtrlCard.Setup_Speed(1, m_nStartvX, m_nSpeedX, m_nAddX);if(m_bY ) /*Y速度设定*/g_CtrlCard.Setup_Speed(2, m_nStartvY, m_nSpeedY, m_nAddY);if(m_bZ ) /*Z速度设定*/ g_CtrlCard.Setup_Speed(3, m_nStartvZ, m_nSpeedZ, m_nAddZ);if(m_bA ) /*A速度设定*/g_CtrlCard.Setup_Speed(4, m_nStartvA, m_nSpeedA, m_nAddA);/驱动指令/*X轴驱动*/if(m_bX) g_CtrlCard.Axis_Pmove(1, m_nPulseX);/*Y轴驱动*/if(m_bY) g_CtrlCard.Axis_Pmove(2, m_nPulseY);/*Z轴驱动*/if(m_bZ) g_CtrlCard.Axis_Pmove(3, m_nPulseZ);/*A轴驱动*/if(m_bA) g_CtrlCard.Axis_Pmove(4, m_nPulseA);if(!m_bX) & (!m_bY) & (!m_bZ) & (!m_bA)MessageBox(请选择联动轴!,提示);2.3.4 插补代码位于插补按钮点击消息中 ,其中依据选择对象的不同发出对应的驱动指令 ,代码如下:/* 插补按钮动作*/void CVCExampleDlg:OnButtonInpmove() UpdateData();long Startv=m_nStartvX,m_nStartvY,m_nStartvZ,m_nStartvA; /初始速度long Speed=m_nSpeedX,m_nSpeedY,m_nSpeedZ,m_nSpeedA; /驱动速度long Add=m_nAddX,m_nAddY,m_nAddZ,m_nAddA; /加速度long Pulse=m_nPulseX,m_nPulseY,m_nPulseZ,m_nPulseA; /轴的驱动脉冲数 /*两轴插补*/if(m_bX & m_bY & !m_bZ & !m_bA) /XY两轴插补g_CtrlCard.Setup_Speed(1, Startv0, Speed0, Add0);g_CtrlCard.Interp_Move2(1, 2, Pulse0, Pulse1);else if(m_bX & !m_bY & m_bZ & !m_bA) /XZ两轴插补g_CtrlCard.Setup_Speed(1, Startv0, Speed0, Add0);g_CtrlCard.Interp_Move2(1, 3, Pulse0, Pulse2);else if(m_bX & !m_bY & !m_bZ & m_bA) /XW两轴插补g_CtrlCard.Setup_Speed(1, Startv0, Speed0, Add0);g_CtrlCard.Interp_Move2(1, 4, Pulse0, Pulse3);else if(!m_bX & m_bY & m_bZ & !m_bA) /YZ两轴插补g_CtrlCard.Setup_Speed(2, Startv1, Speed1, Add1);g_CtrlCard.Interp_Move2(2, 3, Pulse1, Pulse2);else if(!m_bX & m_bY & !m_bZ & m_bA) /YW两轴插补g_CtrlCard.Setup_Speed(2, Startv1, Speed1, Add1);g_CtrlCard.Interp_Move2(2, 4, Pulse1, Pulse3);else if(!m_bX & !m_bY & m_bZ & m_bA) /ZW两轴插补g_CtrlCard.Setup_Speed(3, Startv2, Speed2, Add2);g_CtrlCard.Interp_Move2(3, 4, Pulse2, Pulse3); /*三轴插补*/else if(m_bX & m_bY & m_bZ & !m_bA) /XYZ三轴插补g_CtrlCard.Setup_Speed(1, Startv0, Speed0, Add0);g_CtrlCard.Interp_Move3(1, 2, 3, Pulse0, Pulse1, Pulse2);else if(m_bX & m_bY & m_bZ & !m_bA) /XYZ三轴插补g_CtrlCard.Setup_Speed(1, Startv0, Speed0, Add0);g_CtrlCard.Interp_Move3(1, 2, 3, Pulse0, Pulse1, Pulse2);else if(m_bX & m_bY & !m_bZ & m_bA) /XYW三轴插补g_CtrlCard.Setup_Speed(1, Startv0, Speed0, Add0);g_CtrlCard.Interp_Move3(1, 2, 4, Pulse0, Pulse1, Pulse3);else if(m_bX & !m_bY & m_bZ & m_bA) /XZW三轴插补g_CtrlCard.Setup_Speed(1, Startv0, Speed0, Add0);g_CtrlCard.Interp_Move3(1, 3, 4, Pulse0, Pulse2, Pulse3);else if(!m_bX & m_bY & m_bZ & m_bA) /YZW三轴插补g_CtrlCard.Setup_Speed(2, Startv1, Speed1, Add1);g_CtrlCard.Interp_Move3(2, 3, 4, Pulse1, Pulse2, Pulse3); /*四轴插补*/else if(m_bX & m_bY & m_bZ & m_bA) /XYZW四轴插补g_CtrlCard.Setup_Speed(1, Startv0, Speed0, Add0);g_CtrlCard.Interp_Move4(Pulse0, Pulse1, Pulse2, Pulse3);elseMessageBox(请选择插补轴!,提示);2.4 监控模块监控模块用于实时获取所有轴的驱动信息 ,显示运动信息 ,同时控制在驱动进行过程中 ,不允许发出新的驱动指令。监控模块利用定时器消息完成 ,代码如下:/*实时获取状态*/ 获取逻辑位置、实际位置、运行速度和驱动状态 / 读取正负限位、stop0 /*/void CVCExampleDlg:OnTimer(UINT nIDEvent) long log=0,act=0,spd=0;UINT nID1=IDC_POS_LOGX,IDC_POS_LOGY,IDC_POS_LOGZ,IDC_POS_LOGW;UINT nID2=IDC_POS_ACTX,IDC_POS_ACTY,IDC_POS_ACTZ,IDC_POS_ACTW;UINT nID3=IDC_RUNSPEED_X,IDC_RUNSPEED_Y,IDC_RUNSPEED_Z,IDC_RUNSPEED_W;CStatic *lbl;CString str;int status4;for (int i=1; iSetWindowText(str); /*显示实际位置*/lbl=(CStatic*)GetDlgItem(nID2i-1);str.Format(%ld,act);lbl-SetWindowText(str);/*显示运行速度*/lbl=(CStatic*)GetDlgItem(nID3i-1); /无倍率设定 ,实际速度获取的值str.Format(%ld,spd);lbl-SetWindowText(str);/*获取驱动状态*/g_CtrlCard.Get_Status(i,statusi-1,0); /*信号检测* / X轴STOP0 0 Y轴STOP0 1 / Z轴STOP0 2 A轴STOP0 3 / x轴正限位-4 x轴负限位5 / Y轴正限位-4 Y轴负限位5 / Z轴正限位-8 Z轴负限位9 / A轴正限位-10 A轴负限位11 /*UINT nIDIN1= IDC_STOP0_X,IDC_STOP0_Y, /X,Y原点 IDC_STOP0_Z,IDC_STOP0_W, /Z,A原点 IDC_LIMIT_X,IDC_LIMIT_X2, /X轴正负限位IDC_LIMIT_Y,IDC_LIMIT_Y2, /Y轴正负限位IDC_LIMIT_Z,IDC_LIMIT_Z2, /Z轴正负限位IDC_LIMIT_W,ID

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论