做过配料和混合类项目的人应该都有同感:乍一看“三种液体混合”是最典型的PLC课程设计题,感觉流程无非就是开阀进料、液位到位、搅拌、出料、复位,梯形图写上几十段就完事了。可真到现场接上电磁阀、液位计、触摸屏以后,问题一个接一个往外冒——NPN传感器和S7-1200输入公共端不匹配、PID没整定液位就冲顶、搅拌电机启动瞬间把模拟量信号带偏、自动运行到一半阀门反馈丢失导致停在那里干等。这篇文章我就完整记录一套基于西门子S7-1200的三液体混合配料系统,从工艺需求、硬件选型、电气接线、程序框架到现场调试走过的完整链路。内容面向两类读者:一是学校或培训机构里做PLC课程设计、需要一套能讲清楚的完整案例的人;二是刚入行、第一次独立做小中型自控项目的工程师,希望这篇能帮你在选型和阶段式调试上少踩几个坑。整个项目的DCS/PLC核心逻辑并不复杂,真正体现水平的地方在于“边界情况处理”和“程序结构是否能摆脱纯梯形图面条式代码”。
1. 把工艺先看透:三种液体混合的控制对象到底是什么
1.1 不要把系统想成一个“会倒水的杯子”
当年我第一次做类似项目时,直接按教科书的逻辑开写:启动→开A阀→液位到L1→关A阀→开B阀→液位到L2→关B阀→开C阀→液位到L3→关C阀→启动搅拌→停止搅拌→开排料阀→低液位→关排料阀→复位。这套流程在仿真软件里跑得行云流水,程序一上设备就拉了胯。问题出在哪?我完全没考虑进料阀实际是电磁阀还是电动阀,没有区分“进料泵+阀”的组合,也没定义“料液不足时该停在哪一步”,更没考虑搅拌电机和液位计之间在电气上共用一个电源时互相干扰的问题。
三种液体混合系统通常面对的工艺对象是配料罐、储罐或反应釜。按进料方式可以分为两类:
- 加压或重力进料:进料支路上只有电磁阀,靠上游压力或液位差把液体压进罐里。这种情况下控制对象就是阀,逻辑简单,但阀门故障会导致“进料时间无限长”或“罐内压力倒灌”。
- 泵送进料:每条支路有一个泵或者一个泵通过阀组切换,泵一启动液体就进罐。这种情况多了电机的启停、电机过载保护、泵的空转保护等环节。
我这次做的项目属于“两种液体用泵送、一种液体靠重力自流”的混合方案,所以最终PLC的数字量输出点不只是阀,还包括两个泵的接触器。若只按教科书配置I/O,很容易漏掉泵类设备的点。
1.2 控制模式与操作权限的设定
这套系统直接照搬典型上料流程是不够的,因为实际生产时你需要在不停产的状态下清洗罐体、维修阀组、确认某个泵是否转向正确。因此系统至少应该具备两种模式:
| 模式 | 用途 | 动作方式 |
|---|---|---|
| 手动模式 | 单设备调试、清洗、故障处理 | 操作员在触摸屏上逐个开/关阀和泵,程序只做必要的软联锁 |
| 自动模式 | 生产批次运行 | 按配方依次执行进料→搅拌→出料的全流程 |
手动/自动的切换不应只靠程序内部的位置标志,正确做法是硬件选择开关接入DI点,将当前模式状态显示到HMI上,并且自动模式仅允许在“系统复位完成、无报警、罐底阀关闭”的条件下才能启动。这里有个实际生产中常被忽略的操作权限问题:如果允许操作员在自动运行过程中自由切到手动去动某个阀门,一旦切回自动,内部状态与实际阀位就对不上了,轻则报警停机,重则满罐溢料。所以我在程序里做了“切换即复位”的逻辑:无论手动切自动,还是自动切手动,电机和阀门全部先关闭,并清除批次过程状态。虽然粗暴,但最安全。
1.3 顺序控制的状态机化
顺序控制在程序里最清晰的表现形式是状态机。传统做法是用M继电器和SET/RST来串,比如用M0.1代表进料A状态,用M0.2代表进料B状态。这种写法当状态多起来后非常容易出问题,尤其状态转移条件稍有交叉,就可能同时出现两个M为1的“重态”现象。更稳的方法是用一个整数变量BatchState(字节或Int)来唯一标识当前状态。状态转移就变成:
- 当前状态值 = 1,表示正在进A,进A完成的转移条件满足时,将BatchState赋值2;
- 当前状态值 = 2,表示正在进B,进B完成的转移条件满足时,将BatchState赋值3。
一个整数变量做状态编号,好处是触摸屏上显示“当前步骤”时只用一条文本列表关联即可,排查故障时直接看到状态值就明白程序卡在了哪一步。状态机也不怕误触发,因为每步转移都要求当前状态唯一满足。这个系统最终定义了以下几个状态:
| 状态编号 | 含义 | 进入条件 |
|---|---|---|
| 0 | 空闲/待机 | 系统复位完成 |
| 10 | 进料A | 启动按钮按下,罐底阀关闭,无报警 |
| 20 | 进料B | 进料A满足完成条件 |
| 30 | 进料C | 进料B满足完成条件 |
| 40 | 搅拌 | 三种料全部到位,搅拌时间到达后自动结束 |
| 50 | 出料 | 搅拌完成且出料允许,低液位开关动作或出料时间到 |
| 60 | 批次完成 | 自动复位到空闲;若选择连续模式则重新进料 |
需要注意的是,进料完成条件不应该是单纯的时间继电器。如果泵扬程偏低、管道堵塞或者源料罐液位不够,一段时间内液位变化可能很慢,用固定时间判断不可靠。真正稳妥的完成条件可以组合为“目标液位到达且稳定2秒”为主,时间上限仅作超时报警使用。液位信号则要区分连续量(模拟量液位计)和开关量(液位开关)。后续我会详细展开这部分程序处理。
2. 硬件系统的搭建与I/O配置——从点表倒推选型
2.1 先算点数,再选CPU和模块
在选S7-1200的具体型号前,最忌讳直接说“用1214C就好了”,而应该根据被控对象把所有输入输出点全部列出来。我以这套系统为例,用表格做个梳理,实际DIY或改造时也可以按相同的思路自己扩展。
| 信号类型 | 信号说明 | 通道数 | 信号制式 |
|---|---|---|---|
| DI | 启动按钮(常开) | 1 | 24V DC |
| DI | 停止按钮(常闭作为输入习惯) | 1 | 24V DC |
| DI | 急停按钮(硬接线后再进DI用于程序感知) | 1 | 24V DC |
| DI | 手动/自动选择开关 | 1 | 24V DC |
| DI | 低液位开关(音叉或浮球) | 1 | 24V DC |
| DI | 高液位开关(音叉或浮球,双重保护) | 1 | 24V DC |
| DI | 三个进料泵/阀的反馈触点 | 3 | 24V DC |
| DO | 进料电磁阀A/B/C | 3 | 24V DC 阀线圈 |
| DO | 进料泵A接触器 / 进料泵B接触器 | 2 | 24V DC 中间继电器 |
| DO | 搅拌电机接触器 | 1 | 24V DC 中间继电器 |
| DO | 出料电磁阀 | 1 | 24V DC 阀线圈 |
| DO | 三色报警灯塔(红黄绿,或者红绿双色) | 2~3 | 24V DC |
| AI | 液位变送器4-20mA(用于连续液位显示和到达目标液位判断) | 1 | 4-20mA两线制 |
统计结果约为12个DI、10个DO、1个AI,此外还预留了后续温度输入或第二套罐体的扩展余地。S7-1200家族里1212C本体只有6DI/4DO,1214C有14DI/10DO,刚好够用。若系统同时控制两套混合罐,点数翻倍,那就必须在1214C基础上加SM 1223数字量混合模块或SM 1231模拟量输入模块。若设备分布很分散,也可以考虑用ET200SP远程IO加PN总线,但这种小项目没必要上分布式IO,一个柜子全搞定了。
2.2 CPU型号选择:1214C是不是唯一解?
很多初学者会问:三种液体混合,CPU用1211C会不会更便宜?算一下其实很悬。1211C本体只有6DI/4DO,自动、手动、按钮、液位开关等DI点想要压缩到6个非常困难,除非把HMI上的软按钮当作自动运行条件,硬件按钮省略,但这样的话安全性和急停感知都会打折,现场根本不给用。S7-1200家族的选型主要看三点:
- 本体I/O是否够:不够的话是加信号板还是加信号模块。
- 程序存储器:这个案例程序即使写得很全面,也就几十KB,1211C的75KB工作内存也够,因此存储器不是限制因素。
- 通信能力和响应速度:若需要连接PROFINET IO设备(变频器、伺服、远程IO)、或做MODBUS TCP从站和第三方上位通信,就尽量选带至少一个以上PROFINET端口的型号,1214C/1215C都是合理选择。1211C同样带PN口,不过如果以后要扩展第二块甚至第三块通信模块,1211C的扩展槽位不如1214C充裕。
这次项目我最终选了西门子 S7-1200 1214C DC/DC/DC(6ES7214-1AG40-0XB0),主要考虑到刚好本体DI/DO用完,不用增加额外模块,成本不会失控。程序里预留了OB1主循环、OB100初始化、OB35循环中断用于模拟量采样定时。如果只是做实验柜或纯教学演示,1212C配合信号板也能实现,不过做整体点位设计和扩展时1214C会从容很多。
2.3 传感器NPN与PNP问题——接反了程序再对也不动
这可能是从热词列表里也能看到的高频坑:“输出脉冲接入西门子plc的npn(plc公共端接的电源正)接法”——这个描述本身就是很多初学者把NPN和PNP搞混的来源。S7-1200的数字量输入模块或CPU本体DI在设计上默认是源型输入(俗称PNP传感器适合的接法),即传感器高电平有效,公共端M接到24V电源负。你把一个NPN型的接近开关直接接到S7-1200的DI点上,NPN输出低电平时确实也能让输入导通,但前提是传感器电路和PLC内部输入电路要形成有效回路,必须跨接上拉电阻或把公共端接法调整好,否则有很大概率出现信号一直为0或不稳定的情况。
我见过太多改造项目里,设备原来的电气柜用三菱FX系列(源型/漏型可选或默认为漏型输入,也就是NPN传感器直接对0V输出),换到西门子S7-1200后直接把线迁过来就上电调试,结果所有DI信号都检测不到。对于S7-1200而言,如果你手里的传感器、液位开关或按钮自带NPN开路输出,最省事的办法是换用PNP型传感器;如果传感器不可更换,需要加入中间继电器做极性转换:NPN输出驱动继电器线圈,继电器常开触点再接入PLC的DI点。尽量不要在DI端子上外接上拉电阻去硬改。
接线方面还要注意DI公共端的问题。S7-1200本体DI分为几组,每组有一个公共端M,通常把所有传感器负极接到同一24V直流电源的0V,再把PLC DI公共端接电源0V。很多人把公共端接到电源正极,结果就是信号怎么都不对,原因就是理解反了。
2.4 输出回路:继电器隔离还是直接带负载?
S7-1200本体DO输出是高电平24V,输出能力为0.5A(晶体管型)或2A(继电器型)。这个案例中电磁阀线圈约5~8W、接触器线圈十几W到几十W不等,直接用CPU本体DO带多个感性负载容易导致发热和背刺,缩短CPU输出点寿命。我的做法是所有负载控制在中间继电器上,PLC输出先驱动中间继电器线圈(约0.5W,电流小),再由中间继电器触点控制接触器或电磁阀回路。中间继电器选通用LY2N-J或MY2N-J,带24V DC线圈即可,最好加底座,方便更换。当然也可以选S7-1200的继电器输出型CPU(6ES7214-1HG40-0XB0),但考虑到输出频繁动作和体积,我还是倾向晶体管输出加中间继电器方案。
这里一定要做浪涌吸收。电磁阀、接触器线圈在断开瞬间会产生反向感应电动势,若不采取措施,轻则干扰CPU运行,重则直接打坏输出点或让CPU随机停机。常用办法是在继电器线圈两端反向并联一个1N4007二极管(直流负载),或并联RC阻容吸收组件(交流负载,但本案例均为24V直流所以反向二极管够了)。注意二极管方向:负极接电源正端、正极接电源负端,否则二极管导通就会短路。
3. 程序架构规划:从OB到FB,让代码可读也可复用
3.1 为什么程序不能全堆在OB1里
很多刚入门的人拿到一个项目,打开TIA Portal先把主程序OB1打开,然后梯形图往下写两三百段,中间不建FC也不建FB,甚至符号名也不规范,完全靠网络注释表达“这行是开A阀”。这种面条式程序在仿真和课程设计中能通过,但系统稍微出现故障,在线监控时你会看着一屏绿色线条和无数中间继电器没法下手。
合理架构应当是这样的:
- OB100(启动组织块):做初始化。复位所有输出、清空批次状态、将配方参数从保持区装载到工作区、设置一些默认值。
- OB1(主循环扫描):调用各个功能块,完成输入采集与输出映射。
- OB35(循环中断):以固定周期(例如100ms)做模拟量滤波计算、时间累计、看门狗等对时间一致性要求高的算法。因为这个系统搅拌时间需要精确计时,用OB35累加计数比普通TON定时器在主循环扫描周期不稳定的情况下更可靠。
- FC_Alarm:报警综合块,负责超时、高液位、故障反馈的锁存与复位。
- FB_MixTank:混合罐核心控制块,用一个背景数据块实现顺序控制、搅拌、出料、配方调用。
3.2 FB的背景数据块为什么比多重背景好用
这个系统未来可能扩展到两套或三套罐。比如两个配方罐同时生产不同产品,如果每个罐写一份梯形图,开发和维护量成倍增加,最好的做法是写一个通用的FB_MixTank,然后在OB1里多次调用它,为每个罐体生成独立的背景数据块。
FB接口的设计要考虑清楚:
- 输入:手自动信号、启动命令、急停状态、低/高液位开关状态、连续液位实际值(AI原始值转换后的工程量)、基础配方参数。
- 输出:当前批次状态、当前阀/泵控制字、状态指示、报警代码。控制字比单个BOOL方便HMI批量显示。
- 静态变量:内部定时累加器、故障锁存器、状态暂存。
界面上的参数如“目标液位A”设为Input变量,也可以在背景DB中在线修改;注意若修改仅对下一批次生效,设计时就应保证参数在批次空闲时才被读取到工作变量。为了调试方便,我没有用多重背景(即STATIC里声明FB类型),而是用简单调用方式,每个罐体一个背景DB,这样不同罐的配方互不干扰,改动一个罐的数据块不会影响另一个罐。
另外,S7-1200的FB背景DB支持掉电保持区。我把“批次计数累计”“累计运行时间”这类需要长期保存的信息放到保持区,把临时状态放非保持区。上电后OB100把非保持区清零,保持区保留,又能在HMI上看到历史批次统计。
3.3 梯形图还是SCL?
西门子TIA Portal里可以混合使用LAD、FBD和SCL。对顺序控制这种“状态转移”逻辑,我建议核心状态机用SCL来写,尤其适合复杂条件判断。但很多课程设计、职业等级考核要求交梯形图,那也可以把梯形图当成主语言,把每个状态转移切成一个“网络”。我给出的这套程序使用的是SCL为主、梯形图做DI/DO映射的方式,原因不是梯形图不行,而是在看到“状态转移一致性好、报警复位条件集中、多条分支乱序时”时,SCL比梯形图更容易保持条理:
IF BatchState = 10 AND Level >= TargetLevelA AND TimerInA >= 1.0 THEN BatchState := 20; ELSIF BatchState = 20 AND Level >= TargetLevelB AND TimerInB >= 1.0 THEN BatchState := 30; END_IF;如果按常规梯形图,你要一个状态对应好几行,每个网络再配一个定时器,逻辑分散得很厉害。反过来,底层DO输出用梯形图就有优势,因为你可以在线看到每个线圈的真实状态,加上强制功能也好用。
3.4 输出映射与安全映射
程序的最外层一定要专门做一个“输出映射网络”,不要把控制逻辑中直接写Q地址。例如:
- 阀A输出 = 控制字.bit0 AND 无急停 AND 手动模式点动权(或自动模式状态机允许);
- 泵A输出 = 控制字.bit1 AND 无源料罐缺料信号 AND 无急停;
- 搅拌接触器 = 控制字.bit2 AND 罐盖关闭信号(如果有) AND 无急停。
这样做的核心理由是:急停信号、高液位开关和电机过载反馈必须能够“一票否决”所有输出。如果这些保护条件散落在几十段梯形图里,输出端很难完全约束住。把它放在最末端网络统一做AND,即使某段逻辑写错,只要输出映射这块保证正确,系统整体也不会出现爆罐或设备损坏的严重问题。
4. 核心顺控逻辑实现:状态转移、定时与联锁细节
4.1 启动条件不是“按一下启动按钮”这么简单
自动模式下的真正启动条件我写成了一组,HMI上的“启动”按钮按下后先做条件检查,条件不满足就把复位标志位或者报警提示文本推送给画面,而不是直接什么都不做。启动条件包括:
- 手动/自动开关在“自动”位;
- 系统无未确认报警;
- 当前批次状态 = 0(空闲);
- 罐底排料阀反馈在关位(若有反馈);
- 高液位开关未动作;
- 急停未按下。
满足以上所有条件后才进入状态10开始进A料。如果按钮按下但不满足条件,屏幕上会显示一条“启动条件不满足:请检查排料阀关闭”之类的中文消息,而不是让现场操作工一脸懵地看着没反应。要做出这种“明白为什么不动作”的体验,就得把每个条件单独做成一个BOOL变量并联到HMI报警文本。
4.2 进料阀控制与液位目标判断
进料阶段最容易出现的问题是“液位冲过头”。只靠一个模拟量液位计在到达目标液位时才关阀是不太可靠的:如果你用的是普通电磁阀,从PLC发出关阀指令到阀门完全闭合大约有0.2~0.5秒(考虑线圈释放和阀芯动作),液位还会再上涨一段;如果阀前压力很大,这一段可能达到好几厘米。现场修正方法有两个:
- 提前量法:在目标液位上方设一个提前关闭点(设为目标液位减去一个经验值,比如20mm)。液体惯性明显时提前关阀。这个经验值可以在调试阶段实测。
- 慢关法:对电动调节阀可以走开度控制;对电磁阀来说做不到慢关,只能前面加小口径预开阀实现两段关断,但对大多数小型混合系统属于“杀鸡用牛刀”。
对于模拟量液位计,我在转换时做的不只是工程量和滤波,还增加了稳定判断——液位到达目标值后必须持续0.5秒以上才认为真正到达。为什么?生产现场的液位通常会有波浪或轻微波动,如果你在液位刚触及目标线的瞬间就切换状态,很可能只是浪尖碰到,下一秒液位又掉回目标以下,阀门一开一关反复动作,液体混合比例产生偏差。
模拟量处理我用的是OB35循环中断中每100ms执行一次采样滤波,滤波算法可以就用一阶惯性滤波:y[n] = y[n-1] + k * (x[n] - y[n-1]),k取0.3左右。然后做一个简单的缩放:工程量液位 = (AI原始值16位时的原始值0~27648) / 27648 * 量程上限。若传感器量程为0~3000mm,实际PLC通道读到的原始值假设是18000,对应工程量液位约1953mm。S7-1200只有在组态时把AI模块输入类型设为“4-20mA”,硬件量程设置在0~27648范围内才会这样换算。别忘了组态时把通道的“测量范围”选择正确的电流范围,否则读数偏差很大。
如果项目里用的是液位开关,那么状态转移条件就简单得多,但为了安全我仍然习惯在液位开关到达目标的基础上再加上软逻辑判断:若该液位开关信号持续为1超过1秒才认为有效,目的在于滤除液面波动造成的瞬时误触发。数字量滤波不是靠硬件抖动滤波就行,软件里做短延时确认非常有必要。
4.3 进料超时和源料罐缺料
实际生产里进料支路有泵,源料罐可能空罐;有阀门的管路可能因为前端的过滤器堵塞造成流量极小甚至为零。程序里如果没有超时兜底,设备会一直停留在“正在进料A”状态,操作工如果没注意到,可能整个班次过去还在那里泵堵转。
所以我的做法是每个进料状态都给一个单次循环定时器。比如进料A最大时间为300秒,在进料A状态进入时启动定时器,若未达到目标液位但时间已到300秒,则:
- 关闭当前阀门和泵;
- 将BatchState置为某个“中断等待”状态,比如99;
- 报警文本显示“进料A超时,可能源料罐无料或者管路堵”。
如果泵还带热继电器过载信号,过载动作也应该立即停止泵,并跳到报警状态。请注意,泵的空转保护如果只靠热继电器可能太慢,因为不少泵长时间空转后电流并不明显升高,这时需要实际液位或低压开关来检测源料罐缺料。条件允许的话,应在源料储罐上加一个低位开关,缺料时直接禁止启动进料泵。这个点属于项目设计中“额外考虑”的部分,但在现场往往比主程序更救命。
4.4 搅拌过程与出料联锁
进料完成后进入搅拌状态,搅拌电机需要按配方要求运行一定时间。这里要避开的坑是:搅拌电机启动瞬间电流较大,会对共用的24V模拟量液位计信号产生干扰,而且电机启动也可能让罐体晃动,液位信号在搅拌期间会剧烈波动。所以搅拌状态的判断条件是“搅拌时间到”,是完全基于OB35累加时间得到的,而不是去判断液位是否平稳。
如果系统有加热要求(有的混合需要升温),搅拌的启停还要与温度联锁:温度低于下限时搅拌可能不允许停止,以免局部过热,或者要求边搅拌边加热。温度控制通常用PID调节气动阀/电加热器,这部分就在S7-1200里建一个PID_Compact,不过这个项目没有加热需求,暂不赘述。
出料阀打开后,罐内液位逐步下降。程序判断“出料完成”有三种方式:用低液位开关动作、用模拟量液位低于某阈值、或出料时间到。最可靠的是低液位开关加时间上限。如果出料阀为气动阀,最好有开到位/关到位反馈,否则只能通过时间判断是否完成。但这个项目里出料口是电磁阀,没有反馈,所以我做了“当低液位开关动作并稳定3秒后关闭出料阀”的判定,同时一个总的出料超时保护,比如10分钟没排完就报警。
这里还要强调出料泵和搅拌电机之间的联锁。如果是用泵抽出罐内液体,出料泵必须在出料阀打开后再启动,且不能等到低液位信号才关泵,否则会抽空留气。更合理的方法是:液位低于某个值后,先关出料泵,延时2秒再关闭出料阀,把管道里的残余料液放下一些,这样可以避免下次启动时管道内憋气或滴漏污染。
4.5 状态机中的“重试”和“暂停”处理
生产过程中可能会遇到需要暂停的情况。操作工可能会因为某种原因按暂停,期望系统不要继续进料和搅拌。这个需求听起来简单,但对程序结构有影响:要么给每个状态配备一个暂停变量,暂停时不关闭当前设备但停止状态转移逻辑;要么暂停时把所有设备关闭,等待继续命令后重新启动当前状态。我采用后一种“暂停即安全复位到当前状态起始”的办法,因为很多时候暂停后现场问题不一定马上解决,让设备和阀门保持开着风险较大。操作上,暂停按钮按下后自动锁存一个PauseFlag,BatchState不变化但所有输出控制字清零,设备关闭;暂停解除后重新进入当前状态的初始逻辑,重新打开阀门。因为在每次状态重新进入时都有条件判断,所以这样做并不会导致安全问题。
4.6 手动模式下的点动与保护
手动模式主要用于调试和清洗。为避免操作工在手动模式下一时大意打开排料阀把整罐物料放掉,程序在手动逻辑里必须仍然保留高液位保护和急停保护。阀的点动按钮并不直接接通输出,而是与“非急停、非高液位、非故障”等条件做与之后再输出。这样即使某个触点粘连或HMI按钮被误触,系统也能拒绝危险动作。另外,手动模式下如果工人要开搅拌电机,应保持搅拌电机只能在罐内液位高于某个最低液位时才能启动,防止空罐搅拌损坏机械密封。
5. 与上位机/触摸屏的通信与联调顺序
5.1 触摸屏走S7协议还是Modbus?
现在主流触摸屏,比如西门子精简系列、威纶通、MCGS,大多直接支持与S7-1200通过Profinet/以太网的S7通信协议连接,不需要写任何通讯脚本,只需要在组态软件里添加设备时选择“Siemens S7-1200”并填好IP地址,通道变量就能直接绑定PLC地址或符号。如果是自用项目,HMI推荐直接用S7-1200的以太网口连触摸屏,普通网线直连或经过交换机均可;若HMI只支持Modbus TCP而PLC做Modbus TCP服务器,需要调用MB_SERVER指令并设置好端口号和数据区映射,但要额外占用资源,除非HMI不支持S7协议,否则没必要。
IP地址规划上,我一般把PLC固定为192.168.0.10,HMI固定为192.168.0.11,电脑编程下载时用192.168.0.1或自动获取,三者用同一个交换机。若还要接变频器做Profinet从站,那个设备就要单独分配一个IP地址,例如192.168.0.20。S7-1200只允许一个编程器/面板在某一时刻建立S7连接,但如果HMI和电脑同时在线也不会互相干扰,因为TIA Portal的连接和HMI运行时连接使用的资源槽不一样。
5.2 和变频器、伺服等Profinet从站设备通信
如果混合过程中要用到变频器控制搅拌电机转速,或将来要加入伺服泵做流量控制,这时S7-1200可以走Profinet IO、MODBUS RTU/TCP或USS(老变频器)等方式。对于新一代ABB、汇川、西门子变频器,Profinet是最主流的现场控制法,但要注意:Profinet的GSDML文件需要在TIA Portal中安装,设备组态后需要映射控制字和状态字、设定值/实际值。ABB和西门子的变频器控制字/状态字规范相近,但在位定义上有细微差异,组态时对照手册驱动器的控制字来做启停和故障复位。
如果用的是普通Modbus RTU的仪表(如流量计、液位计)做远程数据采集,那就直接在S7-1200上用MODBUS_COMM_LOAD和MODBUS_MASTER指令,填好从站地址和功能码即可。注意S7-1200的RS485模块不是标配,需要加通信模块如CM1241 RS485,Modbus RTU的波特率、数据位、停止位必须和从站设备一致。通信做好后,流量累计值可以作为配方进料的校验条件:比如目标进料量为150L,通过流量计积分判断进料量到达后关闭阀门,这比单纯液位判断更精确。
5.3 现场联调的正确顺序
程序下载、硬件接线完毕,并不能直接按自动启动。我最终在项目现场的执行顺序是这样的:
- 不带负载单点测试:断开输出回路到接触器/电磁阀的电源,在TIA Portal里用“监视/修改变量”逐一强置DO点,确认PLC输出信号正常。同时监视DI点,手动按按钮、拨液位开关,确认每个输入信号都能正确变化。
- 带负载手动测试:接通动力电源,在触摸屏手动画面上依次点动每个阀和泵,检查执行机构动作方向、阀门是否装反、泵的转向是否和标识一致。尤其要用水代替真实液体试运行,确认没有走漏。
- 单步模拟量测试:把液位计信号用信号发生器模拟4mA、12mA、20mA,验证AI原始值、工程量换算、HMI显示值三者一致。
- 半自动状态测试:临时放一个低液位或手动改变量目标,让程序从进料A开始走到第一个状态转移点,每走一步都核对设备的真实状态,再继续。
- 全自动空载/水运测试:用清水作为液体介质,跑完整个批次,记录每一步耗时,调整超时保护值。
- 真实物料联调:将水换成真实液体,跑一两个批次并取样化验或者人工观察混合效果。前一个批次全程跟班,观察各项指标是否稳定。
很多新工程师会跳过前三步直接进入第4步,结果哪个阀正反都不知道,输出一通乱动作,最后只能说PLC不稳定。这种阶段化调试思路不是流程繁琐,而是帮助你快速定位故障是来源电气接线、仪表信号还是程序逻辑。
6. 调试过程中差点翻车的几个真实故障,怎么一步步定位
6.1 高液位浮球一直误报导致的程序“进不去”
系统启动后按自动,程序进料A后的状态没有按预期转移。我先在在线状态里监控BatchState=10不变,说明程序一直停留在进A状态。再看状态转移条件,发现高液位开关H_Level为1,启动条件根本没满足。我用万用表量DI卡信号,输入确实有24V;量传感器输出,发现浮球式液位开关由于安装位置太靠近罐壁,罐内液体波动时浮球碰壁卡住,没法正常回落,导致输出常通。更换为音叉式液位开关并调整插入深度后恢复正常。这类问题不是程序错误,而是仪表选型安装问题,但如果你用状态机结构和中间变量一层层拆开看,定位速度会快很多。
6.2 模拟量信号在搅拌电机启动后跳变
第一次水运测试时,系统静止状态下液位显示稳定,但搅拌电机一启动,HMI上的液位值上下跳了大约100mm,看起来就像罐内液位波动非常大,其实电机一转搅拌桨会让液面形成旋涡,再加上变频器或接触器启停时对模拟量线的干扰,读数就会剧烈变化。定位过程是:我先在OB35里把滤波周期从100ms改成了500ms,抖动有所减轻但变化还是存在;后来检查信号线发现液位计电缆和电机动力线在同一线槽内走线,且没有使用屏蔽双绞线。整改方法:把模拟量信号单独穿金属管走线,屏蔽层单端接地,并加一个信号隔离器。改完以后搅拌运行过程液位显示非常稳定。这也直接动了状态转移判断的准确度——如果搅拌期间你还在根据液位波动做判断,肯定早晚误动作。
6.3 停止按钮“按下没反应”还是“按了系统反而重启”
有次调试我用的是常闭停止按钮接入PLC DI点。程序里把这个DI取反后作为运行条件使用,逻辑上没有问题。但接线时按钮两端没有并上安全继电器或急停回路,在按停止瞬间触点断开导致DI信号抖动了几个毫秒,程序识别到了停止信号,但CPU输出直接切断接触器,接触器线圈产生的干扰又差点把CPU的24V电源打掉。这种现象的元凶是电源和感性负载共用了一个开关电源,负载断开时产生的反压干扰CPU供电。后来我把CPU供电、DI/DO传感器电源、接触器电源分开,用3个直流开关电源各自隔离,并在关键继电器线圈都加上续流二极管,按停止按钮就完全干净了。
实际上关于停止按钮,工程上我更推荐硬件上停止按钮采用常闭触点接入回路,程序内部正常识别常闭逻辑;急停则必须走硬接线串入所有接触器控制回路,不要只靠PLC输出断开,因为PLC死机时输出继电器可能保持被激励状态。急停按钮的常闭触点直接串在接触器线圈供电回路里,拍下急停后不管PLC程序怎么样,接触器都能断电,这是真正的安全冗余。
6.4 NPN传感器接入S7-1200的偏置问题再复盘
这个项目的出料罐处用了原设备留下的NPN型接近开关,用来检测排料阀是否到位。接线后信号点始终是0,无论阀开还是关,状态都没有变化。排查时我先用万用表量传感器输出端电压,阀到位时传感器输出与电源负极之间电压为0V,阀不到位时为24V;这个逻辑是NPN输出没错,但S7-1200的DI模块输入电路要求传感器输出24V到DI端子才认为是“1”。NPN传感器在导通时输出接近0V,不能为DI点提供24V,因此需要加上拉。我最终没有改程序或接上拉电阻,而是加了一个中间继电器做转换,把传感器当作一个24V继电器线圈的驱动源,线圈得电后其常开触点接到DI点,无论传感器极性是什么样都能可靠转换。这种方式虽然多占了一个继电器,但同时也隔离了电气干扰。
7. 程序里那些不显眼但很有用的边缘功能
做这套系统时还补了几个不起眼但实际现场特别有用的功能点,可能不计入考核评分,但长期使用的人会感谢你。
- HMI上的当前状态显示:BatchState直接映射为中文文本:
- 0 空闲;10 正在进A;20 正在进B;30 正在进C;40 搅拌中;50 出料中;99 故障待处理。 操作工不需要懂PLC,看到“正在进A”就知道设备正常往前走,卡在“正在进A”且时间超过几分钟,自然会去检查A路阀门和源料罐。
- 运行批次计数和总运行时间:放在保持型DB里,可以显示“本批次累计生产N批”“搅拌电机累计运行时间X小时”,帮助做设备保养计划。
- 调试阶段用的“干跑模式”:相当于不真实开阀门,但状态机和输出逻辑都走,便于在办公室做仿真演示,也方便带学员理解状态转移。
- 全面的中文报警列表:不只给一个报警码,而是把报警文本写清楚,比如“进料A超时,请检查源料罐液位”“排料超时,请检查出料管路是否堵塞”。温度异常、电机过载、急停被按下都要有独立报警。报警要支持“确认”和“复位”两段动作,故障消除后按复位才允许重启。这类细节能明显提高系统的可用性和维护效率。
这些功能对一台小型混合设备来说算不上必需,但就是区分“课程设计能跑”和“现场设备能用”的标志。
8. 如果让我再做一套,有什么会改
最后说点个人复盘。这个系统的核心顺控不复杂,但要做到稳定可靠,最花时间的其实是在考虑所有异常工况怎么停、怎么报警、怎么恢复到安全状态。把程序框架搭好——OB100初始化、FB顺控、状态整型化、输出末端安全映射、报警集中管理——是所有微型系统都可以复用的思路。项目做完以后,如果继续扩展,这套逻辑也能直接迁移到两罐并行的场景,FB多次调用就可以;如果换成S7-1500或ET200SP,程序几乎不用改,直接复制过来改硬件组态。这大概就是结构化编程带来最直接的收益。
如果现在再做一套类似的混合系统,我会这样调整:
- 把阀门的阀位反馈尽量补齐。电磁阀加磁性开关或阀位传感器虽然成本略高,但出料阀和关键进料阀有了状态反馈后能自动检测“阀卡住”“阀未关闭”等故障,不用完全依靠超时判断。
- 出料口如果允许,加一个在线流量计或质量流量计,不仅进料更精准,出料产量统计也更准确,省去人工抄表。
- 增加一个手/自动、急停、停止三个物理按钮的同时,把启动也做成硬按钮,而不是只在触摸屏上,因为现场操作工戴手套操作触摸屏不方便,硬按钮更可靠。
- 搅拌电机有条件就接变频器,初始低速启动搅拌可以减少液体的飞溅和轴承冲击,也能通过电流检测判断搅拌桨是否卡阻。
- 把配方从DB区升级为配方视图或多配方DB,每个产品设置自己的目标液位、搅拌时间、出料模式,HMI上能一键切换。
如果你正准备做一个类似的三液混合实训台或小型生产设备,不妨在动手前先画一张I/O分配表,再画一张状态转移清单,最后才打开TIA Portal建工程。这样整个过程下来,你会发现自己踩过的坑会少很多。做PLC项目,先想清楚工艺怎么跑、安全怎么兜底,再谈代码怎么写,这个顺序永远不会错。