第一次打开一套完整的新能源电池pack线程序时,说实话我是有点头皮发麻的。几千个DB块、上百个FB/FC、密密麻麻的OB,随便点开一个程序段就是七八页的梯形图,根本不知道从哪看起。那会儿我连“S1500”这个叫法都还没搞清楚——后来才明白,大家口语里说的S1500,其实就是西门子的S7-1500系列PLC,只是叫着叫着省掉了一个“7”。
这篇内容就想把整套pack线程序的学习思路整理出来,从选型逻辑、程序架构、工艺段逻辑,到调试现场真正踩过的坑,再到新人上手的阅读顺序,一次性说透。适合想进入新能源行业做电气/PLC的工程师,也适合已经在做非标设备、想往pack线方向转的朋友。我不打算讲那种“从入门到精通”的废话,就按实际项目里你怎么接触这套程序、怎么把它啃下来的顺序来写。
1. pack线为什么认准S7-1500:先搞懂程序跑在什么“地基”上
1.1 从名字和选型说起:产线级控制对PLC的要求完全不一样
先把这个命名问题说清楚。西门子官方从来没有“S1500”这个型号,正确叫法是S7-1500,包括CPU 1511、1513、1515、1516、1517这一整个系列。但工地上大家喊习惯了,“S1500”“1500PLC”都指它,所以标题里这么写完全没问题,你知道是哪个东西就行。
为什么pack线普遍用S7-1500而不是S7-1200,也不是老一代的S7-300?核心原因是产线级控制的需求和单机设备完全不同。一条pack线少的二三十个工位,多的五六十个工位,节拍可能压到20秒甚至15秒以内。这意味着:
- 输入输出点数量大,动辄上千点,而且分散在整条线各个工位;
- 伺服轴多,电芯堆叠、压装、拧紧、搬运各种轴加起来二三十个很正常;
- 几乎每个工位都有扫码枪、视觉系统、机器人和MES系统交互,数据流量很大;
- 工位之间有严格的互锁逻辑,比如前站不合格不允许流入下一站,这些判断要在毫秒级完成;
- 故障停机损失极高,整线宕机一分钟可能就意味着几十上百个电芯报废或节拍延误。
S7-1200定位是紧凑型单机控制,处理几百个点、十几个轴没问题,但到了产线级,无论组态规模、通讯能力还是诊断功能都比较吃力。S7-300的问题是老平台,PROFINET支持、在线修改能力、与上位机的交互效率都不如1500来得顺手。S7-1500算力强、通讯集成度高,一条产线挂几十台PN设备非常稳。而且在博途(TIA Portal)里统一组态、统一编程,后期维护成本低。
实际项目中,中小型pack线主流选CPU 1515或1516,大型线用1517,部分只需要几十个IO的小专机用1511也够。选型逻辑基本是:先数轴,再数IO,再看要挂多少PN设备,然后留20%到30%余量,最后看节拍对程序扫描周期有没有硬要求。这里提醒一点,不要只看CPU本体价格,1500平台的软件授权、远程IO模块、伺服配置才是成本大头,选型时要把整个控制柜的方案一起估算。
1.2 一条真实产线的PLC网络拓扑,对应到程序是什么样子
看懂程序之前,最好先把硬件网络在脑子里画出来。典型的一条pack线控制系统大概长这样:
生产管理层有MES/SCADA服务器,通过工业以太网和PLC通讯,负责下发工单、工艺参数,回收各工位的生产数据和追溯信息。控制层就是S7-1500主站,下面挂着多个ET200SP远程IO站,分布在各个工位柜子里;伺服驱动器通过PROFINET接入;机器人和视觉系统要么走PN,要么走Profinet加IO硬接线混合方式;扫码枪、读码器一般也是走PN或串口服务器。
这里最关键的一点,是IO物理地址和程序中使用的名称要对应起来。成熟的项目一般会在程序里建一个专门的IO映射DB,把远程IO站上每个物理点位映射成程序里的符号变量,比如“带顶升定位气缸伸出”“扫码完成信号”“安全门状态”。这样做的目的有几个:一是防止程序里直接散落着I0.0这种地址,改硬件接线时程序跟着遭殃;二是仿真和调试时可以直接在DB块里改值,不用去强制物理IO;三是别人接手程序时,看名字就能明白这个点干什么。
程序组织上,OB1是主循环,大多数逻辑都在里面轮询调用;OB100负责启动初始化,通常在开机时把某些状态位、计数器清零;OB10x是时间中断块,用于周期性处理温度采集、压力监控等需要固定周期执行的任务;OB82、OB86这些是诊断中断块,设备掉站、模块故障时会触发,很多调试现场的“诡异问题”就藏在诊断块的处理逻辑里。后面讲到调试踩坑时我再详细说。
2. 整套程序的“乐高积木”:OB、FB、DB是怎么分工协作的
2.1 为什么产线程序偏爱FB封装,而不是一坨梯形图堆到底
见过的pack线程序,基本都有一个共同特征:几乎不用裸的梯形图逻辑堆叠,而是大量使用FB(函数块)加背景DB(实例数据块)。坦率讲,如果你只看程序段不看调用结构,会觉得每个FB里逻辑也复杂,但正是这种封装让整套程序在几千个变量下依然可控。
打个比方,FB就像一台机器的“操作手册加上状态台账”,背景DB就是这台机器自己的“记录本”。同样是控制一个气缸,你把伸出、缩回、到位检测、超时报警都写成一个FB,每个气缸调用一次,就生成一个独立的背景DB记录它自己的状态。程序里不需要为每个气缸重复写一遍逻辑,改动作流程时只改FB内部,所有气缸跟着变。
在pack线里,典型的分工是:一个工位一个主FB,负责这个工位的状态流转和动作顺序;工位内部通用动作,比如气缸、真空吸盘、扫码触发,调用标准FC或FB;轴控制调用工艺指令块,再在外面包一层工艺处理;通讯和数据交互则在OB或专用FB里统一做。
看到这里有朋友可能会问,这么多FB一层套一层,会不会反而更难读?我的经验是,难点不在于层级多,而在于命名和注释是否规范。好的程序,你看到FB名字就知道是干什么的,比如“Weld_Ctrl”就是焊接控制,“Stack_Asm”就是堆叠装配,“EOL_Test”就是末端测试。变量名做到“前缀_动作_对象”这种程度,基本不用看注释也能猜个大概。
2.2 一套完整pack线程序必备的功能模块清单
虽然不是每条线的程序结构都一样,但你拆开任何一套成熟的pack线程序,下面这些模块几乎都在。
第一个是轴控制模块。pack线里的轴大概是这几类:搬运机械手XYZ轴、堆叠伺服压装轴、电芯入箱的移送轴、拧紧机构的升降轴。常规做法是用运动控制工艺指令实现定位和速度控制,然后在外层封装使能、回零、报警处理、定位完成判断。我见过踩坑最多的地方就是回零逻辑,后面单独说。
第二个是气缸和阀岛模块。产线上气动元件比想象中多得多,夹紧、顶升、阻挡、定位、挡停全是气缸。标准程序里会封装一个气缸FB,输入是动作请求,输出是到位反馈,内部带超时报警。超时时间一般设2到4秒,根据气缸行程和现场速度调。
第三个是扫码与防错模块。扫码枪触发、读码、结果解析、比对工单、防错放行,这一套逻辑在pack线里叫“追溯”或者“防错”。程序里通常有一个专门的数据结构,记录当前托盘条码、电芯序列号、拧紧结果、焊接结果等。
第四个是MES通讯模块。PLC和MES之间交换的数据一般包括:工单信息、工艺参数、设备状态、生产计数、不良品信息。大多数项目用TCP或S7通讯,程序里会有发送缓冲DB和接收缓冲DB,以及握手信号、超时判断。
第五个是报警管理模块。除了PLC自身诊断报警,工艺上还要定义大量自定义报警,比如“气缸超时”“扫码失败”“压力超上限”。成熟的做法是集中在一个报警FB里统一处理,文本要么在HMI里关联,要么在PLC里做报警文本表。
第六个是配方和参数管理模块。不同电芯型号的焊接功率、拧紧扭矩、压装压力都不一样。程序里通常是一张配方表DB,按产品型号索引,切换型号时批量下发到工位FB。
3. 把程序拆开看:几个核心工艺段背后的控制逻辑是怎么“想”的
3.1 上线扫码与托盘防错:从“读到一个码”到“敢放行”之间发生了什么
pack线第一步通常是模组或电芯的上线,把物料放到托盘上,然后托盘在辊筒线上流转。这段程序的核心不是“扫码”这个动作本身,而是扫码之后的防错判断流程。
逻辑大致是这样:托盘到位→阻挡气缸伸出→顶升定位→扫码枪触发→PLC收到字符串形式的条码→和工单要求的当前批次物料编码比对→一致则放行,不一致则报警并禁止进站。这里面有个细节,条码读不到或者读错的时候,程序不能直接停机了事,而是要区分“空托盘”“条码脏污读不出来”“条码不是本工单物料”几种情况,分别给不同的处理策略。
在程序实现上,扫码枪通过PN口把条码发给PLC,PLC侧会有一个接收数据块,里面存了字符串和接收完成标志。执行步骤一般是:先清空接收区→发触发信号→等待完成位→锁存条码→比对→输出结果。我特别提醒一下,扫码触发和完成信号这组握手逻辑一定要考虑超时,不然扫码枪故障时整条线会一直在那干等。
3.2 堆叠压装段:伺服位置、压力监控和“位移-压力双窗口”判断
堆叠和压装是pack线里比较有代表性的工艺段,它典型地体现了PLC程序怎么处理模拟量和运动控制配合。简单说,压装过程不只是把电芯压到位,还要在压的过程中监控压力变化是否在合理区间。压力太大会压坏电芯,压力太小可能没压到位,仅靠定位信号是不够的。
西门子1500平台处理这个场景,位置控制走运动控制指令,压力信号通过模拟量输入模块进PLC,程序里做标定转换,然后和坐标位置一起做窗口判断。所谓“位移-压力双窗口”,是同时看两个条件:压装位移是否到达设定终点、终点位置处的压力是否在上下限之间。两个条件都满足,才算压装合格。
我通常会在程序里看到这种处理方式:压装启动后,FB内部记录当前位移和压力,在一个扫描周期内读取压装轴的位置值和压力传感器数值,判断是否在合格区间,然后保存到背景DB。这个判断条件要放在“压装保持”状态里持续执行,而不是只做一次瞬间判断,因为压力波动可能在保压阶段才出现。曾经有个现场,压装压力偶尔超限,但程序只在压到底的瞬间判断了一次,结果不良品流出到下一个工位,后来改成整个保压周期内持续监控才解决。
给一段简化版的SCL风格逻辑,帮助你理解这种判断方式:
IF #bPressStart AND #stAxis.InPos THEN #rCurrentPressure := #stAnalog.PressureValue; IF #rCurrentPressure > #rPressureMaxLimit THEN #bPressNG := TRUE; #sFaultMsg := '压装压力超上限'; ELSIF #rCurrentPressure < #rPressureMinLimit THEN #bPressNG := TRUE; #sFaultMsg := '压装压力低下限'; ELSE #bPressOK := TRUE; END_IF; END_IF;当然这只是示意,实际程序还要考虑压力滤波、传感器断线检测、标定是否有效等。但核心思路就是这个:动作到位只是前提,工艺结果是否合格才是放行依据。
3.3 焊接段:启停互锁、参数下发、焊接结果回收的三层逻辑
pack线的焊接段,不管是激光焊还是电阻焊,PLC不直接控制焊机内部功率,而是做“外围联锁+参数下发+结果回收”三层逻辑。这是很多新人最容易误解的地方——以为PLC要控制焊接过程本身,其实PLC更像是焊接设备的管理者。
第一层是外围联锁。焊接启动前要确认防护门关闭、光栅无遮挡、排烟风机运行、水冷系统正常、焊机无报警。任何一个条件不满足,启动请求都不会发出去。这层逻辑基本是简单的“与”关系,但要注意互锁信号要取“有效电平”,有些传感器是常闭输出,程序里要反相后再参与互锁,这个搞反了就是安全风险。
第二层是参数下发。不同电芯型号对应不同的焊接参数,程序从配方表里取出参数,通过PROFINET或IO写入焊机控制器,写入完成后焊机返回确认。这层逻辑的关键是“确认”机制,不能发完参数就认为焊接准备完成,必须等焊机反馈“参数已接收”。
第三层是结果回收。焊接完成后,PLC从焊机读取焊接状态、报警代码、能量值,存到追溯数据块中,供MES上传或后续工位查询。之前遇到的情况是,焊机反馈了完成信号,但数据还没完全传过来,程序就已经把托盘放行了,导致追溯数据缺失。后来在程序里加了数据完整性延时等待,确保结果回收完成后再放行。
3.4 拧紧和EOL测试段:结果判定与“合格才放行”的闭环
拧紧段在pack线上一般用于Busbar、端板、模组结构件的螺栓锁付。PLC通过扭矩控制器或拧紧轴通讯,获取每颗螺栓的扭矩值和角度值,判断是否在工艺窗口内。这里程序上有个常见要求:拧紧结果要按螺栓编号逐颗保存,而不是只存一个“整体OK”。如果某一颗螺栓NG,要能记录是哪一颗NG,甚至能够精确定位到托盘上哪个位置,方便返修。
EOL测试段则涉及绝缘耐压测试、气密测试、通讯测试、OCV测试等。以绝缘耐压为例,PLC发送测试请求给测试仪,测试仪执行加压和测量,然后把绝缘电阻值、漏电流值、判定结果返回PLC。这段程序最重要的是状态管理,因为测试过程需要几秒甚至几十秒,PLC必须清楚当前处于“待机”“测试中”“测试完成”“结果处理”哪个状态,避免重复触发或者漏判。
这类测试段的逻辑,很多项目会做成一个“状态机FB”,内部用枚举或整数表示当前处于什么状态,每个状态处理对应的动作和退出条件。在包线程序里,“状态机”思维几乎是必须的,因为你的执行机构不是一直在动,而是节拍式地完成一系列动作,程序必须跟着节拍切换自己的状态。
4. 现场调试最容易翻车的5个地方:真实踩坑记录
4.1 急停、安全门双通道信号:交替脉冲才是最隐蔽的坑
安全回路是所有程序里优先级最高的,但恰恰是调试时最容易被轻飘飘糊弄过去的。现在安全PLC或安全继电器输出的是双通道信号,两个通道状态正常情况下是同步的。但如果接线端子接触不良,会出现一个通道断开片刻又恢复的情况,在程序里看到的现象就是安全信号“闪断”。
有个项目调试时,安全门信号动不动就闪停,整线十几秒就断一次。排查了半天,才发现是一个安全门上的门磁开关接线端子松了,震动时偶尔断开几毫秒,安全回路直接把控制电源切断。后来整改是把所有安全门开关的接线端子全部重新压接,程序侧又给安全信号做了50ms的滤波延时(安全回路本身允许这么短的滤波,但前提是要符合安全评估要求)。这里提醒一点,安全相关的改动一定要谨慎,任何滤波延时都要和现场安全评估确认,不能自己想当然。
4.2 PROFINET设备掉站:为什么整条线会“假死”成一片
PROFINET设备掉站是pack线现场最常见、也最让人头疼的故障之一。现象是某一个远程IO站或伺服驱动器短暂断开,结果整条线停下来,重新上电或复位后才能恢复。原因通常出在程序设计没有单独处理设备掉站,或者没有在OB82/OB86里做相应的系统反应。
有些项目,PLC程序里直接在OB1里访问全站所有IO地址,任何一路通讯故障,系统访问中断,CPU进入STOP,整线瘫痪。合理做法是:给每个远程站配置独立的诊断处理,站点掉站时只影响该站相关区域,只报警不停整机;在程序里对关键IO区域做判断,确认站点在线后才执行该区域的逻辑。西门子的分布式IO诊断块可以提供站点状态,很多成熟项目会把全线的站点状态汇总到一个DB里,HMI上直接显示哪个分站掉线。
4.3 MES通讯超时与“假死”:握手信号里少了一个超时判断
pack线几乎每个工位都要和MES打交道,通讯超时是高频问题。常规的做法是PLC发请求后一直等MES返回,但如果MES那边卡住了或者网线抖动,PLC就会一直空等,整个工位“假死”。这时候操作工只能复位,运气好能恢复,运气差直接报错停机。
解决办法是在通讯逻辑里增加超时判定。PLC发请求后启动一个定时器,比如5秒内MES没响应,判定超时,程序可以选择重新发送、降级跳过当前工单或者停止动作并报警。这个策略要提前跟项目组商量清楚,因为有些追溯数据是不能跳过的,跳过了意味着后面出现质量问题查无依据。我的建议是区分“关键数据”和“非关键数据”:非关键数据超时后先放行,后台补传;关键数据超时则必须停机等待,直到通讯恢复。
4.4 伺服轴零点丢失:一块小小电池的“事故”
轴零点丢失在pack线里遇到的频率比想象中高得多。很多伺服电机的编码器靠电池保持绝对位置,电池没电或者更换时操作不当,零点就会丢。丢了以后重新回零,如果回零方式不对,位置就会偏,堆叠、压装全乱套。
程序层面能做的有两件事。第一,设计好回零程序,支持多种回零方式,至少要有“绝对位置有效直接走绝对定位”和“绝对位置无效时先找Home开关再走绝对定位”两条路径。第二,把编码器电池电压状态接到PLC报警里,低压预警而不是等丢了零点才报警。另外现场管理上要强制规定:更换编码器电池时必须保持电机通电,断电换电池等于直接丢零点,这些都是血泪教训。
4.5 互锁条件的“先并后串”:一个顺序错误就可能引发设备碰撞
非标设备调试中最常犯的互锁错误,是把多个条件直接并联在一条控制线上,导致逻辑上应该“同时满足”变成了“任一满足”。比如一个升降机构,程序要求“前安全门关闭”“后安全门关闭”“没有人员入侵信号”三个条件同时满足才能下降,结果三个传感器信号并联进同一个线圈回路,任意一个有效就能动作,那就危险了。
梯形图里正确的写法是“串联”,但更安全的做法是“条件成立才动作,条件不成立立即断开”,同时安全逻辑独立于普通工艺逻辑,不放在主流程里被扫描顺序影响。有个项目调试时就是把这几个条件写在了程序段的前半部,一旦前面的条件被跳过,机器人照样动作,好在当时是空跑没伤到人。从那以后我养成了一个习惯:凡是和人员安全相关的互锁逻辑,全部单独放在程序最前面,用独立的网络段写,不掺任何工艺动作。
下表总结这几类典型调试问题的快速定位思路:
| 故障现象 | 可能根因 | 排查方向 |
|---|---|---|
| 整线瞬间停机又复位 | 安全回路双通道闪断 | 检查安全门开关、急停按钮接线端子 |
| 某站IO全部无响应 | PROFINET线路或站点掉站 | 查看OB86诊断、交换机端口状态 |
| 工位等待MES后卡死 | 通讯超时无判定 | 检查握手信号、增加超时重发逻辑 |
| 伺服轴位置跑偏 | 编码器电池失效、零点丢失 | 检查电池电压、重新回零校准 |
| 安全条件满足但不动作 | 互锁信号电平取反 | 核对传感器常开常闭、程序取的是否有效电平 |
5. 新人学习路径:一套pack线程序到底该从哪头啃起
5.1 正确的阅读顺序:先拓扑,再IO,再OB,再FB,最后看在线值
很多新人拿到程序包,第一件事就是打开OB1从头看,然后看不了多久就放弃了。这是因为顺序不对。我的建议是下面这条路径,基本能覆盖大多数产线程序。
第一步,先找硬件组态和网络拓扑图。搞清楚CPU型号、挂了多少远程IO站、哪些工位对应哪个站、伺服轴是哪个驱动器、机器人和视觉挂在哪个口上。这一步不需要看任何程序,但能让你对整个系统有个框架。
第二步,找IO映射DB或符号表。把物理IO点位和符号名对应起来看,重点关注气缸、电机、传感器、安全信号的分布。你能说出“这个工位有三个气缸两个传感器”这样的数据,说明你对工位有了基本概念。
第三步,看OB块。打开OB1看它调用了哪些FB,大致理出主流程调用的顺序,哪些工位逻辑在OB1里按顺序轮询,哪些在OB10x里周期执行。再看OB100初始化做了什么清除动作,OB82/OB86诊断处理做了什么。
第四步,挑一个最简单的工位FB深挖。怎么判断“简单”?气缸数量少、没有伺服轴、没有通讯的工位优先。把一个FB从头到尾读完,记录它每一步动作的条件和结果,你就能理解这个工位的完整动作流程。
第五步,在PLC在线状态下打开背景DB,看在线值。这是理解程序运行的“作弊器”——你不用猜某个变量现在是什么状态,直接看监控值就知道。配合状态监控和变量表,能很快看出工位停在哪一步、因为什么条件没有满足。
5.2 用好博途里这几个工程工具,效率翻倍
第一个是交叉引用。点击任何一个变量,能看到它被哪些程序块引用、在什么网络段里使用,排查“这个信号从哪里来、到哪里去”非常有用。第二个是监控表和强制表,调试时批量监控上百个变量、强制某个信号看后续逻辑反应,都靠这两个工具。第三个是“在线修改”功能,1500平台可以在运行状态下修改程序然后下载,不会中断生产,这是比老平台舒服很多的地方。但注意,在线修改后要及时保存项目,不然版本就乱了。
还有一个容易被忽略的是PLC的变量“保持性”设置。产线程序里很多状态变量需要断电保持,比如当前生产计数、工艺结果标志位,如果不设置保持性,断电重启后这些数据就清零了,让你误以为设备或程序出了大问题。
5.3 用仿真和虚拟调试练手:把一条线装进电脑里
如果你手里暂时没有真实产线,最推荐的练习方式是用博途自带的PLCSIM仿真,搭配信号模拟。你可以在仿真环境里练习编写一个“小产线模型”:一个托盘到位气缸、一个扫码枪、一个阻挡气缸、一个顶升定位,再配合产品放行逻辑,基本就能模拟pack线一个工位的完整流程。
更进阶的做法是结合一些第三方虚拟调试软件,把机械模型和PLC程序连起来仿真,机器人动作、传感器触发都能在电脑里跑。但对于大多数学习者来说,先用PLCSIM把状态机逻辑调通,已经比光看程序强太多了。读程序读到怀疑人生的时候,用仿真把这个工位的逻辑跑一遍,很多问题就通了。
下面是一份个人建议的学习阶段参考表:
| 阶段 | 学习目标 | 建议练习内容 |
|---|---|---|
| 入门期 | 看懂硬件组态和OB结构 | 对照拓扑图画信号走向,数清每个工位IO |
| 成长期 | 读懂单个工位FB逻辑 | 选一个气缸工位,画出动作流程 |
| 进阶期 | 理解通讯和数据交互 | 模拟扫码触发、MES请求超时处理 |
| 实战期 | 独立修改和优化程序 | 给程序增加一个超时报警、增加一段防错逻辑 |
6. 最后分享一点个人体会
学pack线程序这件事,最难的其实不是语法,也不是某个指令不会用,而是思维方式的转变。单机设备程序你只要管好一台机器,pack线程序你管理的是一条流动的生产线——每个工位有自己的状态,工位之间还有物流、信息流、质量流的传递。你脑子里必须始终有一个“状态机”的概念:现在在哪个状态、哪些条件满足后进入下一个状态、在某个状态停留太久是不是异常。这是我从pack线程序里收获最大的一点。
最后再分享一个小习惯:每次去现场调试,我都会把当天的故障现象、排查过程、最终原因记在一个小本子上。半年翻下来,你会发现大量问题其实是重复的——接线松了、通讯超时、信号电平搞反、零点丢失。真正让你值钱的不是你会用多少指令,而是你见了多少故障、能不能在十分钟内判断出问题方向。这套pack线程序的学习过程,如果你能坚持把每一个工位都彻底读透一遍,再回到单机设备时,你会觉得什么程序都简单了。