中国自动化学会专家咨询工作委员会指定宣传媒体
文摘详情
gkongbbs

步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2快速入门:二维螺距补偿(下)

http://www.gkong.com 2026-03-03 16:26 深圳市正运动技术有限公司

今天,正运动小助手以QT(C++)为例,为大家介绍如何通过上位机编程来启用ZMC432CL-V2的二维螺距补偿功能。

更多关于ZMC432CL-V2运动控制器的详情点击→步进控制的光栅尺全闭环解决方案:32轴EtherCAT总线运动控制器ZMC432CL-V2查看。

01  产品简介

ZMC432CL-V2高性能多轴运动控制器是一款兼容EtherCAT总线和脉冲型的独立式运动控制器,具备高速实时反馈功能,支持脉冲全闭环控制,能够实现高精度、高响应速度的运动控制。高精度定位,有效消除机械传动误差,满足高精密加工场景应用要求。

正运动ZMC432CL-V2高性能多轴运动控制器.webp

ZMC432CL-V2硬件功能:

  • 丰富的运动控制功能:支持直线、圆弧、空间圆弧、螺旋插补等。

  • 硬件接口丰富:支持脉冲轴(带编码器反馈)和EtherCAT总线轴,具备24路输入和12路输出的通用IO,部分为高速IO,2路模拟量输出(DA)。

  • EtherCAT刷新周期最快达250us,满足高速通信需求。

  • 支持4通道硬件比较输出、硬件定时器、运动中精准输出,适用于多通道视觉飞拍等场合。

  • 支持掉电检测、掉电存储,多种程序加密方式,能够有效防止系统故障,保护项目工程文件数据,并提高系统的可靠性。

  • 通过纯国产IDE开发环境RTSys进行项目开发,可实时仿真、在线跟踪以及诊断与调试,简便易用,支持多种高级上位机语言联合编程进行二次开发。

ZMC432CL-V2产品介绍视频请点击→步进控制的光栅尺全闭环解决方案:32轴EtherCAT总线运动控制器ZMC432CL-V2

02 硬件接口

正运动ZMC432CL-V2硬件接口.webp

正运动ZMC432CL-V2硬件接口说明.webp

03 硬件接线

1.数字量输入口IN接线

正运动ZMC432CL-V2运动控制器硬件接线1.webp

图1 输入口通用接线图

正运动ZMC432CL-V2运动控制器硬件接线1图2~1.webp

图2 输入口单端编码器接线图

2.数字量输出口接线

正运动ZMC432CL-V2运动控制器硬件接线2图3.webp

图3 输出口通用接线图

正运动ZMC432CL-V2运动控制器硬件接线2图4~1.webp

图4 输出口单端脉冲轴接线图

04 控制器开发

1.PC开发

支持以下语言进行开发,我们所有的开发语言和所有控制器提供的都是同一套API接口。

正运动控制器同一套API接口~1.webp

2.脱机开发

使用自主自研的IDE RTSys进行开发,支持Basic、梯形图开发。

正运动技术开发环境及工具.webp

05 二维螺距补偿应用场景

正运动运动控制器ZMC432CL-V2二维螺距补偿应用场景.webp

06 二维螺距补偿指令说明

/*************************************************************
Description:    //二维螺距补偿, 4系列特殊固件支持,该算法比较占CPU
Input:          //handle        句柄连接
Input:          //iaxisList     轴号列表
Input:          //iAxisNum      XY模式2个轴,XYY/XYX模式是3个轴
Input:          //iEnable       0- 关闭补偿,1- XY补偿 ,2- XYX补偿,3- XYY补偿
Input:          //StartPosX     起始补偿MPOS位置X,
Input:          //StartPosY     起始补偿MPOS位置Y,
Input:          //DisOneX       每个补偿点间距X,
Input:          //DisOneY       每个补偿点间距Y,
Input:          //maxpointX     补偿区间X方向总点数
Input:          //maxpointy     补偿区间Y方向总点数
Input:          //Tableindex    螺距补偿表存储的table位置,从StartPos下一个点开始存储,脉冲数单位, 每个点存储两个数据,表示X方向偏差值与Y方向偏差值. 先存储第一行(X方向), 再存储第二行.总共占用 maxpointx*maxpointy*2 个TABLE位置.
Input:          //pfDisancelist  区间补偿值列表
Output:         //
Return:         //错误码
*************************************************************/
int32  ZAux_Direct_Pitch2set(ZMC_HANDLE handle,int * iaxisList,int iAxisNum,int iEnable,float StartPosX,float StartPosY,float DisOneX ,float DisOneY ,uint32 maxpointX,uint32 maxpointY,uint32 Tableindex,float * pfDisancelist);

