去年接了一个传感器装配工装的项目,转盘旁要加一台步进电机驱动的推料机构:正转把物料推到检测位,检测完再反转退回来,转速要在触摸屏上能调。用西门子S7-1200做PLC控制步进电机,听起来无非是梯形图加脉冲输出,但真从I/O分配到博途组态到现场跑通,中间还是有几个容易被新手低估的坎。这篇文章就按我当时推进项目的顺序,把硬件选型、接线、运动轴组态、梯形图编写和调试排错全过一遍,给准备用S7-1200带步进电机的朋友一个可以直接抄的作业。
1. 硬件选型:晶体管输出的CPU是绕不开的门槛
1.1 为什么S7-1200比200 SMART更适合做步进控制
很多人问我,200 SMART不是也能发脉冲吗?为什么选S7-1200?确实200 SMART的PTO/PWM功能也不差,但耐不住S7-1200在博途里的运动控制工艺对象做得完整,调试和监控体验好太多了。你可以直接在轴对象里组态单位、加减速、限位、回原点,梯形图只需要调用几个运动控制指令块,不用自己去算PTO包络、管理脉冲数,这对做非标设备来说非常省心。
选具体型号时有一点必须说在前面:如果要输出高速脉冲,必须选DC/DC/DC的晶体管输出型CPU。继电器输出型的S7-1200输出响应时间在毫秒级,根本发不出步进驱动器需要的几十kHz脉冲,即使你勉强把梯形图写出来,电机也是抖着走的,所以别在选型上省这个钱。我当时用的是CPU 1214C DC/DC/DC,6个高速输出通道,Q0.0/Q0.1作为脉冲和方向输出足够用了。
1.2 步进电机、驱动器和电源怎么配套
步进电机我选的是57系列的57HS22,搭配导程5mm的丝杠模组。57步进在中小型装配机构里属于性价比很高的选择,扭矩够用,体积也不算夸张。如果你做的是很轻的负载,42步进电机也完全够,热词里常有人问42步进电机怎么驱动,其实控制逻辑完全一样,区别主要在电流和扭矩上。
驱动器用的是TB6600和DM542都试过,个人觉得DM542的电流设置和抗干扰表现更好一点,但TB6600便宜量大,调试也方便。关键要把驱动器的工作模式设置为“脉冲/方向”,有的驱动器默认是“双脉冲”模式,接正反转脉冲的时候接线方式完全不同,上电前一定要看说明书。
电源方面,我是PLC和驱动器分开供电的,PLC用一个24V/2A开关电源,步进驱动器单独用了一个24V/4A开关电源。分开供电不是浪费,是减少干扰——步进电机启停瞬间电流波动很大,如果和PLC共用电源,很容易导致CPU偶发停机或模拟量跳变,这个坑我在早期项目里踩过,后来就再也没合用过。
1.3 I/O分配表:动手写程序前先把这个表填好
I/O分配是整个项目的地基,不能边写程序边拍脑袋。我当时的分配表是这样定的:
| 信号名称 | 地址 | 类型 | 说明 |
|---|---|---|---|
| 正转启动按钮 | I0.0 | DI | 常开,按下启动正转 |
| 反转启动按钮 | I0.1 | DI | 常开,按下启动反转 |
| 停止按钮 | I0.2 | DI | 常开,程序内取反处理 |
| 急停开关 | I0.3 | DI | 常闭,断开即急停 |
| 正转限位 | I0.4 | DI | 正方向限位,常闭 |
| 反转限位 | I0.5 | DI | 反方向限位,常闭 |
| 原点接近开关 | I0.6 | DI | 回原点用,常开 |
| 轴0脉冲输出 | Q0.0 | DO 晶体管 | 发步进脉冲,接驱动器PUL+ |
| 轴0方向输出 | Q0.1 | DO 晶体管 | 接驱动器DIR+ |
| 驱动使能 | Q0.2 | DO | 接驱动器ENA,低有效或按驱动器定义 |
| 运行指示灯 | Q0.3 | DO | 正转/反转启动时亮 |
这里有一个很关键的细节:Q0.0是高速脉冲输出,Q0.1是方向信号。很多教程会让你再单独用一个输出做方向,但博途运动轴对象组态时会把脉冲和方向绑定到一个轴,方向信号其实是被系统自动管理的,不需要你在梯形图里手动置位或复位。
还有,建议把急停按钮接到常闭触点而不是常开。万一急停线路断线了,PLC能第一时间判断出故障,如果你用常开,线断了系统反而不知道,这是安全逻辑上的基本要求。I0.3在程序里用常开触点读取,导线正常连接且急停未按下时它一直是1,一旦急停按下或线路断开就变成0。
2. 接线与驱动器设置:脉冲、方向、使能的接法
2.1 共阳还是共阴:S7-1200的输出特性和驱动器输入端子匹配
这是很多新手最容易搞混的地方。S7-1200晶体管输出是PNP高电平有效,输出点导通时输出电压接近24V。而TB6600、DM542这类步进驱动器的脉冲输入端通常是一对光耦,以TB6600为例,端子为PUL+和PUL-,内部是一个发光二极管加限流电阻,电流从PUL+流进、从PUL-流出,光耦才导通。
所以正确接法是:
- 驱动器的PUL+接PLC输出点(如Q0.0)
- 驱动器的PUL-接PLC公共端(电源0V)
- 驱动器的DIR+接Q0.1,DIR-接0V
- 使能ENA可以悬空或者根据驱动器手册单独控制
PLC输出高电平时,电流从Q0.0流入PUL+,再从PUL-流回0V,光耦导通。这个接法对于S7-1200来说最自然。千万不要用“PUL+接24V,PLC输出接PUL-”的低边接法,那是针对继电器输出或者漏型输出PLC用的,强行接到S7-1200晶体管输出上,输出点可能过流或者根本不工作。
有人会问,PLC输出高电平时不是24V吗,步进驱动器脉冲输入一般只能承受5V或24V?其实大多数国产驱动器输入光耦已经内置了适配24V的限流电阻,所以直接用24V高电平驱动没问题。但如果你用的驱动器说明书写的是5V信号,就需要在PLC输出和驱动器之间加电阻限流,或者用中间继电器转换,别硬怼。
2.2 细分和电流拨码:直接影响运行精度和发热
驱动器上最需要认真设置的拨码就是细分和电流。我的57电机额定电流是2.8A,驱动器电流拨码按2.0A整定,运行久了电机温升还在可接受范围。电流不是越大越好,大了电机发热严重,小马拉大车时又会失步,一般按电机额定电流的70%~90%设置比较稳。
细分我设置成1600步/圈。为什么是1600?因为驱动器常见的细分档位有800、1600、3200、6400,1600在精度和速度之间比较平衡。细分越高,每一步对应的角度越小,电机运行越平滑,但同样的脉冲频率下电机转速越慢。比如我后面要算脉冲当量:丝杠导程5mm,驱动器细分1600步/圈,那么每个脉冲对应的直线位移是5mm÷1600=0.003125mm,也就是3.125微米。这个精度对装配工装来说够了,如果用6400细分,精度是有了,但同样的PTO频率下最快速度只有1600细分时的一半,得不偿失。
2.3 电源回路和屏蔽线:稳定运行不能只靠运气
步进驱动器的电源线尽量直接接到开关电源的两个端子,不要经过中间长距离转接。我用1.5mm²的软线,长度控制在0.5米以内。开关电源上也建议并联一个25V/470μF的电解电容,用来吸收电机频繁启停时产生的反向电动势。
脉冲和方向信号线必须用双绞屏蔽线,最好一路信号一根屏蔽线,屏蔽层单端接到驱动器侧的电源0V或接地排。我把PLC输出线和步进电机动力线分槽布置,横向距离至少隔开10厘米。现场电磁干扰的问题很玄学,但只要接线规范,至少能把绝大多数干扰挡在门外。
3. 博途运动轴组态:把Q0.0变成“Axis_1”
3.1 添加工艺对象“定位轴”
打开TIA Portal,在项目树左侧“工艺对象”下点击“添加新对象”,选“定位轴”,名称改成Axis_1。组态时选择“PTO(脉冲A和脉冲B)”——注意如果你的驱动器是脉冲/方向模式,这里的“脉冲A和脉冲B”在下一步会有更多选择,实际我们只需要一个脉冲输出加一个方向输出;如果博途版本里有“脉冲/方向”选项,直接选它。
然后选择集成的输出:脉冲输出选Q0.0,方向输出选Q0.1。S7-1200的运动轴对象会把这两个点绑定起来,以后你在梯形图里调用MC_MoveVelocity这类指令,系统会自动根据速度的正负去切换Q0.1的电平,不需要你额外写方向控制梯形图,这是S7-1200运动控制最舒服的地方。
3.2 机械参数和单位换算:把“脉冲数”翻译成“毫米”
在轴组态里必须告诉PLC你的机械结构是什么。电机每转脉冲数填1600,减速比填1(如果电机和丝杠直连),负载位移填5mm,单位选mm。这些参数填好后,你在程序里设定的速度单位就成了mm/s,而不是每秒多少个脉冲。比如我后面触摸屏上写50,就是50mm/s,这就直观多了。
加速度和减速度的初始值不要给得太激进。很多第一次用运动轴的人习惯性填个5000mm/s²,然后电机一启动就啸叫甚至失步。我当时先用500mm/s²试跑,觉得响应太慢再一步步往上加,最终稳定在800mm/s²。具体数值和负载惯量强相关,别迷信推荐值。
3.3 限位、急停和回原点的组态
在轴对象的“硬限位”选项卡里,把所有限位信号关联进来。正限位接I0.4,负限位接I0.5,动作模式选“立即停止”。注意这些限位信号必须是常闭触点,否则限位开关断线时系统不会报警。
急停我放在MC_Power指令的使能条件里,没有单独在轴组态里配。程序里MC_Power的Enable输入接“急停未按下且无报警”,这样急停一断,轴使能立即解除,驱动器收不到脉冲,电机自然停住。比在轴上组态急停输入更直接,也好排查。
回原点我后面加了MC_Home,这个在第五章说。
3.4 博途“资源使用情况”怎么查
调试前可以在博途里先看一眼PLC的资源余量。操作方式是在项目树里右键CPU,选择“属性”,在“资源”选项卡里能看到CPU内存占用率、装载内存占用率、工作内存占用率,还有位存储器、定时器等资源使用情况。如果工艺对象多了,这里也能看到运动控制资源占用。在线状态下还可以打开“在线和诊断”-“存储器”页面,看运行中的实际负载。
为什么我要提这个?因为S7-1200虽然是中型PLC,但工艺对象和运动控制指令比较占资源。如果你同时开了好几个轴对象,又加了一堆DB块,编译时会提示“无法创建运动控制实例”或者“资源不足”,这时候就得回头精简程序或者换更大内存的CPU。早发现比上线后发现好处理多了。
4. 梯形图实战:正反转、顺起逆停和调速
4.1 程序变量规划
先规划好要用的变量,别在写梯形图时临时造地址。我这里建了一个全局DB“HMI_Data”,存放速度和状态信息:
| 变量名 | 类型 | 初始值 | 说明 |
|---|---|---|---|
| Speed_Set | Real | 50.0 | 触摸屏设定速度,单位mm/s |
| Run_Pos | Bool | FALSE | 正转运行标志 |
| Run_Neg | Bool | FALSE | 反转运行标志 |
| Axis_Error | Bool | FALSE | 轴故障标志 |
| MC_Active | Bool | FALSE | 轴运动中标志 |
梯形图采用“控制标志位+调用运动控制指令”的结构,这样做的好处是运动控制指令不会在同一个扫描周期里被反复启停,逻辑清爽。
4.2 网络1:MC_Power使能与急停逻辑
MC_Power是运动轴的电源使能指令,相当于给轴“送电”。我这样写:
网络1:轴使能 I0.3(急停常闭触点) M1.0(无报警) ----| |-----------------------| |---------[ MC_Power ] Enable: %DB_Axis_1_MC_Power, Enable StopMode: 2控制逻辑是急停常闭触点I0.3为1且无报警时,Enable为TRUE。StopMode设成2,表示急停时按组态的急停减速停止,而不是立刻抱死;如果设备有安全需求要立即停,可以设成1,但机械冲击会大一些。
4.3 网络2和3:正转启动、反转启动与互锁
正转启动按钮I0.0用上升沿P触发,置位Run_Pos,复位Run_Neg。反转启动按钮I0.1同理,置位Run_Neg,复位Run_Pos。这一步就是互锁,保证两个方向不会同时运行。
然后调用MC_MoveVelocity:
网络2:正转启动 I0.0(上升沿) M0.0 Run_Pos ----|P|-----------------( S ) Run_Pos M0.1 Run_Neg ( R ) Run_Neg 网络3:反转启动 I0.1(上升沿) M0.1 Run_Neg ----|P|-----------------( S ) Run_Neg M0.0 Run_Pos ( R ) Run_Pos运动控制指令这样接:
网络4:连续速度运动 M0.0 Run_Pos MC_MoveVelocity ----| |-------------------------------| Execute: Motor_on | M0.1 Run_Neg | Velocity: 速度 | ----| |-------------------------------|| |其实在博途里梯形图直接调用MC_MoveVelocity时,Execute用边沿触发更好,但我们的标志位M0.0/M0.1在整个运行期间一直为TRUE,所以MC_MoveVelocity的Execute端会一直有信号,这样也舒服——轴会持续按给定速度运行,直到收到停止或新的速度指令。
速度值怎么接?我直接从DB“HMI_Data”.Speed_Set取,正转时把Speed_Set传给Velocity,反转时把Speed_Set取负后传给Velocity。如果你不想做正负速度切换,也可以把方向信号交给轴对象自动处理:MC_MoveVelocity的Velocity只填正值,另用MC_MoveDirection或轴的方向参数控制。但我个人习惯用速度的正负来控制方向,这样程序最直观,也可以在触摸屏上自由设定顺转逆转速度。
4.4 停止、限位和“顺起逆停”逻辑
停止按钮I0.2为常开触点,用常闭触点串联在运行标志位上。限位信号I0.4和I0.5也要参与到停止里:正转限位动作时,把Run_Pos复位并调用MC_Halt。
MC_Halt的梯形图逻辑:
网络5:停止/限位停机 I0.2(停止) M0.0 Run_Pos M0.1 Run_Neg MC_Halt ---| |--------|/|-----------|/|------------------|Execute|停止后把方向标志复位。限位动作时也可以触发一个报警位,让触摸屏显示“到达限位”。
热词里有个“西门子s7-1200顺起逆停”,其实就是一种特殊的控制要求:正转启动按钮启动顺时针运行,反转启动按钮不光启动逆时针,还承担“停止+反转”的任务。我做过类似的收放卷机构,梯形图逻辑和普通正反转有一点区别:
- 按正转按钮:正转运行标志置位,直到停止。
- 按反转按钮:如果当时正在正转,先MC_Halt停止正转,然后延时200ms,再置位反转运行标志。
- 再次按正转按钮,先停止反转,再延时,再正转。
这个“先停再反”的延时非常关键,防止电机因为方向切换太快而失步。实现方式是在两个运行标志之间加TON延时,同时把每次方向切换指令的边沿只执行一次。很多设备要“点到即停”就不要加延时,要根据机械负载来取舍。
4.5 调速:从触摸屏到实际速度
调速我做了两个入口,一个是在触摸屏上直接填Speed_Set,另一个是预留了模拟量调速。模拟量调速的思路是:0~10V模拟量输入模块采集电位器电压,FC把整数0~27648转换成0~100mm/s的Real速度,传给Speed_Set。
梯形图核心是把模拟量浮点化:
网络6:模拟量调速 %IW64(模拟量) ----[MOVE]---- %MW10(整数) %MW10 ----[DI_REAL]---- %MD20(实数) %MD20 ----[MUL]---- 100.0/27648.0 ---- %MD24(速度)然后在MC_MoveVelocity的Velocity端不用Speed_Set直接用%MD24,同时加一个上下限限幅,比如最低5mm/s,最高120mm/s。限幅用TIA的LIMIT指令最方便,否则万一触摸屏上误填一个500,电机会像疯了一样冲。
5. 调试实操:监控、波形和资源占用
5.1 上电检查顺序
第一次上电千万别直接把电机连上去就猛干。我的顺序是:
- 断开电机电源,PLC上电,用万用表量Q0.0和Q0.1对M的电压,至少确认输出通道没烧。
- 用博途在线监控,把轴手动点动速度设到10mm/s,确认轴对象能输出脉冲。
- 示波器探Q0.0,看有没有频率稳定的方波;没有示波器就把万用表打到频率档,一般能看到几十Hz到几百Hz的读数。
- 接上驱动器电源,但先不接电机,手动方向输出,听驱动器有没有故障报警声。
- 接电机,速度从5mm/s开始,点动跑10mm,确认方向正确,再往上加。
我见过太多人跳过前两步,接完全套以后电机不转,结果排查了一整天才发现是PLC输出点没初始化,或者方向信号没接对。分步调试虽然慢,但定位问题快多了。
5.2 博途轴诊断面板怎么看
在线模式下,打开工艺对象Axis_1,在“诊断”页能看到轴状态、当前位置、运行速度、跟随误差等。如果轴有报警,诊断列表里会直接显示错误代码,比如“50000”是轴激活冲突,“35069”是回原点超时。把错误代码拿去查帮助手册比蒙着猜快得多。
还可以点“手动测试”直接让轴以设定速度点动,这个功能在接线后试方向时特别有用,不需要写任何程序。我调试时先用手动测试确认机械方向,再回到梯形图里验证程序逻辑,不然很难判断是程序写错还是接线接错。
5.3 限位和原点开关的测试
限位逻辑一定要在低速下测:把速度设到10mm/s,手动JOG向限位方向移动,触发限位后看轴是否立即停止,再看报警是否出现。我遇到过一次正转限位I0.4接线接触不良,程序里虽然是常闭逻辑,但线没接好导致信号一直为0,轴一使能就报“硬限位已达到”,根本跑不了。后来把限位开关线重新压了一遍端子才解决。
回原点我用MC_Home,Mode设成3(主动回原点,限位+原点开关)。调试时注意原点开关最好用常开触点,安装在丝杠中间位置,而不是末端,避免和限位开关干涉。原点回零速度先慢点,比如30mm/s,碰到原点开关后减速到5mm/s找Z相或原点沿,最后停在Offset位置。
5.4 现场踩过的坑:失步、发热、反向间隙
调试过程中最容易遇到的是失步。表现是速度一快电机就响,或者发出“咔啦咔啦”声音,位置越跑越偏。我当时的处理顺序是:
- 先降低最高速度,从120mm/s降到80mm/s,观察是否改善;
- 再提高加减速度时间,把800mm/s²降到500mm/s²;
- 最后检查驱动器电流,发现之前设的2.0A偏小,提高到2.4A后失步明显减少。
电机发热的问题也常见。我有一台57步进,连续跑半小时后壳体烫手,测温枪一打70℃。后来把驱动器电流从2.8A降到2.2A,发热降到50℃左右,扭矩也没有明显下降。另外加装了一块小散热片,效果更好。
反向间隙是丝杠的固有属性,尤其用久了以后。如果你要做往返定位,正转和反转的绝对位置会有零点几毫米的偏差。简单做法是程序里做反向补偿:反转启动时,先额外走一段固定距离再按正常速度走,这个补偿值要实测出来。螺纹丝杠硬度不够的话,换滚珠丝杠是最彻底的方案。
6. 升级方向:开环到闭环、加原点回归、多轴联动
6.1 为什么步进要闭环
普通步进系统是开环控制,PLC发多少个脉冲,默认电机就走多少步,但电机不会汇报它到底走没走到位。如果负载突变或加速过猛丢步了,系统完全不知道。所以对定位要求比较高的场合,可以考虑闭环步进,比如热词里提到的雷赛DM3E。闭环步进电机尾部带编码器,驱动器内部实时检测位置偏差并补偿,PLC这边仍然是通过脉冲/方向控制,接线方式几乎不变,只是驱动器多了一个报警输出信号可以接到PLC输入。
但是闭环步进本质上还是步进电机,高速性能不如伺服,别想着换了个闭环步进就能跑10000rpm。如果负载惯量很大或者要高速高动态响应,老老实实上伺服才是正解。
6.2 MC_Home回原点:每个定位程序的标配
如果你的设备每次上电都要从绝对位置开始运行,那回原点就是必须的。梯形图里调用MC_Home,Mode选3,Position填0,执行一次后轴就有了参考坐标。
MC_Home Execute: I0.6(原点触发边沿) Position: 0.0 Mode: 3调试时我把原点开关装在丝杠正中间,模式里的回零方向选“负方向”,这样轴会先往负方向走找限位,再反向找原点开关的上升沿,最后停车。这种方式比直接碰限位更精准。
6.3 S7-1200能做多轴联动和圆弧插补吗
这是很多从三菱PLC转过来的朋友最常问的问题。S7-1200的运动轴对象可以做点到点定位、速度控制、回原点,也支持简单的两轴线性插补(用“运动学”功能),但如果你想做圆弧插补或者复杂轨迹,S7-1200原生工艺对象是不支持的。热词里提到的“三菱PLC圆弧插补程序梯形图”能在三菱FX5U上实现,是因为三菱的定位指令和CPU硬件本身为此设计了专用功能。S7-1200如果要实现同样效果,要么换S7-1500配合高端运动控制模块,要么外置运动控制器。这个坑提醒大家,选型前先确认好运动控制需求,别等程序写了一半才发现硬件干不了。
除了多轴联动,后续还可以扩展触摸屏显示轴状态,或者用Profinet把S7-1200连接到上位机做配方管理。步进电机控制这块,S7-1200能做的事其实很多,关键是把基础的地基打好。
这台推料机构后来跑了三个多月,除了换过一次驱动器散热风扇,再没出过别的问题。如果让我重做一遍,我会提前把机械参数、脉冲当量、限位方式全部写在I/O分配表旁边,而不是一边接线一边想——这些一开始没理清楚的东西,最后都会变成你调试时的“隐形时间成本”。