技术频道

娓娓工业
您现在的位置: 中国传动网 > 技术频道 > 技术百科 > 运动控制器PSO视觉飞拍与精准输出的C++开发(三):二维/三维/多轴PSO输出

运动控制器PSO视觉飞拍与精准输出的C++开发(三):二维/三维/多轴PSO输出

时间:2023-03-10 14:34:53来源:深圳市正运动技术有限公司

导语:​本文主要介绍正运动技术EtherCAT控制器在VS平台采用C++语言实现的各种PSO功能。正运动提供多种PSO模式供用户搭配不同的场景使用。上节讲解了多轴PSO等距周期和固定时间周期两种比较输出模式,本节主要讲解二维三维比较输出模式。

  本文主要介绍正运动技术EtherCAT控制器在VS平台采用C++语言实现的各种PSO功能。正运动提供多种PSO模式供用户搭配不同的场景使用。上节讲解了多轴PSO等距周期和固定时间周期两种比较输出模式,本节主要讲解二维三维比较输出模式。

  01、硬件介绍

  ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。

运动控制器

  ZMC408CE支持8轴运动控制,最多可扩展至32轴,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随等功能。ZMC408CE支持8轴运动控制,可采用脉冲轴(带编码器反馈)或EtherCAT总线轴,通用IO包含24个输入口和16个输出口,部分IO为高速IO,EtherCAT最快100us的刷新周期。ZMC408CE支持8个通道的硬件比较输出、硬件定时器、运动中精准输出,还支持8通道PWM输出,对应的输出口为OUT0-7,支持8个通道同时触发硬件比较输出,用于多通道的视觉飞拍场合等。ZMC408CE支持PLC、Basic、HMI组态三种编程方式。PC上位机API编程支持C#、C++、LabVIEW、Matlab、Qt、Linux、VB.Net、Python等接口。

运动控制器

  ZMC408CE内置高精度PSO位置同步输出功能,在加工圆角与曲线时即使进行有减速调整,在高速加工的场合中也能控制激光输出的等间距输出。

  02、PSO技术介绍

  PSO(position synchronized output)即位置同步输出,本质是通过采集实时的编码器反馈位置(无编码器可使用输出的脉冲位置)与比较模式设定的位置进行比较,控制OP高速同步输出信号,PSO示意图如下。

运动控制器

  PSO一般与激光器(或点胶喷射阀等设备)同步输出信号进行相位同步,在运动轨迹的所有阶段以恒定的空间(或恒定时间)间隔触发输出开关,包括加速、减速和匀速段,从而实现脉冲能量均匀地作用在被加工物体上。PSO功能的特点是能高速且稳定的输出信号,因为输出精度足够高,所以能够在整个运动轨迹中以固定的距离触发输出信号而不用考虑总体速度,即在直线部分以很快的速度运动,而在圆角部分减速的同时也能保证输出间距恒定。通常圆角加工部分在整个加工过程中占有比较小的部分,这样在保证加工效果的同时,就可以最大限度地提高产能。

运动控制器

  正运动的PSO功能调用ZAux_Direct_HwPswitch2函数接口实现,该函数采用硬件实现IO的高速比较输出,响应速度达到微秒级别,故名硬件比较输出。

  03、C++语言MFC进行运动控制项目的开发

  1.新建MFC项目并添加函数库

  注:本例程在VS2010编译环境下,基于.NET Framework 4.0框架创建的MFC窗体应用程序。

  (1)工具栏菜单“文件”→“新建”→“项目”,启动创建项目向导。

运动控制器

  (2)选择开发语言为“Visual C++”和.NET Framework 4以及MFC应用程序,填写好程序名以及选择好程序存放路径,点击确定。

运动控制器

  (3)点击下一步。

运动控制器

  (4)选择类型为“基于对话框”,点击下一步或者完成即可。