正运动二维螺距补偿指令使用的注意点:

1.必须先设置ATYPE,然后设置补偿;修改ATYPE时,必须先关闭补偿!

2.设置补偿时,轴要位于IDLE的停止状态!

3.开始补偿点的坐标填写的是轴的MPOS坐标!

4.带编码器反馈的轴类型,不同位置补多少个脉冲,是根据编码器位置确定脉冲补偿的个数的,所以一定要保证编码器的反馈是正确的!

5.机台断使能前,需先关掉二维螺距补偿功能,否则如果断使能的情况下机台有移动,会造成dpos跟mpos的数据对不上。

6.如下图假设开始补偿点是坐标系的原点,补偿间距分别是【DisX,DisY】补偿的点是【4*4】的话,螺距补偿表存储的点位数据就是以下【点1】到【点16】的位置下的补偿数据。

正运动二维螺距补偿指令注意点~1.webp

07 上位机编程验证效果

假设客户有一个激光切割机的机台需要使用二维螺距补偿指令来解决机台在不同位置受力不同【导致】机台形变不同【从而】导致的精度丢失问题。

步骤一:
以轴坐标【0,0】作为二维补偿的开始补偿的位置。

 

步骤二:
以轴坐标【40,40】作为第一个圆的圆心,然后以阵列的方式通过激光在板子是画出4行4列的16个圆,阵列X轴方向间距为40mm,Y轴方向间距为40mm,16个圆的大致位置如下:

07步骤二.webp

步骤三:
设置二维螺距补偿的【辅助参数】,并运动到【开始补偿点】的位置点击【教导编码器】,把当前编码器位置更新到【开始补偿点】的编码器原始值里面。

二位螺距补偿辅助参数.webp

步骤四:
通过视觉找出这16个圆的圆心的实际坐标,并把坐标填入到Ui界面的表格里面。

步骤四~1.webp

步骤五:
运动到各个补偿点验证效果,具体补偿效果如下:

步骤五1.webp

步骤五2.webp

步骤五3.webp


步骤六:
上位机编程详情。

①如何启用二维螺距补偿功能。

