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

ZMC432CL-V2硬件功能:
-
丰富的运动控制功能:支持直线、圆弧、空间圆弧、螺旋插补等。
-
硬件接口丰富:支持脉冲轴(带编码器反馈)和EtherCAT总线轴,具备24路输入和12路输出的通用IO,部分为高速IO,2路模拟量输出(DA)。
-
EtherCAT刷新周期最快达250us,满足高速通信需求。
-
支持4通道硬件比较输出、硬件定时器、运动中精准输出,适用于多通道视觉飞拍等场合。
-
支持掉电检测、掉电存储,多种程序加密方式,能够有效防止系统故障,保护项目工程文件数据,并提高系统的可靠性。
-
通过纯国产IDE开发环境RTSys进行项目开发,可实时仿真、在线跟踪以及诊断与调试,简便易用,支持多种高级上位机语言联合编程进行二次开发。

ZMC432CL-V2产品介绍视频请点击→步进控制的光栅尺全闭环解决方案:32轴EtherCAT总线运动控制器ZMC432CL-V2
更多关于ZMC432CL-V2运动控制器的详情点击→步进控制的光栅尺全闭环解决方案:32轴EtherCAT总线运动控制器ZMC432CL-V2查看。
02
硬件接口


03 硬件接线
1.数字量输入口IN接线

图1 输入口通用接线图

图2 输入口单端编码器接线图
2.数字量输出口接线

图3 输出口通用接线图

图4 输出口单端脉冲轴接线图
04
控制器开发
1.PC开发
支持以下语言进行开发,我们所有的开发语言和所有控制器提供的都是同一套API接口。

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

05 补偿应用场景及功能说明
1.典型应用场景
在工业自动化领域,高精度运动控制是核心需求之一,以下场景对设备的定位精度和重复定位精度有着严苛要求:

CNC数控机床
精密零件加工、模具制造,要求加工精度达到微米级。
半导体封装设备
芯片贴装、引线键合,定位精度需控制在±1μm以内。
精密检测仪器
三坐标测量机、激光扫描仪,依赖准确的位置反馈。
3D打印设备
高精度工业级3D打印,保证层厚和尺寸精度。
电子制造设备
SMT贴片机、PCB钻孔机,实现微小元器件的精准贴装。
由于机械传动系统(如滚珠丝杠、齿轮齿条)不可避免地存在制造误差、安装误差以及长期使用后的磨损变形,会导致设备实际运动位置与指令位置产生偏差,严重影响加工和检测精度。螺距补偿和反向间隙补偿技术是解决这一问题经济且有效的手段。
2.核心功能介绍
一维螺距补偿
螺距误差是指滚珠丝杠在制造过程中,实际螺距与理论螺距之间的偏差,以及安装过程中产生的平行度、垂直度误差,还有运行过程中热变形引起的螺距变化。这些误差会随着运动距离的增加而累积,导致绝对定位精度下降。

正运动控制器的一维螺距补偿功能,通过预先测量运动轴全行程内各个位置的误差值,建立补偿表。当轴运动到对应位置时,控制器自动叠加相应的补偿脉冲,修正实际运动距离,从而显著提高设备的绝对定位精度。补偿精度可通过增加补偿点数进一步提升,补偿间距越小,精度越高。
反向间隙补偿
反向间隙是指当运动轴改变运动方向时,由于丝杠与螺母之间、齿轮之间存在间隙,电机已经转动了一定角度,但工作台并未立即产生位移的现象。反向间隙会导致设备在换向时出现定位误差和跟随误差,影响加工表面质量和重复定位精度。

控制器的反向间隙补偿功能,通过在运动方向改变时,预先发送一定数量的补偿脉冲,消除机械间隙,保证换向时的运动精度。补偿值可通过激光干涉仪或百分表精确测量后设置。
06 激光干涉仪测量螺距误差并生成补偿表
激光干涉仪是目前测量螺距误差精度最高的设备,可实现纳米级的位置测量。以下是完整的操作流程,使用本次实测数据进行演示。
1.激光干涉仪测量获取误差数据
获取正向补偿表数
① 搭建激光干涉仪测量系统,将反射镜固定在运动轴的工作台上,调整光路使激光束与运动轴平行。
② 控制器控制运动轴回零,同时手动将激光干涉仪清零。
③ 设置单步运动量为40mm,从0mm开始,每次寸动40mm后等待轴稳定,记录激光干涉仪的测量值。
④ 完成全行程(0-920mm)测量后,激光干涉仪软件导出误差数据表格,如下图所示:

获取反向补偿表数
① 在正向运动和反向运动过程中,相同坐标位置的螺距误差并非一致。在一些正反向运动都需要较高定位精度的应用场景,正向和反向需要使用不同的补偿表,此时我们还需要获取到反向补偿表的补偿数据。
② 在激光干涉仪软件中,设置双向测量模式。
③ 控制器控制轴从0mm正向运动到920mm,每次寸动40mm后等待轴稳定,记录激光干涉仪的测量值;再反向运动回0mm,每次寸动40mm后等待轴稳定,记录激光干涉仪的测量值,此时记录的就是反向运动的误差。
④ 完成全行程(0-920mm)测量后,激光干涉仪软件导出包含正向和反向平均误差的Excel表格。
①虽然测量反向补偿值时是从920mm运动到0mm的负向运动,但在反向补偿表里,也是按照从0-920mm的顺序补偿脉冲数,补偿数据方向与正向补偿方向一致。
②反向补偿表不是必须的,在只对正向运动有要求的应用场景,只需要获得正向补偿数据。
2.计算补偿脉冲数
激光干涉仪的误差单位为um,假设机台运动1um需要2个脉冲。
补偿脉冲数计算公式为:
?补偿脉冲数 = -2 × 平均误差(μm)
根据上述公式计算得到各点的补偿脉冲数。
正向补偿数据:

反向补偿数据:

3.数据格式转换
(1)将计算得到的补偿脉冲数列复制到Excel空白处,选择“粘贴值和数字格式”。
(2)选中粘贴后的数据,再次复制,选择“粘贴内容转置”,将列数据转换为行数据。
(3)将转置后的数据复制到记事本中,使用“编辑 - 替换”功能,将所有空格替换为英文逗号,最终得到补偿数据字符串。
?正向补偿表:
15.4,24.8,16.8,13.8,13.2,16.8,26.4,18.8,11.4,14.4,15.6,6,-2.2,-4.8,-9.8,-9.2,-10.8,-14.4,-13.2,-13.4,-14,-0.4,1
?反向补偿表:
16.2, 26.4, 18.0, 14.6, 14.0, 17.6, 28.0, 20.2, 12.4, 15.2, 16.4, 5.4, -1.6, -4.2, -9.0, -8.4, -10.2, -13.8, -12.6, -12.8, -13.4, -0.2, 1.4
07
通过Basic编程实现一维螺距补偿和反向间隙补偿
1.补偿指令说明
螺距补偿核心BASIC指令:


反向间隙补偿核心函数:

2.BASIC开启补偿步骤
一维螺距补偿
说明:正向运动和反向运动时都使用正向补偿表数据。
' 轴号:0轴
' 轴脉冲当量:2000pulse/mm
' 补偿间距:40mm
' 补偿点数:23点
' 正向补偿表起始位置:TABLE(100)
' 写入正向补偿表到TABLE(100)
TABLE(100, 15.4, 24.8, 16.8, 13.8, 13.2, 16.8, 26.4, 18.8, 11.4, 14.4, 15.6, 6, -2.2, -4.8, -9.8, -9.2, -10.8, -14.4, -13.2, -13.4, -14, -0.4, 1)
' 定义螺距补偿起点
global StartMPos
StartMPos = 0
' 初始化关闭补偿
PITCHSET(0,0,0,0,0,0,0,0) AXIS(0)
' 脉冲当量:2000脉冲对应1mm
BASE(0)
UNITS = 2000
' 确保轴IDLE再补偿
WAIT IDLE
' 使能正向螺距补偿
' 参数说明:PITCHSET(使能, 开始位置, 补偿间距, 补偿点数, 正向补偿表起始Table索引)AXIS(补偿轴的轴号)
PITCHSET(1, StartMPos, 40, 23, 100)AXIS(0)
一维螺距正反双向补偿
说明:正向运动和反向运动时使用不同的补偿表数据。
' 轴号:0轴
' 轴脉冲当量:2000pulse/mm
' 补偿间距:40mm
' 补偿点数:23点
' 正向补偿表起始位置:TABLE(100)
' 反向补偿表起始位置:TABLE(200)
' 写入正向补偿表到TABLE(100) TABLE(100, 15.4, 24.8, 16.8, 13.8, 13.2, 16.8, 26.4, 18.8, 11.4, 14.4, 15.6, 6, -2.2, -4.8, -9.8, -9.2, -10.8, -14.4, -13.2, -13.4, -14, -0.4, 1)
' 写入反向补偿表到TABLE(200) TABLE(200, 16.2, 26.4, 18.0, 14.6, 14.0, 17.6, 28.0, 20.2, 12.4, 15.2, 16.4, 5.4, -1.6, -4.2, -9.0, -8.4, -10.2, -13.8, -12.6, -12.8, -13.4, -0.2, 1.4)
' 定义螺距补偿起点
global StartMPos
StartMPos = 0
' 初始化关闭补偿
PITCHSET(0,0,0,0,0,0,0,0) AXIS(0)
' 脉冲当量:2000脉冲对应1mm
BASE(0)
UNITS = 2000
' 确保轴IDLE再补偿
WAIT IDLE
' 使能双向螺距补偿
' 参数说明:PITCHSET(使能, 开始位置, 补偿间距, 补偿点数, 正向补偿表起始Table索引, 反向补偿表起始Table索引)AXIS(补偿轴的轴号)
PITCHSET(1, StartMPos, 40, 23, 100, 200)AXIS(0)
反向间隙补偿
' 轴号:0轴
' 轴脉冲当量:2000pulse/mm
' 定义反向间隙补偿值(激光干涉仪或百分表实测值mm)
global Const BACKLASHSET = 0.18
' 初始化关闭补偿
BACKLASH(0) AXIS(0)
' 脉冲当量:2000脉冲对应1mm
BASE(0)
UNITS = 2000
' 使能反向间隙补偿
' 参数说明:BACKLASH(使能, 反向补偿距离, [(选填)反向间隙速度, 反向间隙加速度]) AXIS(补偿轴的轴号)
BACKLASH(1, BACKLASHSET) AXIS(0)
效果验证
测试说明:检测不同的补偿方式在轴按坐标(0,40,80,40,0)位置运动后的实际补偿数据。
测试程序:
'**********************************
'补偿效果验证'
**********************************
global testAxis,testMode
testAxis = 0
testMode = 0
'1. 关闭补偿
PitchTest(testAxis, 0)
'2. 回到补偿起点(此处假定为0,实际场景不一定为0)
BASE(testAxis)
MOVEABS(0)
WAIT IDLE
'3. 延时等待电机停稳,手动对齐规划位置DPOS和反馈位置MPOS,与补偿起点相等
DELAY(1500)
DPOS = 0
MPOS = 0
'4. 开启补偿
PitchTest(testAxis, testMode)
'5. 运动测试
MoveTest(testAxis,testMode,0)
MoveTest(testAxis,testMode,40)
MoveTest(testAxis,testMode,80)
MoveTest(testAxis,testMode,40)
MoveTest(testAxis,testMode, 0)
END
GLOBAL SUB MoveTest(AxisNum,RunMode,MovPos)
'运动测试补偿是否生效。等待脉冲到位,并延时等待电机停稳后,打印补偿数据
MOVEABS(MovPos)
WAIT IDLE
DELAY(1500)
IF RunMode=0 THEN
?"不开启补偿的轴当前位置:规划位置 = ",DPOS(AxisNum),"反馈位置 = ",MPOS(AxisNum),"编码器原始位置(脉冲单位) = ",ENCODER(AxisNum)
?"螺距补偿实际使能状态",PITCHSET AXIS(AxisNum),"轴实际补偿值",PITCH_DIST(AxisNum)
ELSEIF RunMode=1 THEN
?"开启正向螺距补偿的轴当前位置:规划位置 = ",DPOS(AxisNum),"反馈位置 = ",MPOS(AxisNum),"编码器原始位置(脉冲单位) = ",ENCODER(AxisNum)
?"螺距补偿实际使能状态",PITCHSET AXIS(AxisNum),"轴实际补偿值",PITCH_DIST(AxisNum) ELSEIF RunMode=2 THEN
?"开启双向螺距补偿的轴当前位置:规划位置 = ",DPOS(AxisNum),"反馈位置 = ",MPOS(AxisNum),"编码器原始位置(脉冲单位) = ",ENCODER(AxisNum)
?"螺距补偿实际使能状态",PITCHSET AXIS(AxisNum),"轴实际补偿值",PITCH_DIST(AxisNum) ELSEIF RunMode=3 THEN
?"开启反向间隙补偿的轴当前位置:规划位置 = ",DPOS(AxisNum),"反馈位置 = ",MPOS(AxisNum),"编码器原始位置(脉冲单位) = ",ENCODER(AxisNum)
ENDIF
?"不叠加补偿的反馈位置原始值:",MPOS_ORI(AxisNum)
?"叠加补偿后的反馈位置实际值",MPOS(AxisNum)
ENDSUB
测试结果:
不开启补偿