运动控制器

  2.找到厂家提供的C++函数库文件

       (1)进入厂商提供的光盘资料,找到“8.PC函数”文件夹,并点击进入,找到C++函数库,路径如下(64位库为例)。

运动控制器

  (2)选择“函数库2.1”文件夹。

运动控制器

  (3)选择“Windows平台”文件夹。

运动控制器

  (4)根据需要选择对应的函数库,这里选择“64位库”。(5)解压C++压缩包,里面有C++对应的函数库。

运动控制器

  (6)函数库具体路径如下。

运动控制器

  (7)将厂商提供的C++库文件以及相关文件复制到新建的项目中。

运动控制器

  3.在项目中添加静态库和相关头文件静态库:zauxdll.lib, zmotion.lib相关头文件:zauxdll2.h, zmotion.h

       (1)先右击头文件,接着依次选择:“添加”→“现有项”。

运动控制器

  (2)在弹出的窗口中依次添加静态库和相关头文件。

运动控制器

  (3)声明用到的头文件和定义控制器连接句柄。

运动控制器

运动控制器

  至此,项目新建完成。

  4.查看PC函数手册

  用户需要从PC函数手册中获取运动控制开发使用的函数接口,对照手册说明使用,PC函数手册在光盘资料查看,具体路径如下:“光盘资料\8.PC函数\函数库2.1\ZMotion函数库编程手册V2.1.pdf”。

运动控制器

  5.控制器网口连接函数接口

  PC编程一般使用网口对控制器和工控机进行链接。ZAux_FastOpen();如果链接成功,该接口会返回一个链接句柄。通过操作这个链接句柄可以实现对控制器的控制。ZAux_OpenEth()接口说明:

运动控制器

  项目应用截图:

运动控制器

  6.硬件比较输出函数接口使用对下位机寄存器操作的指令操作链接句柄“g_handle”,对控制器进行寄存器内容取值,实时控制下位机相关的指令如下。实时全局变量指令:ZAux_Direct_HwPswitch2硬件比较输出指令到位置后硬件自动触发op输出信号。

运动控制器

  7.硬件定时器函数接口

  ZAux_Direct_HwTimer硬件定时器硬件比较输出后一段时间还原电平。

运动控制器

  04、MFC程序的运行和读写控制开发

  1.Demo交互界面如下

运动控制器

  2.二维比较模式

  (1)2D比较(模式25)

  语法:HW_PSWITCH2(25,opnum,opstate,maxerr,num,tablepos)mode 25:二维的比较模式;opnum:对应的输出口;

  opstate:第一个比较点的输出状态;

  maxerr:比较位置每个轴左右的脉冲偏差,进入偏差范围后开始比较,此参数不能写0;

  num:table里面存储的比较点坐标个数;

  tablepos:第一个比较点坐标所在table编号。

  说明:比较点写在TABLE中,两个连续的TABLE数据组成一个2D坐标,每到达一个比较位置OP反转一次。图中蓝色段表示OP开启,各类常用插补运动均支持比较,比较点坐标一定的要准确,否则会影响后面点的比较。

运动控制器

  该模式主要功能为,碰到设置好的二维比较点之后,输出口电平反转。

  该模式使用时需要指定高速输出口,将首个比较点的输出状态、比较轴设置好之后,再设置比较点(即设置table寄存器,点数量等),设置比较点脉冲最大误差等参数后,启动比较。紧接着驱动轴运动即可。脉冲偏差说明:2D模式下设置XY坐标需要准确,轴运动不到准确的TABLE比较点时将无法触发,3D模式同理。故多维比较模式引入一个特殊参数maxerr位置范围偏差,左右范围均有效,即实际位置坐标点与TABLE的比较点的差值在maxerr范围内便有效,触发时刻为当前位置进入比较点的触发范围内便触发比较,比较范围示意图如下。