int TimeOut = 3000;
int TempI[AxisNum]={0,0};
int AxisList[AxisNum] = {AxisIdX,AxisIdY};
float PcTable[16*2];
//是否启用二维螺距补偿功能
if((0 == m_Enable)&&(ui->Enable->text() == "是"))
{
    //等待轴停止,轴停下来了才可以打开二维螺距补偿功能
    while (TimeOut>0) {
        ZAux_Direct_GetIfIdle(handle,MyAxisInfo[0].AxisId,&TempI[0]);
        ZAux_Direct_GetIfIdle(handle,MyAxisInfo[1].AxisId,&TempI[1]);
        if((TempI[0] != 0 ) &&(TempI[1] != 0))
        {
            break;
        }
        QThread::msleep(10);
        TimeOut = TimeOut -10;
    }
    if(TimeOut ==0)
    {
        qDebug()<<"等待轴停止时间超时!轴还未停止!";
        return;
    }
    int i=0,j=0;
    // 开始更新表格点位数据到PcTable数组
    for (int row = 0; row < ui->TableData->rowCount(); row++) {
        QTableWidgetItem *xItem = ui->TableData->item(row, 1); // X列(索引1)
        QTableWidgetItem *yItem = ui->TableData->item(row, 2); // Y列(索引2)
        if (xItem && yItem) {
            // 直接读取表格显示的文本值
            QString xText = xItem->text();  // 如 "40.003800"
            QString yText = yItem->text();  // 如 "40.008700"
            // 转换为浮点数
            bool xOk, yOk;
            float xValue = xText.toFloat(&xOk);
            float yValue = yText.toFloat(&yOk);
            if (xOk && yOk) {
                // 按原逻辑存储到PcTable数组
                PcTable[i] = xValue;
                i = i + 1;
                PcTable[i] = yValue;
                i = i + 1;
            } else {
                qDebug() << "错误: Row" << row << "数据转换失败"
                         << "X text:" << xText << "Y text:" << yText;
            }
        }
    }
   //开始更新补偿表的数据到TABLE数组
   for(i=0;iMaxPointY->text().toUInt();i++) //行
   {
       for(j=0;jMaxPointX->text().toUInt();j++) //列
       {
           PcTable[2*(i*4+j)] = ((1+j)*ui->DisX->text().toFloat()+ui->StartMposX->text().toFloat()-PcTable[2*(i*4+j)])* MyAxisInfo[0].Units;
           PcTable[2*(i*4+j)+1] = ((1+i)*ui->DisY->text().toFloat()+ui->StartMposY->text().toFloat()-PcTable[2*(i*4+j)+1])* MyAxisInfo[1].Units ;
       }
   }
   //启用二维螺距补偿功能
   /*************************************************************
   Description:    //二维螺距补偿, 4系列(VERSION_BUILD > 230511)特殊固件支持.  比较占CPU, 标准固件不支持.
   Input:          //handle 句柄连接
   Input:          //AxisList	  轴号列表
   Input:          //iEnable  0- 关闭补偿,  1- XY补偿,2- XYX补偿,3- XYY补偿
   Input:          //StartMposX  起始补偿MPOS位置X
,   Input:          //StartMposY  起始补偿MPOS位置Y,
   Input:          //DisX	 每个补偿点间距X,
   Input:          //DisY	 每个补偿点间距Y,
   Input:          //MaxPointX  补偿区间总点数
   Input:          //MaxPointY  补偿区间总点数
   Input:          //TableStartId   螺距补偿表存储的table位置,从startpos下一个点开始存储,脉冲数单位, 每个点存储两个数据,表示X方向偏差值与Y方向偏差值. 先存储第一行(X方向), 再存储第二行.总共占用 maxpointx*maxpointy*2 个TABLE位置.
   Input:          //PcTable  区间补偿值列表
   *************************************************************/
   ZAux_Direct_Pitch2set(handle,AxisList,2,1,ui->StartMposX->text().toFloat(),ui->StartMposY->text().toFloat(),
                         ui->DisX->text().toFloat() ,ui->DisY->text().toFloat(),
                         ui->MaxPointX->text().toUInt(),ui->MaxPointY->text().toUInt(),
                         ui->TableStartId->text().toUInt(),PcTable);   m_Enable=true;}

②定时器如何实时计算实际补偿数据到UI界面。

float TempDpos[AxisNum]={0,0};
float TempActuaPul[AxisNum]={0,0};
//理论上发的脉冲数
ZAux_Direct_GetDpos(handle,MyAxisInfo[0].AxisId,&TempDpos[0]);
TempDpos[0] = (TempDpos[0] - ui->StartMposX->text().toFloat() )*(MyAxisInfo[0].Units);
ZAux_Direct_GetDpos(handle,MyAxisInfo[1].AxisId,&TempDpos[1]);
TempDpos[1] = (TempDpos[1] - ui->StartMposY->text().toFloat() )*(MyAxisInfo[1].Units);
//实际上发的脉冲数
ZAux_Direct_GetEncoder(handle,MyAxisInfo[0].AxisId,&TempActuaPul[0]);
TempActuaPul[0] = (TempActuaPul[0] - ui->StrarEncoderX->text().toFloat());
ZAux_Direct_GetEncoder(handle,MyAxisInfo[1].AxisId,&TempActuaPul[1]);
TempActuaPul[1] = (TempActuaPul[1] - ui->StrarEncoderY->text().toFloat());
//实际上发的脉冲数 -理论上发的脉冲数 = 实际补偿的脉冲数  (除以脉冲当量后表示实际补偿的距离)
ui->CompenDataX->setText(QString("%1").arg((TempActuaPul[0]-TempDpos[0])/(MyAxisInfo[0].Units)));
ui->CompenDataY->setText(QString("%1").arg((TempActuaPul[1]-TempDpos[1])/(MyAxisInfo[1].Units)));完整代码获取地址

完整代码获取地址

代码.webp

本次,正运动技术步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2快速入门:二维螺距补偿(下),就分享到这里。

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

二维码.webp

正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。

版权所有 工控网 Copyright©2026 Gkong.com, All Rights Reserved