1. 项目内容整体设计与思路拆解
1.1 核心需求:为什么选S7-1200来驱步进电机
先说结论:S7-1200(尤其是1214C/1215C这一档)是当前中小型自动化项目里,做步进电机控制非常划算的选择。它自带高速脉冲输出,不需要额外买定位模块,CPU本体就能输出200kHz的脉冲,配合步进驱动器驱动42、57甚至86步进电机,在小型传送带、贴标机、点胶机、小型雕刻机这些场景里完全够用。
这个项目里我用的是一台S7-1214C DC/DC/DC的CPU,步进电机选择的是57步进加DM542驱动器。整套系统还配了一个昆仑通态触摸屏做手动操作和状态显示。项目做到最后,从I/O分配、硬件接线、驱动器参数设置到博途里的梯形图编程、在线调试,一条线完整走了一遍。这篇文章就把整个流程拆开讲,核心是让没怎么碰过运动控制的PLC工程师能少走弯路,从拿到CPU到电机转起来,每一步都讲清楚。
需要提前说明的是,S7-1200控制步进电机有两种主流方式:一种是用PTO(脉冲串输出)配合运动控制指令(MC_MoveRelative这类);另一种是直接用高速输出点发脉冲,用CTRL_EPT指令或者干脆用PLS指令。我强烈建议用第一种,也就是在博途里组态工艺对象,用PLCopen运动控制指令来写程序。原因后面细说。
1.2 应用场景与方案选型逻辑
先想清楚这个项目要干什么:控制一个步进电机完成“启动→正向走指定距离→停止→反向回到原点”这个循环动作,同时能够在触摸屏上调整运行速度、转动圈数,并且在手动模式下可以点动正转、点动反转。这是非常多设备的基础动作模型,学会这个,平移台、送料机构、分度转盘基本都能套。
方案选型的时候我做了几轮对比:
| 方案 | 优势 | 劣势 | 结论 |
|---|---|---|---|
| S7-1200自带高速输出 | 成本低、接线简单、集成度高 | 点位少,只能控制1~2轴 | 本方案采用 |
| S7-200 SMART | 价格低、易上手 | 指令体系稍旧,博途不直接支持 | 不选,项目已有1200 |
| 独立脉冲发生器/Arduino | 成本极低 | 可靠性、抗干扰差,不好联锁 | 不选,工业场合不放心 |
| 加装定位模块(如FM模块) | 功能强 | 成本高、组态复杂 | 没必要,杀鸡用牛刀 |
个人建议是:只有当项目需要同时控制4轴以上,或者需要复杂插补时,才考虑升级到S7-1500或专用运动控制器。单轴、两轴点位控制,S7-1200的脉冲轴方案就是性价比天花板。
1.3 整个流程的推动路径
做一个完整的PLC步进控制项目,不是光写个梯形图就完事。我在做这个项目时按下面的顺序推进,每一步都踩过坑,文章的结构也按这个来:
- 先做I/O分配和点位规划,搞清楚输入输出分别接什么。
- 接线和驱动器参数设置,这一步错了后面调试全是痛苦的回忆。
- 博途里创建项目,组态CPU和轴工艺对象。
- 编写梯形图逻辑,把运动控制指令接进去。
- 下载程序,在线调试,处理各种“我以为能转但就是不转”的问题。
这个顺序是血的教训换来的。以前我刚接触S7-1200运动控制时,上来就写程序,结果轴根本没组态好,MC_Power一使能就报错,后面排查了半天才发现是组态漏了。所以这次文章也按这个完整流程来写,你照着一步步做,大概率一次能成。
2. I/O分配与硬件接线要点
2.1 I/O点表设计:先规划再动手
很多人拿到项目第一件事就是打开博途开始拖梯形图,我劝你先拿张纸把I/O表列出来。S7-1214C本身自带14个数字量输入和10个数字量输出,这个项目里面输入和输出都不紧张,但规划得清楚,后面程序写起来和排查故障都会非常省心。
这个项目我最终的点表是这样的:
| 点位 | 地址 | 功能说明 | 信号类型 |
|---|---|---|---|
| 启动按钮 | I0.0 | 按下后自动运行一个流程 | 常开 |
| 停止按钮 | I0.1 | 急停/流程停止 | 常闭(安全考虑) |
| 原点传感器 | I0.2 | 步进电机回原点的感应开关 | 常开 |
| 正转限位 | I0.3 | 防止超程的正向限位开关 | 常开 |
| 反转限位 | I0.4 | 防止超程的反向限位开关 | 常开 |
| 脉冲输出 | Q0.0 | 步进驱动器PUL+,发脉冲 | 高速输出 |
| 方向输出 | Q0.1 | 步进驱动器DIR+,控制方向 | 数字量输出 |
| 驱动器使能 | Q0.2 | 步进驱动器ENA+,使能控制 | 数字量输出 |
| 运行指示灯 | Q0.3 | 电机运行时点亮 | 数字量输出 |
| 故障指示灯 | Q0.4 | 驱动器报警时点亮 | 数字量输出 |
这里要特别说明几个细节:
第一,停止按钮接常闭输入而不是常开。原因很简单:如果接常开,当急停按钮本身线路断了或者按钮坏了,程序永远不知道要停止,这种设计在安全上是不合格的。接常闭,一旦线路断线,程序会自动进入停止状态,这是教科书级别的安全常识,但在实际项目里真的有人大意。
第二,Q0.0是S7-1200的高速输出点,必须用它来发脉冲。CPU上标着PTO0/PTO1的那几个点,1214C对应的是Q0.0到Q0.3。如果你把脉冲信号接到普通数字量输出了,无论怎么调用运动控制指令,电机都不会转,因为普通输出点不能生成高速脉冲。
第三,原点传感器和限位开关我用的是三线制NPN常开传感器,接法要注意公共端。S7-1200漏型输入的公共端是M,源型输入公共端是L+,接法不同。如果不确定你手里的CPU是源型还是漏型,翻一下硬件手册,别凭感觉。
2.2 步进电机驱动器接线:DM542的实操经验
步进电机驱动器的型号是DM542,因为目标电流不超过4.2A,57步进电机完全在它的能力范围内。驱动器上的端子不多,但每一个都不能接错,我列一下我的实际接法:
驱动器侧电源:DC24V供电,注意DM542的供电范围是20V~50VDC,如果你用开关电源供电,一定不要把电源正负极接反,否则驱动器当场报废。我见过不止一次新手把V+和V-接反,啪一下冒烟,几百块就没了。
电机绕组接线:57步进电机一般有4根线(两相四线),分别是A+、A-、B+、B-。这四根线要严格按照电机的说明书接到驱动器对应的A+、A-、B+、B-端子上。如果A相和B相接反了,电机只是方向反了,调整方向信号或者对调A/B相即可。但如果是同一相的A+和A-接反,电机就会抖动不转,这是典型的相序错误。
控制信号接线(重点):驱动器这边的PUL+、PUL-、DIR+、DIR-、ENA+、ENA-是一组差分输入信号。S7-1200的输出是24V高电平,所以要采用共阳接法:把PUL+和DIR+和ENA+接在一起接到PLC的24V正极(L+),PUL-接PLC的Q0.0,DIR-接PLC的Q0.1,ENA-接PLC的Q0.2。
这里必须强调一点:步进驱动器内部已经做了光耦隔离,控制信号电源和工作电源是分开的。但S7-1200的M端和24V开关电源的M端必须可靠共地,否则信号会飘,脉冲时有时无,表现出来的症状就是电机丢步、抖动、甚至不转。很多新手调试半天找不到原因,最后发现是地线没接。
信号线尽量用双绞线屏蔽线,屏蔽层单端接地。这个项目里脉冲线和方向线我用的是一对一绞的屏蔽线,屏蔽层在PLC侧接地。如果你直接把普通导线拿来当脉冲线用,旁边又有接触器或变频器,干扰问题会非常头疼。
2.3 驱动器拨码开关设置:细分和电流
DM542驱动器上面有一排小的拨码开关,分别用于设定工作电流和细分倍数。这个环节看似不起眼,但直接决定了电机的运行平稳度和最终精度。
电流设置要根据电机的额定电流来。我这个57步进电机的额定电流是2.8A,所以驱动器输出电流按峰值4.0A左右设置。DM542的电流一般是通过SW1~SW3开关设定,我查到对应的峰值电流是4.2A那一档,就按那个拨。
细分设置我调到了3200脉冲/圈。意思是驱动器接收3200个脉冲,电机转一圈。这一步的原理是:步进电机本身有一个固有步距角,常规是1.8°,即整步时200脉冲转一圈。驱动器的细分功能可以把每一步再细分,最普通的8细分就是1600脉冲/圈,16细分就是3200脉冲/圈。
那为什么我选3200而不是1600或者更低呢?因为细分越高,电机运行越平稳、噪音越小、低速振动也越小。但细分也不是越高越好,太高了PLC发脉冲的频率上限会限制电机的最大转速。
这里顺便算一下最高转速:S7-1200的高速脉冲输出上限是200kHz,也就是每秒20万个脉冲。如果细分是3200脉冲/圈,那么理论最高转速就是200000÷3200×60=3750转/分钟。而步进电机在这个转速下早就没扭矩了,实际跑到600转/分钟以内才靠谱。所以3200的细分既有好的低速性能,也不会限制整体速度。如果你的应用需要高速,比如每秒200mm以上的快速移动,就需要降低细分倍数,逻辑就这么简单,别盲目调高。
3. 梯形图程序设计详解(博途实战)
3.1 组态工艺对象“轴”,这是整个程序的地基
打开TIA Portal V16(我用的是V16,V15/V17操作完全一样),创建新项目,添加S7-1214C CPU。这里有个关键动作:不仅要组态硬件,还要在PLC程序里添加“工艺对象”。
具体路径是:PLC项目树 → 工艺对象 → 新增对象 → 运动控制 → 轴。
新建轴之后,在组态界面里做基础设置:
- 选“脉冲”作为驱动器接口。
- 信号类型选“PTO(脉冲串输出)”。
- 脉冲输出点会自动关联到Q0.0,方向输出点可以选Q0.1。
- 电机每转的脉冲数:写入3200,对应驱动器细分。
- 旋转方向:根据实际电机转向,如果反了后面可以通过“取反”选项改。
- 硬件限位:选启用,上限位是I0.3,下限位是I0.4。
还有几个参数建议在组态阶段就改好:
- “位置监控”的方向值:做正值,方便程序里读位置。
- “回原点”方式:选择“主动回原点”,方向为负方向,原点开关用I0.2,回原点速度设为60(单位是“单位/分钟”),找原点速度设为10。
- 动态限制里的最大速度,设置成300,加减速度设置成150,加减速的平滑时间默认0.3秒,保持默认就行。
为什么回原点要“主动”而不是“被动”?主动回原点是指PLC主动找原点开关,碰到原点后再低速找一次Z相脉冲;被动回原点是指靠外部输入触发,适合带原点信号给PLC的场景。步进驱动器一般没有独立的Z相反馈,所以要么用传感器的常开点,要么用主动回原点方式。主动回原点的好处是每次回原点的停止位置一致性很高,因为最后是靠找Z脉冲锁定的,但是步进电机没有编码器Z信号,那就只能靠传感器重复精度了,所以传感器要装牢,感应面要干净。
3.2 梯形图核心:MC_Power和MC_MoveRelative的用法
组态完轴,下面才开始真正写梯形图。S7-1200的运动控制指令放在“运动控制”指令目录下,最常用的有这么几个:
- MC_Power:轴的使能/去使能。
- MC_Home:回原点。
- MC_MoveRelative:相对运动,走指定距离。
- MC_MoveAbsolute:绝对运动,走指定位置。
- MC_Halt:停止。
- MC_MoveJog:点动(这个项目里我用它做手动正反转)。
我来说一下标准逻辑,你直接在OB1里调用就行。下面是核心的梯形图逻辑结构(用STL风格描述,方便理解):
第一个程序段:MC_Power使能。
MC_Power_Instance( enable := 自动运行或手动模式, stopMode := 0, axis := axis1, status => ... );enable给一个常ON的M点就行,比如M0.0。MC_Power有StopMode参数,建议设成0(立即停止)。如果设成1(带斜坡停止),在急停场景下反而会更危险,比如垂直负载的场合,斜坡停止可能导致瞬间滑落。
第二个程序段:回原点。当在触摸屏上按下“回原点”按钮时,执行MC_Home。
MC_Home_Instance( execute := HMI回原点按钮, position := 0, mode := 3, // 主动回原点 axis := axis1 );第三个程序段:相对运动。当按启动按钮,并且不在回原点状态时,执行MC_MoveRelative。
MC_MoveRelative_Instance( execute := 启动信号, distance := 目标距离(HMI可设), velocity := 运行速度(HMI可设), axis := axis1 );第三个程序段的“启动信号”关键不是单纯的位信号,而是一个上升沿。运动控制指令大多数是边沿触发,你用常开信号一直按着,指令不会重复执行。我自己的处理方式是把启动按钮做上升沿检测,置位内部标志M1.0,再拿M1.0去触发运动指令,运动完成后复位M1.0。这样既不会重复触发,也比较容易加“运行中”互锁。
第四和第五个程序段:手动点动。用MC_MoveJog当按下正转/反转按钮时,设置方向和速度。
第六个程序段:故障处理。驱动器的报警输出(ALM信号)接到DI点,当它断开或闭合(根据报警输出类型)时,把MC_Power的enable清掉,同时点亮故障灯,并在触摸屏上报出“驱动器报警”字样的信息。
3.3 运行模式切换与互锁逻辑
实际设备不能只有自动模式,还要有手动模式。触摸屏上我放了“手动/自动”切换开关。手动模式下运行点动,自动模式下运行相对运动。
梯形图里的互锁逻辑很简单,但必须写:
- 手动模式激活时,自动启动按钮无效。
- 自动模式运行时,手动点动按钮无效。
- 无论哪种模式,只要正转限位或反转限位被触发,立即停止当前运动并复位使能。
- 原点未回归时,禁止自动相对运动(防止以未知位置开始运动导致超出边界)。
这四个互锁写起来不难,但我见过不少新手漏了第一第二项,结果手动点动和自动定位同时触发,两个指令同时向轴写速度给定值,最后轴的输出速度是乱的,轻则报警,重则撞限位。
关于位置管理,S7-1200的轴工艺对象内部有一个实际位置值。回原点后归零,之后只需要读轴的position状态就能得知当前位置,不需要自己在梯形图里做脉冲计数。这个自动化内部处理其实非常贴心,早期用S7-200做定位时必须自己数CTU计数器,程序又长又容易算错。
3.4 博途资源使用情况,别等到写满了再抓瞎
有段时间我经常写程序写到一半编译报错,提示“资源不足”,最后才学会在博途里查看CPU资源使用情况。这里分享一个实用技巧:在“PLC程序”块文件夹上右键 → “资源”,就能看到存储区占用情况,包括装载存储区、工作存储区、保持性存储区等。
S7-1200的存储资源分为加载存储区和工作存储区。加载存储区就是SD卡或内置的存储区,工作存储区才是运行时程序的加载空间。工作存储区满了,程序绝对下载不进去,涉及“load memory”和“work memory”两个概念。这个项目本身不大,程序不算吃紧,但如果你的程序里塞了大量FB的静态变量、DB的注释、或是有很多在线诊断的报文缓存,工作存储区也会迅速膨胀。
我一般会在写完一段功能后就去资源页面看一次,而不是等最后编译时才看。这个习惯帮我提前发现了一个隐藏风险:原来的程序里有一个DB块变量建得特别细,光注释就写了几百条,占用比实际代码多得多。删掉冗余变量后,工作存储区下降了一截,程序块也干净多了。
4. 实操过程与核心环节实现
4.1 从零到一转:首次通电怎么一步步验证
硬件接线完成后,别急着下载程序,先做几项检查。我每次调试都按这个顺序来,效率和安全感都高很多。
第一步,断开PLC到驱动器的信号线,只给驱动器和PLC各自上电。用万用表测量PLC高速输出点对M的电压,正常应该有24V左右。这个步骤是验证PLC输出点本身没有因为接线错误被烧毁。
第二步,把驱动器信号线的PUL-直接拿手碰一下M端(也就是给一次低电平),看电机是否走一步。注意:这时候如果电机抖动了一下,说明脉冲回路是通畅的。再碰DIR-看方向是否变化。这不依赖PLC的程序,纯硬件验证,能帮你确认驱动器光耦内部门槛电压是否匹配PLC的24V电平。
第三步,恢复所有接线,下载博途项目。下载后先在变量监控表里强制给MC_Power的enable置1,观察轴的状态。轴状态从“未启用”变成“已启用”说明MC_Power正常工作了。
第四步,手动执行MC_Home,让轴回原点。如果电机没有动,马上看轴的status报警代码。S7-1200运动控制报警代码是十六进制的,在博途的指令“错误ID”可以看到,比如16#8001表示轴未使能,16#800B表示到达硬件限位等。这个步骤是最常用的故障定位手段。
第五步,执行MC_MoveRelative,给定一个很小的距离(比如20mm,速度60),看电机是否动。这一点很关键:第一次定位一定给个很小的值,速度也不要给太高,防止电机突然高速冲出去撞坏机构。确认正常情况下,再慢慢加大距离和速度。
4.2 步进电机的电子齿轮比:细分脉冲数如何换算距离
步进电机的“电子齿轮比”经常有人搞混。其实对PLC控制来说,不需要去管驱动器的内部电子齿轮比设置,只要把驱动器细分后的脉冲数对应关系搞清楚就行。用丝杆传动来举例:
假设你用的是导程为5mm的丝杆,也就是说电机转一圈,负载直线移动5mm。驱动器细分是3200脉冲/圈。那么负载移动1mm需要发的脉冲数就是:3200 ÷ 5 = 640脉冲/mm。
如果你用的是皮带传动,假设同步轮节圆直径是20mm,周长是π×20=62.8mm,那么电机转一圈负载移动62.8mm。1mm需要3200÷62.8≈50.96脉冲/mm,这样算出来不是整数也没关系,博途轴组态允许你输入带小数的脉冲数。
这里强烈建议在博途的轴的组态界面里,把“电机每转的脉冲数”严格按照这一步计算出来的数值填写。填写完成之后,编程时给的距离就是真正的mm,而不需要自己再去换算,非常直观。很多新手的程序读起来费劲,就是因为没有把机械比例写到轴组态里,而是自己在指令里乘系数。
我算一下这个项目的实际参数:电机转一圈对应丝杆移动5mm,为了精度和速度均衡,细分设定为16细分,也就是3200脉冲/圈,那么运动1mm需要发640个脉冲。博途的“电机每转脉冲数”设置为3200,“每转行程”填入5mm。
这样设置后,我程序里写距离50就是50mm,写速度100就是100mm/min。调试的时候非常直观,触摸屏上让操作工填的也是真实尺寸,这人机交互才像话。
4.3 梯形图+触摸屏联调:为什么运行轨迹是乱的
联调阶段最容易出问题的不是单步指令,而是几条运动指令之间相互干扰。我的梯形图一开始是把回原点、相对运动、点动一次性全都做在了OB1里,结果发现触摸屏切换模式时,轴老是报错,位置精度也飘。
排查后发现根源是:回原点指令(MC_Home)和相对运动指令(MC_MoveRelative)同时execute为TRUE,而且我自己写的“模式切换”没有彻底把另一路的启动信号阻断。后来的解决方案是引入一个“运动状态字”的概念:
- M10.0:自动流程状态位
- M10.1:自动完成标志
- M10.2:回原点标志
- M10.3:故障锁定标志
逻辑就被整理成四条互斥的流程链,任何时候只有一个标志为1。当需要回原点时,自动流程必须处于未运行状态;当自动流程运行时,手动点动标志必须被清零。这种软件层面的流程管理,跟在纸上画流程图完全不是一回事,建议你写程序之前在Excel里先列一个状态真值表,把所有情况的组合列一遍,再在梯形图里针对性地写互锁。
4.4 原点回归与限位开关安装的精度细节
回原点的重复定位精度,很大程度取决于原点开关的安装位置。这里有个特别实际的坑:电气原点开关的感应面不能和机械原点重合。意思是你把原点开关放在行程中间偏某侧,而不是放在行程端点,这样电机每次回原点时都从同方向以同速度靠近开关,不会因为机械挡块的压紧变形导致重复性变差。
我的项目中把原点开关装在丝杆的中间位置,使得电机回原点时先朝负方向走,如果中途碰到原点开关就立即停止并清零。如果起点在原点开关的另一侧,就可能出现一种情况:电机一向负方向走却始终碰不到原点开关,最后撞下限位。所以正确做法是:把原点开关安装在负方向限位开关之前,并且回原点的方向是向负方向找。
另外,找原点速度不要设太快,我设置的是10mm/min,这就属于“低速爬行找原点”的思路。步进电机的脉冲频率不断下降,能最大限度减少机械惯性对停止位置的影响。你要是把回原点的速度设成200mm/min,十次回原点十次位置都不一样。我第一次做运动控制时就吃过这个亏,后来把找原点速度降到5mm/min,重复误差基本控制在两三个脉冲以内。
5. 常见问题与排查技巧实录
5.1 电机不转?先查这三个地方
我在帮人远程排查步进电机不转的问题时,发现的共性原因几乎就那几类。按出现频率排序:
第一,轴未使能。很多人调用了MC_MoveRelative但前面的MC_Power压根没置1,或者MC_Power的enable刚好是一个还没运行的程序段里的位。轴不使能,运动指令就一直报错,但PLC不亮红灯,表面看起来“程序都对”,就是轴不动。判断方法:看轴的工艺对象状态,或者看运动指令的status如果等于“轴未使能”,百分百使能链路断了。
第二,硬件接线不对。尤其是PUL+和PUL-、DIR+和DIR-的极性。共阳接法看起来简单,但有人会把PUL-直接接到PLC的M端,认为这样“看起来也是回路”,结果因为PLC输出点是高电平有效,一共阳一漏接就乱套了。正确的接法是PUL-接PLC输出点,输出导通时输出点输出低电平,脉冲电流形成回路。
第三,驱动器的使能信号没有打开。很多驱动器(包括DM542)默认ENA信号内部光耦不导通,也就是允许运行。但如果你把ENA-接到了PLC输出点,并且PLC程序里把Q0.2置0了,反而把使能信号断开了。这是因为有些驱动器ENA光耦导通时代表“禁止电机工作”,逻辑是反的。需要仔细看驱动器的说明书,比如DM542上的ENA信号逻辑默认是“低电平禁止”,那就意味着Q0.2必须置1,光耦才不导通,电机才允许运行。这种反向逻辑坑过无数人,包括我自己。
5.2 丢步和位置漂移:步进系统的五大元凶
丢步是步进电机最让人崩溃的问题,症状是走几点以后位置差很大。总结我的排查经验,按频率排序:
- 加减速时间太短或速度突变。步进电机的扭矩随速度升高而下降,如果启动速度一下子给300mm/min,电机直接失步。解决方法是给足加减速斜坡时间,S7-1200轴组态里的“加速度”默认值通常还能用,但最大速度要跟实际负载匹配,不要满转速去跑。
- 脉冲频率过高。接近驱动器允许的极限脉冲频率时会丢步。检查方法:把速度参数降一半,看丢步是否消失。
- 机械间隙。丝杆螺母间隙或联轴器打滑会造成“现象像丢步但不是电气问题”。检查方法:用手盘一下丝杆,感受间隙大小。如果有间隙,要么更换消隙螺母,要么在程序里做反向间隙补偿。
- 电源电压不足或电流设置过低。步进驱动器供电电压偏低时,高速扭矩明显下降。DM542推荐电压36V或48V,如果你用24V供电,扭矩会缩水明显,丢步概率大增。
- 干扰导致脉冲丢失。脉冲线靠近动力线,屏蔽层没接地,或者PLC和驱动器没有共地,都会导致脉冲信号被干扰。这种问题特别隐蔽,查起来费时。
5.3 运动控制指令报警代码速查与处理
S7-1200运动控制指令会把错误代码显示在指令的status引脚上。下面是我项目里实际遇到和整理的常见代码,建议保存:
| 错误代码 | 含义 | 处理建议 |
|---|---|---|
| 16#8001 | 轴未使能 | 检查MC_Power的enable是否为1,检查驱动器报警 |
| 16#8002 | 轴已使能但未回原点 | 先执行MC_Home |
| 16#800B | 到达硬件限位 | 检查I0.3/I0.4是否被触发,机构是否超程 |
| 16#800F | 定位未完成又触发新定位 | 等待前一条指令Done或调整互锁逻辑 |
| 16#8012 | 速度/位置参数超限 | 检查最大速度、最大加速度是否在组态限制内 |
| 16#8015 | 不允许的运动指令 | 检查当前模式是否允许该指令(如自动模式下手动指令报错) |
调试时把运动指令的status引脚在变量监控表里实时监视,出了问题先看代码再动机械,效率会高很多。新手容易犯的错是:电机一转不动就去拆电机拆丝杆,结果发现是程序里一个位没置1。
5.4 干扰问题的实战处理:一次诡异的丢步排查记录
我想分享一个真实案例。有一次项目调试,电机空载运行一切正常,带上负载后偶尔丢步。一开始怀疑是负载惯量过大,加减速不够,结果加了斜坡时间还是时好时坏。后来有一次碰巧手边示波器探头夹在脉冲线上,发现脉冲波形上有明显的高频毛刺,这才意识到是干扰问题。
排查下来干扰源是距离控制柜很近的一台变频器,它的动力线从脉冲信号线旁边走了一段,而且信号线的屏蔽层在驱动器和PLC两端都没有接地。处理措施:把脉冲信号线重新走线,远离变频器出线;屏蔽层在PLC侧的24V0V端单端接地;脉冲线换成双绞屏蔽线;最后在PLC输出点与驱动器PUL-之间串了一个1kΩ电阻,进一步减少高频干扰。处理后丢步现象彻底消失。
在这里说一个判断干扰的经验:如果丢步是有规律的,比如每次都在变频器启动时发生,基本就是干扰。如果完全随机,先怀疑加减速或机械间隙。
6. 项目复盘与几个值得养成的操作习惯
这个项目从拿到CPU到稳定运行,总共花了两天半。第一天做I/O分配和接线,第二天写程序和组态,第三天上午调试解决各种小问题。整体来说,S7-1200配合博途的运动控制功能,配合步进电机,在小项目里确实属于“开箱即用”的体验,但前提是硬件接线正确、轴组态参数合理、梯形图逻辑有互锁。
有几个习惯我认为值得分享,它们不是在教科书里直接能学到的:
第一个习惯:每个运动控制指令都单独建一个FB。不要把所有运动指令堆在一个OB1里,那样看起来热闹,实际排查问题时你会在滚屏里迷失。我这次项目里建了MC_Power_FB、MC_Home_FB、MC_Move_FB、MC_Jog_FB,每个FB里面只放对应指令和它的状态处理。OB1只做模式切换和调用这些FB,思路清晰,改起来也安全。
第二个习惯:把轴的状态值和错误代码在触摸屏上实时显示。项目调试时,一旦报警马上能在屏幕上看到轴是“未启用”“正忙”还是“错误停止”。这个成本不高,但对排障帮助极大。别只顾着显示电机转没转,要把status数字放出来。
第三个习惯:备份博途项目时,连同驱动器的拨码开关照片、接线照片一起存。等你三个月后回来看这个项目,仅仅有程序文件是远远不够的,你大概率会忘记当时的细分倍数和电流设置。我把当时DM542的拨码开关状态拍了一张照,放在项目文件夹里,后来又一次改造时直接对着照片重新拨码,省了大量时间。
第四个习惯:限位开关的动作方向要想清楚。正限位接入的是常开点,但不同厂家传感器的输出逻辑(常开还是常闭)也得确认。传感器坏了之后,限位开关本身可能永远不导通,这就失去了保护意义。如果你是做安全相关的限位,推荐用常闭型传感器,断线即报警,安全等级完全不同。
最后再分享一个小技巧:博途的运动控制指令在梯形图里连线时,觉得引脚太多占屏幕,你可以在指令的属性里“隐藏”不用的引脚。编译和在线调试都不受影响,梯形图会清爽很多。我第一次用的时候没发现这个功能,整个梯形图拉得特别长,翻页翻得崩溃。后来把这个技巧分享给了同事,大家都说调试体验提升了一大截。
这个项目后续想扩展,还可以在这个轴的基础上增加第二根轴,做XY平台联动,或者把相对运动换成绝对运动,配合视觉引导做定位抓取。不过这些都是后话了,先把单轴整明白,步进电机控制的基本功就拿到了。