运动控制器

  注意:maxerr的单位为脉冲数的偏差,不是距离的偏差。如下图所示,设置高速比较输出口为0,首个比较点的输出状态为1,比较轴为0,1;设置两个比较点,比较点坐标分别为:(100,50),(160,80)。即当轴运动到点(100,50)和点(160,80),误差范围在±50个脉冲左右的范围时,都会触发电平变化。

运动控制器

  示波器波形如图所示:在坐标(100,50)时输出为1,直到坐标(160,80)的时候恢复为0。

运动控制器

  (2)2D比较(模式26)

  语法:HW_PSWITCH2(26,opnum,opstate,maxerr,num,tablepos,[ophwtimeus,ophwtimes,hwcyctimeus])

  mode 26:二维的比较模式;opnum:对应的输出口;opstate:第一个比较点的输出状态;maxerr:比较位置每个轴左右的脉冲偏差,进入偏差范围后开始比较,此参数不能写0;num:table里面存储的比较点坐标个数;tablepos:第一个比较点坐标所在table编号;* 以下参数和HW_TIMER二选一,HW_TIMER单独写可以动态调整参数 *ophwtimeus:脉冲时间;ophwtimes:脉冲个数;hwcyctimeus:脉冲周期。说明:比较点写在TABLE中,两个连续的TABLE数据组成一个2D坐标,每到达一个比较位置触发OP,每个比较点OP反转的次数和反转周期由HW_TIMER设置;到达下一个TABLE位置,OP再次触发。类似模式7和模式36。

运动控制器

  该模式主要功能为,碰到设置好的二维比较点之后,输出口输出一断设置好的定时脉冲。该模式使用时,需要指定高速输出口,将首个比较点的输出状态、比较轴设置好之后,再设置比较点(即设置table寄存器,点数量等),设置好比较点之后再设置脉冲有效时间、脉冲周期时间,以及脉冲个数(重复次数),设置比较点的脉冲最大误差等参数后,启动比较。紧接着驱动轴运动即可。如下图所示,设置高速比较输出口为0,首个比较点的输出状态为1,比较轴为0,1;设置两个比较点,比较点坐标分别为:(100,100),(200,200)。即当轴运动到点(100,100),点(200,200),误差范围在±10个脉冲左右的范围时,都会触发两个周期为60ms,脉冲有效时间为20ms的脉冲。

运动控制器

  示波器波形如图所示:在坐标(100,100),(200,200)的时候都会触发两个周期为60ms,脉冲有效时间为20ms的脉冲。

运动控制器

  3.三维比较模式

  (1)3D比较(模式35)

  语法:HW_PSWITCH2(35,opnum,opstate,maxerr,num,tablepos)

  mode 35:三维的比较模式;opnum:对应的输出口;opstate:第一个比较点的输出状态;maxerr:比较位置每个轴左右的脉冲偏差,进入偏差范围后开始比较,此参数不能写0;num:table里面存储的比较点坐标个数;tablepos:第一个比较点坐标所在table编号;说明:比较点写在TABLE中,三个连续的TABLE数据组成一个3D坐标,每到达一个比较位置触发OP,每个比较点OP反转的次数和反转周期由HW_TIMER设置;到达下一个TABLE位置,OP再次触发。类似模式26和模式7。

运动控制器

  该模式主要功能为,碰到设置好的三维比较点之后,输出口电平反转。

  该模式使用时需要指定高速输出口,将首个比较点的输出状态、比较轴设置好之后,再设置比较点(即设置table寄存器,点数量等),设置比较点的脉冲最大误差等参数后,启动比较。紧接着驱动轴运动即可。如下图所示,设置高速比较输出口为0,首个比较点的输出状态为1,比较轴为0,1,2;设置4个比较点,比较点坐标分别为:(80,40,20),(160,80,40),(240,120,60),(320,160,80)。即当轴运动到点(80,40,20),(160,80,40),(240,120,60),(320,160,80),误差范围在±10个脉冲左右的范围时,都会触发电平变化。