开启一维螺距正向补偿
前文中,激光干涉仪从0位开始每个40mm测试得到的正向补偿表数据为:
(15.4, 24.8, 16.8, 13.8, 13.2, 16.8, 26.4, 18.8, 11.4, 14.4, 15.6, 6, -2.2, -4.8, -9.8, -9.2, -10.8, -14.4, -13.2, -13.4, -14, -0.4, 1)
?正向运动到绝对坐标40mm处,需补偿15.4个脉冲,才能使机械位置移动40mm;
?正向运动到绝对坐标80mm处,需补偿24.8个脉冲,才能使机械位置移动80mm;
?反向运动到绝对坐标40mm处,由于正反共用同一个补偿表,因此也需要补偿15.4个脉冲,才能使机械位置回到距0位40mm处;
?反向返回零点,补偿表在0位不需要补偿,因此此处坐标与不开补偿时一致。
通过对比不开启补偿时的编码器原始位置,可以看到开启补偿后编码器多走了相应的脉冲数,补偿生效。因脉冲不能为小数,故补偿表中的小数部分无法补偿。

开启一维螺距正反双向补偿
前文中,激光干涉仪从0位开始每个40mm测试得到的反向补偿表数据为:
(16.2, 26.4, 18.0, 14.6, 14.0, 17.6, 28.0, 20.2, 12.4, 15.2, 16.4, 5.4, -1.6, -4.2, -9.0, -8.4, -10.2, -13.8, -12.6, -12.8, -13.4, -0.2, 1.4)
?正向运动时,使用正向补偿表数据,因此与开启正向补偿表时的效果一致。
?反向运动时,使用反向补偿表数据。在反向运动到40mm时,需要补偿16.2个脉冲,才能保证机械运动到距0位40mm处。观察下图,第4步从80运动到40时,编码器原始位置相比不开启补偿,多走了16个脉冲,补偿有效。

开启反向间隙补偿
反向间隙补偿可以通过激光干涉仪或百分表测试间隙长度,此处反向补偿假设0.18mm,轴的脉冲当量为2000pulse/mm,即反向间隙为360个脉冲。
初始状态,轴的反向间隙为0,此时轴从0走到40再到80mm处,都未补偿。
轴从80mm反向运动到40mm时,反向间隙补偿生效,编码器原始位置从160000走到79640,相比不开补偿时多走了360个脉冲,用于抵消机械间隙,保证机械能够走到距0位40mm处。
反向回到0位置时,编码器原始位置不在0而是-360个脉冲处,此时轴若再正向运动,运动方向反转,反向间隙补偿生效,会多走360个脉冲抵消编码器原始位置的-360。

08
通过C#编程实现一维螺距补偿和反向间隙补偿
1.补偿函数说明
螺距补偿核心C#函数
/// /// 设置轴的螺距补偿,扩展轴无效。
/// /// 句柄连接/// 轴号/// 是否启用补偿/// 起始补偿MPOS位置/// 补偿区间总点数/// 每个补偿点间距/// 补偿坐标值填入TABLE系统数组起始引导地址/// 区间补偿值列表/// [DllImport("zauxdll.dll", EntryPoint = "ZAux_Direct_Pitchset", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern Int32 ZAux_Direct_Pitchset(IntPtr handle,Int32 iaxis,Int32 iEnable,float StartPos,UInt32 maxpoint,float DisOne ,UInt32 TablNum,float [] pfDisancelist);
/// /// 设置轴的螺距双向补偿,扩展轴无效。
/// /// 句柄连接/// 轴号/// 是否启用补偿/// 起始补偿MPOS位置/// 补偿区间总点数/// 每个补偿点间距/// 正向补偿坐标值填入TABLE系统数组起始引导地址/// 正向区间补偿值列表/// 反向补偿坐标值填入TABLE系统数组起始引导地址/// 反向区间补偿值列表 补偿数据方向于正向方向一致/// [DllImport("zauxdll.dll", EntryPoint = "ZAux_Direct_Pitchset2", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern Int32 ZAux_Direct_Pitchset2(IntPtr handle,Int32 iaxis,Int32 iEnable,float StartPos,UInt32 maxpoint,float DisOne ,UInt32 TablNum,float [] pfDisancelist,UInt32 RevTablNum,float [] RevpfDisancelist);
/// /// 轴的螺距补偿状态读取,扩展轴无效。
/// /// 句柄连接/// 轴号/// 是否启用补偿 0关闭 -1开启/// 补偿距离/// [DllImport("zauxdll.dll", EntryPoint = "ZAux_Direct_GetPitchStatus", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 ZAux_Direct_GetPitchStatus(IntPtr handle,Int32 iaxis,ref Int32 IfEnable,ref float PitchDist);
反向间隙补偿核心C#函数
/// /// 反向间隙补偿
/// /// 连接句柄/// 轴号/// 距离/// 错误码[DllImport("zauxdll.dll", EntryPoint = "ZAux_Direct_Backlash", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 ZAux_Direct_Backlash(IntPtr handle, int iaxis, bool enable, float dist, float speed, float accel);
2.C#开启补偿步骤
一维螺距补偿
步骤一:
以0位作为螺距补偿开始补偿的位置。控制轴回到轴坐标【0】的位置,并将轴的规划位置DPOS和反馈位置MPOS清0。
步骤二:
通过控件设置补偿表和设置补偿参数。
设置完成后,通过运动按钮测试补偿效果,按钮响应函数调用ZAux_Direct_PitchSet函数设置螺距补偿下发给控制卡,此时补偿生效。
通过函数ZAux_Direct_GetPitchStatus获取函数当前实际补偿距离。

