正运动控制器Zbasic回零详细教程(带Z信号)
正运动Zbasic带Z信号回零详细教程
📋 目录
- Z信号回零基础概念
- Z信号硬件连接要求
- Z信号回零模式详解
- Z信号回零参数配置
- Z信号回零编程实现
- Z信号回零完整示例
- Z信号回零故障排除
- Z信号回零最佳实践
🎯 Z信号回零基础概念
什么是Z信号回零?
Z信号回零是利用编码器的Z相信号(索引脉冲)进行高精度原点定位的回零方式。Z信号是编码器每转一圈产生一个脉冲的索引信号,具有极高的重复定位精度,是精密定位应用的首选回零方式。
Z信号回零的优势
- 超高精度:定位精度可达±0.25个编码器脉冲
- 重复性好:每次回零都能回到完全相同的位置
- 不受磨损影响:不依赖机械开关,无接触磨损
- 适合高速:可以在较高速度下进行精确定位
- 长期稳定:不会因为机械磨损而影响精度
为什么需要回零?
- 建立坐标系:确定运动的起始参考点
- 消除累积误差:清除断电或异常导致的位置偏差
- 保证精度:为后续精确运动奠定基础
- 安全要求:确保设备在已知位置启动
回零的基本原理
- 快速寻找:以较高速度(SPEED)向原点方向运动
- 碰到原点开关:检测到原点信号后开始减速
- 精确定位:以较低速度(CREEP)进行精确定位
- 位置清零:将当前位置设为坐标原点(DPOS=0)
🔌 Z信号硬件连接要求
Z信号回零必需的硬件信号
1. 带Z信号的编码器(必需)
- A相信号:连接到控制器编码器输入的A相端子
- B相信号:连接到控制器编码器输入的B相端子
- Z相信号:连接到控制器编码器输入的Z相端子(关键)
- 电源:编码器供电(通常5V或24V)
- 屏蔽:使用屏蔽电缆,屏蔽层接地
重要说明:Z信号回零必须使用带Z相输出的编码器,普通AB相编码器无法实现Z信号回零。
2. 原点开关(模式5/6需要)
- 作用:配合Z信号实现更高精度的回零
- 连接:通过
DATUM_IN
指令映射到输入口 - 类型:接近开关、光电开关或微动开关
3. 限位开关(安全保护)
- 正向限位:通过
FWD_IN
指令映射 - 负向限位:通过
REV_IN
指令映射 - 作用:防止轴运动超出安全范围,Z信号回零时提供安全保护
3. 信号电平说明(重要)
根据正运动官方手册,不同控制器系列的信号触发方式不同:
ZMC系列控制器:
- 触发方式:0触发有效
- 信号状态:输入为OFF状态时,表示到达原点/限位
- 常开信号:需要采用INVERT_IN反转电平
- 常闭信号:不需要反转
ECI系列控制器:
- 触发方式:1触发有效
- 信号状态:输入为ON状态时,表示到达原点/限位
- 常开信号:不需要反转
- 常闭信号:需要采用INVERT_IN反转电平
- 信号反转:使用
INVERT_IN
指令调整信号极性
典型硬件连接图
控制器输入端口 | 传感器类型 | 连接说明
IN8 | X轴原点开关 | DATUM_IN = 8
IN9 | Y轴原点开关 | DATUM_IN = 9
IN10 | Z轴原点开关 | DATUM_IN = 10
IN11 | X轴正限位 | FWD_IN = 11
IN12 | X轴负限位 | REV_IN = 12
📊 Z信号回零模式详解
Z信号回零专用模式
根据正运动官方手册,Z信号回零必须配置为ATYPE=4或7,支持以下专用模式:
模式 | 官方描述 | 运动过程 | 精度等级 | 适用场景 |
---|---|---|---|---|
模式1 | Z信号正向回零 | CREEP正向→Z信号→停止 | ⭐⭐⭐⭐ | 编码器Z信号稳定,直接寻找 |
模式2 | Z信号负向回零 | CREEP负向→Z信号→停止 | ⭐⭐⭐⭐ | 编码器Z信号稳定,反向寻找 |
模式5 | 原点+Z信号正向 | SPEED正向→原点→CREEP反向→离开→CREEP反向→Z信号 | ⭐⭐⭐⭐⭐ | 最高精度,推荐使用 |
模式6 | 原点+Z信号负向 | SPEED负向→原点→CREEP正向→离开→CREEP正向→Z信号 | ⭐⭐⭐⭐⭐ | 最高精度,反向回零 |
Z信号回零模式选择指南
模式1/2:直接Z信号回零
- 优点:速度快,流程简单
- 缺点:需要确保Z信号位置在安全范围内
- 适用:编码器Z信号位置已知且稳定的场合
模式5/6:原点开关+Z信号回零(推荐)
- 优点:精度最高,安全性好
- 缺点:流程较复杂,时间稍长
- 适用:高精度定位要求的精密设备
Z信号回零关键要求
1. ATYPE配置要求(必须)
根据官方手册,Z信号回零必须配置为带Z信号的ATYPE:
- ATYPE = 4:脉冲方向输出+正交编码器输入(推荐)
- ATYPE = 7:模拟量输出+正交编码器输入
2. 编码器要求
- 必须带Z信号:编码器必须有Z相输出
- Z信号质量:Z信号必须稳定可靠,无抖动
- 信号连接:Z信号必须正确连接到控制器Z相输入端子
3. Z信号回零精度优势
- 模式1/2精度:±1个编码器脉冲
- 模式5/6精度:±0.25个编码器脉冲(最高精度)
- 重复性:每次回零位置完全一致
4. 4系列控制器特殊功能
- 模式101/102:对应模式1/2的自动清零MPOS版本
- 模式105/106:对应模式5/6的自动清零MPOS版本
模式1详细说明(直接Z信号回零)
根据官方手册,模式1的完整运动过程:
运动过程:
1. 轴以CREEP速度正向运行直到Z信号出现
2. 碰到限位开关会直接停止
3. DPOS值重置为0同时纠正MPOS适用场景:
- 编码器Z信号位置已知且在安全范围内
- 需要快速回零的场合
- Z信号质量稳定可靠安全保护:
- 碰到限位开关会直接停止
模式5详细说明(原点+Z信号回零,推荐)
根据官方手册,模式5是精度最高的Z信号回零方式:
运动过程:
1. 轴以SPEED速度正向运行,直到碰到原点开关
2. 然后轴以CREEP速度反向运动直到离开原点开关
3. 然后再继续以爬行速度反转直到碰到Z信号
4. DPOS值重置为0同时纠正MPOS精度优势:
- 结合了原点开关的粗定位和Z信号的精定位
- 定位精度可达±0.25个编码器脉冲
- 重复定位精度极高安全保护:
- 碰到限位开关会直接停止
- 先找到原点开关确保安全范围
⚙️ Z信号回零参数配置
Z信号回零基本轴参数
ATYPE轴类型设置(必须正确)
Z信号回零的核心要求:必须配置为带Z信号的ATYPE类型
BASE(0) ' 选择轴号' Z信号回零必须的轴类型设置
ATYPE = 4 ' 脉冲方向输出+正交编码器输入(推荐)
' 或者
ATYPE = 7 ' 模拟量输出+正交编码器输入UNITS = 1000 ' 脉冲当量:每单位脉冲数(建议1000以上)
SPEED = 100 ' 回零速度(units/s)
CREEP = 10 ' 爬行速度(units/s,Z信号寻找速度)
ACCEL = 1000 ' 加速度(units/s²)
DECEL = 1000 ' 减速度(units/s²)
HOMEWAIT = 20 ' 反找等待时间(ms)
Z信号回零ATYPE说明:
- ATYPE = 4:适用于步进电机+编码器或伺服脉冲控制+编码器反馈
- ATYPE = 7:适用于伺服模拟量控制+编码器反馈
- 其他ATYPE:无法实现Z信号回零功能
Z信号回零速度参数优化
- SPEED:不宜过快,建议50-200 units/s
- CREEP:Z信号寻找速度,建议5-20 units/s,越慢精度越高
- UNITS:建议设置较大值(1000以上),提高分辨率
Z信号回零信号映射配置
模式1/2(直接Z信号回零)配置
直接Z信号回零不需要原点开关,只需要配置限位保护:
' 限位信号映射(安全保护)
FWD_IN = 11 ' 正向限位连接到IN11
REV_IN = 12 ' 负向限位连接到IN12' ZMC系列控制器信号反转
INVERT_IN(11, ON) ' 常开限位信号反转
INVERT_IN(12, ON)' ECI系列控制器
' 常闭信号才需要反转
模式5/6(原点+Z信号回零)配置
需要配置原点开关和限位开关:
ZMC系列控制器(0触发有效)
' 原点信号映射
DATUM_IN = 8 ' 原点开关连接到IN8
INVERT_IN(8, ON) ' 常开信号需要反转(ZMC系列OFF有效)' 限位信号映射
FWD_IN = 11 ' 正向限位连接到IN11
REV_IN = 12 ' 负向限位连接到IN12
INVERT_IN(11, ON) ' 常开限位信号反转
INVERT_IN(12, ON)
ECI系列控制器(1触发有效)
' 原点信号映射
DATUM_IN = 8 ' 原点开关连接到IN8
' INVERT_IN(8, ON) ' 常闭信号需要反转(ECI系列ON有效)' 限位信号映射
FWD_IN = 11 ' 正向限位连接到IN11
REV_IN = 12 ' 负向限位连接到IN12
' 常闭信号才需要反转
Z信号回零信号要求:
- Z信号:由编码器硬件连接提供,无需软件配置
- 原点开关:模式5/6需要,用于粗定位
- 限位开关:所有模式都建议配置,提供安全保护
参数选择建议
- SPEED:根据机械结构选择,一般50-500 units/s
- CREEP:SPEED的1/5到1/10,保证精度
- HOMEWAIT:脉冲轴建议20ms,总线轴可更短
- 信号反转:根据传感器类型和控制器型号确定
💻 Z信号回零编程实现
步骤1:Z信号回零系统初始化
GLOBAL SUB ZSignalHomeInit()' Z信号回零轴参数设置BASE(0)ATYPE = 4 ' 必须:脉冲+编码器(Z信号回零要求)UNITS = 1000 ' 脉冲当量(建议1000以上)SPEED = 100 ' 回零速度(不宜过快)CREEP = 10 ' 爬行速度(Z信号寻找速度)ACCEL = 1000 ' 加速度DECEL = 1000 ' 减速度HOMEWAIT = 20 ' 反找等待时间' 信号映射(模式5/6需要原点开关)DATUM_IN = 8 ' 原点开关(模式5/6使用)FWD_IN = 11 ' 正向限位(安全保护)REV_IN = 12 ' 负向限位(安全保护)' 信号反转(ZMC系列)INVERT_IN(8, ON) ' 原点开关信号反转INVERT_IN(11, ON) ' 限位信号反转INVERT_IN(12, ON)PRINT "Z信号回零系统初始化完成"PRINT "ATYPE=4: 脉冲+编码器(支持Z信号)"
END SUB
步骤2:执行Z信号回零
根据官方DATUM指令规范,Z信号回零的标准执行流程:
模式1:直接Z信号回零
GLOBAL SUB ExecuteZSignalHome1(axis_num)PRINT "开始轴", axis_num, "直接Z信号回零(模式1)"BASE(axis_num)' 清除轴错误状态(官方推荐)DATUM(0) AXIS(axis_num) ' 清除指定轴的错误状态DELAY(10)' 执行Z信号回零指令DATUM(1) ' 模式1:CREEP正向→Z信号→停止' 等待回零完成WAIT UNTIL IDLE(axis_num) = -1DELAY(10) ' 状态稳定延时' 检查回零结果IF AXISSTATUS(axis_num) = 0 THEN' Z信号回零成功 - DATUM指令已自动清零DPOS并纠正MPOSPRINT "轴", axis_num, "Z信号回零成功!"PRINT "DPOS位置:", DPOS(axis_num) ' 应该为0PRINT "MPOS位置:", MPOS(axis_num) ' 已被纠正PRINT "精度:±1个编码器脉冲"RETURN 1 ' 返回成功标志ELSE' 回零失败处理PRINT "轴", axis_num, "Z信号回零失败!"PRINT "错误状态:", HEX(AXISSTATUS(axis_num))CALL AnalyzeZSignalError(axis_num)RETURN 0 ' 返回失败标志ENDIF
END SUB
模式5:原点+Z信号回零(推荐)
GLOBAL SUB ExecuteZSignalHome5(axis_num)PRINT "开始轴", axis_num, "原点+Z信号回零(模式5)"BASE(axis_num)' 清除轴错误状态DATUM(0) AXIS(axis_num)DELAY(10)' 执行最高精度Z信号回零DATUM(5) ' 模式5:原点→离开→Z信号→停止' 等待回零完成WAIT UNTIL IDLE(axis_num) = -1DELAY(10)' 检查回零结果IF AXISSTATUS(axis_num) = 0 THEN' 最高精度Z信号回零成功PRINT "轴", axis_num, "最高精度Z信号回零成功!"PRINT "DPOS位置:", DPOS(axis_num)PRINT "MPOS位置:", MPOS(axis_num)PRINT "精度:±0.25个编码器脉冲(最高精度)"RETURN 1ELSEPRINT "轴", axis_num, "Z信号回零失败!"PRINT "错误状态:", HEX(AXISSTATUS(axis_num))CALL AnalyzeZSignalError(axis_num)RETURN 0ENDIF
END SUB
Z信号回零重要说明:
- ATYPE要求:必须配置为ATYPE=4或7
- 自动清零:DATUM指令成功后会自动将DPOS重置为0并纠正MPOS
- 精度优势:模式1/2精度±1脉冲,模式5/6精度±0.25脉冲
- Z信号质量:确保编码器Z信号稳定可靠
步骤3:多轴回零
GLOBAL SUB MultiAxisHoming()LOCAL home_successhome_success = 1' 按顺序回零各轴FOR i = 0 TO 2IF ExecuteHoming(i, 3) = 0 THENhome_success = 0PRINT "多轴回零失败,停止在轴", iEXIT ' 退出循环ENDIFDELAY(500) ' 轴间延时NEXTIF home_success = 1 THENPRINT "所有轴回零成功!"ELSEPRINT "多轴回零失败!"ENDIFRETURN home_success
END SUB
📝 完整示例代码
基础回零示例
'=============================================================================
' 实用Z信号回零示例程序
' 基于正运动官方手册和最佳实践
' 专门针对Z信号回零(模式2和模式6)
' 适用于ZMC系列运动控制器,要求ATYPE=4或7
'============================================================================='================ 全局变量定义 ================
GLOBAL gv_AxisMax '轴数量
GLOBAL ga_AxisNum(3) '轴号定义
GLOBAL gv_Status '系统状态:0-停止,1-运行中,2-已完成
GLOBAL ga_StatusAxis(3) '各轴状态:0-未回零,1-回零中,2-已回零,3-失败
GLOBAL ga_HomeMode(3) '回零方式:2-Z信号反向,6-原点+Z信号负向
GLOBAL ga_HomeEnable(3) '回零使能:0-使能,1-禁用'常量定义
CONST MAX_AXES = 3 '最大轴数
CONST HOME_SPEED = 200 '回零速度
CONST CREEP_SPEED = 20 '爬行速度'================ 主程序 ================
PRACTICAL_INIT() '系统初始化PRINT "=== 实用Z信号回零示例程序 ==="
PRINT "基于正运动官方手册和最佳实践"
PRINT ""
PRINT "Z信号反向回零(模式2):"
PRINT "IN0 - 单轴回零(轴0)"
PRINT "IN1 - 多轴顺序回零"
PRINT "IN2 - 多轴同时回零"
PRINT ""
PRINT "原点+Z信号负向(模式6):"
PRINT "IN3 - 单轴回零(轴0)"
PRINT "IN4 - 多轴顺序回零"
PRINT "IN5 - 多轴同时回零"
PRINT ""
PRINT "系统功能:"
PRINT "IN6 - 状态检查"
PRINT "IN7 - 紧急停止"WHILE 1 '主循环PRACTICAL_SCAN() '主程序扫描
WEND'================ 初始化子程序 ================
GLOBAL SUB PRACTICAL_INIT()'--- 变量初始化 ---gv_AxisMax = 3ga_AxisNum(0) = 0 'X轴(0轴)ga_AxisNum(1) = 1 'Y轴(1轴)ga_AxisNum(2) = 2 'Z轴(2轴)gv_Status = 0'初始化轴状态数组FOR i = 0 TO 2ga_StatusAxis(i) = 0ga_HomeMode(i) = 2 '默认回零模式2(Z信号反向回零)ga_HomeEnable(i) = 0 '默认使能回零NEXT'--- 轴参数初始化 ---CALL PracticalAxisInit()PRINT "系统初始化完成"
END SUB'================ Z信号回零轴参数初始化 ================
GLOBAL SUB PracticalAxisInit()BASE(ga_AxisNum(0), ga_AxisNum(1), ga_AxisNum(2))ATYPE = 4, 4, 4 'Z信号回零必须:脉冲+编码器UNITS = 1000, 1000, 1000 '脉冲当量(建议1000以上)ACCEL = 1000, 1000, 1000 '加速度DECEL = 1000, 1000, 1000 '减速度SPEED = 100, 100, 100 'Z信号回零速度(不宜过快)CREEP = 10, 10, 10 'Z信号寻找速度(爬行速度)HOMEWAIT = 20, 20, 20 '反找等待时间(ms)'原点输入设置DATUM_IN = 8, 9, 10 '原点输入:IN8, IN9, IN10INVERT_IN(8, ON) '反转原点信号(ZMC系列OFF有效)INVERT_IN(9, ON)INVERT_IN(10, ON)'限位输入设置FWD_IN = 11, 12, 13 '正向限位REV_IN = 14, 15, 16 '负向限位INVERT_IN(11, ON)INVERT_IN(12, ON)INVERT_IN(13, ON)INVERT_IN(14, ON)INVERT_IN(15, ON)INVERT_IN(16, ON)'关闭所有输出FOR i = 0 TO 7OP(i, OFF)NEXT
END SUB'================ 主程序扫描子程序 ================
GLOBAL SUB PRACTICAL_SCAN()'--- 扫描输入信号事件 ---' Z信号反向回零(模式2)IF SCAN_EVENT(IN(0)) > 0 THEN '模式2单轴回零CALL practical_home_axis_mode(0, 2)ENDIFIF SCAN_EVENT(IN(1)) > 0 THEN '模式2多轴顺序回零CALL practical_home_seq_mode(2)ENDIFIF SCAN_EVENT(IN(2)) > 0 THEN '模式2多轴同时回零CALL practical_home_sim_mode(2)ENDIF' 原点+Z信号负向(模式6)IF SCAN_EVENT(IN(3)) > 0 THEN '模式6单轴回零CALL practical_home_axis_mode(0, 6)ENDIFIF SCAN_EVENT(IN(4)) > 0 THEN '模式6多轴顺序回零CALL practical_home_seq_mode(6)ENDIFIF SCAN_EVENT(IN(5)) > 0 THEN '模式6多轴同时回零CALL practical_home_sim_mode(6)ENDIFIF SCAN_EVENT(IN(6)) > 0 THEN '状态检查CALL PracticalCheckStatus()ENDIF'紧急停止IF IN(7) = ON THENCALL practical_stop()ENDIF'状态指示灯IF gv_Status = 1 THEN '回零中OP(0, TICKS AND 1) '红灯闪烁OP(1, OFF)ELSEIF gv_Status = 2 THEN '回零完成OP(0, OFF)OP(1, ON) '绿灯亮ELSE '待机OP(0, OFF)OP(1, OFF)ENDIFDELAY(50)
END SUB'================ 单轴Z信号回零处理 ================
GLOBAL SUB practical_home_axis_mode(num, home_mode)IF gv_Status <> 1 THEN '判断系统状态不在回零中CALL practical_task_axis_mode(num, home_mode)ELSEPRINT "系统忙,无法回零"ENDIF
END SUBGLOBAL SUB practical_task_home_axis(num)PRINT "=== 单轴回零:轴", num, " ==="gv_Status = 1 '状态切换成回零中ga_StatusAxis(num) = 1'执行回零前检查IF PracticalSystemCheck() = 0 THENPRINT "系统检查失败,停止回零"gv_Status = 0ga_StatusAxis(num) = 3RETURNENDIFBASE(num)'清除轴状态AXIS_STOPREASON = 0'根据回零模式执行不同的回零指令IF ga_HomeMode(num) = 3 THEN '正向找原点DATUM(3)ELSEIF ga_HomeMode(num) = 4 THEN '负向找原点DATUM(4)ELSEIF ga_HomeMode(num) = 13 THEN '正向找原点+限位反找DATUM(13)ELSEIF ga_HomeMode(num) = 14 THEN '负向找原点+限位反找DATUM(14)ELSEDATUM(3) '默认使用模式3ENDIF'等待回零完成WAIT UNTIL IDLE(num) = -1DELAY(10) '状态稳定延时'检查回零结果IF AXISSTATUS(num) = 0 THEN'回零成功处理DPOS(num) = 0 '清零位置MPOS(num) = 0 '清零编码器位置ga_StatusAxis(num) = 2 '设置为已回零PRINT "轴", num, "回零成功!位置:", DPOS(num)ELSE'回零失败处理ga_StatusAxis(num) = 3 '设置为回零失败PRINT "轴", num, "回零失败!状态:", HEX(AXISSTATUS(num))CALL PracticalAnalyzeError(num, AXISSTATUS(num))ENDIFgv_Status = 0 '状态切换成待机
END SUB'================ 多轴顺序Z信号回零处理 ================
GLOBAL SUB practical_home_seq_mode(home_mode)IF gv_Status <> 1 THENCALL practical_task_seq_mode(home_mode)ELSEPRINT "系统忙,无法回零"ENDIF
END SUBGLOBAL SUB practical_task_sequential()PRINT "=== 多轴顺序回零演示 ==="gv_Status = 1 '状态切换成回零中'设置所有轴状态为回零中FOR i = 0 TO gv_AxisMax - 1IF ga_HomeEnable(i) = 0 THENga_StatusAxis(i) = 1ENDIFNEXT'按轴号顺序回零(可根据需要调整顺序)FOR i = 0 TO gv_AxisMax - 1IF ga_HomeEnable(i) = 0 THENBASE(i)PRINT "开始轴", i, "回零..."'根据回零模式执行(支持Z信号回零)IF ga_HomeMode(i) = 2 THENDATUM(2) 'Z信号反向回零ELSEIF ga_HomeMode(i) = 6 THENDATUM(6) '原点+Z信号负向回零ELSEIF ga_HomeMode(i) = 3 THENDATUM(3)ELSEIF ga_HomeMode(i) = 4 THENDATUM(4)ELSEIF ga_HomeMode(i) = 13 THENDATUM(13)ELSEIF ga_HomeMode(i) = 14 THENDATUM(14)ELSEDATUM(2) '默认使用Z信号反向回零ENDIF'等待当前轴回零完成WAIT UNTIL IDLE(i) = -1DELAY(10)'检查回零结果IF AXISSTATUS(i) = 0 THENga_StatusAxis(i) = 2DPOS(i) = 0MPOS(i) = 0PRINT "轴", i, "回零成功"ELSEga_StatusAxis(i) = 3PRINT "轴", i, "回零失败,状态:", HEX(AXISSTATUS(i))'如果有轴失败,停止后续回零gv_Status = 0PRINT "回零过程中断,轴", i, "失败"RETURNENDIFDELAY(200) '轴间延时ENDIFNEXTgv_Status = 2 '状态切换成已完成PRINT "多轴顺序回零完成!"
END SUB'================ 多轴同时Z信号回零处理 ================
GLOBAL SUB practical_home_sim_mode(home_mode)IF gv_Status <> 1 THENCALL practical_task_sim_mode(home_mode)ELSEPRINT "系统忙,无法回零"ENDIF
END SUBGLOBAL SUB practical_task_simul()PRINT "=== 多轴同时回零演示 ==="gv_Status = 1 '状态切换成回零中'同时启动所有轴回零FOR i = 0 TO gv_AxisMax - 1IF ga_HomeEnable(i) = 0 THENga_StatusAxis(i) = 1BASE(i)'根据模式执行回零(支持Z信号回零)IF ga_HomeMode(i) = 2 THENDATUM(2) 'Z信号反向回零ELSEIF ga_HomeMode(i) = 6 THENDATUM(6) '原点+Z信号负向回零ELSEIF ga_HomeMode(i) = 3 THENDATUM(3)ELSEIF ga_HomeMode(i) = 4 THENDATUM(4)ELSEIF ga_HomeMode(i) = 13 THENDATUM(13)ELSEIF ga_HomeMode(i) = 14 THENDATUM(14)ELSEDATUM(2) '默认使用Z信号反向回零ENDIFPRINT "轴", i, "开始回零..."ENDIFNEXT'等待所有轴回零完成WAIT UNTIL IDLE(0) = -1 AND IDLE(1) = -1 AND IDLE(2) = -1DELAY(10)'检查所有轴的回零结果DIM home_successhome_success = 1FOR i = 0 TO gv_AxisMax - 1IF ga_HomeEnable(i) = 0 THENIF AXISSTATUS(i) = 0 THENga_StatusAxis(i) = 2DPOS(i) = 0MPOS(i) = 0PRINT "轴", i, "回零成功,位置:", DPOS(i)ELSEga_StatusAxis(i) = 3PRINT "轴", i, "回零失败,状态:", HEX(AXISSTATUS(i))home_success = 0ENDIFENDIFNEXTIF home_success = 1 THENgv_Status = 2 '所有轴回零成功PRINT "所有轴同时回零完成!"ELSEgv_Status = 0 '有轴回零失败PRINT "部分轴回零失败!"ENDIF
END SUB'================ 停止按钮处理 ================
GLOBAL SUB practical_stop()STOPTASK 2RAPIDSTOP(2)gv_Status = 0FOR j = 0 TO gv_AxisMax - 1IF ga_StatusAxis(j) = 1 THENga_StatusAxis(j) = 0ENDIFNEXTPRINT "紧急停止!所有轴停止运动"
END SUB'================ 系统检查 ================
GLOBAL SUB PracticalSystemCheck()PRINT "执行系统检查..."'检查急停状态IF IN(7) = ON THENPRINT "错误:急停信号有效,无法回零"RETURN 0ENDIF'检查驱动器使能FOR i = 0 TO gv_AxisMax - 1IF AXIS_ENABLE(i) = 0 THENPRINT "警告:轴", i, "未使能"ENDIFNEXTPRINT "系统检查通过"RETURN 1
END SUB'================ 回零状态检查 ================
GLOBAL SUB PracticalCheckStatus()PRINT "=== 回零状态检查 ==="FOR i = 0 TO gv_AxisMax - 1PRINT "轴", i, "状态检查:"PRINT " 位置:", DPOS(i)PRINT " 编码器位置:", MPOS(i)PRINT " 轴状态:", HEX(AXISSTATUS(i))IF IDLE(i) = -1 THENPRINT " 运动状态:停止"ELSEPRINT " 运动状态:运动中"ENDIFPRINT " 回零状态:", ga_StatusAxis(i), "(0-未回零,1-回零中,2-已回零,3-失败)"PRINT " 回零模式:", ga_HomeMode(i), "(2-Z信号反向,6-原点+Z信号负向)"'检查ATYPE设置(Z信号回零要求)PRINT " ATYPE:", ATYPE(i)IF ATYPE(i) = 4 OR ATYPE(i) = 7 THENPRINT " ✓ ATYPE设置正确,支持Z信号回零"ELSEPRINT " ✗ ATYPE设置错误,无法进行Z信号回零"ENDIF'检查是否在原点附近IF ABS(DPOS(i)) < 1 THENPRINT " 原点状态:在原点"ELSEPRINT " 原点状态:偏离原点", DPOS(i), "单位"ENDIF'检查原点输入信号(模式6需要)DIM home_inputhome_input = IN(8 + i)IF home_input = ON THENPRINT " 原点信号:有效"ELSEPRINT " 原点信号:无效"ENDIF'检查编码器值(Z信号回零相关)PRINT " 编码器值:", ENCODER(i)PRINT ""NEXT'显示系统状态PRINT "系统状态:", gv_Status, "(0-停止,1-运行中,2-已完成)"IF gv_Status = 0 THENPRINT "状态说明:待机"ELSEIF gv_Status = 1 THENPRINT "状态说明:回零中"ELSEIF gv_Status = 2 THENPRINT "状态说明:回零完成"ENDIF
END SUB'================ 信号测试 ================
GLOBAL SUB PracticalTestSignals()PRINT "=== 原点信号测试 ==="PRINT "测试时间:10秒,请手动触发各轴原点开关"FOR test_time = 1 TO 100 '10秒测试PRINT "时间:", test_time * 0.1, "s"FOR i = 0 TO gv_AxisMax - 1DIM home_signal, fwd_signal, rev_signalhome_signal = IN(8 + i)fwd_signal = IN(11 + i)rev_signal = IN(14 + i)PRINT "轴", i, ": 原点=", home_signal, " 正限位=", fwd_signal, " 负限位=", rev_signalNEXTPRINT "---"DELAY(100)NEXTPRINT "信号测试完成"
END SUB'================ 轴错误分析子程序 ================
GLOBAL SUB PracticalAnalyzeError(axis_num, status_value)DIM cur_axis, cur_statuscur_axis = axis_numcur_status = status_valuePRINT "轴", cur_axis, "错误分析:"IF cur_status AND 1 THENPRINT " - 轴错误标志置位"ENDIFIF cur_status AND 2 THENPRINT " - 碰到正向硬限位"ENDIFIF cur_status AND 4 THENPRINT " - 碰到负向硬限位"ENDIFIF cur_status AND 8 THENPRINT " - 急停信号有效"ENDIFIF cur_status AND 16 THENPRINT " - 驱动器报警"ENDIF'检查原点信号状态DIM home_signalhome_signal = IN(8 + cur_axis)IF home_signal = ON THENPRINT " - 原点信号状态:有效"ELSEPRINT " - 原点信号状态:无效"ENDIF'建议解决方案PRINT "建议检查:"PRINT " 1. 原点开关连接和信号"PRINT " 2. 限位开关状态"PRINT " 3. 驱动器使能和报警"PRINT " 4. 轴运动方向设置"PRINT " 5. Z信号回零需要ATYPE=4或7"PRINT " 6. 检查编码器Z信号连接"
END SUB'================ Z信号回零任务函数 ================'单轴Z信号回零任务(支持不同模式)
GLOBAL SUB practical_task_axis_mode(num, home_mode)DIM cur_axis, mode_valcur_axis = nummode_val = home_modegv_Status = 1 '状态切换成回零中ga_StatusAxis(cur_axis) = 1IF mode_val = 2 THENPRINT "开始轴", cur_axis, "Z信号反向回零(模式2)"PRINT "运动过程:CREEP负向→Z信号→停止"ELSEIF mode_val = 6 THENPRINT "开始轴", cur_axis, "原点+Z信号负向回零(模式6)"PRINT "运动过程:SPEED负向→原点→CREEP正向→离开→CREEP正向→Z信号"ENDIF'执行回零前检查IF PracticalSystemCheck() = 0 THENPRINT "系统检查失败,停止回零"gv_Status = 0ga_StatusAxis(cur_axis) = 3RETURNENDIFBASE(cur_axis)'检查ATYPE设置(Z信号回零要求)IF ATYPE(cur_axis) <> 4 AND ATYPE(cur_axis) <> 7 THENPRINT "错误:Z信号回零必须配置ATYPE=4或7"PRINT "当前ATYPE:", ATYPE(cur_axis)gv_Status = 0ga_StatusAxis(cur_axis) = 3RETURNENDIF'清除轴错误状态(官方推荐)DATUM(0) AXIS(cur_axis)DELAY(10)'执行Z信号回零指令DATUM(mode_val)'等待回零完成WAIT UNTIL IDLE(cur_axis) = -1DELAY(10) '状态稳定延时'检查回零结果IF AXISSTATUS(cur_axis) = 0 THEN'回零成功 - DATUM指令已自动清零DPOS并纠正MPOSga_StatusAxis(cur_axis) = 2 '设置为已回零PRINT "轴", cur_axis, "Z信号回零成功!"PRINT "DPOS:", DPOS(cur_axis), "(已自动清零)"PRINT "MPOS:", MPOS(cur_axis), "(已自动纠正)"IF mode_val = 2 THENPRINT "精度:±1个编码器脉冲"ELSEIF mode_val = 6 THENPRINT "精度:±0.25个编码器脉冲(最高精度)"ENDIFELSE'回零失败处理ga_StatusAxis(cur_axis) = 3 '设置为回零失败PRINT "轴", cur_axis, "Z信号回零失败!状态:", HEX(AXISSTATUS(cur_axis))CALL PracticalAnalyzeError(cur_axis, AXISSTATUS(cur_axis))ENDIFgv_Status = 0 '状态切换成待机
END SUB'多轴顺序Z信号回零任务(支持不同模式)
GLOBAL SUB practical_task_seq_mode(home_mode)DIM mode_val, cur_axismode_val = home_modegv_Status = 1 '状态切换成回零中IF mode_val = 2 THENPRINT "开始多轴顺序Z信号反向回零(模式2)"ELSEIF mode_val = 6 THENPRINT "开始多轴顺序原点+Z信号负向回零(模式6)"ENDIF'执行回零前检查IF PracticalSystemCheck() = 0 THENPRINT "系统检查失败,停止回零"gv_Status = 0RETURNENDIF'按顺序回零每个轴FOR i = 0 TO gv_AxisMax - 1cur_axis = ga_AxisNum(i)PRINT "--- 开始轴", cur_axis, "Z信号回零 ---"ga_StatusAxis(i) = 1 '设置为回零中BASE(cur_axis)'检查ATYPE设置IF ATYPE(cur_axis) <> 4 AND ATYPE(cur_axis) <> 7 THENPRINT "错误:轴", cur_axis, "ATYPE设置不正确,当前:", ATYPE(cur_axis)ga_StatusAxis(i) = 3gv_Status = 0RETURNENDIF'清除轴错误状态DATUM(0) AXIS(cur_axis)DELAY(10)'执行Z信号回零DATUM(mode_val)'等待回零完成WAIT UNTIL IDLE(cur_axis) = -1DELAY(10)'检查回零结果IF AXISSTATUS(cur_axis) = 0 THENga_StatusAxis(i) = 2 '设置为已回零PRINT "轴", cur_axis, "Z信号回零成功"ELSEga_StatusAxis(i) = 3 '设置为回零失败PRINT "轴", cur_axis, "Z信号回零失败,停止多轴回零"CALL PracticalAnalyzeError(cur_axis, AXISSTATUS(cur_axis))gv_Status = 0RETURNENDIFDELAY(500) '轴间延时NEXTPRINT "所有轴Z信号顺序回零完成"gv_Status = 0 '状态切换成待机
END SUB'多轴同时Z信号回零任务(支持不同模式)
GLOBAL SUB practical_task_sim_mode(home_mode)DIM mode_val, check_axis, result_axis, all_successmode_val = home_modegv_Status = 1 '状态切换成回零中IF mode_val = 2 THENPRINT "开始多轴同时Z信号反向回零(模式2)"ELSEIF mode_val = 6 THENPRINT "开始多轴同时原点+Z信号负向回零(模式6)"ENDIF'执行回零前检查IF PracticalSystemCheck() = 0 THENPRINT "系统检查失败,停止回零"gv_Status = 0RETURNENDIF'检查所有轴的ATYPE设置FOR i = 0 TO gv_AxisMax - 1check_axis = ga_AxisNum(i)BASE(check_axis)IF ATYPE(check_axis) <> 4 AND ATYPE(check_axis) <> 7 THENPRINT "错误:轴", check_axis, "ATYPE设置不正确,当前:", ATYPE(check_axis)gv_Status = 0RETURNENDIFNEXT'设置所有轴状态为回零中FOR i = 0 TO gv_AxisMax - 1ga_StatusAxis(i) = 1NEXT'清除所有轴错误状态FOR i = 0 TO gv_AxisMax - 1DATUM(0) AXIS(ga_AxisNum(i))NEXTDELAY(10)'同时启动所有轴Z信号回零FOR i = 0 TO gv_AxisMax - 1BASE(ga_AxisNum(i))PRINT "启动轴", ga_AxisNum(i), "Z信号回零(模式", mode_val, ")"DATUM(mode_val)NEXTPRINT "等待所有轴Z信号回零完成..."'等待所有轴回零完成WAIT UNTIL IDLE(ga_AxisNum(0)) = -1 AND IDLE(ga_AxisNum(1)) = -1 AND IDLE(ga_AxisNum(2)) = -1DELAY(10) '状态稳定延时'检查所有轴的回零结果all_success = 1FOR i = 0 TO gv_AxisMax - 1result_axis = ga_AxisNum(i)BASE(result_axis)IF AXISSTATUS(result_axis) = 0 THENga_StatusAxis(i) = 2 '设置为已回零PRINT "轴", result_axis, "Z信号同时回零成功"ELSEga_StatusAxis(i) = 3 '设置为回零失败PRINT "轴", result_axis, "Z信号同时回零失败"CALL PracticalAnalyzeError(result_axis, AXISSTATUS(result_axis))all_success = 0ENDIFNEXT'显示最终结果IF all_success = 1 THENPRINT "所有轴Z信号同时回零成功!"IF mode_val = 2 THENPRINT "精度:±1个编码器脉冲"ELSEIF mode_val = 6 THENPRINT "精度:±0.25个编码器脉冲(最高精度)"ENDIFELSEPRINT "部分轴Z信号同时回零失败!"ENDIFgv_Status = 0 '状态切换成待机
END SUB
🔧 故障排除指南
常见问题及解决方案
1. 回零失败:AXISSTATUS ≠ 0
问题现象:回零指令执行后,AXISSTATUS返回非零值
状态码对照表:
状态码 | 含义 | 解决方案 |
---|---|---|
0x01 | 轴错误标志 | 检查驱动器使能和连接 |
0x02 | 正向硬限位 | 检查正限位开关状态 |
0x04 | 负向硬限位 | 检查负限位开关状态 |
0x08 | 急停信号 | 检查急停开关状态 |
0x10 | 驱动器报警 | 检查驱动器报警信号 |
调试代码:
SUB DiagnoseHomingError(axis_num)LOCAL status_codestatus_code = AXISSTATUS(axis_num)PRINT "轴", axis_num, "回零诊断:"PRINT "状态码:0x", HEX(status_code)IF status_code AND 1 THENPRINT "错误:轴错误标志置位"PRINT "解决:检查AXIS_ENABLE和驱动器连接"ENDIFIF status_code AND 2 THENPRINT "错误:碰到正向限位"PRINT "解决:手动移动轴离开限位或使用模式13"ENDIFIF status_code AND 4 THENPRINT "错误:碰到负向限位"PRINT "解决:手动移动轴离开限位或使用模式14"ENDIFPRINT "原点信号状态:", IN(DATUM_IN(axis_num))PRINT "正限位信号:", IN(FWD_IN(axis_num))PRINT "负限位信号:", IN(REV_IN(axis_num))
END SUB
2. 找不到原点信号
检查步骤:
SUB CheckHomeSignal(axis_num)LOCAL home_inputhome_input = DATUM_IN(axis_num)PRINT "原点信号检查:"PRINT "映射输入口:IN", home_inputPRINT "当前信号状态:", IN(home_input)' 手动测试原点开关PRINT "请手动触发原点开关,观察信号变化..."FOR i = 1 TO 20PRINT "IN", home_input, "=", IN(home_input)DELAY(200)NEXT
END SUB
3. 回零精度优化
SUB OptimizeHomingAccuracy(axis_num)BASE(axis_num)' 降低爬行速度提高精度CREEP = 5 ' 原来20,现在5' 增加反找等待时间HOMEWAIT = 50 ' 原来20,现在50' 使用更精确的回零模式' DATUM(5) ' 使用Z信号回零(需要编码器支持)PRINT "已优化轴", axis_num, "回零精度参数"
END SUB
🏆 最佳实践建议
1. 标准回零流程
GLOBAL SUB StandardHomingProcedure()PRINT "=== 标准回零流程 ==="' 步骤1:系统检查IF SystemCheck() = 0 THENPRINT "系统检查失败,停止回零"RETURNENDIF' 步骤2:执行回零FOR i = 0 TO axis_count - 1CALL SingleAxisHome(i)IF home_status(i) <> 2 THENPRINT "轴", i, "回零失败,停止流程"RETURNENDIFDELAY(500)NEXT' 步骤3:结果验证CALL VerifyHomingResult()PRINT "标准回零流程完成"
END SUBGLOBAL SUB SystemCheck()' 检查急停状态IF IN(7) = ON THENPRINT "错误:急停信号有效"RETURN 0ENDIF' 检查驱动器使能FOR i = 0 TO axis_count - 1IF AXIS_ENABLE(i) = 0 THENPRINT "警告:轴", i, "未使能"ENDIFNEXTPRINT "系统检查通过"RETURN 1
END SUB
2. 回零成功判断标准
GLOBAL SUB VerifyHomingResult()PRINT "=== 回零结果验证 ==="FOR i = 0 TO axis_count - 1PRINT "轴", i, "验证:"' 检查1:轴状态正常IF AXISSTATUS(i) = 0 THENPRINT " ✓ 轴状态正常"ELSEPRINT " ✗ 轴状态异常:", HEX(AXISSTATUS(i))ENDIF' 检查2:位置已清零IF ABS(DPOS(i)) < 0.1 THENPRINT " ✓ 位置已清零:", DPOS(i)ELSEPRINT " ⚠ 位置偏差:", DPOS(i)ENDIF' 检查3:轴已停止IF IDLE(i) = -1 THENPRINT " ✓ 轴已停止"ELSEPRINT " ✗ 轴仍在运动"ENDIFPRINT ""NEXT
END SUB
3. 安全保护措施
GLOBAL SUB HomingSafetyProtection()' 设置软限位保护FOR i = 0 TO axis_count - 1BASE(i)FS_LIMIT = 500 ' 正向软限位RS_LIMIT = -500 ' 负向软限位NEXT' 设置急停保护AXISEMG_IN = 7 ' 急停信号映射到IN7' 设置驱动器报警保护FOR i = 0 TO axis_count - 1ALM_IN(i) = 20 + i ' 驱动器报警信号INVERT_IN(20 + i, ON)NEXTPRINT "安全保护设置完成"
END SUB
📚 总结
回零成功的三个关键判断条件
AXISSTATUS(axis) = 0
- 轴状态无错误(最重要)IDLE(axis) = -1
- 轴已停止运动ABS(DPOS(axis)) < 允许误差
- 位置精度满足要求
标准回零代码模板
' 推荐的回零实现模板
GLOBAL SUB RecommendedHoming(axis_num)PRINT "开始轴", axis_num, "回零"BASE(axis_num)' 1. 执行回零指令DATUM(3) ' 使用模式3(最常用)' 2. 等待回零完成WAIT UNTIL IDLE(axis_num) = -1DELAY(10) ' 状态稳定延时' 3. 检查回零结果IF AXISSTATUS(axis_num) = 0 THEN' 4. 回零成功处理DPOS(axis_num) = 0 ' 清零脉冲位置MPOS(axis_num) = 0 ' 清零编码器位置PRINT "轴", axis_num, "回零成功!"RETURN 1ELSE' 5. 回零失败处理PRINT "轴", axis_num, "回零失败!状态:", HEX(AXISSTATUS(axis_num))RETURN 0ENDIF
END SUB
开发建议
- 从简单开始:先实现单轴回零,再扩展到多轴
- 充分测试:在不同位置多次测试回零的重复性
- 完善错误处理:为各种异常情况提供明确的错误信息
- 参数优化:根据实际机械特性调整速度参数
- 安全第一:始终考虑安全保护措施
通过遵循本教程,您可以实现稳定、可靠、高精度的回零功能!
📖 附录:官方DATUM指令完整参考
DATUM指令语法
DATUM(mode) ' 基本回零模式
DATUM(21, mode2) ' EtherCAT/Rtex总线回零
DATUM(0) AXIS(axis_num) ' 清除指定轴错误状态
官方回零模式完整列表
模式 | 官方描述 | 运动过程 | ATYPE要求 |
---|---|---|---|
0 | 清除错误状态 | 清除所有轴的错误状态 | 通用 |
1 | Z信号正向回零 | CREEP正向→Z信号→DPOS清零 | ATYPE=4或7 |
2 | Z信号负向回零 | CREEP负向→Z信号→DPOS清零 | ATYPE=4或7 |
3 | 原点开关正向回零 | SPEED正向→原点→CREEP反向→离开→DPOS清零 | 通用 |
4 | 原点开关负向回零 | SPEED负向→原点→CREEP正向→离开→DPOS清零 | 通用 |
5 | 原点+Z信号正向 | SPEED正向→原点→CREEP反向→离开→CREEP反向→Z信号→DPOS清零 | ATYPE=4或7 |
6 | 原点+Z信号负向 | SPEED负向→原点→CREEP正向→离开→CREEP正向→Z信号→DPOS清零 | ATYPE=4或7 |
8 | 简单正向回零 | SPEED正向→原点→停止 | 通用 |
9 | 简单负向回零 | SPEED负向→原点→停止 | 通用 |
13 | 限位反找正向回零 | 模式3+限位反找功能 | 通用 |
21 | EtherCAT驱动器回零 | 使用驱动器内部回零功能 | 总线轴 |
控制器信号电平差异
控制器系列 | 触发电平 | 常开信号 | 常闭信号 | 示例 |
---|---|---|---|---|
ZMC系列 | 0触发有效 | 需要INVERT_IN反转 | 不需要反转 | INVERT_IN(8, ON) |
ECI系列 | 1触发有效 | 不需要反转 | 需要INVERT_IN反转 | INVERT_IN(8, ON) |
重要注意事项
- Z信号回零要求:必须配置为ATYPE=4或7
- 指令限制:DATUM指令后不能接绝对指令和mover指令
- 多轴回零:每个轴都需要单独使用DATUM指令
- 自动清零:DATUM指令成功后自动将DPOS重置为0并纠正MPOS
- 总线控制器:使用控制器找原点模式完成后,需要手动清零MPOS
- 4系列特殊功能:ATYPE=4时,模式100+n可自动清零MPOS
Z信号回零官方示例代码
示例1:直接Z信号回零(模式1)
BASE(0)
DPOS = 0
ATYPE = 4 ' 必须:脉冲+编码器(Z信号回零要求)
SPEED = 100 ' 找原点速度
CREEP = 10 ' Z信号寻找速度(爬行速度)
FWD_IN = 6 ' 正限位保护
INVERT_IN(6, ON) ' 反转限位信号(ZMC控制器)
DATUM(1) ' 执行直接Z信号回零
示例2:原点+Z信号回零(模式5,推荐)
BASE(0)
DPOS = 0
ATYPE = 4 ' 必须:脉冲+编码器(Z信号回零要求)
SPEED = 100 ' 找原点速度
CREEP = 10 ' Z信号寻找速度
DATUM_IN = 5 ' 输入IN5作为原点开关
FWD_IN = 6 ' 输入IN6作为正限位开关
INVERT_IN(5, ON) ' 反转原点信号(ZMC控制器)
INVERT_IN(6, ON) ' 反转限位信号
DATUM(5) ' 执行最高精度Z信号回零
示例3:Z信号回零验证
' Z信号回零完整流程
BASE(0)
ATYPE = 4 ' 必须设置为支持Z信号的轴类型' 清除轴错误状态
DATUM(0) AXIS(0)
DELAY(10)' 执行Z信号回零
DATUM(5) ' 使用最高精度模式
WAIT UNTIL IDLE(0) = -1
DELAY(10)' 验证回零结果
IF AXISSTATUS(0) = 0 THENPRINT "Z信号回零成功"PRINT "DPOS:", DPOS(0), "(已自动清零)"PRINT "MPOS:", MPOS(0), "(已自动纠正)"PRINT "精度:±0.25个编码器脉冲"
ELSEPRINT "Z信号回零失败,状态:", HEX(AXISSTATUS(0))
ENDIF
Z信号回零标准代码模板
模板1:直接Z信号回零(模式1)
' 基于官方DATUM指令的直接Z信号回零模板
BASE(axis_num)
ATYPE = 4 ' 必须:脉冲+编码器(Z信号回零要求)
UNITS = 1000 ' 脉冲当量(建议1000以上)
SPEED = 100 ' 回零速度
CREEP = 10 ' Z信号寻找速度
FWD_IN = 11 ' 正限位保护
INVERT_IN(11, ON) ' ZMC系列限位信号反转' 清除轴错误状态
DATUM(0) AXIS(axis_num)
DELAY(10)' 执行直接Z信号回零
DATUM(1) ' 模式1:CREEP正向→Z信号→停止
WAIT UNTIL IDLE(axis_num) = -1
DELAY(10)' 判断回零结果
IF AXISSTATUS(axis_num) = 0 THENPRINT "Z信号回零成功,精度:±1个编码器脉冲"PRINT "DPOS:", DPOS(axis_num), "(已自动清零)"PRINT "MPOS:", MPOS(axis_num), "(已自动纠正)"
ELSEPRINT "Z信号回零失败,状态:", HEX(AXISSTATUS(axis_num))
ENDIF
模板2:原点+Z信号回零(模式5,推荐)
' 基于官方DATUM指令的最高精度Z信号回零模板
BASE(axis_num)
ATYPE = 4 ' 必须:脉冲+编码器(Z信号回零要求)
UNITS = 1000 ' 脉冲当量
SPEED = 100 ' 回零速度
CREEP = 10 ' Z信号寻找速度
DATUM_IN = 8 ' 原点开关输入
FWD_IN = 11 ' 正限位保护
INVERT_IN(8, ON) ' ZMC系列原点信号反转
INVERT_IN(11, ON) ' ZMC系列限位信号反转' 清除轴错误状态
DATUM(0) AXIS(axis_num)
DELAY(10)' 执行最高精度Z信号回零
DATUM(5) ' 模式5:原点→离开→Z信号→停止
WAIT UNTIL IDLE(axis_num) = -1
DELAY(10)' 判断回零结果
IF AXISSTATUS(axis_num) = 0 THENPRINT "Z信号回零成功,精度:±0.25个编码器脉冲(最高精度)"PRINT "DPOS:", DPOS(axis_num), "(已自动清零)"PRINT "MPOS:", MPOS(axis_num), "(已自动纠正)"
ELSEPRINT "Z信号回零失败,状态:", HEX(AXISSTATUS(axis_num))
ENDIF
Z信号回零关键要点总结
- ATYPE要求:必须配置为ATYPE=4或7(带Z信号的轴类型)
- 编码器要求:必须使用带Z相输出的编码器
- 精度优势:模式1/2精度±1脉冲,模式5/6精度±0.25脉冲
- 模式选择:推荐使用模式5/6,安全性和精度都最高
- 自动清零:DATUM指令成功后自动清零DPOS并纠正MPOS
本教程专门针对Z信号回零,完全基于正运动官方DATUM指令手册编写,确保与官方规范完全一致。