整理车间自动化项目的时候,翻出两个去年给建材厂做的S7-1200程序案例,越看越觉得有必要写出来。这两个项目,一个是加气混凝土砌块生产线的配料称量系统,另一个是砌块切割工位的自动摆渡与顺序控制。都是建材厂里很常见的中小规模设备,但现场环境相当不客气:粉尘大、振动强、温度高,工人三班倒,半夜报警是常态。程序就是在这样的环境里磨出来的,编程套路也全是现场逼出来的。
两个项目有一个共同点:功能不复杂,但逻辑关系特别碎。配料称量要处理多路给料机的粗细喂、称重仪表的通讯、飞料补偿、配方切换;切割摆渡要处理摆渡车、切割小车、升降台之间无数个“谁先谁后”的条件。这种项目,最怕的不是不会写某条指令,而是程序越改越乱、越改越坏。所以这篇文章不打算讲具体工艺怎么设计讲解过了,重点放在我怎么用一套组织方式,把这种“碎逻辑”写得不乱、好调试、敢让别人接手。
这篇文章适合谁看?正准备接S7-1200项目的新手,在建材设备或类似离散控制行业做电气设计的同行,以及想提升程序结构化程度、让同事能顺利接手你程序的工程师。内容都是我实际落地过程中总结出来的套路,能直接抄作业的尽量给到位。
1. 两套建材厂设备的工艺链路与硬件基础
1.1 加气砌块配料称量系统的工艺要求
加气混凝土砌块这个行业,核心工艺路线大体是:粉煤灰、砂、水泥、石灰等原料进仓,通过螺旋给料机往计量斗里加料,计量斗下方压着称重传感器,配料完成后卸料进搅拌机,加水搅拌,最后浇注成型。真正要命的地方在“计量”:每一盘的配方比例直接决定成品强度,精度不够,整批砌块都可能报废。
这套系统的控制点主要有三类:一是多路螺旋给料机,每路配一台变频器,实现“粗喂快、精喂慢”;二是气动阀门和卸料门,控制物料流向;三是称重仪表,实时把计量斗的重量数据传送给PLC。做程序的时候,我习惯把工艺要求整理成一句大白话:在尽量短的时间内,把几种物料按配方重量加进计量斗,精度达到±1公斤以内,并且不能超调。
看起来简单,实际上牵扯的问题很多。比如粉煤灰这种物料流动性差,给料机容易结拱,重量信号会有跳跃性波动;螺旋给料机停止以后,管道里还有一截余料在下落,这部分的“飞料”重量如果不做补偿,精度就是一句空话。这些细节都是程序里需要专门处理的。
1.2 切割摆渡顺序控制系统的工艺链路
另一套是砌块成型后的切割工段。坯体成型出来以后,要先由摆渡车送到切割位置,切割台升降、水平切割钢丝动作、垂直切割动作,全部完成后坯体再送走。这中间每个动作之间有严格的时序关系,而且切割小车和摆渡车在空间上是交叉的,谁先动谁后动错一点都不行——轻则挂坏钢丝,重则两车相撞。
这套系统的逻辑难点在于“顺序的编排”。十几个动作,每个动作有自己的起始条件、结束反馈、超时报警和互锁条件。一开始我也想过把所有条件堆在一起判断,写到后来自己都绕晕了。后来改成顺控表的思路,把每一步当成一个状态,用“当前步号 + 转移条件”推动流程往前走,程序一下清晰了很多。这块内容我在后面专门用一整章来讲。
1.3 为什么选S7-1200而不是更小的200 SMART或更大的300
硬件选型的时候,甲方问过我一次:这种系统用西门子S7-1200是不是有点“杀鸡用牛刀”?我当时的回答是:恰恰是因为项目不大,才更要选一个扩展性够、调试方便、模块化的平台。
S7-1200在性价比上比S7-300有明显优势,CPU本体自带以太网口,下载程序、连HMI、做Web诊断都很方便。相比200 SMART,S7-1200的程序块结构更完整,支持SCL、支持多重背景数据块,做设备封装的时候非常顺手。对于配料称量这类需要Modbus通讯和配方管理的项目,S7-1200的串口模块和块访问概念都比200 SMART高出不少。
硬件配置上,两个系统我都用了1214C DC/DC/DC的CPU。配料系统加了模拟量输入模块接变频器和称重仪表的备用信号,切割系统多挂了一个远程IO从站,省了从控制柜往设备现场拉大量电缆。通讯方面,配料系统用CM1241 RS485模块连接称重仪表,切割系统通过PN口和HMI通讯,整体拓扑非常干净。
2. 编程套路第一层:把设备控制封装成标准FB,调试省一半时间
2.1 不封装的程序为什么会越改越乱
很多同行写S7-1200程序,习惯把所有逻辑放在OB1里,或者按功能拆几个FC就完事。项目规模小的时候看不出问题,一旦设备数量上来了,比如配料系统有8路给料机、8台变频器、十几把气动阀门,每台设备的启停、故障、状态处理都写一遍,程序就成了一盘散沙。
我记得有一次在现场改一个阀门的延时时间,翻了三页梯形图才找到那一段逻辑,改完还担心会不会碰到相邻的定时器。这种程序不是说不能干活,而是后期维护成本太高,换个工程师绝对不敢碰。设备封装的思路就是把这个痛点解决掉:把“一台电机”所有相关的逻辑放进一个FB,管脚暴露出来,程序里其他地方只需要“调用这个块,给它相应的变量”就行了。
2.2 电机控制FB的具体写法
这里先说一下我常用的电机控制FB结构。管脚分四组:
- 命令类:启动命令、停止命令、正反转切换、自动手动切换
- 反馈类:运行反馈、故障反馈、过载信号、变频器 readiness
- 输出类:启停输出、正反转输出、复位输出、频率给定值
- 参数类:启动延时、故障后自动复位次数、最小运行时间
内部逻辑上,我会强制默认“手动优先”——自动指令来了先看手动状态,防止现场调试的时候误动作。启动条件全部满足并且没有故障,输出才置位;运行反馈在设定时间内没回来,马上报“运行超时”故障;故障信号复位必须是沿触发,不能让人一直摁着复位按钮就能反复启动。
SCL的大致骨架我贴在下面,方便对照:
FUNCTION_BLOCK FB_Motor VAR_INPUT iManualOn : BOOL; iAutoOn : BOOL; iStartCmd : BOOL; iStopCmd : BOOL; iFaultSig : BOOL; iRunFb : BOOL; END_VAR VAR_OUTPUT qRun : BOOL; qFault : BOOL; qActive : BOOL; END_VAR IF iManualOn THEN qRun := TRUE; // 手动强制运行,调试用 ELSEIF iAutoOn THEN IF iFaultSig THEN qRun := FALSE; qFault := TRUE; ELSE qRun := iStartCmd AND NOT iStopCmd; END_IF; END_IF;实际使用时,在OB1里给每台电机建立一个背景数据块,比如“MOTOR_BLOWER”“MOTOR_FEED1”,然后在程序里反复调用这个FB。好处非常直观:调试电机逻辑只需要在监控表里修改一个背景数据块,哪里不对查哪里,根本不用满程序翻。
2.3 阀门和模拟量设备的封装套路
阀门控制比电机简单,但同样值得封装。我把阀门分为两类:开关阀和调节阀。开关阀的控制就一个原则——先确认动作方向,再判断开/关到位反馈,到位反馈超时一律报警。调节阀则在FB里额外增加了模拟量给定值的处理,支持手动给定和自动PID调节两种模式切换,并且做了输出限幅。
设备封装做完以后,配料系统和切割系统的程序结构一下子从“几百行堆叠的散点逻辑”变成了“二十来个标准块的实例化组合”。后期做程序交接的时候,我把FB的管脚表打印出来给同事,人家半天就把程序逻辑顺清楚了。
这套东西看着简单,但确实是我被现场教育过之后才总结出来的。早期程序我也写过一坨到底,后来连续两次因为改一个延时翻遍整个程序,才下决心把所有设备逻辑全部封装。
3. 配料称量系统的核心:Modbus通讯与称重数据处理实战
3.1 modbus_comm_load指令的参数匹配逻辑
配料系统的称重仪表输出的是RS485信号,通讯协议是Modbus RTU。S7-1200这边用CM1241 RS485模块,程序里通过MODBUS_COMM_LOAD这个指令完成串口参数配置,再用MODBUS_MASTER指令轮询读写从站数据。
很多新手在这里首次接触modbus_comm_load,容易卡在“什么波特率、校验位、超时时间到底怎么填”。这块我的建议是:先别着急填,跑去把称重仪表的说明书翻出来,看看厂家出厂默认的串口参数。仪表厂商一般默认9600波特率、8数据位、1停止位、偶校验,PLC这边必须和从站完全一致,否则通讯直接起不来。
参数配好以后,指令块上有几个关键输入:REQ(通讯请求)、MB_MODE(0表示读,1表示写)、MB_DATA_ADDR(从站寄存器地址)、MB_DATA_LEN(数据长度)、DATA_PTR(数据存放区)。调度逻辑上不要每周期都发请求,我一般做一个5Hz的脉冲发生器,每200毫秒触发一次读写,这样既保证了称重数值的实时性,又不会把串口带宽占死。
3.2 称重数据的稳定性处理
称重仪表读回来的重量数据,理论上是一条直线,到了现场就完全不是那么回事。螺旋给料机一启动,整个计量斗都在跟着振动,重量信号会上下跳;粉煤灰下落过程中还会产生冲量,读数更是频繁跳动。
程序里我做了两级处理。第一级是递推平均滤波,把最近5个采样周期的重量值做移动平均,把高频抖动平滑掉。第二级是变化率限制,如果两秒内的重量变化超过了一个预设值,比如3公斤,就判定为异常跳跃,用上一次的有效值代替。这两个措施加在一起,称重数据基本稳下来了。
滤波明显会带来一个副作用:重量变化的响应变慢了。喂料到了目标值附近,需要快速停止给料机,这时候滤波产生的滞后就成了影响精度的罪魁祸首。所以我的逻辑是“滤波用于显示和稳定判断,停止判断用原始采样值”,两个数据分别走不同路径,各取所需。
3.3 飞料补偿的前馈逻辑
螺旋给料机停下来的那一瞬间,计量斗里的重量并不是最终值——从螺旋管道里还在往下落的物料会继续进入计量斗,这部分叫“飞料”。要命的是,飞料量不是固定的,不同物料、不同含水率、不同给料频率,飞料能差出两三公斤。
解决思路是“提前停机+动态补偿”。程序里设一个提前量参数,比如配方目标是50公斤,当重量到达48.5公斤时就停止精喂,让剩下的1.5公斤由飞料补齐。这个提前量不能拍脑袋设,我做成一个可调参数,现场调试时先观察几次实际停机后的净重偏差,再反向修正提前量。
更进阶一点的做法是“学习补偿”:每次停机后计算实际值与目标值的偏差,把这批偏差加进下一次停机提前量的修正里,形成一个简单的闭环学习。实测下来,磨机磨合一段时间后,每批配料精度能稳定在±0.5公斤以内。
3.4 配方管理和批次切换的处理细节
配料系统一定要做配方管理,就算甲方一开始说“不需要”,我们也要做进去。因为建材厂的配方是随时可能调整的,水泥标号换了、砂子的含水率变了,都要改配方。我用一个数据块把配方做成结构体数组,每种配方包含所有给料路的目标重量、粗喂量、精喂量、飞料补偿系数,HMI上直接可以修改和保存。
配方切换时要特别注意“清零逻辑”。换配方必须在一次配料流程完全结束之后进行,不能在计量过程中切配方,否则会导致累计值混乱。程序里我在“批次完成”这个步骤上加了配方切换允许标志,没到这一步,HMI上的切换按钮一律置灰。
3.5 S7-1200 G2在通讯上的新变化
如果这台PLC是S7-1200 G2系列,也就是带G2后缀的新款CPU,固件和指令集有些细节和经典款不一样,比如Web服务器功能更强、访问保护策略更严格,MODBUS_COMM_LOAD在部分固件版本的接口显示会有些许差异。我遇到过一次固件版本和博途版本不匹配导致通讯指令报文报错的情况,解决办法是把CPU固件更新到与TIA Portal版本兼容的版本,并且重新下载硬件配置。
4. 切割摆渡系统:用顺控表思路理顺机械动作
4.1 为什么顺序逻辑需要专门的写法
切割摆渡系统最大的坑在于“动作之间互相影响”。摆渡车没到位,切割台不能升;切割台没升到位,水平切割不能走;水平切割没退到位,垂直切割不能下。这种一层叠一层的条件关系,如果全部用“无条件+条件”粗暴堆叠,程序会变得极其难看。
更麻烦的是,现场机械信号经常不稳定,比如到位开关偶尔闪断一下,如果程序只认瞬时信号,整个顺控就会误动作甚至卡死。这个时候就需要一套专门应对“顺序逻辑”的写法,让每一步都有明确的进入条件和退出条件,不受干扰信号的影响。
4.2 步进顺控的核心实现方式
我的做法是用一个整型变量作为“步号”,从0开始逐步递增。每个步号对应一个工艺动作,步号在哪个值,程序就只执行那个动作的控制逻辑。每一步的基本结构是:检测“进入条件”是否满足;满足则执行动作;动作完成的反馈信号到位后,延时一个确认时间,再产生“转移脉冲”切换到下一步。
在SCL里可以写成这样:
CASE stepNumber OF 0: // 初始步,等待启动 IF startBtn AND readySignal THEN stepNumber := 10; END_IF; 10: // 摆渡车前进 trolleyForward := TRUE; IF trolleyInPosition THEN stepNumber := 20; END_IF; 20: // 切割台上升 cutTableUp := TRUE; IF cutTableUpFb THEN stepNumber := 30; END_IF; // 继续后续步骤 END_CASE;每个步号都必须有超时保护。我在程序里为每一步配了一个超时定时器,动作超过设定时间没有反馈,立即报警并保持当前状态,禁止继续向下走,防止机械卡死以后程序还在向下循环导致二次事故。
4.3 凸轮追剪思路在切割位的移植
切割工位的小车切割动作,如果用伺服驱动,行业里常见的设计是“凸轮追剪”,也就是主从轴同步控制,从轴跟随主轴位置走一条预设的凸轮曲线,实现运动中同步切割。我虽然没有在S7-1200里直接做电子凸轮(那是高端运动控制器的活),但凸轮追剪的核心思想我移植进了变频器版本的程序:把主轴的实时位置通过编码器读进PLC,计算当前位置对应的切割动作窗口,在这个窗口内同步控制切割小车跟随运动。
这个思路的好处是不需要依赖固定的机械挡块,位置算出来是多少就是多少,偏差大了还能在下一盘自动修正。后来有同行跟汇川的伺服配合做类似项目,也是参考的这套位置同步框架,只不过把脉冲输出换成了汇川伺服的总线给定。
4.4 多工位互锁必须做成矩阵
切割摆渡系统里,摆渡车和切割小车的运动范围有交叉区域,机械设计上虽然加了物理限位,但程序层面的互锁必须更严格。我的做法是列一张互锁矩阵表:横向是所有运动部件,纵向是所有区域传感器,交叉点填“谁在哪个区域时谁不能动”。
这张表直接翻译成程序里的互锁条件,并且在每个运动命令输出前做一次强制检查。为什么说“强制”?因为我在现场见过电工手动短接信号,把互锁绕过导致两台车怼在一起。程序里无论如何不能给绕过留后门。
5. 现场调试踩过的坑:通讯掉线、称重漂移和半夜报警
5.1 Modbus通讯偶尔断线的根治
设备运行一段时间后,客户反馈称重数值偶尔卡住不动,重启PLC就好。我到现场一看,发现程序里是一路MODBUS_MASTER在主循环里不停发请求,一旦一个轮询周期因为程序循环超时被拖延,从站那边就认为通讯超时,整条链路进入半死状态。
修这个问题的关键在于“通讯请求要有节奏”。我把Modbus轮询过程拆成了独立状态机,每个从站按固定的200毫秒时间片轮询,不在这个时间窗内绝不多发请求;同时增加断线检测逻辑,连续三次没有回复就置通讯故障位,并在HMI上大字报警。处理完以后,这个系统运行了半年再没出现掉线问题。
5.2 称重信号的干扰来源与处理手段
现场还有一个经典问题:夜间电压波动大的时候,配料精度明显变差。查了一圈发现,变频器的动力电缆和称重传感器的信号线有一段走在同一个桥架里,变频器一启动,感应的干扰直接耦合到称重信号上。
处理办法分三步:一是把信号线单独穿管,远离动力线;二是给称重仪表供电加隔离变压器;三是在程序里把采样窗口调整到变频器输出稳定的时间段。这个案例充分说明,做建材厂项目,如果前期布线不规范,后面程序做到天上去也救不回来。
5.3 到位开关闪断引发的顺控误动作
切割摆渡项目调试时遇到一个诡异问题:程序在正常运行时偶尔会跳过某一步,直接进入下一步。最开始我怀疑程序逻辑写错了,反复查CASE语句都没发现毛病。后来通过在程序里记录每一步的到来时间点,才发现是接近开关在上电瞬间有短暂抖动,被程序误判成了到位信号。
解决办法也很简单:所有开关量输入全部加上延迟滤波,信号持续20毫秒以上才认为有效;同时把关键到位信号改为“沿+保持”,需要两个扫描周期连续为真才触发转移。这里提醒各位,现场PLC程序的输入滤波参数不要随手用默认值,要根据现场信号实际情况去调。
5.4 急停和复位逻辑必须单独考虑
建材厂的设备安全要求高,急停按钮基本上每台设备旁边都有。急停按下之后,如果程序不把当前状态清掉,复位后设备可能直接接着后半段流程跑,非常危险。
我的做法是所有设备的动作状态都受“安全继电器+程序急停标志”双重控制。急停触发时,程序跳转到独立的停止状态,清空所有运行标志,并且把步号清零,必须现场手动按复位按钮并重新走一遍启动流程才会恢复。这个逻辑看起来简单,但很多项目恰恰在这里偷懒,导致后期验收被安全评审打回来。
5.5 归档之前,注释和版本记录也是程序的一部分
项目交付的时候,甲方工程师会把程序拷走自行维护,跟你远程要参数调整的权限。这时候如果程序注释写得稀烂,人家连哪台电机对应哪个块都找不到,后续沟通成本会非常高。
我现在习惯在每一个FB前面用中文注释写明:设备位号、工艺用途、所在区域、互锁条件、最近一次修改日期和修改人。全局数据块里的每个配方参数也都挂中文注释。这样做我自己的收益是什么?半年以后客户回访,翻到老程序,我能在十分钟内恢复记忆,不用重新看一遍图纸再结合逻辑慢慢猜。
写在最后:如果能重来一次,我会先做这三件事
两个项目做下来,我最大的体会是:S7-1200的编程本身不难,难的是把项目从工艺需求一步步拆成清晰可控的程序结构。如果能回到动笔写代码之前的日子,我一定要先做三件事。
第一,把设备清单和IO映射表填得一丝不苟。前期IO规划错了,后面改起来牵一发动全身。第二,先把设备的FB封装框架搭好再写具体逻辑,不要等程序写了一半才想起来封装,那时候重构的代价很大。第三,进现场调试时随身带一个本子,把每一个现场故障的根因和临时处理措施记录下来。现在项目的程序目录下还留着一个“现场调试记录.txt”,客户再问起来,翻出来就能答,省了大量重复沟通的时间。
最后再分享一个小技巧:S7-1200项目完成后,导出一份程序块的PDF文档放在项目文件夹里,连注释带逻辑一起打印出来,比单纯甩给客户一个源文件专业得多,也能避免客户在看不懂的情况下频繁打电话来问。这招在最后验收阶段帮我省了很多事。