
前阵子刚交付了一个用 S7-1200G2 做四轴运动控制的小项目从最开始选型号、组态工艺对象到后面写逻辑、现场调试踩的坑不算少但把整套流程完整跑通之后再回头看这个平台其实逻辑很清晰难的是你愿不愿意把每一步都吃透。这篇内容就围绕S7-1200G2 运动控制这条主线展开重点讲清楚三件事轴组配置怎么做、运动控制程序怎么组织、到了现场又该怎么调试。适合刚接触 S7-1200G2、之前只用过老款 S7-1200 或者 S7-200 SMART 的电气工程师、调试工程师也适合那些想把多轴定位控制从能转做到转得稳、调得快的朋友参考。1. 项目背景与需求拆解1.1 为什么这一代会选 S7-1200G2先说结论S7-1200G2 不是 S7-1200 换个外壳那么简单。它的 CPU 性能提升非常明显工作存储器扩大运算速度上了一个台阶尤其是在运动控制相关的指令处理和轴对象管理上明显比第一代 S7-1200 从容很多。第一代 S7-1200 做运动控制CPU 1214C 最多能管 4 个轴而且当轴数多了以后逻辑扫描周期和运动控制周期的相互影响会比较明显。G2 这一代在轴数上限上做了扩展高端型号可以做到更多轴同时高速输出和高速计数的配合精度也更好脉冲输出频率也有提升。对于大多数中小型设备一台 G2 CPU 直接管理 4 到 8 根轴已经完全够用了不用额外加运动控制器成本和控制复杂度都能压下来。另外G2 在通信能力上更友好PROFINET 口是标配CPU 本体的网口用来连触摸屏、上位机、远程 IO 都很方便。调试的时候直接在线访问不用来回插拔网线。1.2 设备与项目需求确认我这次项目是四台步进电机控制每一台分别带动一个独立工位完成水平和垂直方向的位置定位。之所以用步进而不是伺服是因为负载轻、定位精度要求不高±0.1mm 足够用步进能把成本压到很低而且调试简单。硬件清单大概如下西门子 S7-1200G2 CPU具体型号 1214C DC/DC/DC外加一个 24V 传感器电源四台步进驱动器拨码设置为脉冲加方向模式单脉冲 2000 脉冲每转四台 57 步进电机带 1:10 行星减速机输出端接同步带机构每根轴配两个接近开关一个做原点一个做负限位四个 24V 中间继电器作为使能信号输出隔离防止驱动器干扰 PLC 输出选择 S7-1200G2 还有一个很现实的原因博途软件支持完善。TIA Portal V20 及以上版本可以直接建 S7-1200G2 的站点运动控制工艺对象也在同一套软件里配置不需要额外插件。1.3 运动控制需求的确认你要的到底是轴组还是单轴很多人一听到轴组配置就觉得要搞多轴插补、龙门同步、圆弧插补。在 S7-1200G2 这个平台里我更愿意把轴组理解为多轴工艺对象的组态管理而不是 CNC 插补。G2 不支持像 S7-1500T 那样做运动学机构也不支持复杂的多轴插补它的强项是单轴定位、多轴独立运行和通过程序逻辑做简单联动。所以在项目启动前先明确需求这台设备有没有多个轴必须同时按一定比例运动的场合有没有轨迹必须是圆弧或直线插补的场合如果是S7-1200G2 可能不是最优选择需要上带 T-CPU 或独立运动控制器。如果只是这根轴走 500mm那根轴同时走到 300mm然后各自停止那 G2 完全没问题而且性价比非常高。2. 轴组配置工艺对象从创建到参数化2.1 添加工艺对象在博途里运动控制轴不是直接编程而是先添加一个工艺对象Technology Object然后通过 PLCopen 指令去控制这个对象。操作路径左侧项目树 → PLC_1 → 工艺对象 → 新增对象 → 运动控制 → 定位轴PTO或者速度轴。我四个轴全部用的是定位轴PTO因为我们需要做绝对定位和相对定位速度轴适合那种只要求持续运行的场合比如输送带恒速驱动。添加之后每个轴都会生成一个对应的轴名称比如 Axis_1、Axis_2。这个名字后面所有程序里都要引用最好一开始就定义得规范比如 Axis_L1、Axis_R1、Axis_L2、Axis_R2千万不要叫 Axis_1、Axis_2、Axis_3、Axis_4否则程序写多了自己都记不住。2.2 关键参数怎么填轴参数配置是整个运动控制能否稳定运行的核心我建议按顺序逐个填不要跳。驱动参数选择脉冲 A 和方向 B还是双脉冲 CT我用的驱动器支持脉冲加方向就选第一种。脉冲输出通道要分配到 PLC 本体的高速输出点S7-1200G2 的 1214C 本体默认有四个高速输出通道正好对应四个轴。如果是更高轴数可能要用到信号板扩展选型的时候就要提前确认。编码器参数步进电机没有外部编码器所以选择内部计算也就是 PLC 根据发出的脉冲数来计算实际位置。如果是伺服电机带编码器反馈可以选择外部编码器把编码器信号接入高速计数器这样位置闭环更可靠。但步进场景下只要不丢步内部计算足够用。机械参数这一步最容易出错。我建议先在纸上画一下传动链电机轴 → 减速机10:1→ 同步带轮 → 负载机械部分的每转电机对应的负载距离要算准确。以我其中一根轴为例同步带轮节圆直径约 48mm周长约 150.8mm。减速比 10:1即电机转 10 圈带轮转 1 圈负载移动 150.8mm。所以负载每转这个值实际含义是电机转一圈负载移动多少距离也就是 150.8 ÷ 10 15.08mm。这个数字填进去以后配合脉冲数 2000 脉冲/转软件会自动算出每个脉冲对应的位移量。如果这个数算错了设备标定出来的定位距离会整体偏差后面再查就非常痛苦。限位参数正负硬限位建议一开始就接上千万别偷懒。很多人觉得反正有软限位硬限位可接可不接。但实际现场一旦电机过冲、驱动器参数没调好软限位就是一层纸。我在轴组配置里全部启用了硬件限位输入负限位接到接近开关正方向限位在行程末端用机械挡块加检测开关。动态参数加速度、减速度、急停减速度。这里有两条经验运行加速度不要拍脑袋填先按设备工艺节拍估算然后在现场从低到高慢慢提升直到出现明显丢步或机械振动再回调 20%急停减速度必须比运行减速度大但也不要大太多否则机械冲击很容易把同步带拉断我习惯先设置加速度 200mm/s²、减速度 200mm/s²、急停减速度 800mm/s²然后根据现场实际节拍要求去调。2.3 轴组配置的三条铁律第一单位一定要统一。我全部用 mm 和 mm/s不搞混用。如果某根轴用 mm、另一根轴用 inch程序里换算非常容易出错。S7-1200G2 的工艺对象里单位可以选一定要在项目最开始就定下来。第二一根轴对应一个工艺对象不要多个设备复用同一个轴对象否则两个设备互相抢轴程序逻辑会乱得没法看。即使两根轴机械结构完全一样也必须建两个工艺对象。第三轴名称、轴编号、物理通道要有一个对应表。我项目里做了一张 Excel 表格列清楚Axis_L1 对应本体 Q0.0 和 Q0.1对应电机 1对应原点开关 I0.0这张表在整个调试期间一直在更新极大减少了现场排查问题的时间。3. 运动控制程序设计与编写3.1 PLCopen 指令选型S7-1200G2 运动控制使用的是 PLCopen 标准指令具体分几类MC_Power轴的使能/去使能。任何运动指令执行前必须先把对应轴使能这是所有运动控制的大前提MC_Home回零确定机械原点位置。步进电机的回零方式一般是主动找原点开关碰到后把当前位置设为 0MC_MoveAbsolute绝对定位运行到指定位置。前提是已经完成回零否则绝对位置就是空中楼阁MC_MoveRelative相对定位从当前位置开始走一定距离。不受原点影响MC_MoveVelocity恒速运行适合输送带等场景MC_Halt平滑停止MC_Stop紧急停止一般配合急停按钮MC_Reset确认轴故障清除错误我的程序框架里这四个轴都各自封装了一个功能块FB里面调用上述指令统一管理轴的使能、回零、定位和停止逻辑。主程序里只需要给每个 FB 传入目标位置、运行速度和启动命令这样后期维护非常方便。3.2 程序架构与状态机设计运动控制程序最忌讳的就是直接用一大堆 M 变量东拉西扯。我习惯的做法是给每个轴做一个轴状态机内部有复位状态、使能状态、回零状态、待机状态、运行状态、暂停状态和故障状态。主流程大概是这样设备上电 → 所有轴 MC_Reset 清除历史故障 → 等待使能命令 → MC_Power 使能成功 → 等待回零完成信号 → 主程序根据工艺节拍给各轴发送定位命令 → 定位完成以后进入待机 → 收到停止命令或者急停信号进入停止流程。这个状态机的好处是任何时候你都能从轴的当前状态判断出它到底卡在哪一步而不必去猜。现场调试的时候报警停机了直接看 FB 里的状态字就知道是没使能、没回零还是指令报错。3.3 关键程序段与 SCL 示例下面给出一个典型的单轴定位调用示例SCL 代码可以直接在博途里建一个 FB 测试// 轴使能 MC_Power_Axis1( Axis : Axis_L1, Enable : #bEnableCmd, StopMode : 2, // 1: 急停减速度停止, 2: 使用轴组态里的急停减速度 Power #bPowerDone, Status #bPowerStatus, Error #bPowerError, ErrorID #iPowerErrorID ); // 相对定位 MC_MoveRelative_Axis1( Axis : Axis_L1, Execute : #bStartCmd, Distance : #rTargetDistance, Velocity : #rMoveSpeed, Acceleration : #rMoveAcc, Deceleration : #rMoveDec, Jerk : 0.0, Done #bMoveDone, Busy #bMoveBusy, CommandAborted #bMoveAborted, Error #bMoveError, ErrorID #iMoveErrorID );这段程序里有两个细节值得注意。第一个是 MC_Power 的 StopMode 参数。默认情况下轴使能断开后轴会按组态里的急停减速度停止这个参数要认真对待。如果不希望使能断开时用那么猛的减速度停下来可以在 StopMode 里选择使用轴的动态参数也就是普通减速度但这样的话安全急停的效果会被削弱。我现场是分两个场景普通停止用 MC_Halt急停按钮触发时直接把 MC_Power 的 Enable 置 false同时 StopMode 设为 2保证快速刹停。第二个是 Jerk加加速度参数。S7-1200G2 支持加加速度限制如果设为零那么加速度变化是瞬时的对于轻载步进问题不大对于重载机构建议给一个小值来过滤掉启动瞬间的冲击。我的同步带机构负载轻Jerk 设 0定位更快后来有一根轴负载较重我加了 100mm/s³ 的 Jerk机械撞击声明显下降。3.4 速度曲线与加减速经验定位控制的核心是速度规划。S7-1200G2 的定位轴默认走梯形速度曲线加速段、匀速段、减速段。加速段和减速段完全对称所以实际定位时间可以这样估算总距离 加速距离 匀速距离 减速距离如果总距离 d 大于等于 2 × 加速距离就存在匀速段如果太小速度还没上到设定值就开始减速此时最高实际速度会小于设定值定位时间会变长。现场调试时我发现一个经典问题把定位距离改短以后电机速度明显变慢后来一算才发现是距离不够梯形变成了三角。这个不需要改参数如果你希望短距离也能跑出速度需要提升加速度。另外步进电机在高速段扭矩会明显下降所以设定速度不要超过电机矩频特性的安全区。我用的 57 步进电机驱动器拨码细分 10对应 2000 脉冲每转设定速度跑到 120mm/s 时对应电机转速约 4800rpm 带减速机后已经开始出现轻微丢步的情况。我把速度降到 100mm/s同时加速度从 800 降到 500问题消失。经验是速度参数要给余量不要卡在电机的极限附近。4. 程序调试全流程实录4.1 离线仿真先跑一遍S7-1200G2 在博途里支持运动控制的仿真虽然没有真实电机反馈但可以验证程序逻辑、状态机跳转、指令调用顺序是否正确。我建议在仿真里把每个轴的回零、定位、报警恢复流程都跑一遍。特别是定位过程中断开使能这种故障场景仿真里能看到指令报错 NotDone并且上电后必须用 MC_Reset 复位才能重新使能。这些不提前搞清楚现场遇到会慌。仿真还有一个用处确认轴组态的机械参数换算结果是否合理。在工艺对象在线监控里可以直接看到每脉冲的距离这个计算值仿真前就把 15.08mm/转 这个值验证清楚避免到了现场发现整体定位距离偏差。4.2 上电点动调试仿真通过以后连上 PLC进入真正的调试环节。我习惯的第一步是点动。在博途运动控制调试面板里选择对应的轴 → 点动按钮 → 设定点动速度比如 10mm/s然后按下正方向点动。这个步骤主要确认几个关键点电机方向是否正确。如果按下正方向电机反向走说明驱动器方向信号接反或者是脉冲加方向逻辑不对要在驱动器或者组态里改方向电机是否有异响、振动。如果步进电机低频振动明显可能是细分设置不对也可能是电流设置偏小实际位移方向与组态的正方向定义是否一致。不一致的话后面回零、限位逻辑全都会反点动确认后把点动速度逐步提高比如 20、50、80、100mm/s在高速点动下听声音是否正常观察电机是否丢步。这个阶段不需要接负载可以先把电机和减速机放在台架上空跑有问题提早暴露。4.3 回零与限位调试回零调试是整个项目现场最容易出问题的一环原理很简单轴朝指定方向找原点开关碰到开关后减速停止然后把当前位置设为原点。但在实际操作中有几个细节极易踩坑。第一个坑原点开关要装在不会在正常运动中误碰的位置。我有一次把原点开关装在负限位旁边结果回零过程中轴先撞上负限位直接报限位故障后来把原点位置往正方向挪了一段距离才解决。第二个坑主动回零结束后轴的当前位置并不一定正好在机械零点上取决于接近开关的感应位置和减速的停止位置。如果设备要求零点精度高需要在组态回零参数里开启主动回零后执行校准移动也就是回零碰到开关后再做一次基准定位。这个配置可以在工艺对象的回零属性里找到。第三个坑限位开关和原点开关不能共用一个输入点。虽然物理上可能靠得很近但 PLC 程序里必须用两个独立的输入点否则限位信号和原点信号互相影响。4.4 监控表与 Trace 追踪调试过程中博途的监控表和 Trace 功能非常好用。我习惯在监控表里把每个轴的关键状态字、当前位置、当前速度、目标位置、指令的 Done/Busy/Error 全部拖出来排成一张大表然后按 F5 持续监控。比如定位命令下发以后看到 Busy 一直为 true、Done 一直为 false而当前位置已经不变化了那就极有可能是速度或加速度设置太小、实际还没到位或者命令被其他条件中断。Trace 功能更适合看动态曲线。比如轴的设定位置和实际位置曲线是否平滑速度曲线是否有突变位置跟随是否超调。我用 Trace 抓过一次定位完成前后的位置曲线发现定位到位瞬间有明显过冲现象后来在动态参数里把减速度调低过冲消失。没有 Trace 的话这样的问题基本只能凭感觉猜。4.5 常见问题与排查速查现象可能原因排查思路电机不转轴报错误MC_Power 未使能或故障未清除先执行 MC_Reset等待 Power 状态字为 true再发运动指令电机转了但方向反驱动器方向信号或组态方向参数反了点动确认反接方向线或勾选反向方向定位距离偏大或偏小机械参数负载每转计算错误核算减速比和带轮周长用 Trace 看实际位置对比电机高速丢步速度超过步进电机安全区加速度过大降低速度降低加速度或换大电流设置回零结束后原点位置不准确有减速过程停止位置与感应点不一致开启回零后校准移动或降低回零速度运行时突然报限位错误但机械并未撞限位限位开关信号抖动或输入接线接触不良用监控表观察 I0.x 状态确认是否因振动误触发定位完成后有机械过冲减速度太小或负载惯量大增大减速度或加 Jerk 限制必要时机械加装阻尼这张表在现场调试时非常实用我把它打印出来贴在电柜门上调试完以后直接留给客户做了维护手册。5. 避坑总结与个人经验项目整体下来我的最大体会是S7-1200G2 的运动控制功能本身非常成熟它不像以前做步进控制要靠定时器去手动发脉冲而是把所有底层逻辑都封装好了你要做的是在组态里把机械参数填对在程序里把指令调用顺序理对剩下的事情硬件自己处理。这里再分享一个我踩过的坑轴使能状态和系统急停必须分开处理。我之前做一个设备把急停信号直接接到了 PLC 的 STOP 输入设备一按急停PLC 直接停机轴失去使能变频器、驱动器全部掉电。表面看很安全但实际上 PLC 停机后跟不上急停减速度电机会因为惯性继续滑行位置就丢了。后来我把急停改为只复位 MC_Power 的 Enable同时走 MC_Stop 指令让轴按急停减速度快速停稳然后再断使能位置不会丢太多上位机也能及时捕获到急停状态。还有一个容易被忽略的点S7-1200G2 工艺对象在线访问时轴的状态字特别是跟随误差非常适合用来判断机械问题。有一次设备运行中偶发位置偏差我查看轴状态字发现跟随误差超限报警但机械也没卡死。后来逐项排查发现是同步带一个张紧轮轴承碎裂导致负载波动。这个报警在纯脉冲控制时代根本不可能监控到这也是 S7-1200G2 做运动控制的好处之一。最后讲一个调试习惯每完成一个轴的调试点立刻在项目的PLC 变量注释和工艺对象注释里更新自己的测试结论比如Axis_L1 点动速度 80mm/s 正常超过后丢步。别指望靠脑子记现场数据一多一天以后你连哪根轴调过都记不住。S7-1200G2 这套平台说实话上手门槛不高真正拉开差距的是对轴组参数的理解、程序架构的设计和对运动控制细节的把控。如果你也在做类似的多轴定位项目建议把组态和程序调试的每一步都记录好尤其是机械参数换算和限位逻辑项目交付后维护起来会非常省心。