步骤三:
函数实现:
int iret = 0;
//设置螺距补偿
if (rd_PitchEnable.Enabled) //开启螺距补偿
{
//读取界面数据
float startpos = Convert.ToSingle(tb_StartPos.Text);
float disone = Convert.ToSingle(tb_Disone.Text);
uint tablestart = Convert.ToUInt32(tb_TableStart.Text);
uint tablereverse = Convert.ToUInt32(tb_TableReverse.Text);
uint posnum = (uint)PitchValue.Rows.Count - 1;
uint posnumre = (uint)PitchValueRe.Rows.Count - 1;
if (posnum > 0) //正向螺距补偿表有数据
{
float[] pitchvalue = new float[posnum];
for (int i = 0; i < posnum; i++)
pitchvalue[i] = Convert.ToSingle(PitchValue.Rows[i].Cells["位置"].Value);
if (posnumre > 0) //双向螺距补偿
{
if (posnum == posnumre)
{
float[] pitchvaluere = new float[posnumre];
for (int i = 0; i < posnumre; i++)
pitchvaluere[i] = Convert.ToSingle(PitchValueRe.Rows[i].Cells["位置"].Value);
iret = zmcaux.ZAux_Direct_Pitchset2(g_handle, m_AxisNum_X, 1, startpos, posnum, disone, tablestart, pitchvalue, tablereverse, pitchvaluere);
}
else
{
MessageBox.Show("双向表数据长度不一致!", "提示");
return;
}
}
else //单向螺距补偿
{
iret = zmcaux.ZAux_Direct_Pitchset(g_handle, m_AxisNum_X, 1, startpos, posnum, disone, tablestart, pitchvalue);
}
}
else
{
MessageBox.Show("正向补偿表无数据!", "提示");
return;
}
}
else
{
//关闭螺距补偿
iret = zmcaux.ZAux_Direct_Pitchset(g_handle, m_AxisNum_X, 0, 0, 0, 0, 0, new float[] { 0 });
}
反向间隙补偿
步骤一:
通过控件设置补偿表和设置补偿参数。
设置完成后,通过运动按钮测试补偿效果,按钮响应函数调用ZAux_Direct_Backlash函数设置反向间隙补偿下发给控制卡,此时补偿生效。

步骤二:
函数实现:
//设置反向间隙补偿
if (rd_BackLashEnable.Enabled) //开启反向间隙补偿
{
float dis = Convert.ToSingle(tb_BackLashDis.Text);
float sp = Convert.ToSingle(tb_BackLashSp.Text);
float acc = Convert.ToSingle(tb_BackLashAcc.Text);
iret = zmcaux.ZAux_Direct_Backlash(g_handle, m_AxisNum_X, true, dis, sp, acc);
}
else
{
iret = zmcaux.ZAux_Direct_Backlash(g_handle, m_AxisNum_X, false, 0, 0, 0);
}
完整代码获取地址
▼

本次,正运动技术步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2快速入门:一维螺距补偿和反向间隙补偿,就分享到这里。
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。

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