运动控制器

  示波器波形如图所示:在坐标(80,40,20),(160,80,40),(240,120,60),(320,160,80)时会发生电平变化。

运动控制器

  核心程序示例:

  ·

  /*参数:mode 25, 26 ,35,36.2D/3D的比较模式Axisnum:轴数组Opnum :对应的输出口Opstate: 第一个比较点的输出状态.maxerr:比较位置每个轴左右的脉冲偏差, 进入偏差范围后开始比较.num :TABLE 里面存储的比较点个数.tablepos: 第一个比较点坐标所在 TABLE 编号与 hwtimer 并用时, 可以动态调整 hwtimer 参数.ModePara1:脉冲时间ModePara2:脉冲个数ModePara3:脉冲周期*/int32 CMyControlDlg:: ZAux_Direct_HwPswitch2_2D(ZMC_HANDLE handle, int *Axisnum,int Mode,int Opnum , int Opstate,int maxerr,int num, int tablepos, float ModePara1, float ModePara2,float ModePara3){ if(0 > Axisnum[0] || Axisnum[0] > MAX_AXIS_AUX) { return ERR_AUX_PARAERR; } char cmdbuff[2048]; char tempbuff[2048]; char cmdbuffAck[2048]; //生成命令 sprintf(cmdbuff, "BASE(%d,%d)\n", Axisnum[0], Axisnum[1]); switch(Mode) { case 25: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d)", Mode, Opnum, Opstate, maxerr,num,tablepos); strcat(cmdbuff, tempbuff); break; case 26: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d,%f,%f,%f)", Mode,Opnum, Opstate, maxerr,num,tablepos,ModePara1,ModePara2,ModePara3); strcat(cmdbuff, tempbuff); break; case 35: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d)", Mode, Opnum, Opstate, maxerr,num,tablepos); strcat(cmdbuff, tempbuff); break; case 36: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d,%f,%f,%f)", Mode,Opnum, Opstate, maxerr,num,tablepos,ModePara1,ModePara2,ModePara3); strcat(cmdbuff, tempbuff); break; default: return ERR_AUX_PARAERR; break; } //调用命令执行函数 int ret=ZAux_Execute(handle, cmdbuff, cmdbuffAck,2048); if (strlen(cmdbuffAck)!=0) return ERR_ACKERROR; return ret;}

  (2)3D比较(模式36)

  语法:HW_PSWITCH2(36,opnum,opstate,maxerr,num,tablepos, [ophwtimeus,ophwtimes,hwcyctimeus])mode 36:三维的比较模式;opnum:对应的输出口;opstate:第一个比较点的输出状态;maxerr:比较位置每个轴左右的脉冲偏差,进入偏差范围后开始比较,此参数不能写0;num:table里面存储的比较点坐标个数;tablepos:第一个比较点坐标所在table编号;* 以下参数和HW_TIMER二选一,HW_TIMER单独写可以动态调整参数 *ophwtimeus:脉冲时间;ophwtimes:脉冲个数;hwcyctimeus:脉冲周期。

运动控制器

  该模式主要功能为,碰到设置好的三维比较点之后,输出口输出一断设置好的定时脉冲。该模式使用时,需要指定高速输出口,将首个比较点的输出状态、比较轴设置好之后,再设置比较点(即设置table寄存器,点数量等),设置好比较点之后再设置脉冲有效时间,脉冲周期时间,以及脉冲个数(重复次数),设置比较点的脉冲最大误差等参数后,启动比较。紧接着驱动轴运动即可。如下图所示,设置高速比较输出口为0,首个比较点的输出状态为1,比较轴为0,1,2;设置4个比较点,比较点坐标分别为:(80,40,20),(160,80,40),(240,120,60),(320,160,80)。即当轴运动到点(80,40,20),(160,80,40),(240,120,60),(320,160,80),误差范围在±10个脉冲左右的范围时,都会触发电平变化。都会触发两个周期为40ms,脉冲有效时间为20ms的脉冲。

运动控制器

  示波器波形如图所示:在坐标(80,40,20),(160,80,40),(240,120,60),(320,160,80)时会触发两个周期为40ms,脉冲有效时间为20ms的脉冲。

运动控制器

  核心程序示例:

  ·

  /*参数:mode 25, 26 ,35,36.2D/3D的比较模式Axisnum:轴数组Opnum :对应的输出口Opstate: 第一个比较点的输出状态.maxerr:比较位置每个轴左右的脉冲偏差, 进入偏差范围后开始比较.num:TABLE 里面存储的比较点个数.tablepos: 第一个比较点坐标所在 TABLE 编号与 hwtimer 并用时, 可以动态调整 hwtimer 参数.ModePara1:脉冲时间ModePara2:脉冲个数ModePara3:脉冲周期*/int32 CMyControlDlg:: ZAux_Direct_HwPswitch2_2D(ZMC_HANDLE handle, int *Axisnum,int Mode,int Opnum , int Opstate,int maxerr,int num, int tablepos, float ModePara1, float ModePara2,float ModePara3){ if(0 > Axisnum[0] || Axisnum[0] > MAX_AXIS_AUX) { return ERR_AUX_PARAERR; } char cmdbuff[2048]; char tempbuff[2048]; char cmdbuffAck[2048]; //生成命令 sprintf(cmdbuff, "BASE(%d,%d)\n", Axisnum[0], Axisnum[1]); switch(Mode) { case 25: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d)", Mode, Opnum, Opstate, maxerr,num,tablepos); strcat(cmdbuff, tempbuff); break; case 26: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d,%f,%f,%f)", Mode,Opnum, Opstate, maxerr,num,tablepos,ModePara1,ModePara2,ModePara3); strcat(cmdbuff, tempbuff); break; case 35: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d)", Mode, Opnum, Opstate, maxerr,num,tablepos); strcat(cmdbuff, tempbuff); break; case 36: sprintf(tempbuff, "HW_PSWITCH2(%d,%d,%d,%d,%d,%d,%f,%f,%f)", Mode,Opnum, Opstate, maxerr,num,tablepos,ModePara1,ModePara2,ModePara3); strcat(cmdbuff, tempbuff); break; default: return ERR_AUX_PARAERR; break; } //调用命令执行函数 int ret=ZAux_Execute(handle, cmdbuff, cmdbuffAck,2048); if (strlen(cmdbuffAck)!=0) return ERR_ACKERROR; return ret;}

完整代码获取地址▼

运动控制器

  本次,正运动技术运动控制器PSO视觉飞拍与精准输出的C++开发(三):二维/三维/多轴PSO输出,就分享到这里。

  更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。

  本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

标签: EtherCAT运动控制器控制器

点赞

分享到:

上一篇:常见的温湿度变送器有哪几种?

下一篇:2023年十大机器人创新趋势

中国传动网版权与免责声明:凡本网注明[来源:中国传动网]的所有文字、图片、音视和视频文件,版权均为中国传动网(www.chuandong.com)独家所有。如需转载请与0755-82949061联系。任何媒体、网站或个人转载使用时须注明来源“中国传动网”,违反者本网将追究其法律责任。

本网转载并注明其他来源的稿件,均来自互联网或业内投稿人士,版权属于原版权人。转载请保留稿件来源及作者,禁止擅自篡改,违者自负版权法律责任。

网站简介|会员服务|联系方式|帮助信息|版权信息|网站地图|友情链接|法律支持|意见反馈|sitemap

中国传动网-工业自动化与智能制造的全媒体“互联网+”创新服务平台

网站客服服务咨询采购咨询媒体合作

Chuandong.com Copyright ©2005 - 2024 ,All Rights Reserved 版权所有 粤ICP备 14004826号 | 营业执照证书 | 不良信息举报中心 | 粤公网安备 44030402000946号