欢迎来到广州研为官方频道!我们将在频道中不断更新运动控制案例讲解、小型项目代码讲解、运动控制知识科普、机器视觉知识科普等内容,只为与您一起交流分享运动控制的那些事。
目录
本文篇幅较长,各位可按需求跳转观看
文章简介
本文将通过介绍插补运动常见原理,以模拟实操的方式由浅入深的教学如何使用运动控制卡进行插补运动。当然,本文的模拟实操所涉及的所有资源都是免费的,并且无论是否拥有实体控制卡都能够与我们一起进行模拟操作。
本文示例将涉及的实例有:
1.【体验】使用软件生成轨迹点,控制电机进行插补运动,通过示波器观察运动轨迹
2.【入门】使用C++代码进行插补运动,并通过监控器,示波器进行观察
3.【进阶】观察案例并尝试重现:视觉辅助零件轮廓加工
OK!接下来进入正题,感兴趣的同学可按需求跳转观看
1. 常见插补原理
在数控机床中,刀具地运动轨迹是折线,刀具并不能严格沿着加工轨迹进行运动,只能通过折现轨迹逼近需要加工的曲线。
机床的数控系统依照一定方法确定刀具运动轨迹的过程称为插补。简单来说,插补就是在一个线段的起点和终点之间进行“数据密化”的操作。
从插补的计算方法分类,插补主要分为:基准脉冲插补,数据采样插补。在两类方法中我们分别选择一种方法进行简要介绍:逐点比较法,数据采样插补法。
1.1 基准脉冲插补:逐点比较法
基准脉冲插补的特点是每次插补结束只产生一个行程增量,以脉冲的形式输出给伺服电机,适用于以步进电机为驱动电机的开环数控系统,以及特定的经济型数控系统。这类方法运算速度较快,主要用于一些中等精度或中等速度要求的控制。
逐点比较法进行直线插补
在直线插补时,通过把工具中心的实际位置与给定轨迹的理想位置之间的误差以偏差的形式计算出来,然后根据偏差的方向决定下一步行动方向。
例如:在XOY平面中有一线AB段需要进行加工,工具的加工点P将使用逐点比较法,使运动轨迹逼近线段AB,并在B点停下。
加工点P因为只能以折线方式运动(即沿X/Y方向运动),所以我们可以模拟出点P的运动轨迹并总结运动规律:在有限步数下,点P通过判断当前位置与加工直线位置的偏差,规划下一步运动方向,以折线的轨迹逼近加工直线。
1.2 数据采样插补法
在使用高性能直流伺服电动机和交流伺服电动机等执行机构进行控制时,对于闭环与半闭环控制的系统,脉冲当量(一个脉冲使电机移动的距离)较小。若使用基准脉冲插补,计算所执行的指令约有20条(约40us),且在产生脉冲的期间计算机无法执行其他任务,因此基准脉冲插补对此情况并不适用,需要使用数据采样插补执行操作。
数据采样插补实际是一种时间分割法。根据程序指定的进给速度,将工件轮廓曲线分割为一定时间(一个插补周期)内的一条微小直线(进给量),即通过一系列微小线段逼近轮廓。
数据采样插补一般分为两个步骤:
- 粗插补:计算出一个插补周期内各坐标位置的增量值
- 精插补:对粗插补输出的位置增量及逆行基准脉冲插补
在一个插补周期内,计算机除了完成插补运算外还需要实时完成其他工作,因此插补周期必须大于插补运算时间 + 其他实时任务时间之和。一般为8~10ms。
2. 使用软件生成轨迹点,控制电机进行插补运动
在大致了解插补运动的原理后,我们通过可以通过软件执行一次插补运动:使用插补运动画正弦轨迹。进行操作前,需要准备以下东西,所有资料可在广州研为官网下载。
- 控制卡驱动安装
- 运动控制卡快速测试软件
- 运动控制卡或控制卡模拟器
2.1 插补运动使用步骤
(0)控制卡驱动安装(仅新设备需要进行配置)
(1)打开控制卡对应的功能测试软件,连接控制卡
(2)打开配置页面 -- 选择默认配置
(3)打开监控信息页面 -- 保留监控信息窗口
(4)打开直线插补功能页面 -- 选择生成正弦轨迹,使用默认参数 -- 点击启动直线插补
(5)在监控页面可观察轴位置变动情况
2.2 使用辅助软件查看轴运动轨迹
(1)打开辅助软件示波器 -- 连接控制卡
(2)启动示波器获取电机运动轨迹
(3)停止获取运动轨迹并再次启动示波器,可清空已有轨迹
3. 使用C++代码实现插补运动
关于使用控制卡函数库需要进行的项目配置可参考控制卡配套资料,此处不做说明。使用控制卡执行插补操作一共需要执行以下步骤:
- 打开控制卡
- 配置控制卡参数
- 插补参数设置与执行
3.1 连接控制卡并配置参数
控制卡控制轴运动,至少需要配置以下几个参数:
- 对轴进行运动的标志位进行置一
- 轴速度/加速度极限
- 轴加减速度
- 轴的规划速度
当然,在实际操作中关于轴的参数配置不仅有以上几点,配置的参数在类别上可分为:
- 轴控制
- 轴错误处理
- 开关量输入输出
- 极限设置
- 运动设置
这里以使用IMC4系列控制卡进行连接并单轴配置举例,参数配置代码如下
//此处只定义了一个控制卡句柄,由PKG_IMC_Open函数赋值
IMC_HANDLE g_handle = NULL;
//使用方法:在打开控制卡或者需要时调用ImcCfgDev函数
int ImcCfgDev()
{
int axis, ena, clr, st;
double vel, acc;
//设置急停输入的有效极性:0:急停输入开关导通有效; 非零:急停输入开关断开有效
st = PKG_IMC_SetEmstopPolar(g_handle, 0);
//设置插补轨迹加速度
acc = CmpImcPathAcc(1.000);
st = PKG_IMC_SetPFIFOaccel(g_handle, acc, SEL_PFIFO1);
st = PKG_IMC_SetPFIFOaccel(g_handle, acc, SEL_PFIFO2);
//---------------------------------------------------------------------
//配置轴0
axis = 0;
//清除轴状态
clr = 1;
if (clr != 0 ){
st = PKG_IMC_ClearAxis(g_handle, axis);
}
//设置脉冲宽度
st = PKG_IMC_SetPulWidth(g_handle, 3000, axis);
//设置脉冲模式及有效电平
st = PKG_IMC_SetPulMode(g_handle, 0, axis);
//设置脉冲有效电平
st = PKG_IMC_SetPulPolar(g_handle, 1, 1, axis);
//设置编码器反馈
st = PKG_IMC_SetEncpEna(g_handle, 0, axis);
//设置编码器反馈计数模式及方向
st = PKG_IMC_SetEncpMode(g_handle, 0, 0, axis);
//设置伺服报警
st = PKG_IMC_SetAlm(g_handle, 1, 1, axis);
//设置伺服到位
st = PKG_IMC_SetINP(g_handle, 0, 0, axis);
//设置硬件限位
st = PKG_IMC_Setlimit(g_handle, 1, 0, 1, 0, axis);
//设置平滑因子
st = PKG_IMC_SetSmooth(g_handle, 64, axis);
//设置加速度、速度的极限值
vel = CmpImcVel(32767.999, axis);
acc = CmpImcAcc(32767.999, axis);
st = PKG_IMC_SetVelAccLim(g_handle, vel, acc, axis);
//设置单轴的运动加速度
acc = CmpImcAcc(1.000, axis);
st = PKG_IMC_SetAccel(g_handle, acc, acc, axis);
//设置轴错误发生时,是否停止轴运动
st = PKG_IMC_SetStopfilt(g_handle, 0xFFF0, axis);
st = PKG_IMC_SetExitfilt(g_handle, 0, axis);
//设置使能
ena = 1;
st = PKG_IMC_SetEna(g_handle, ena, axis);
}
3.2 执行插补运动
控制卡可以对微小线段进行连续插补,常用于路径加工、切割等。iMC的连续插补具有强大且实用的功能,主要有以下特点:
- 支持多达两个插补空间(PFIFO1,PFIFO2)同时执行插补运动,即两组轴同时执行独立的插补运动;
- 每个插补空间均支持单个轴~全部轴连续直线插补,控制卡内部硬件插补运算,高速高精度;
- 支持任意两轴圆弧插补;
- 支持螺线线(圆弧+直线)插补;
- 支持两轴圆弧+若干轴线性插补,线性轴根据已走过的圆弧长度按比例推进;
- 支持海量微小线段连续插补;
- 直线段之间的衔接过渡采用三阶融合技术,减小小线段在过渡时刻的冲击;
- 可以在段(直线段或圆弧段)之间插入写参数指令、位操作指令、等待指令,灵活实现复杂的同步运动,如I/O与路径运动的同步等;
- 可以指定每段的运行速度和段末速度;
- 直线段可以选择基于合成路径来规划速度,也可以基于某轴的移动距离来规划速度;
- 可以实时改变速度比率,速度比率可以大于1,也可以小于1;
- 可以暂停插补运动,速度比率为0时即为暂停插补。
执行插补运动的步骤
以插补空间1为例:
- 开启(使能)插补空间:置startpath1非零。只有置startpath1非零后,PFIFO1中的指令才被解释执行;
- 把参与插补运动的轴号映射为坐标系中的轴,即把各个参与插补运 动的轴号依次写入segmap_x1、segmap_y1、…;
- 设置路径加速度pathacc1,以及各轴的绝对值标志参数pathabs1,若pathabs≠0,段数据中该轴的终点数据表示绝对坐标值,若pathabs=0, 则段数据中该轴的终点数据表示相对值,即相对于起始点的距离;
- 往PFIFO1加入段数据或其它指令(如写参数指令、等待指令等)。
执行插补运动的代码如下所示:
//包含控制卡函数所需的头文件
//需要将IMCnet4xxx.dll和IMC_PKG4xxx.dll文件复制到编译生成的exe文件目录下
#include "IMC_Def4xxx.h"
#include "ParamDef4xxx.h"
#include "IMC_Pkg4xxx.h"
#pragma comment(lib, "IMC_Pkg4xxx.lib")
//如果有多块控制卡连接到电脑,则每块卡都需要定义一个句柄
//此处只定义了一个控制卡句柄,由PKG_IMC_Open函数赋值
IMC_HANDLE g_handle = NULL;
//获取普通插补数据
int GetInterpData(int** data , int* num, int axisNum)
{
int i, axis, st;
int segnum = 10; //直线段的段数
int *d = new int[segnum * axisNum];
//用户可以通过此函数获取插补数据
//可以是以文件的方式保存的插补数据
//或者通过算法计算得到的插补数据
//得到的插补数据是用户单位时,需要转换为IMC单位
//注,此处只是示例,是直接赋值的插补数据
for( i=0; i < segnum; i++) {
for( axis=0; axis < axisNum; axis++){
//每段插补轴走到的位置,注这里的位置单位是IMC单位脉冲
d[axisNum * i + axis] = 100 * i;
}
}
*num = segnum * axisNum;
*data = d;
st = 1;
return st;
}
//使用方法:在线程中调用ImcInterp函数
int ImcInterp()
{
int i, num, axisNum, segnum, velAxisNum, userId, st, err;
int axis[16];
double acc, vel;
int *data = NULL;
//参与插补的轴号
axis[0] = 0;
axis[1] = 1;
axisNum = 2; //参与插补的轴数
velAxisNum = 0; //参与速度规划的轴数
acc = CmpImcPathAcc(5.000); //插补加速度
vel = CmpImcPathVel(10.000); //插补速度
//清空PFIFO中的插补数据(不一定要清,如果 FIFO中的数据还有用,则不能清。
//如果前一段加工程序是点插补模式,则必须清)
st = PKG_IMC_PFIFOclear(g_handle, SEL_PFIFO1);
for( i=0; i< axisNum; i++) {
//设置插补的数据是绝对位置
st = PKG_IMC_SetPathAbs(g_handle, 1, axis[i], SEL_IFIFO);
}
//设置插补模式
st = PKG_IMC_SetPathMode(g_handle, 0, 0, velAxisNum, SEL_PFIFO1);
//映射参与插补的轴号
st = PKG_IMC_AxisMap(g_handle, axis, axisNum, SEL_PFIFO1);
//启动PFIFO1的插补功能
st = PKG_IMC_PFIFOrun(g_handle, SEL_PFIFO1);
//获取插补数据
st = GetInterpData(&data, &num, axisNum);
segnum = num / axisNum; //插补段数
i = 0;
userId = 0;
while( i < segnum) {
//每段数据id,可通过读取id来确定执行到那一段
userId = userId + 1;
while( true) {
if( i < segnum - 1 ) {
st = PKG_IMC_AddLineWithVelUid(g_handle, userId, &data[i * axisNum], axisNum, vel, vel, 0, SEL_PFIFO1);
}else{
//最后一段的终点速度为0
st = PKG_IMC_AddLineWithVelUid(g_handle, userId, &data[i * axisNum], axisNum, vel, 0, 0, SEL_PFIFO1);
}
if( st == 0 ) {
err = PKG_IMC_GetFunErrCode();
if( err != IMC_FIFO_FULL ) {
//不是FIFO满,说明有错误发生,则退出发送数据
break;
}
}else{
//成功发送数据,则退出这个循环,继续发后续的数据
break;
}
}
if( st == 0 ) {
//失败,可以在此处增加错误处理代码
ImcFunErr();
break;
}
i = i + 1;
}
//等待运动结束
while (true) {
st = PKG_IMC_isPstop(g_handle, SEL_PFIFO1);
if( st != 0 ) {
//运动结束,退出等待
break;
}
}
if( data != NULL)
delete [] data;
return st;
}
3.3 使用MVC软件快速生成控制代码
在官网新发布了一款免费的关于运动控制与机器视觉融合的新编程平台,在平台中可以通过编辑模块参数快速生成对应代码,仅需复制代码到工程中即可进行快速开发。文中关于控制卡的所有操作都能够通过设置模块参数实现。
此外,关于机器视觉的处理功能也能在平台中找到对应的模块,并一键生成代码。
MVC软件介绍:运动控制与视觉融合平台,MVC软件介绍
更多控制卡的操作可进入主页查看,我们将不断更新教学内容。
4.插补示例讲解
插补运动的示例在MVC软件配套开发示例中可以找到,示例中结合了运动控制与视觉功能。通过示例演示展示使用MVC软件进行开发的效果。
关于示例的讲解可前往文章:运动控制与机器视觉融合案例介绍:轮廓提取与运动
总结
本文将通过介绍插补运动常见原理,以模拟实操的方式由浅入深的教学如何使用运动控制卡进行插补运动。本文的模拟实操所涉及的所有资源都是免费的,并且无论是否拥有实体控制卡都能够与我们一起进行模拟操作。
至此文章就以接近尾声,十分感谢大家观看,如果大家觉得文章有帮助不妨点赞收藏,你们的关注既是对我们最大的鼓励!
如果需要对机器视觉应用进行快速开发的同学,可以试着使用我们的编程平台通过设置模块参数,对代码一键生成。