
1. 为什么EPOS模式总在速度给定这一步卡住1.1 从一台包装机的调试现场说起去年帮朋友调试一台枕式包装机用的是西门子S7-1200配V90伺服走EPOS定位模式。机械部分装完电气接线核对无误博途里组态也做完了结果一给使能电机要么不动要么直接飞车。查了半天问题出在FB284的输入参数上——Velocity这个引脚填了个想当然的数值OverV和OverAcc也没设对导致速度给定和实际机械需求完全对不上。这个场景在V90 EPOS应用里太常见了。很多人拿到V90看到支持EPOS基本定位器觉得比走工艺对象简单不用组态TO轴不用调MC_Power那一套直接调FB284就能跑。但真正上手才发现FB284的引脚看着不多每一个背后都牵扯到V90内部的参数体系尤其是速度给定和位置换算这两块填错一个数轻则定位偏差重则报警停机。这篇内容就是围绕这个痛点展开的。我会把FB284的速度给定逻辑、V90内部的速度限幅机制、位置换算的完整推导过程以及实际调试中容易踩的坑一层一层拆开讲。适合已经接触过S7-1200/1500和V90但对EPOS模式还停留在能跑就行阶段的同行。看完之后你至少能做到拿到一台新设备知道每个参数该填多少、为什么填这个值、填错了会出什么现象。1.2 EPOS模式到底省掉了什么又要求你补上什么先把这个前提说清楚。V90支持两种定位控制方式一种是走工艺对象TO在PLC侧组态轴、调用MC_系列运动控制指令另一种就是EPOS模式把定位功能下放到驱动器内部PLC只负责发命令和给参数。EPOS模式的核心优势在于PLC不需要建立运动控制工艺对象不占用PLC的运算资源轴的数量多了也不怕。对于S7-1200这种资源有限的控制器带三四个V90轴走EPOS比走TO要轻松得多。但代价是位置环和速度环的细节你摸不到了驱动器内部帮你闭环你只能通过FB284的引脚去告诉它该怎么动。这就带来一个关键问题FB284的引脚参数和V90内部的参数比如P29110、P29111、P29120这些是怎么对应的速度给定值Velocity的单位是什么位置Position的单位又是什么这些如果不搞清楚调试就是碰运气。我见过有人直接把Velocity填成100以为就是100转/分结果电机慢得像蜗牛也有人填成10000电机直接过流报警。根本原因就是没搞明白FB284的速度给定是以什么为基准的百分比还是工程单位。1.3 本文的拆解路线接下来我会按这个顺序展开先把FB284的速度给定链路讲透包括Velocity、OverV、OverAcc、OverDec这几个引脚的含义和它们与V90内部参数的关系然后重点推导位置换算从电机转数到负载位移把齿轮比、丝杠导程、减速比这些因素串起来接着讲EPOS模式下V90的关键参数设置哪些必须改哪些保持默认最后用一段完整的SCL代码示例把FB284的调用和参数计算封装成一个可复用的功能块。中间会穿插实际调试中遇到的典型问题和排查思路比如使能后电机不转、定位偏差固定值、速度上不去、报警F7452/F7453这些。每个问题都会给出具体的排查步骤和验证方法不是泛泛而谈。2. FB284速度给定链路从引脚值到电机轴的实际转速2.1 Velocity引脚的单位不是rpm而是参考转速的百分比这是第一个必须纠正的认知。FB284的Velocity输入单位是百分比基准是V90参数P29111EPOS参考转速。也就是说如果你设P291113000 rpmVelocity50那么电机目标转速就是1500 rpm。很多人第一次用的时候看到Velocity是Int类型范围-200%到200%就懵了。为什么是200%因为V90允许在EPOS模式下短时超过参考转速运行上限就是200%。但实际应用中除非你的机械确实需要超频否则一般不会用到超过100%。那P29111该设多少这个值不是随便填的。它应该等于你电机在额定扭矩下的最高转速或者等于机械系统允许的最高转速。比如1FL6电机配V90额定转速3000 rpm那P29111就设3000。如果机械减速比大负载侧最高只需要500 rpm那P29111也可以设成对应电机侧的转速值但要注意设低了会限制电机的动态响应能力。提示P29111的设定值会直接影响Velocity100%时电机的实际转速。调试时先把P29111设成电机额定转速后续再根据机械需求微调。2.2 OverV和OverAcc速度与加速度的上限保险OverV、OverAcc、OverDec这三个引脚分别对应速度上限、加速度上限、减速度上限单位也是百分比基准同样是P29111速度和P29110加速度。这里有个容易混淆的点Velocity是目标速度OverV是允许的最大速度。如果Velocity设了80%OverV设了50%那实际运行速度会被限制在50%。这个机制在调试初期很有用——你可以先把OverV设小一点比如20%让电机慢慢动起来确认方向和机械没问题再逐步放开。OverAcc和OverDec的基准P29110是EPOS参考加速度单位是参考转速/秒。比如P291103000 rpm/sOverAcc100%那加速度就是3000 rpm/s。这个值设得太小电机会软绵绵的定位时间长设得太大机械冲击大容易报警F7452跟随误差过大。实际调试时我一般这样操作先把OverAcc和OverDec设成50%让电机以中等加速度运行观察机械有没有异响或抖动。如果没问题再逐步加到80%甚至100%。如果一上来就100%机械刚性不够的话很容易出问题。2.3 速度给定与V90内部参数P29110/P29111的对应关系把这条链路完整串起来PLC侧FB284的Velocity百分比→ 乘以P29111 → 得到目标转速rpmPLC侧FB284的OverV百分比→ 乘以P29111 → 得到速度上限rpmPLC侧FB284的OverAcc百分比→ 乘以P29110 → 得到加速度rpm/sPLC侧FB284的OverDec百分比→ 乘以P29110 → 得到减速度rpm/s这四个参数在V90内部还有一层限制P29120最大转速、P29121最大加速度。如果FB284给的值超过了这两个参数的限制实际运行会以P29120/P29121为准。所以调试时如果发现速度上不去先检查P29120是不是设小了。我遇到过一种情况Velocity给了100%P291113000理论上应该跑3000 rpm但实际只有1500。查了半天发现P29120被设成了1500。这个参数在V90的出厂设置里可能是根据电机型号自动写入的但如果你换了电机或者手动改过就可能对不上。2.4 一个实际的速度给定计算示例假设机械参数如下电机额定转速3000 rpm减速比10:1丝杠导程10 mm要求负载侧最高速度300 mm/s先算电机侧需要的最高转速负载侧300 mm/s 18000 mm/min 丝杠每转走10 mm所以丝杠转速 18000 / 10 1800 rpm 减速比10:1电机转速 1800 × 10 18000 rpm这显然超过了电机额定转速。说明这个机械配置下要么减速比不对要么丝杠导程不对。重新算如果电机最高3000 rpm减速比10:1丝杠导程10 mm那负载侧最高速度 3000 / 10 × 10 3000 mm/min 50 mm/s。达不到300 mm/s的要求。这就是为什么调试前一定要先做速度校核。如果机械本身达不到要求的速度电气参数怎么调都没用。假设机械改成了减速比5:1丝杠导程20 mm那负载侧最高速度 3000 / 5 × 20 12000 mm/min 200 mm/s。还是不够。再改减速比2:1导程20 mm负载侧最高速度 3000 / 2 × 20 30000 mm/min 500 mm/s。够了。这时候P29111设3000Velocity100%对应电机3000 rpm负载侧500 mm/s。如果实际只需要300 mm/s那Velocity60%就够了。3. 位置换算从电机转数到负载位移的完整推导3.1 Position引脚的单位是LU不是毫米FB284的Position引脚单位是LULength Unit这是EPOS模式下的位置单位。LU和毫米之间的换算取决于V90参数P29247LU per revolution和机械减速比、丝杠导程。P29247的定义是电机每转一圈对应的LU数。比如P2924710000那电机转一圈位置值变化10000 LU。这个参数设得越大位置分辨率越高但PLC侧的位置值范围也越大要注意不要溢出。那LU和毫米怎么对应这就要引入机械参数了。假设电机每转一圈负载移动距离 丝杠导程 / 减速比电机每转一圈 P29247 LU所以1 LU对应的负载位移 (丝杠导程 / 减速比) / P29247反过来如果要让负载移动1 mm需要的LU数 P29247 × 减速比 / 丝杠导程。这个换算关系必须搞清楚否则你给Position填10000以为走10 mm实际可能走了100 mm。3.2 P29247怎么设分辨率与溢出风险的平衡P29247的设定值直接决定了位置控制的分辨率。设小了分辨率不够定位精度差设大了PLC侧的位置值范围不够容易溢出。S7-1200的DInt范围是-2147483648到2147483647。FB284的Position引脚是DInt类型所以位置值不能超过这个范围。假设你的机械行程是1000 mmP2924710000减速比5:1丝杠导程10 mm那1 mm对应的LU数 10000 × 5 / 10 5000 LU。1000 mm就是5000000 LU远小于DInt上限没问题。但如果P29247设成1000000那1 mm就是500000 LU1000 mm就是500000000 LU超过了DInt上限就会溢出。所以P29247不能无限大要根据行程和DInt范围来算。我一般这样选先确定需要的定位精度比如0.01 mm。然后算1 LU对应的位移要小于等于0.01 mm。再根据行程算总LU数确保不超过DInt上限的80%留余量。具体公式1 LU对应位移 (丝杠导程 / 减速比) / P29247 ≤ 定位精度总LU数 行程 / 1 LU对应位移 ≤ DInt上限 × 0.8由第一个式子得P29247 ≥ (丝杠导程 / 减速比) / 定位精度 由第二个式子得P29247 ≤ DInt上限 × 0.8 × (丝杠导程 / 减速比) / 行程两个不等式联立就能确定P29247的取值范围。3.3 齿轮比、丝杠导程、减速比谁乘谁除别搞反这是最容易出错的地方。我见过有人把减速比乘反了结果定位偏差正好是减速比的平方倍。这里把关系理清楚电机转一圈经过减速机后负载侧转了多少圈答案是1/减速比圈。负载侧转一圈丝杠走多少距离答案是丝杠导程。所以电机转一圈负载移动距离 丝杠导程 / 减速比。如果减速比是10:1电机转10圈负载转1圈那电机转一圈负载转0.1圈移动距离 丝杠导程 × 0.1 丝杠导程 / 10。所以是除以减速比不是乘以。那LU和毫米的换算电机转一圈 P29247 LU 丝杠导程 / 减速比 mm。所以1 mm P29247 × 减速比 / 丝杠导程 LU。举个例子P2924710000减速比10:1丝杠导程10 mm。电机转一圈负载移动1 mm对应10000 LU。所以1 mm 10000 LU。如果Position填50000就是走5 mm。如果减速比搞反了变成1:10电机转1圈负载转10圈那电机转一圈负载移动100 mm对应10000 LU。1 mm 100 LU。Position填50000就是走500 mm。偏差100倍。3.4 回零与绝对定位位置值从哪来EPOS模式下位置值有两种来源一种是回零后建立的绝对位置另一种是直接设的绝对位置。回零方式由V90参数P29240选择常见的有主动回零找原点开关编码器零脉冲被动回零碰到硬限位后反向找零脉冲直接设零把当前位置直接设为原点回零完成后当前位置值就是0。之后所有绝对定位的Position值都是相对于这个原点的。如果用的是绝对编码器比如1FL6配多圈绝对编码器那上电后不需要回零位置值直接从编码器读。但要注意绝对编码器的多圈范围是有限的比如4096圈超过后会溢出。所以如果行程对应的电机转数超过4096圈就要用回零方式不能依赖绝对编码器。实际调试时我一般先用主动回零确认原点开关和零脉冲都正常再跑绝对定位。如果回零过程中报错先检查P29240的设置和原点开关的接线。4. V90 EPOS模式的关键参数设置与调试步骤4.1 必须改的参数清单V90在EPOS模式下有几个参数是必须根据实际机械调整的不能保持默认参数含义设定依据P29110EPOS参考加速度电机额定加速度或机械允许加速度P29111EPOS参考转速电机额定转速或机械允许最高转速P29120最大转速机械允许最高转速对应的电机转速P29121最大加速度机械允许最大加速度P29240回零方式根据原点开关类型选择P29247LU per revolution根据定位精度和行程计算P29250软限位上限机械行程上限对应的LU值P29251软限位下限机械行程下限对应的LU值这些参数在V90的调试软件V-ASSISTANT里都能改也可以通过博途的驱动组态改。改完之后要保存到ROM否则断电会丢。4.2 用V-ASSISTANT做参数备份和对比V-ASSISTANT是西门子官方的V90调试工具比在博途里改参数直观得多。我一般用它做三件事第一参数备份。调好一台设备后把参数导出成文件下次调同型号设备直接导入省时间。第二参数对比。如果两台同型号设备表现不一致把参数导出来对比很快能找到差异。第三在线监控。V-ASSISTANT可以实时看电机的转速、电流、位置跟随误差调试时很有用。注意V-ASSISTANT和博途不能同时在线会冲突。调试时要么用V-ASSISTANT要么用博途别两个一起开。4.3 使能、回零、定位三步走的调试顺序调试EPOS模式我一般按这个顺序第一步使能。调用FB284ModePos0使能EnableAxis1。观察电机是否使能抱闸松开电机有保持力矩。如果使能不上检查AxisEnable输出和Error输出看报警代码。第二步回零。ModePos4主动回零或5被动回零ExecuteMode给上升沿。观察电机是否朝原点开关方向运动碰到开关后是否减速找零脉冲。回零完成后AxisRef输出为1。第三步定位。ModePos1绝对定位或2相对定位Position给目标位置Velocity给速度ExecuteMode给上升沿。观察电机是否走到目标位置AxisPosOk输出为1。这三步每一步都可能出问题下面分别说。4.4 使能后电机不转的排查链路使能后电机不转先看FB284的输出AxisEnabled是否为1如果不是说明使能没成功检查EnableAxis引脚和V90的使能逻辑。Error是否为1如果是看ErrorID对照V90手册查报警代码。AxisPosOk是否为1如果是说明轴已经到位不需要动。AxisRef是否为1如果不是说明没回零绝对定位不会执行。如果这些输出都正常但电机还是不转检查Velocity和OverV是不是设成了0。我遇到过有人把OverV设成0结果电机使能了但速度被限制在0当然不转。还有一种情况电机使能了也有力矩但就是不动。这可能是机械卡死了或者抱闸没松开。检查抱闸电源和机械部分。4.5 定位偏差固定值的排查思路定位偏差固定值比如每次都差5 mm这种问题最好查。偏差固定说明是换算关系错了不是随机误差。先算理论偏差如果偏差是5 mm而你的1 mm对应5000 LU那偏差就是25000 LU。检查Position的计算公式看是不是减速比搞反了或者丝杠导程填错了。如果偏差是减速比的整数倍比如减速比10:1偏差正好是10倍或0.1倍那基本可以确定是减速比方向搞反了。如果偏差是丝杠导程的整数倍比如导程10 mm偏差正好是10 mm或0.1 mm那可能是丝杠导程填错了。排查方法让电机走一个已知距离比如Position给10000 LU测量实际走了多少毫米。然后反推1 LU对应多少毫米和理论值对比。如果对不上检查P29247、减速比、丝杠导程这三个参数。4.6 报警F7452/F7453的处理F7452是跟随误差过大F7453是位置监控报警。这两个报警在EPOS模式下很常见原因通常是加速度设得太大电机跟不上跟随误差超限机械阻力太大电机堵转速度设得太高电机过载P29110设得太小加速度上限太低处理方法是先降低OverAcc和OverDec比如从100%降到50%看报警是否消失。如果消失说明是加速度问题逐步加回去找到不报警的最大值。如果还报警检查机械是否卡死或者电机是否选型偏小。F7453通常是位置监控报警可能是编码器信号问题或者P29247设得太大导致位置值溢出。检查编码器接线和P29247的设置。5. 用SCL封装FB284一个可复用的功能块5.1 为什么要封装FB284本身是个FB但它的引脚很多每次调用都要填一堆参数。如果轴多了代码会很乱。我一般会封装一个自己的FB把机械参数减速比、丝杠导程、P29247作为输入内部自动计算Position和Velocity对外只暴露走多少毫米和走多快这两个接口。这样做的另一个好处是机械参数改了只需要改封装FB的输入不用改每个调用点。5.2 封装FB的接口设计输入EnableAxis使能ModePos模式ExecuteMode执行TargetPos_mm目标位置毫米TargetVel_mm_s目标速度毫米/秒GearRatio减速比ScrewPitch丝杠导程毫米LUPerRevP29247输出AxisEnabled使能状态AxisRef回零状态AxisPosOk到位状态Error错误ErrorID错误代码ActualPos_mm当前位置毫米5.3 位置和速度的换算代码// 位置换算毫米转LU #Position_LU : REAL_TO_DINT(#TargetPos_mm * #LUPerRev * #GearRatio / #ScrewPitch); // 速度换算毫米/秒转百分比 // 先算负载侧最高速度对应的电机转速 #MaxMotorRPM : #RefRPM; // P29111 #MaxLoadSpeed_mm_s : #MaxMotorRPM / #GearRatio * #ScrewPitch / 60.0; // 再算目标速度占最高速度的百分比 #Velocity_Percent : REAL_TO_INT(#TargetVel_mm_s / #MaxLoadSpeed_mm_s * 100.0);这段代码里RefRPM是P29111的值需要作为输入传进来。MaxLoadSpeed_mm_s是负载侧最高速度单位毫米/秒。5.4 调用示例与注意事项// 调用封装FB V90_EPOS_FB( EnableAxis : TRUE, ModePos : 1, // 绝对定位 ExecuteMode : #StartMove, TargetPos_mm : 100.0, // 走100毫米 TargetVel_mm_s : 50.0, // 速度50毫米/秒 GearRatio : 10.0, ScrewPitch : 10.0, LUPerRev : 10000, RefRPM : 3000.0, AxisEnabled #AxisEnabled, AxisRef #AxisRef, AxisPosOk #AxisPosOk, Error #Error, ErrorID #ErrorID, ActualPos_mm #ActualPos_mm );注意事项ExecuteMode要给上升沿不能一直给1否则会重复触发。TargetPos_mm和TargetVel_mm_s要在ExecuteMode上升沿之前准备好不能在触发后再改。如果Error为1先清错误再重新触发。清错误的方法是ModePos0ExecuteMode给上升沿。5.5 实际项目中的参数整定经验在实际项目中我一般先把OverAcc和OverDec设成30%OverV设成50%让电机慢慢跑。确认机械没问题后逐步加OverV到100%再加OverAcc到80%。如果加的过程中出现F7452就退回到上一个不报警的值。P29110和P29111的设定我一般按电机额定值来。比如1FL6电机额定3000 rpmP29111就设3000。P29110按电机额定加速度设一般是额定转速的10倍左右也就是30000 rpm/s。但实际机械可能达不到所以OverAcc不会给到100%。P29247的设定我一般先按定位精度算一个最小值然后取整到1000的倍数方便计算。比如算出来最小是8000就设10000。软限位P29250/P29251一定要设而且要留余量。我一般设成机械行程的90%防止撞限位。6. 调试中那些手册不会告诉你的细节6.1 抱闸电机的使能顺序带抱闸的V90电机使能时抱闸松开和电机使能有先后顺序。如果顺序不对电机会溜车或者抱闸磨损。正确的顺序是先给使能电机建立力矩再松抱闸。V90内部会自动处理这个顺序但前提是抱闸参数P29300设对了。如果P29300设错抱闸可能不松或者松得太早。调试时如果发现电机使能后抱闸不松检查P29300。如果抱闸松了但电机没力矩检查使能逻辑。6.2 编码器方向与电机方向不一致的处理有时候电机转的方向和编码器反馈的方向相反导致位置值越走越小或者一使能就飞车。这种情况要改P29201编码器方向或P29001电机方向。改方向之前先确认机械方向是对的。方法是手动转电机看负载移动方向是否符合预期。如果反了改P29001。如果负载方向对但编码器反馈反了改P29201。改完之后要重新回零否则位置值会乱。6.3 多轴EPOS的资源分配S7-1200带多个V90走EPOS要注意通信资源。每个V90走PROFINET占用一个设备名和一个IP。如果轴多了交换机带宽和PLC的通信负载要算。我一般建议S7-1200最多带4个V90走EPOS再多就考虑S7-1500。如果非要带更多可以用多个PLC或者用分布式IO。另外FB284的调用要注意背景数据块的数量。每个轴一个背景DBDB多了会占用PLC的装载内存。S7-1200的装载内存有限轴多了要算一下。6.4 断电后位置值丢失的问题EPOS模式下如果用的是增量编码器断电后位置值丢失上电必须重新回零。如果用的是绝对编码器位置值不丢但要注意多圈范围。我遇到过一种情况设备断电后重新上电位置值变成了一个很大的数导致软限位报警。查了半天发现是绝对编码器的多圈值溢出了。解决办法是上电后先执行一次回零或者把P29240设成直接设零上电后把当前位置设为原点。6.5 用Trace功能抓速度给定和实际转速的波形博途的Trace功能很好用可以抓FB284的Velocity引脚值和V90的实际转速对比看是否一致。如果不一致说明参数换算有问题。我一般这样抓让电机走一段匀速运动Trace记录Velocity、OverV、实际转速、跟随误差。如果实际转速和Velocity×P29111对不上检查P29111和P29120。如果跟随误差大检查OverAcc和机械阻力。Trace的采样周期要设小一点比如1 ms否则抓不到动态过程。6.6 一个容易被忽略的参数P29246P29246是EPOS模式下的位置到达窗口单位是LU。如果电机走到目标位置附近但AxisPosOk一直不出1可能是P29246设得太小。我一般设成定位精度的2倍比如定位精度0.01 mmP29246就设成0.02 mm对应的LU值。这个参数在手册里不太起眼但实际调试时经常用到。设得太小到位信号出不来设得太大定位精度不够。7. 从速度给定到位置换算一条完整的调试链路回到开头那台枕式包装机。后来我把P29111设成3000P29110设成30000P29247设成10000减速比5:1丝杠导程10 mm。FB284的Velocity给60%OverV给80%OverAcc和OverDec给50%。回零用主动回零原点开关接在V90的DI1上。第一次跑电机动了但定位偏差5 mm。查换算1 mm 10000 × 5 / 10 5000 LU。Position给50000应该走10 mm实际走了15 mm。偏差5 mm正好是1 mm的5倍。检查减速比发现机械实际是2:1不是5:1。改成2:1后1 mm 10000 × 2 / 10 2000 LU。Position给20000走10 mm准了。这个例子说明机械参数一定要以实际为准不能照搬图纸。图纸上写5:1实际装的是2:1这种情况在非标设备里太常见了。调试时先手动转一圈测量实际位移反推减速比和导程比看图纸靠谱。速度给定这块后来我把OverV放开到100%OverAcc加到80%电机运行平稳没有报警。包装机的节拍要求是每分钟30包每包走200 mm算下来负载侧速度 200 × 30 / 60 100 mm/s。电机侧转速 100 / 10 × 2 × 60 1200 rpm。P291113000所以Velocity40%就够了。实际设了50%留了点余量。整个调试过程花了大概两天其中一天半在搞换算和参数半天在跑节拍。如果一开始就把换算关系理清楚半天就能搞定。这也是我写这篇内容的原因——把换算链路讲透让后来的人少走弯路。最后再分享一个小技巧调试时在博途里建一个数据块把P29110、P29111、P29247、减速比、丝杠导程这些参数都放进去FB284的调用直接引用这些变量。这样改参数只需要改一个地方不用满程序找。而且这些参数可以做成HMI可改的现场调试时不用开博途直接在触摸屏上改方便得多。