前一阵接了一个物料转运现场的需求:货车开进料仓下方,要自动往车厢里装一定量的物料,装完提醒司机开走,同时值班室电脑上要能看到料仓料位、闸门状态这些实时数据。项目不算复杂,但既有料位判断,又有车辆到位联锁,还要用组态王做上位机监控,正好把S7-200 PLC和组态王这套经典组合完整走了一遍。这篇文章就把这套系统的梯形图程序、接线原理、组态王画面组态,以及现场调试时踩过的坑,从头到尾拆开讲一遍。如果你是正在学PLC的学生,或者准备做料仓装车这类小型监控项目,可以照着这个思路直接抄作业。
先说结论:这套系统用一台S7-200 PLC做控制核心,通过梯形图实现“进料—装料—提示离场”的全自动流程,组态王负责画面显示和状态监视。物料传送部分用一条皮带把原料送进料仓,料仓下方有出料闸门,货车压到到位限位后按启动按钮,闸门打开装料,用定时器做定量控制,装完声光提示。整个过程不需要人工去开阀、去掐时间,值班员只看组态王画面就知道现场状态。
1. 这套装料控制系统的工艺需求与整体控制时序
做项目之前先别急着写程序,把工艺捋清楚。这套系统的现场大概是这样:储料区的物料通过皮带输送机送入高位料仓,料仓底部有出料口,出料口装电磁阀控制的闸门。货车停在料仓下方时,控制系统要完成一次定量装料,然后放行。
1.1 六个核心控制需求
第一,料仓料位要自动维持。料位低了,皮带启动进料;料位高了,皮带必须停,防止料漫出来。第二,货车必须到指定位置才能装料,车没停到位,启动按钮再按闸门也不开。第三,装料量要可控。这个项目里用时间定量,也就是闸门打开固定时间后关闭,前提是物料流量相对稳定。第四,装料过程中允许人工停止,急停要能立即切断所有输出。第五,装车完成后要有声光提示,司机看到灯亮、听到蜂鸣器响就走。第六,货车离开后系统自动复位,准备进入下一次装料循环。
这六点就是程序的“需求文档”,后面每一段梯形图都是在为这六个需求服务。
1.2 一次完整装料动作的时序表
我把整个流程按时间顺序列出来,方便后面对照程序看:
| 步骤 | 触发条件 | 执行动作 |
|---|---|---|
| 1 | 料仓低料位开关动作 | 缺料标志置位,皮带电机启动进料 |
| 2 | 料仓高料位开关动作 | 皮带电机停止,进料结束 |
| 3 | 货车压上装车位限位开关 | 到位信号置位,允许启动装料 |
| 4 | 操作员按下启动按钮 | 出料闸门电磁阀打开,装料开始 |
| 5 | 定时器计时到达设定值 | 闸门关闭,装料结束 |
| 6 | 完成标志置位 | 完成指示灯亮,蜂鸣器鸣叫约5秒 |
| 7 | 货车驶离,压到离场限位后复位 | 完成标志清除,系统回到待机状态 |
这里需要注意第4步,启动按钮虽然是人工按下,但闸门是否动作还取决于第3步的到位信号,这就是联锁。现场有人问过:“我按了启动按钮为什么没反应?”十有八九是车没停到位,或者到位开关本身没被压上。
1.3 为什么这个项目选择时间定量,而不是称重定量
时间定量是最简单的做法:物料流量基本稳定时,闸门开固定的秒数,装进去的量差别不大。缺点是物料湿度、粒度变化会导致流量波动,装料量跟着漂移。称重定量要加称重传感器和称重仪表,成本高一点,但精度明显更好。
这个项目客户预算有限,对精度要求也不高,我就用了时间定量。梯形图里留好了扩展点,后续如果想升级称重定量,把称重仪表的高低限位干接点接到PLC输入点上,替换掉定时器逻辑就行。这一点在后面排错章节会具体说。
2. 硬件接线怎么看:I/O分配、端子回路与原理图要点
很多人拿到一套原理图就蒙圈,不知道从哪根线开始看。实际上这套系统的原理图分三层:主回路、控制回路、信号回路。一层一层拆开就清楚了。
2.1 输入输出点分配表
先把I/O点列出来。以S7-200 CPU224 AC/DC/继电器输出的型号为例,输入24点输出16点,这套系统用了6个输入点、4个输出点,余量充足。
| 类别 | 地址 | 设备代号 | 功能说明 | 接线形式 |
|---|---|---|---|---|
| 输入 | I0.0 | SB1 | 装料启动按钮 | 常开触点 |
| 输入 | I0.1 | SQ1 | 货车到位限位开关 | 常开触点 |
| 输入 | I0.2 | SB2 | 停止按钮 | 常闭触点 |
| 输入 | I0.3 | SL1 | 料仓高料位开关 | 有料时闭合 |
| 输入 | I0.4 | SL2 | 料仓低料位开关 | 无料时闭合 |
| 输入 | I0.5 | SQ2 | 货车离场限位开关 | 货车压上时闭合 |
| 输入 | I0.7 | SB0 | 急停按钮 | 常闭触点 |
| 输出 | Q0.0 | KM1 | 皮带电机接触器 | AC220V线圈 |
| 输出 | Q0.3 | YV1 | 出料闸门电磁阀 | 经中间继电器转接 |
| 输出 | Q0.6 | HL1 | 装车完成指示灯 | DC24V |
| 输出 | Q0.7 | HA1 | 蜂鸣器 | DC24V |
这里有两个细节。第一,停止按钮和急停按钮都用常闭触点,梯形图里用“AN”指令去读,意思是“常闭触点闭合表示允许运行”。如果用了常开触点,设备一断电重启就不能自锁,这是新手最容易犯的错误。第二,I0.4低料位开关在物料低于低限位时闭合,I0.3高料位开关在物料到达高限位时闭合,选型时要确认开关的动作形式,有的阻旋式料位开关常开常闭可调,接线前先拨对模式。
2.2 主回路与控制回路的走线逻辑
主回路很简单:三相电源经过断路器QF1到接触器KM1的主触点,再到热继电器FR1,最后到皮带电机M1。这条路上没有PLC参与,PLC只控制KM1线圈的通断电。
控制回路的走线是:AC220V的L线接到PLC输出公共端2L,Q0.0端子出来接到KM1线圈的A1脚,KM1线圈A2脚接N线。当PLC内部Q0.0继电器触点闭合时,2L和Q0.0导通,KM1线圈得电,主触点吸合,皮带电机启动。
必须强调一个选型问题:S7-200有不同的输出类型,继电器输出可以接AC220V负载,晶体管输出只能接DC24V负载。如果买到的是晶体管输出的CPU224 DC/DC/DC,千万不能把KM1线圈直接接到Q0.0上,必须先让Q0.0驱动一个DC24V中间继电器,再由中间继电器触点去控制AC220V接触器线圈。否则一上电就烧输出点。
2.3 信号回路的公共端处理
输入回路的接线是:DC24V电源正极经过按钮、限位开关、料位开关,回到PLC的输入端子I0.x,再从公共端1M回到DC24V电源负极。S7-200的输入是源型输入,也就是电流从输入点流进模块。
很多现场问题就出在公共端上。1M端子如果没接牢,或者DC24V电源负极没有和1M连到一起,输入点灯可能时亮时不亮,程序逻辑再正确也白搭。原则是:所有输入信号的公共回路必须经过同一个参考点,接线端子排上最好用一个零电位汇流排把所有负极集中起来,不要东接一根西接一根。
3. 梯形图逐网络拆解:七段逻辑一点一点讲透
这部分是全文的核心。我按S7-200编程软件Micro/WIN里的网络顺序,把梯形图用助记符的形式表现出来,每个网络下面跟着完整解释。你在软件里照着画就行,每个网络的触点、线圈一一对应。
3.1 Network 1:料仓缺料检测
Network 1 料仓缺料检测 I0.4 M0.0 --| |---------------( )对应的STL是:
LD I0.4 = M0.0I0.4接低料位开关,无料时触点闭合。M0.0是中间继电器,用它做缺料标志。为什么多设计一个M0.0而不直接用I0.4?因为下面用T39做延时滤抖时,需要把输入信号先隔离出来,后续程序修改也方便,不会因为换料位开关类型影响逻辑。
3.2 Network 2:进料皮带延时启动与高料位停止
Network 2 进料皮带(延时启动,高料位立即停止) M0.0 T39 --| |----------------------( TON ) PT=200 T39 I0.3 Q0.0 --| |----+-------|/|---------------( ) | Q0.0 | --| |----+对应STL:
LD M0.0 TON T39, 200 LD T39 O Q0.0 AN I0.3 = Q0.0这一网络是进料控制的核心。M0.0缺料标志为1时,T39开始计时,200是预设值,T39是100ms定时器,所以实际延时20秒。延时结束后T39触点闭合,皮带启动。Q0.0自锁保持,只有高料位开关I0.3闭合时才断开。
为什么要延时20秒?因为料位开关在物料下降到临界点附近时会有抖动,一会儿接通一会儿断开。如果皮带跟着抖动,电机几分钟内就要反复启动好几次,接触器线圈发热严重。加了延时相当于给系统加了一段“迟滞区间”,确认缺料状态持续成立再进料。但停止动作不需要延时,高料位一闭合立即停,防止物料溢出。
3.3 Network 3:货车到位检测
Network 3 货车到位信号 I0.1 M0.1 --| |---------------( )对应STL:
LD I0.1 = M0.1I0.1是装车位限位开关,货车压上闭合,M0.1作为到位标志。这一网络看似简单,但它为Network 4提供了联锁条件。这种情况下,把输入点先转成中间变量,后面逻辑维护时一眼就能看出“到位”和“按钮”之间的关系,不用去翻I/O分配表。
3.4 Network 4:装料使能自锁回路
Network 4 装料使能(到位联锁+自锁+停止/急停断开+完成闭锁) I0.0 I0.1 I0.2 I0.7 M0.3 M0.2 --| |----+-----| |-------|/|-------|/|-------|/|----------( ) | M0.2 | --| |----+对应STL:
LD I0.0 O M0.2 A I0.1 A I0.2 AN I0.7 AN M0.3 = M0.2这是整套程序的联锁核心。从左往右看这串触点:I0.0启动按钮按下,或者M0.2已经在自锁状态,再串联I0.1到位信号、I0.2停止按钮常闭、急停常闭、M0.3完成标志常闭。
简单说就是:车到位了,没按停止,没按急停,上次装料已经完成复位,这时候启动按钮才能让M0.2得电并自锁。M0.2一旦得电,即使松开启动按钮,回路也通过自身的常开触点维持导通。按一次启动按钮只是瞬时脉冲,自锁回路让闸门能一直开着完成整次装料。
M0.3完成标志的常闭触点接在最后一位,意思是装料完成后,M0.2会被强制解除自锁,闸门关闭。这个设计保证了“一次装料只能走一轮流程,不会重复动作”。
3.5 Network 5:出料闸门控制
Network 5 出料闸门 M0.2 M0.3 Q0.3 --| |-------------|/|----------------( )对应STL:
LD M0.2 AN M0.3 = Q0.3闸门打开的条件是装料使能M0.2为1,同时完成标志M0.3还没有置位。所以装料过程中闸门保持打开,定时时间一到M0.3置位,闸门立即关闭。有人会问,为什么这里还要再串一次M0.3的常闭?Network 4里不是已经有M0.3了吗?
原因是网络扫描顺序。当定时器T37触点闭合的那个扫描周期,Network 4先执行,此时M0.3还没置位,M0.2依然保持,闸门还开着。要到下一个扫描周期M0.3置位后,M0.2才断开。也就是说,闸门的关闭会比定时器到达时间晚一个扫描周期。在PLC里一个扫描周期是毫秒级,对装料没有影响,但逻辑上要清楚这个时序。
3.6 Network 6:装料计时
Network 6 装料计时(30秒) M0.2 T37 --| |----------------------( TON ) PT=300对应STL:
LD M0.2 TON T37, 300T37是100ms定时器,预设值300就是30秒。M0.2为1时开始计时,M0.2断开时定时器复位。如果中途按下停止按钮,M0.2断开,定时器清零,重新启动后要从头计时,不会累加。这一点在调试时要跟现场操作工交代清楚,免得他们说“我上次装到一半停了,这次应该接着装”之类的话。
30秒不是拍脑袋定的,是根据闸门口径、物料堆积密度、目标装料量反推出来的。现场可以先手动开闸门,记录装满一车需要多少秒,再把这个值写进程序。
3.7 Network 7:装车完成标志(自锁到货车离开)
Network 7 装车完成标志 T37 M0.3 --| |------+--------( ) | M0.3 | --| |------+ I0.5 -----|/|---对应STL:
LD T37 O M0.3 AN I0.5 = M0.3定时器到达后T37常开触点闭合,M0.3置位并自锁。I0.5是离场限位开关,货车离开时压上它,I0.5闭合,M0.3复位。这样完成标志就一直保持到货车离场为止。
这个网络解决了一个实际问题:定时器T37的触点在预设值到达后虽然会保持闭合,但一旦M0.2被Network 4复位,T37也会被复位,触点断开。如果没有M0.3自锁,完成状态会瞬间消失,司机还没看清指示灯就灭了。加上自锁后,M0.3能一直保持到车辆离场。
3.8 Network 8和Network 9:蜂鸣器停止定时与声光输出
Network 8 蜂鸣器停止定时(5秒) M0.3 I0.5 T38 --| |------------|/|------------------( TON ) PT=50 Network 9 声光输出 M0.3 Q0.6 --| |----------------------( ) T38 M0.3 I0.5 Q0.7 --|/|----+----| |---------|/|--------( ) | Q0.7 | --| |----+对应STL:
LD M0.3 AN I0.5 TON T38, 50 LD M0.3 = Q0.6 LDN T38 A M0.3 AN I0.5 = Q0.7完成指示灯Q0.6在M0.3置位期间一直亮,直到货车离场复位。蜂鸣器Q0.7多了一个T38的常闭触点,T38计时5秒后断开,蜂鸣器自动停。这样不需要司机去按什么复位按钮,到时间它就自己停了,也不至于吵得现场工人心烦。
到这里,整套装料控制逻辑完整闭环:缺料进料、到位检测、启动装料、定时关阀、声光提示、离场复位。核心设计原则是“联锁先行、状态自锁、完成再闭锁”,每一条都对应一个现场真实需求。
4. 组态王画面组态与S7-200通信配置
PLC程序写完,下一步就是把状态送到组态王屏幕上。组态王和S7-200的通信有两条路:一是用USB-PPI编程电缆走PPI协议,二是通过以太网模块走TCP协议。这个项目现场S7-200配了以太网模块,所以我用TCP方式。
4.1 通信方式选择与设备配置步骤
在组态王工程管理器中新建工程,注意工程保存路径不能有中文,不然运行时会出一些莫名其妙的错误。然后打开“设备驱动”,选择“PLC—西门子—S7-200(TCP)”,新建逻辑设备。
设备地址填PLC的IP地址。S7-200加装的以太网模块默认地址一般可以改,我在PLC编程软件里把模块的IP设成了192.168.0.2,组态王里就填这个。如果用PPI电缆,设备地址不是IP,而是PLC的站号,默认是2,通信波特率要和Micro/WIN里设置的保持一致,常见的是9.6kbps。
设备配置完成后,先做通信测试。组态王的数据词典里随便建一个变量,运行时看设备状态图标是不是绿的。我建议先直接用PLC编程软件测试网络通信,确认能用再切到组态王,避免两头同时查。
4.2 变量定义与画面组态步骤
数据词典里需要定义的变量如下:
| 变量名 | 连接对象 | 数据类型 | 属性 |
|---|---|---|---|
| 启动按钮 | 内存变量 | 离散 | 读写 |
| 到位信号 | I0.1 | 离散 | 只读 |
| 高料位 | I0.3 | 离散 | 只读 |
| 低料位 | I0.4 | 离散 | 只读 |
| 闸门开 | Q0.3 | 离散 | 只读 |
| 装车计时 | T37 | 整数 | 只读 |
| 完成状态 | M0.3 | 离散 | 只读 |
T37在组态王里要按整数读取,读回来的是0.1秒为单位的数值,显示的时候要换算成秒。我在组态王里定义一个内存整数“显示秒”,在画面属性里让它每秒执行一次脚本,把T37的值除以10赋给显示秒,这样画面显示的就是“剩余多少秒”。
画面组态我是这样做的:从图库工具箱里拖出料仓图形,用矩形加一个倒梯形拼成,把填充百分比绑定到高料位和低料位两个变量上,低料位时填充为零,高料位时填满。皮带电机用图库里的传输带图标,动画连接选“旋转”,绑定Q0.0,皮带转起来就画面里就一直转动。出料闸门用一个三角形图形,动画连接绑定Q0.3,闸门开时三角形往旁边移动一小段距离,可以直观看到出料口状态。
启动按钮直接用两个矩形叠加,上面做成绿色,下面做成灰色,弹起时的命令语言写:
\\本站点\启动按钮=1; \\本站点\启动按钮=0;这段命令语言的作用是模拟实际按钮的“按下—松开”瞬时动作,程序员里按下时给变量置1,紧接着置0,这样PLC的I0.0接收到的就是一个短暂的脉冲,和实际点动按钮一样。
4.3 组态王运行时的三个常见问题
第一个是通信状态时好时坏。如果不是物理链路问题,多半是I/O变量刷新周期设得太快。组态王里每个I/O变量默认刷新时间在1秒左右,有人为了画面实时性好,调到几十毫秒,结果通信压力陡增。我用500ms刷新周期,画面依然流畅,通信稳定。
第二个是PPI电缆和编程软件冲突。如果用的是USB-PPI电缆,组态王运行时不要再同时开着Micro/WIN监控PLC,两个软件会抢总线,通信时断时续。调试时先关掉编程软件的监控功能,再切组态王运行。
第三个是画面卡顿。如果组态王画面里图片素材太多,或者每个图形都绑定了多个变量且刷新周期不一样,运行系统会占用大量CPU。我的做法是:动画图形只绑定关键变量,次要的状态用“文本显示”代替,比如“到位—未到位”用红色绿色切换,不绑定多个动态属性。
5. 现场调试记录:三个真实故障的完整排查链路
程序写完了,组态王画完了,不代表项目就结束了。现场调试才能真正暴露问题。我记录三个这次遇到比较典型的故障,每个都给出完整的排查思路,你会发现大部分问题不在程序逻辑,而在现场环境和硬件细节。
5.1 故障一:按启动按钮没反应,到位信号时有时无
现象是货车开到装车位后,PLC上I0.1的指示灯亮一下又灭掉,再亮一下,反复跳动。按住启动按钮不放,M0.2能保持;一松手,装料就停了。从梯形图看,Network 4里A I0.1这个条件一直在断开,M0.2自锁根本建不起来。
排查过程:先排除按钮本身,I0.0指示灯正常。然后看SQ1限位开关,发现它的安装支架是普通角钢,货车每次停靠位置稍有偏差,限位滚轮正好顶在车门边缘的加强筋上,开关触点被顶开,信号断开。也就是说,货车虽然大体到了,但限位开关没有稳稳地被压合。
处理方式是调整支架位置,让限位开关的滚轮对准车厢侧面的平整区域,同时加了一个可调节的缓冲垫,防止车辆停靠过猛把开关撞变形。重新试车后I0.1状态稳定,启动正常。
这个故障说明,程序里已经加了联锁,但硬件安装马虎,联锁等于摆设。调试时别先怀疑程序,先看PLC输入指示灯,输入点状态不稳定,问题一定在传感器或接线。
5.2 故障二:装料量不稳定,同样的30秒时多时少
项目上第一版运行时,按30秒定时装料,结果有时候28秒就已经漫出车厢,有时候35秒才装到八成。操作工觉得是定时不准,我看着不像:定时器本身很精确,问题在闸门打开后,物料下落并不是均匀的。
实际观察出料口发现,料仓里的物料会形成一个“料拱”,闸门打开瞬间大量物料涌出,后面料流逐渐变细,甚至偶尔断一下,然后护坡塌下来又恢复。这段时间里定时器一直在走,但实际装进去的量并不一致。
改进办法是在出料管上加装一个料流检测挡板,物料下落时挡板偏转,带动一个接近开关,有料流时I0.6触点闭合。然后把Network 6改成:
Network 6 装料计时(带料流确认) M0.2 I0.6 T37 --| |--------| |-------------------( TON ) PT=300这样只有物料真正在落的时候才累计时间,料流中断的时间被剔除掉。改完之后装料量一致性明显改善。如果项目预算允许上称重定量,同样接这个思路,把称重仪表的上限常开触点接到I0.6,到达目标重量后直接给Network 7的T37触点并联一个完成条件,就能实现更精确的定量。
5.3 故障三:组态王通信时断时续,画面整体变灰
运行系统里画面上的所有变量突然全部变成灰色闪烁状态,右下角设备图标变红,过几秒又恢复。查了半天网络,ping PLC的IP地址,丢包率为零,物理链路没问题。
后来在组态王设备配置里发现,我把I/O变量的刷新周期调成了50ms,理由是想要画面尽量实时。结果以太网模块在每个扫描周期要处理大量读写请求,处理不过来,出现超时重连。把刷新周期改回500ms后,画面稳定了,实际观察下来人眼完全看不出延迟。
这个坑提醒我,组态王和PLC通信不像编程软件监控那样高频,上位机画面的价值是让操作员看懂状态,不是显示微秒级变化。刷新周期设在300到500ms之间,既不卡顿又能保证实时性。另外,组态王工程里如果定义了太多“读写”属性的I/O变量,通信负载也会翻倍,只读变量就设只读,别全设成读写。
最后如果你要照着这套方案做类似项目,我有三点建议:第一,I/O分配表和原理图节点表一定要打印出来带现场,排查问题时省一半力气;第二,输入输出公共端的接线必须作为重点验收项,大部分灵异故障都出在公共端松动上;第三,组态王画面宁可做简单也不要做花哨,动画绑定变量越少,运行越稳。这套系统从写梯形图到调试完大约花了三天,核心逻辑清楚之后,后面扩展功能是很顺的事情。