多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

西门子S7-1200 PLC让压装工艺实现曲线监控与程序化控制

西门子S7-1200 PLC让压装工艺实现曲线监控与程序化控制 去年给一条转向节衬套压装线做电气改造原设备用的是老式仪表控制器加一堆中间继电器压力到了给个开关量位移全靠人工看百分表换型号调参数能折腾一整天。改造成西门子1200系列PLC之后整套压装工艺才算是真正长在程序里。这篇文章把当初的方案思路、硬件选型、采集逻辑、编程方法以及现场踩过的坑完整梳理一遍做汽车零部件产线或者非标压装设备的朋友可以直接参考。这套系统的核心价值有三点一是用PLC实现了压力位移数据的精准采集让压装过程从凭感觉变成看曲线二是把复杂的压装工艺流程做成结构化程序实现了简化编程三是为后续的数据追溯和产线信息化留好了接口。无论你是电气工程师、设备维护人员还是做产线自动化的项目经理这篇文章里的内容都有可以直接套用的地方。1. 压装工艺的难点拆解压力位移曲线为什么是核心先说清楚压装到底是什么。压装就是用外力把轴承、衬套、销子、密封圈这类零部件压入壳体的孔位里靠过盈配合来保证装配强度。汽车行业里转向节、轮毂单元、变速箱壳体、减振器筒都有这类工位。工艺参数一般就三个压装力、压装位移、压装速度但真正让调试人员头疼的是这三个参数之间的动态关系——压力位移曲线。1.1 传统的控制方式为什么跟不上早期设备最常见的方案是液压缸或气缸推动压头压力继电器检测到压力到达设定值就给PLC一个开关量压头到位后停止。这种方案最大的问题是只看结果、不看过程。举个很典型的情况衬套压入时如果歪斜了压力虽然会上升但上升的速率和正常情况完全不同。用开关量控制的话只要最终压力到了设定值设备就认为合格了压根发现不了压斜。等到下一个工序装配卡死或者异响才回头查漏一批零件已经流下去了。还有更隐蔽的问题——空压。操作工忘记放工件压头空跑一趟压力继电器也能报到位因为气缸/液压缸到头了压力自然就上来了。位置开关如果装在气缸本体上更是完全无感。这类问题用开关量是防不住的必须同时盯住压力和位移。1.2 正常压装曲线长什么样一条正常的压力位移曲线大致分四个阶段快进段压头快速接近工件表面压力接近零位移线性增加。接触段压头碰到工件压力开始缓慢爬升位移继续往前。压入段工件与孔壁摩擦压力随位移稳步上升这是判断压装质量最关键的一段正常应该平滑、无突变。保压段压到底后保持压力一段时间让应力释放曲线趋于平稳。只要这段曲线形状出现异常大概率就是零件问题、工装问题或者来料问题。比如压入段压力突然断崖式下降往往意味着零件开裂或者压穿压力上升斜率异常陡峭说明过盈量太大了可能要压碎工件压力已经有明显台阶而位移没走多少大概率是卡滞或者缺润滑。1.3 我要用PLC解决的几个问题把需求列清楚选型才有依据。当时我给这个项目定的目标是每秒至少采集200组压力位移数据也就是5ms一个采样周期这样突变点不会被漏掉实时绘制并监控压力位移曲线发现异常立即停车并报警区分空压、卡滞、过载、压不到位等故障类型每个工件自动存储最大压力、终点位置、判定结果方便扫码追溯程序结构上做到多工位通用换个产品或换一套工装时只改配方参数不改程序。这四个目标决定了后面所有硬件和软件的设计方向。2. 硬件选型与配置S7-1200加传感器的搭配方案很多人在选型阶段就开始纠结其实压装工艺对PLC的要求没有那么复杂但有两个硬指标必须满足模拟量采样要够快够稳程序执行要能扛住高速数据处理。S7-1200这条产品线里我会优先建议用1214C DC/DC/DC。2.1 CPU型号怎么选为什么是1214C而不是更便宜的1212C1212C本体只有8输入6输出做单工位压装勉强够用但如果要加扫码枪、三色灯、伺服使能、安全继电器这些外设IO数量很吃紧。1214C自带14DI/10DO运算速度快不少程序存储和DB容量也更大后续如果要扩展第二个压装工位不用换CPU。如果现场已经有了PROFINET控制层可以考虑1215C它多了一个千兆PROFINET接口与其他设备通信更灵活。但做单机设备1214C性价比最好。选DC/DC/DC型是因为压装设备现场一般都有24V直流控制电源直接用24V供电不用额外处理220V转24V的问题。另外控制柜内强电电磁干扰比较大DC型PLC的开关电源抗干扰性能比AC型更稳定。2.2 模拟量信号链路的搭法压装需要采集模拟量信号的核心是压力传感器和位移传感器。S7-1200本体CPU自带两个模拟量输入通道但说实话精度和通道数都不够用——压装工位至少要同时采集压力、位移两路如果还有温度或力传感器就得扩展信号模块。我当时用的是SM1231 AI 8x13bit模块8路模拟量输入13位分辨率足够压装使用。一个模块可以管两个工位的压力位移采集剩余通道还能接油温、气压等辅助信号。压力传感器选的是4-20mA输出的压阻式变送器量程按最大压装力的1.5倍来选。比如工艺最大压装力是30kN我就选45kN量程的传感器。留这个余量不是为了好看是防止偶尔过载把传感器顶坏同时让正常信号落在量程的60%-80%区间测量精度最高。位移传感器有两种路线各有优缺点方案A模拟量直线位移传感器输出4-20mA或0-10V量程100mm接模拟量模块。优点是接线简单、程序好写缺点是精度受模拟量分辨率限制13位分辨率对应100mm量程理论上最小分辨能力约0.012mm实际噪声一掺和能稳定的也就是0.05mm左右。方案B增量编码器加高速计数器测量位移。编码器直接装在伺服电机或压头丝杠上每转输出脉冲数一般在2500以上4倍频后分辨率远高于模拟量。缺点是程序里要处理高速计数还要处理电子齿轮比和方向。我最终选了方案A因为压装设备的位移精度需求通常在0.1mm级别模拟量位移传感器足够调试省事。但如果你做的是精密压装比如高压油嘴、精密轴承果断上编码器加HSC。2.3 伺服还是液压控制执行机构的选择压装执行机构目前主流是伺服电动缸和伺服液压缸两种。伺服电缸的优点是速度控制精准压力位移曲线重复性好程序控制简单直接给伺服驱动器速度或位置指令就行。缺点是推力上限受电机和丝杠限制大吨位压装成本偏高。伺服液压缸的优点是推力大、成本相对低但液压系统响应慢控制压力需要额外增加比例阀或伺服阀调试周期长。压力波动也比电缸大对曲线判定逻辑的要求更高。我这条线用的是伺服电缸配西门子V90伺服驱动器PN通信。如果预算有限用步进加丝杠也能做但动态响应和过载能力都差一档强烈不建议。以下是当时系统的主要硬件清单供参考组件型号/规格作用PLCS7-1200 1214C DC/DC/DC主控逻辑与数据采集模拟量输入SM1231 AI 8x13bit接压力、位移等模拟量压力传感器4-20mA, 0-45kN压装力检测位移传感器拉杆式模拟量, 0-100mm压头位置检测伺服驱动器西门子V90 PN驱动电缸走PROFINET触摸屏西门子KTP700 Basic参数设定、曲线显示、报警扫码枪串口输出, RS232转485工件追溯码录入3. 压力位移数据采集的实现从硬件信号到PLC内存数据采集是整个系统里最容易出问题、也最容易被轻视的环节。很多程序写得好好的一上设备数据就乱跳。这里不把原理讲透后面排查会让你怀疑人生。3.1 模拟量信号进入PLC后如何变成工程量S7-1200读取SM1231的原始值是0到27648的整数。4-20mA信号对应0到27648需要换算成实际压力值。博途里可以用NORM_X和SCALE_X指令这两条指令配合完成。SCL写法如下// 压力通道原始值转换为kN 压力原始值 : INT_TO_REAL(AI_Pressure); 压力工程值 : SCALE_X(MIN : 0.0, MAX : 45.0, VALUE : NORM_X(MIN : 0.0, MAX : 27648.0, VALUE : 压力原始值));这里有个容易踩的坑4mA对应0电流低于4mA比如断线时原始值会变成负数或跳到0。为了能区分没压力和传感器断线我会加一个断线判断原始值小于500约3.5mA时直接报传感器故障不参与曲线判定。3.2 采样周期与定时中断为什么不能用扫描周期PLC的扫描周期是不固定的写了个程序段去读模拟量每次读到的时间间隔会随着程序长短波动。压装过程中压头可能以20mm/s的速度下压如果采样间隔忽快忽慢曲线上的点会分布不均突变点也会被漏掉。正确做法是把数据采集放到循环中断组织块里执行比如OB35。OB35默认间隔是100ms对于压装来说太慢了我实际设置为5ms甚至2ms取决于CPU负载。在OB35里做的事情很纯粹读两路模拟量换算工程值存入DB数组再做一次简易滤波。3.3 压力位移同步问题压力传感器和位移传感器是两路独立的模拟量通道虽然都挂在SM1231上但模块扫描通道时有一个固定的轮询顺序严格意义上两个值不是同一时刻采到的。如果压装速度很快两路信号之间的时间差会导致曲线产生位移偏差。处理办法有两个。一个是算法修正位移变化率乘以通道间隔时间补偿到位移值里另一个简单粗暴的做法是压装速度控制得比较慢比如工进速度控制在5-10mm/s通道间隔1ms以内偏差可以忽略。我采用的是第二种方案实测曲线效果很满意。如果做高速压装30mm/s以上建议还是上编码器加高速计数的方式脉冲信号不存在采样同步问题。3.4 滤波的取舍平滑但不能失真现场传感器信号不可能完全干净尤其是旁边有伺服驱动器时4-20mA信号上会叠加高频噪声。如果不做处理直接画曲线就是一条毛刺很多的锯齿线。我在程序里做了一阶惯性滤波公式很简单滤波后值 : 滤波后值 K * (当前采样值 - 滤波后值);关键是K值怎么选。K太小曲线被压得很平滑但真实的压力突变也会被抹掉压装裂纹这种特征就看不出来了。K太大的话又起不到滤波作用。我实测下来K取0.2-0.3比较合适既能压住毛刺又不至于让突变点变形。还有一个细节滤波只用于曲线显示和包络线判定报警用的极限压力比较最好用原始值滤波前的值或者用一个很小的K确保超压时不留延迟。3.5 数据缓存的分配思路曲线数据要临时存在PLC里。S7-1200的DB空间不像大型PLC那么充裕但存曲线还是够的。我定义了一个固定长度的环形数据区按采样周期往里写近2秒的数据压装完成后把这一段数据整体搬到结果记录DB里同时给HMI做曲线回放。数组的定义大致是这样// 曲线数据块 CurveData : ARRAY[0..399] OF Struct Pressure : Real; // 压力kN Position : Real; // 位移mm END_STRUCT400个点配合5ms周期就是2秒的曲线窗口压装长工件时如果超过2秒可以开成800点或者用差分记录只存关键特征点那样对处理器资源更友好。4. 核心控制逻辑压装曲线判定、状态机与报警防错压装控制的本质是一个带判定的状态机。程序不能只盯着最终结果还要在过程中实时判断曲线是否正常发现异常就及时停车。任何压装工艺控制块都可以拆成阶段状态窗口判定两部分。4.1 压装过程的四段状态机我用SCL写了一个FB里面用一个整型变量STATE表示当前阶段值1-6分别对应空闲、快进、接触判定、工进压装、保压、退回。SCL里的CASE语句比梯形图清晰太多CASE state OF 1: // 空闲 IF 启动命令 THEN state : 2; 压头速度 : 快进速度设定; END_IF; 2: // 快进 IF 位移工程值 接触位置设定 THEN state : 3; END_IF; 3: // 接触判定 IF 压力工程值 接触压力设定 THEN state : 4; 曲线记录运行 : TRUE; END_IF; 4: // 工进压装 IF 位移工程值 终点位置设定 THEN state : 5; 压头速度 : 0; END_IF; 5: // 保压 保压计时 : 保压计时 1; IF 保压计时 保压时间设定 THEN state : 6; END_IF; 6: // 退回 ... END_CASE;快进时压头移动快但还没有接触工件这时候压力应当趋近于零。如果快进途中压力突然升高说明压头撞到东西了要立刻停车。4.2 包络线判定如何让PLC看懂曲线光有状态机还不够因为压装质量的核心是过程曲线形态。工业上最实用的做法是设置包络线——在正常压力位移曲线的上下各留一个公差带实时值一旦出界就认为异常。包络线的实现不是存一整条曲线再比较那样计算量太大。我的做法是按位移区间分段每5mm设置一个允许压力上限和下限值。压装过程中实时位移落在哪个区间段就把当前压力与该段的上限下限比较。这里要给个建议上下限不要设成固定值最好与位移位置做一点关联。比如压入初始阶段包络可以宽一点压到中后段包络要收紧。因为压力随压入深度增加是趋势性上升的固定宽度的包络在浅压入时会误报在深压入时又不够灵敏。4.3 常见异常怎么识别压装最常见的异常模式就那么几种每种在曲线上有明显特征程序里可以分别捕捉异常类型曲线特征判定方法处置空压压力几乎为0位移走完压装阶段压力始终小于接触压力设定立即停机提示放件过载压力急剧上升超过上限实时压力超过程序硬上限立即停机防止顶坏卡滞压力上升斜率明显变大单位位移内压力量超过设定阈值停机报警零件开裂压力突然明显回落相邻采样点压力差小于负阈值停机并标记不合格压不到位压力正常但位移未到终点压到上限压力时位移未达终点停机并标记不合格压斜曲线呈非单调波动压力出现明显波动或阶梯停机人工检查这里要特别注意斜率突变检测的计算量。PLC在每个采样周期里计算单位位移内压力变化我用的是一个简单的差分法压力变化率 : (当前压力 - 上个周期压力) / (当前位移 - 上个周期位移);如果位移增量太小接近零除法会产生巨大值要加一个位移增量过滤条件位移推进小于0.01mm时不计算斜率。4.4 报警优先级的处理压装过程中可能同时触发多个异常程序要按危害程度决定响应顺序。我的优先顺序是超压停车 传感器断线 卡滞 压不到位 空压 包络线超差。超压必须无条件立即停车不受任何互锁影响传感器断线时报停但允许人工继续点动空压和包络线超差这类属于质量相关异常停车后可以复位重启。防错方面所有安全门、双手启动按钮、安全光幕都接进急停回路PLC里再用硬互锁防止压头在人员伸手时启动。这部分逻辑不能用程序代替必须靠硬件安全回路。5. 简化编程的关键思路FB封装与结构化数据块标题里特别提到简化编程这一点不是空话。老式的压装程序大多是梯形图一上一下铺开状态切换、数据记录、报警判断全混在几十个网络里调试时找一个问题要翻半小时。我做的是把整个压装工艺封装成一个通用FB参数全部走接口这样多工位复制、换产品调参都不用动代码。5.1 为什么用FB而不是子程序S7-1200支持FC函数和FB函数块。压装控制我强烈建议用FB因为FB自带背景数据块每次调用都有独立的内存区域保存状态和参数。FC没有独立数据块多个工位调用同一个FC时如果FC内部用了全局变量工位之间会严重串数据。FB天然避免了这个问题——每个工位调用一次FB就有一个独立的实例DB各存各的数据。后台数据块的独立性是多工位程序最简单可靠的实现方式。5.2 一个通用压装FB的接口设计我的FB接口参考如下// FB_Pressing 压装控制块 FUNCTION_BLOCK FB_Pressing VAR_INPUT i_StartCommand : BOOL; // 启动命令 i_ProductSelect : INT; // 产品配方号 i_PressureRaw : REAL; // 当前压力kN已换算 i_PositionRaw : REAL; // 当前位移mm已换算 i_ResetFault : BOOL; // 故障复位 END_VAR VAR_OUTPUT o_Running : BOOL; // 正在压装 o_Done : BOOL; // 压装完成 o_Fault : BOOL; // 故障中 o_FaultCode : INT; // 故障代码 o_MaxPressure : REAL; // 本次最大压力 o_EndPosition : REAL; // 本次终点位置 o_Pass : BOOL; // 判定合格 END_VAR VAR_IN_OUT io_CurveBuffer : ARRAY; // 曲线数据缓冲区 END_VAR VAR state : INT; faultCodeTmp : INT; maxPressureTmp : REAL; ... END_VAR这样做的好处非常明显现场操作工换产品时只需要在HMI上切换配方号FB内部从配方DB读取对应的接触位置、终点位置、压力上限下限、保压时间等参数完全不改程序逻辑。5.3 多工位复用的具体做法假设现场是双工位压装左边压衬套、右边压销子两套工艺参数差距很大。传统做法是复制一套程序改参数代码冗余大。FB的思路是创建两个实例FB1压装工位1和FB2压装工位2两个实例使用同一个FB定义静态变量各自独立模拟量通道、伺服轴号、IO点通过背景DB的接口参数映射到各自工位。以后如果做三条线直接再拖一个实例出来配好接口就完事。这条思路后来在其他项目里又用了几次每次都能省掉大量重复编程时间。5.4 数据结构怎么组织才不乱S7-1200支持优化访问的数据块建议直接用符号名访问不要用绝对地址。压装相关的数据设计成三层第一层是配方层存不同产品型号的压装参数第二层是运行层存实时采样值和判定中间量第三层是结果层存每个工件的完工记录。数据块划分清晰之后HMI变量连接、上位机读取、程序内部引用都不容易串地址。6. 数据追溯与外部交互扫码、上位机与配方管理压装数据光在PLC里存着没有意义汽车零部件行业现在基本都要求每件产品都有完整的压装记录能追溯到原材料批次、设备参数和结果。这块是S7-1200相对老款200PLC最让人舒服的地方通信能力强了不止一点。6.1 每件产品的追溯记录有哪些我在程序里为每个工件维护一份压装记录字段大致如下工件二维码/条码压装时间戳年月日时分秒产品配方号最大压装压力终点位置判定结果合格、不合格代码异常代码如果中途报警保压时间实际值操作员号。这份记录存在结果DB里用数组循环存储存满时覆盖最老的一批。HMI上可以查最近记录上位机通过通信把这些记录实时拉走。6.2 扫码枪接入PLC的两种方式扫码枪接入PLC常见就两条路串口和以太网。串口扫码枪便宜但S7-1200本体不带标准串口需要配通信模块如CM1241 RS232。我用的是RS232扫码枪转485再接CM1241程序里用收字符中断把二维码拼起来。以太网扫码枪更方便直接通过TCP或UDP协议发送数据到PLC。S7-1200从固件4.0开始支持TCP通信用T-CON和TRCV指令实现。如果只是简单扫码我更推荐以太网方式省掉转换模块处理速度也快。6.3 与上位机/MES的通信方案S7-1200和上位机交互有几种方案按实际情况选择通信方式特点适用场景OPC UAS7-1200固件4.0后支持直接读写符号变量无需工业网关中控室监控、MES直连Modbus TCP万能协议上位机、触摸屏、老系统都支持国产MES或第三方上位机PROFINET S7通信西门子原生协议博途工程组态里直接PUT/GET同一控制系统内的数据交换文件导出HMI导出CSV或上位机读取DB导出离线分析、审计留存我这次用的是Modbus TCP因为甲方MES系统是老平台跑私有协议对接太麻烦。Modbus TCP在S7-1200里是通过MB_SERVER指令实现的把要读的数据映射到一个专用数据块映射关系做好以后调试很顺利。6.4 配方管理怎么做配方说白了就是一组工艺参数的集合。S7-1200可以用配方数据功能也可以用普通数据块加HMI切换。我的经验是压装场景用数据块配方更灵活因为直接在SCL里读数组不用去处理配方组件的复杂状态。我把配方数据定义为一个三维数组配方号、参数号、参数值。比如配方号1的终点位置就是RecipeData[1,2]HMI上做个表格控件操作工可以自己填写参数不需要工程师改程序。这里有个安全建议配方参数在HMI上修改后最好加一个试压模式先在低速空行程下运行一遍确认参数没输错再放行正常生产。不然误操作把终点位置改成150mm压头直接顶到工装底板上损失的不只是时间。7. 现场运行的实战经验干扰、误报与故障排查记录程序写得好只是第一步真正让人长记性的是现场调试时的各种怪问题。这节整理几个典型故障都是我在实际项目里踩过的。7.1 模拟量信号受到伺服干扰第一台设备通电调试时伺服一启动压力信号就开始波动波动幅度能有0.8kN左右。当时排查路子先看屏蔽层接没接地确认用的是屏蔽双绞线且单端接地再查传感器供电电源和伺服动力线是否走同一个线槽结果还真共用了一段桥架。整改措施把动力线和信号线分开走压力传感器和位移传感器的电源从PLC侧24V单独供电加了磁环滤波器在信号线末端。整改后波动降到0.1kN以内曲线明显光顺多了。很多现场模拟量乱飘的问题归根结底都是布线问题不是PLC或者传感器的问题。7.2 滤波参数调得太平滑导致漏判有一阵出现零件压装后异响但设备判定全部合格。后来回放曲线才发现压入段有一个很小的压力回落幅度只有正常压力的5%左右持续20ms。因为当时滤波系数K设得小这个回落被完全抹掉了。这也印证了我前面说的曲线判定用的数据不能滤波太狠。我的改进办法是双路处理——压力超限报警用未滤波的值包络线判定用轻度滤波的值显示到HMI的曲线再用重度滤波的值。一套数据三个用途各取所需。7.3 零点漂移让压力基线抬高连续生产两个小时后设备开始误报空压——明明放了工件接触压力判定却过了。查到最后是压力传感器零点漂移基线从0.2kN抬到了0.9kN接触压力设定值只有2kN误判大概率发生。处理办法在PLC程序里加了一个自动校零逻辑压头回到上极限位且无负载时采样一段时间取平均值作为当前零点补偿到压力计算里。这之后零漂问题就基本绝迹了。分享一个细节自动校零只能在校零位置没有机械接触应力时进行如果压头在中间被什么东西卡住校零会引入更大的偏差。所以程序里把校零条件锁定在压头回到上极限伺服无抱闸时间窗口内位移变化小于0.01mm这三个条件同时满足时才执行。7.4 压装时间太长导致曲线窗口不够刚开始曲线数组只设计了2秒的容量结果有一种长衬套零件压装周期要3.5秒中间段数据被覆盖了。后来改成了差分压缩方案位移每前进一定距离才记录一个点而不是按固定时间间隔记录。这样既保证了曲线点数的完整又不会因为压装时间长短变化而丢失关键区间。类似的坑还有设备开机不生产时OB35里的数据采集一直在跑会把曲线数组覆盖掉。我加了一个数据记录使能条件只有状态机进入工进压装后曲线才写入压装完成立即冻结。7.5 现场调试时建议备一台笔记本电脑S7-1200用博途调试真心方便在线监控、强制变量、Trace功能都能用。特别是曲线调试阶段配合博途自带的Trace功能可以直接在PC上录波形比HMI上肉眼看曲线直观得多。强烈建议现场调试时把手提电脑带全了网线、交换机、博途软件一个都别少。我总结下来的调试顺序是先用Trace确认传感器信号正确、滤波参数合理然后做空压和超压报警测试再进行包络线学习最后跑产品验证。这样每步都能清清楚楚知道问题出在哪一环不至于浪费一整天在设备上瞎试。这套基于S7-1200的压装控制系统运行了一年多最直接的感受就是工艺人员敢在程序里放手干活了。以前改一次参数要电气工程师全程陪着现在操作工自己上台一扫产品码配方自动加载压装参数、曲线、结果记录全自动跑完出错还有明确的故障提示。最后分享一个我养成的习惯每批新工件做首件压装时不要直接设好包络线就量产。先手动跑三次把三条正常曲线存下来叠加在一起看重复性如何再根据这三条线的外包络去生成判定上限下限。很多你觉得曲线应该长这样的判断实际上不如让设备自己多跑几趟来得可靠。这个习惯帮我挡掉过好多次因工装偏差、来料变化导致的曲线误判也省掉了后续大量返工。
返回列表