### HW_PSWITCH 2 -- 总线硬件位置比较输出

类型 | 轴指令
描述 | 总线硬件位置比较输出，也支持脉冲轴，必须使用特定的输出口。 4 系列产品有 4 个比较输出口，可以选择不同的比较输出口，一般为 OUT0/1/2/3 口。 比较主轴带编码器输入时，自动使用编码器位置来触发，可以使用 MOVEOP_DELAY 参数来调整输出准确时刻。 不同的总线驱动器效果可能有差异，也可以通过 MOVEOP_DELAY 参数来调整。 HW_PSWITCH2 与 MOVE_OP 精准使用同样的硬件资源，不建议在同一个通道同时使用，可以在不同的通道同时使用。 每个系统周期内只能比较一次，系统周期通过 SERVO_PERIOD 查询。 TABLE 位置数据在所有比较点完成前不要修改。 脉冲轴和总线轴均支持此指令。 使用脉冲型电机时只有 ATYPE 为 4 时才是比较反馈位置(MPOS)，默认出厂的 ATYPE 为 1 或 7 比较的是命令位置(DPOS)。
语法 | 命令语法：HW_PSWITCH2(mode, [...]) 函数语法：Buff = HW_PSWITCH2([axisnum]) Mode=1:单轴比较，见例一 HW_PSWITCH2(1,opnum,opstate,tablestart,tableend[,direction]) mode：1-启动比较器 opnum：对应的输出口 opstate：第一个比较点的输出状态 tablestart：第一个比较点绝对坐标所在 TABLE 编号 tableend：最后一个比较点绝对坐标所在 TABLE 编号 direction：第一个点判断方向，0 坐标负向，1 坐标正向，-1 不使用方向 Mode=2:清除比较点 HW_PSWITCH2(2) mode：2-停止并删除没完成的比较点 使用矢量距离比较时，与 VECTOR_MOVED 进行比较，建议连续运动前设置 VECTOR_MOVED 初始值 Mode=3:矢量比较方式，见例二 HW_PSWITCH2(3, opnum, opstate, tablestart, tableend) mode：3-启动比较器 opnum：对应的输出口 opstate：第一个比较点的输出状态 tablestart：第一个比较点 VECTOR_MOVED 坐标所在 TABLE 编号 tableend：最后一个比较点 VECTOR_MOVED 坐标所在 TABLE 编号 Mode=4:矢量比较方式, 单个比较点 HW_PSWITCH2(4, opnum, opstate, vectstart) mode：4-启动比较器 opnum：对应的输出口 opstate：第一个比较点的输出状态 vectstart：比较点 VECTOR_MOVED 当前运动距离 Mode=5:矢量比较方式, 周期脉冲模式，见例三 HW_PSWITCH2(5,opnum, opstate, vectstart, repes, cycledis, ondis) mode：5-启动比较器 opnum：对应的输出口 opstate：第一个比较点的输出状态，认为是有效状态，反之认为无效状态 vectstart：比较点 VECTOR_MOVED 当前运动距离 repes：重复周期，个周期内比较两次，先输出有效状态，再输出无效状态 cycledis：周期距离，每隔这个距离输出 opstate, ondis 后还原为无效状态 ondis：输出有效状态的距离，(cycledis- ondis)为无效状态距离 Mode=6：矢量比较方式，周期模式，与 HW_TIMER 一起使用，见例四 HW_PSWITCH2(6, opnum, opstate, vectstart, repes, cycledis) mode：6-启动比较器 opnum：对应的输出口 opstate：第一个比较点的输出状态 vectstart：比较点 VECTOR_MOVED 当前运动距离 repes：重复周期，一个周期只比较一次 cycledis：周期距离，每隔这个距离输出一次 Mode=7：与 HW_TIMER 一起使用 HW_PSWITCH2(7, opnum, opstate, tablestart, tableend [, optimeus, optimes, cyctimeus]) mode：7-启动比较器，opstate 不翻转, 方便与 HW_TIMER 配合使用. opnum：对应的输出口 opstate：第一个比较点的输出状态 tablestart：第一个比较点 VECTOR_MOVED 坐标所在 TABLE 编号 tableend：最后一个比较点 VECTOR_MOVED 坐标所在 TABLE 编号 [与 hwtimer 并用时，可以动态调整 hwtimer 参数] optimeus：动态调整 HW_TIMER 的有效时间 optimes：动态调整 HW_TIMER 的触发脉冲数，0-不输出 cyctimeus：动态调整 HW_TIMER 的脉冲周期时间 HW_PSWITCH2 没有比较完所有点的话，一定要设置 mode 值为 2，通过 HW_PSWITCH2(2)指令停止并删除没有完成的比较点，否则后面此输出通道会工作不正常。 以下为 2D，3D 比较模式 4 系列 170706 以后固件版本支持，运行轨迹必须顺序通过 fifo 的点。 2D 比较：每 2 个 table 存储一个点 多个点比较，每次输出翻转状态。 HW_PSWITCH2(25, opnum, opstate, maxerr, num, tablepos) 注意：此模式下 maxerr 偏差参数不能写 0。 与 HW_TIMER 复用 HW_PSWITCH2(26, opnum, opstate, maxerr, num, tablepos, [ophwtimeus, ophwtimes, hwcyctimeus]) 3D 比较：每 3 个 TABLE 存储一个点 多个点比较，每次输出翻转状态。 HW_PSWITCH2(35, opnum, opstate, maxerr, num, tablepos) 与 HW_TIMER 复用 HW_PSWITCH2(36, opnum, opstate, maxerr, num, tablepos, [ophwtimeus, ophwtimes, hwcyctimeus]) 参数： mode：25，26，35，36 多维的比较模式 opnum：对应的输出口 opstate：第一个比较点的输出状态 maxerr：比较位置每个轴左右的脉冲偏差，进入偏差范围后开始比较 num：table 里面存储的比较点个数 tablepos：第一个比较点坐标所在 table 编号 [与 hwtimer 并用时，可以动态调整 hwtimer 参数] ophwtimeus：脉冲时间 ophwtimes：脉冲个数 hwcyctimeus：脉冲周期
适用控制器 | 3 系列部分、4 系列及以上产品，4 系列固件 20170704 及以上
例子 | 以下例程测试环境：ZMC432，固件：20170709（仿真器无法运行此指令）。 例一 单轴比较 总线轴使能过程省略，参考总线初始化例程。 BASE(0) DPOS=0 MPOS=0 OP(0,OFF) TABLE(0,50,100,150,200) '比较点坐标设置 HW_PSWITCH2(2) '停止并删除没有完成的比较点 HW_PSWITCH2(1, 0, 1, 0, 3,1) '比较 4 个点，操作输出口 0 TRIGGER '触发示波器 MOVE(500) 比较输出图 运动到 50 时，关闭 OUT0；位置 100 时，打开 OUT0；位置 150 时，关闭 OUT0；位置 200 时，打开 OUT0。 MPOS(0)垂直刻度 200 OP(0)垂直刻度 2 例二 矢量单轴比较模式 总线轴使能过程省略，参考总线初始化例程。 BASE(0) DPOS=0 MPOS=0 OP(0,OFF) TABLE(0,50,100,150,200) '比较点坐标设置 VECTOR_MOVED=120 '设置矢量起始位置，会影响比较点 HW_PSWITCH2(2) '停止并删除没有完成的比较点 HW_PSWITCH2(3, 0, 1, 0, 3) '比较 4 个点，操作输出口 0 TRIGGER '触发示波器 MOVE(500) 比较输出图 MPOS(0)垂直刻度 200 OP(0)垂直刻度 2 可以看出信号操作直接从例一的位置 120 处开始，只比较了后面两个点，矢量比较模式就是将 MPOS(当前位置)+VECTOR_MOVED(之前的位移)与设置位置进行比较。 例三 XY 加工模式的 PSO 应用 RAPIDSTOP(2) WAIT IDLE(0) WAIT IDLE(1) BASE(0,1) ATYPE=1,1 SPEED=100,100 ACCEL=1000,1000 DECEL=1000,1000 SRAMP=100,100 DPOS=0,0 MPOS=0,0 OP(0,OFF) TABLE(0,50,100,150,200) '比较点坐标设置 VECTOR_MOVED=0 '设置矢量起始位置 HW_PSWITCH2(2) '停止并删除没有完成的比较点 HW_PSWITCH2(3, 0, 1, 0, 3) '比较 4 个点，操作输出口 0 TRIGGER '触发示波器 MOVE(300,400) END 比较输出图：按 XY 轴插补位置比较 VECTOR_MOVED(0)垂直刻度 200 OP(0)垂直刻度 2 例四 周期比较模式，距离复位 总线轴使能过程省略，参考总线初始化例程。 BASE(0) DPOS=0 MPOS=0 OP(0,OFF) TABLE(0,50,100,150,200) '比较点坐标设置 VECTOR_MOVED=0 '设置矢量起始位置为 0，方便观察 HW_PSWITCH2(2) '停止并删除没有完成的比较点 HW_PSWITCH2(5,0,1,100,3,150,50) '位置 100 开始比较，比较 3 次 '周期距离 150，输出有效距离 50 TRIGGER '触发示波器 MOVE(500) 比较输出图 位置 100 开始比较，比较 3 次，一个和周期中前 50 输出有效状态，后 100 输出无效状态。 MPOS(0)垂直刻度 200 OP(0)垂直刻度 2 例四 周期比较模式，时间复位 总线轴使能过程省略，参考总线初始化例程。 BASE(0) DPOS=0 MPOS=0 OP(0,OFF) TABLE(0,50,100,150,200) '比较点坐标设置 VECTOR_MOVED=0 '设置矢量起始位置为 0，方便观察 HW_PSWITCH2(2) '停止并删除没有完成的比较点 HW_PSWITCH2(6,0,1,100,3,100) '位置 100 开始比较，比较 3 次周期距离 100，输出有效时间由 HW_TIMER 指令确定 HW_TIMER(2,1000000,500000,1,off,0) '输出变为 on 后 500ms 变为 off TRIGGER MOVE(500) 比较输出图 位置 100 时开始比较，比较 3 次，输出有效信号后 500ms 反转。 MPOS(0)垂直刻度 100 OP(0)垂直刻度 2 例五 二维硬件位置比较输出，模式 25 BASE(0,1) '选择 XY 轴 UNITS=1000,1000 SPEED=100,100 ACCEL=10000,10000 DECEL=10000,10000 '将当前位置设置为 0 点 DPOS=0,0 MPOS=0,0 '提前写入位置比较点 XY 坐标到 table 10~49 中 TABLE(10, 10,0,12,0, 20,0,22,0, 30,0,32,0, 40,0,42,0, 50,0,52,0, 52,10,52,12, 52,20,52,22, 52,30,52,32, 52,40,52,42, 52,50,52,52) GLOBAL pointNum '比较点数 pointNum=20 GLOBAL startX,startY '起点 startX=0 startY=0 GLOBAL midX,midY '中点 midX=52 midY=0 GLOBAL endX,endY '终点 endX=52 endY=52 WHILE 1 IF TABLE(0)=1 THEN '比较脉冲位置,非精准输出 WAIT IDLE ?"比较脉冲位置,非精准输出" '设置参数 SYSTEM_ZSET=1 AXIS_ZSET=1,1 ELSEIF TABLE(0)=2 THEN '比较脉冲位置,精准输出 WAIT IDLE ?"比较脉冲位置,精准输出" '设置参数 SYSTEM_ZSET=3 AXIS_ZSET=3,3 ELSEIF TABLE(0)=3 THEN '比较编码器位置,非精准输出 WAIT IDLE ?"比较编码器位置,非精准输出" '设置参数 SYSTEM_ZSET=17 AXIS_ZSET=17,17 ELSEIF TABLE(0)=4 THEN '比较编码器位置,精准输出 WAIT IDLE ?"比较编码器位置,精准输出" '设置参数 SYSTEM_ZSET=19 AXIS_ZSET=19,19 ENDIF IF TABLE(0)<>0 AND IDLE(0)=-1 THEN TABLE(0)=0 ?"启动" HW_PSWITCH2(2) '先清除所有的比较 HW_PSWITCH2(25,0,1,10,pointNum,10) '写入比较，操作输出口 0 WA 10 TRIGGER '启动示波器 MOVEABS(startX,startY) '开始运动 MOVEABS(midX,midY) MOVEABS(endX,endY) ENDIF WEND END
相关指令 | PSWITCH，HW_PSWITCH，MOVEOP_DELAY，REG_IMPUTS