sPTP同步点对点+平滑半径,PTO脉冲接V90/S200的直角坐标抓放方案
先说重点:这个库在 S7-1200 G2 上是个"补位"方案
这个库干的事一句话能说清:让直角坐标(笛卡尔)机械手的多个伺服轴,按预先定义的空间路径做同步点对点运动(synchronous Point-To-Point,sPTP),典型用途就是 Pick & Place 抓放。
但要特别注意 V2.0 相对老 S7-1200 时代的定位变化:
• S7-1200 G2 已经原生支持运动学,通过工艺对象 TO_Kinematics(底层用 TO_PositioningAxis / TO_SynchronousAxis)就能协调多轴。走 PROFINET 或模拟量接驱动,直接用原生 TO_Kinematics 即可;
• 唯独一种情况原生方案用不了:通过板载数字量输出做脉冲给定(PTO)接驱动。因为 G2 的 TO_PositioningAxis / TO_SynchronousAxis 不能配合信号板、信号模块的脉冲输出,只有 PTO 专用的 TO_PositioningAxis_PTO 可以;
• LAxesGrpCtrl V2.0 被移植到 G2,就是为了补上这一个缺口——PTO 脉冲接 V90 PTI / S200 PTI 时,照样能做多轴协调抓放。
所以选型逻辑很直白:用总线驱动,上原生 TO_Kinematics;用板载 PTO 脉冲,才需要这个库。
sPTP 到底是怎么"同步"的
库内部并不做插补器,每个轴底层调用的还是大家熟悉的运动控制指令 MC_MoveAbsolute。协调靠的是动力学再分配:
1. 先算出路径段里动作最慢的那根轴走完全程需要的时间;
2. 再把其余轴的速度、加速度等动力学值按比例压低,让所有轴同时启动、尽量同时到位。
这样 TCP(工具中心点)从空间点 P1 到 P2 的过程,就是多轴"凑齐时间"的协调运动。
库提供两种同步模式,由 syncDynPhases 参数切换:
• syncDynPhases = False(默认):各轴的加速、匀速、制动阶段不强制对齐,每轴相位可以不同。协调到位即可,执行速度更快;
• syncDynPhases = True:各轴加减速、匀速阶段完全同步、耗时相同。两点之间的轨迹更接近一条直线,重复一致性更好,但执行时间略长。
抓放节拍优先选前者,对轨迹一致性有要求选后者。
中间点不用停:平滑半径(Blending Radius)
Pick & Place 的诉求是尽快从取料点 P1 到放料点 P4,中间的 P2、P3 往往只是避让障碍的"过路点",逐个精确停到位既没必要又拖节拍。
库允许给中间点定义一个平滑半径:TCP 一旦进入该点周围的半径球,就提前向下一个点过渡,不再精确经过该点。半径越大、过渡越圆滑,但实际轨迹也越"不精确"——它取决于当时编程的动力学值,不同速度下轨迹可能有差异。
两个使用细节:
• 平滑半径按"该段各轴最短行程的百分比"设定,用户常量里有百分比上限(默认 50%),超了会被自动截断,且没有任何接口反馈,需要自己把半径留够;
• 协调计算在 OB1 主循环里完成,扫描周期负载会影响进入平滑半径的判定时机,路径速度越快、CPU 负载越高,TCP 切入半径的深度越不一致。半径要留足余量。
另外必须认清边界:sPTP 不是轨迹精确的路径运动。它追求的是快和流畅,不能用于涂胶、焊接这类要求沿指定曲线精确行走的工序。
库里有什么:2 个 FB + 3 个 DB
Master copies 里分三个文件夹:LAxesGrpCtrl_Types(PLC 数据类型)、LAxesGrpCtrl_Tags(用户常量表)、LAxesGrpCtrl_Blocks(程序块)。核心对象如下:
| | |
|---|
| | 主控块,在 OB1 调用一次即可。execute 上升沿启动后,自动顺序走完 PathDefinition 里的全部插补点;支持 stop、interrupt(暂停后可再触发 execute 恢复)、reset,以及路径间平滑 pathTransition、全局动力学系数 globalDynamicsFactor |
| LAxesGrpCtrl_ExecutePosCmd | 单点定位块。支持绝对/相对定位,可用 usedAxes 只让某一根轴动作——回零前把各轴依次挪到安全位就是靠它。正常跑路径不用直接调它 |
| | 轴数组。在 OB100 StartUp 里把工艺对象依次填入 kinematicsAxes[0]=X、[1]=Y、[2]=Z |
| | 路径数组。每条路径含路径名 pathName、各轴动力学 axesDynamics、插补点 points(点类型、坐标、该点动力学系数、平滑半径) |
| | 预置点表。可由 HMI 示教自动写入;路径中点类型填负值(如 -5)即引用点表索引 5,便于多条路径集中共用、统一修改点位 |
插补点类型 pointType 有四种取值:0 = 该点无效跳过;1 = 绝对目标位置;2 = 相对当前 TCP 的增量;负值 = 引用点表。
6 个用户常量:先设对,再编译
库容量全部由用户常量决定,改完必须完整编译软件才生效。为省 CPU 存储,按需设置、别贪大:
• LAXESGRPCTRL_LAST_NUMBER_OF_AXES:轴数减 1,三轴系统填 2;
• LAXESGRPCTRL_LAST_NUMBER_OF_PATH_DEFINITION_POINTS:单条路径插补点的最大索引,5 表示可有 6 个点,至少填 1(起点+终点);
• LAXESGRPCTRL_LAST_NUMBER_OF_PATH_DEFINITIONS:可存路径条数减 1,2 表示 3 条路径;
• LAXESGRPCTRL_SIZE_OF_POINT_TABLE:点表点数;
• LAXESGRPCTRL_MAX_BLENDING_VALUE:平滑半径占段长百分比上限,默认 50;
• LAXESGRPCTRL_LENGTH_OF_NAME:路径名字符长度,默认 10。
上手流程(TIA Portal V21)
1. 下载库 ZIP 解压,在"全局库"中打开;
2. 依次把 Types、Tags、Blocks 三个文件夹拖入用户项目对应目录;
3. 在 PLC 变量的"用户常量"页设好上述 6 个常量,完整编译软件,生成对应 DB;
4. 在 Motion Control → PTO 下为每根轴新建工艺对象 TO_PositioningAxis_PTO:配脉冲发生器与脉冲形式(V90 支持 A/B 相脉冲、脉冲+方向;S200 还支持正转脉冲+反转脉冲)、机械参数(丝杠导程)、软硬限位、最大动力学、急停减速度、主动回零;
5. 在 OB100 里把轴对象写入 KinematicsAxes 数组;
6. 在 OB1 调用 LAxesGrpCtrl_Main 并关联各 DB;
7. 在 PathDefinition 里填路径:路径名、各轴速度/加减速度、各插补点坐标与平滑半径;
8. 投运顺序:MC_POWER 使能 → MC_RESET 确认故障 → MC_HOME 回零(建议逐轴依次回零防碰撞;用绝对值编码器只需标定一次)→ execute 上升沿启动路径。
启动前提醒一句:触发后 TCP 会先直接走向路径第一个有效点,务必先确认起点附近无碰撞,必要时先用单动方式把 TCP 放到安全位。
动力学设置的三个坑
• Jerk(加加速度)不参与库内部路径计算。工艺对象里的 jerk 限制应禁用、设为不限或给一个很大的值,否则结果不可预期;
• 路径里动力学值填负数,表示沿用工艺对象里设定的最大值;填得超过 TO 上限会被自动限制;
• PTO 有频率下限:给定速度对应的脉冲频率若低于 TO 里设的启动/停止频率,轴根本不动,协调路径就会被带偏。G2 板载输出最高 100 kHz(Aa.0~Aa.3,其余点 20 kHz),信号板 100 kHz,5V 信号板可达 200 kHz。
另外,库里部分内部 FC 要求非优化块访问,如果被改成优化访问会报区域长度错误(Area length error),保持默认即可。
故障排查:常见状态字与错误码
块的 status 输出遵循 16#0000~7FFF 为状态、16#8000 以上为错误的约定,现场常用的几个:
四类运动学方案怎么选
西门子官方在该条目页给出了 S7-1200/1500 家族四个抓放/运动学方案的对照,选型时可以直接对着看:
| | | | |
|---|
| | | | |
| V90 PTI/PN、S200 全系、S210(PROFIdrive 有限制) | 仅 PTI 脉冲驱动(V90 PTI、S200 PTI) | | |
| | | | 门架、Delta、SCARA、关节臂、Tripod、圆柱、自定义等 |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
一句话总结:小型 G2 + 脉冲驱动做直角坐标抓放,用本篇的 LAxesGrpCtrl;1500 平台要 HMI 模板和更完整功能看 Kinematics Operate;要多构型机器人、直线圆弧、输送带跟踪,得上 S7-1500T + Kinematics Integrator。
写在最后
S7-1200 G2 这一代把运动学能力收进了原生 TO_Kinematics,LAxesGrpCtrl 的舞台确实变小了——但只要现场还有"经济型 G2 + 板载 PTO + V90/S200 PTI 脉冲驱动"这种讲究成本的抓放设备,它就是官方给的现成答案:不用自己写多轴时间分配,不用自己处理平滑过渡,填路径表、调一个 FB 就能跑。
用的时候记住三条边界:只认直角坐标、只做抓放不做精确轨迹、PTO 频率和扫描周期要留余量。剩下的,照着程序示例改就行。