每年到这个节点,总能看到一批标题几乎一样的毕业设计:基于 S7-300 和 WinCC 的自动售货控制系统。作为过来人我并不觉得选题老旧,反而认为它是最适合练手的工控小项目。S7-300 作为西门子经典 PLC,配套 WinCC 组态监控软件,能把一款自动售货机的“投币—选择—扣款—出货—找零—统计”全流程完整闭环地跑起来。三货物版的规模不大不小,I/O 点可控、状态逻辑清晰,又能覆盖真实售货机的大部分核心环节,非常适合自动化、电气工程、机电一体化专业的课程设计和毕业设计。这篇内容我尽量按真实项目落地的顺序来写,从硬件选型、I/O 分配、PLC 程序、WinCC 画面到通讯联调,把思路和坑都摆出来,给准备做同类题目的朋友一份可以直接参考的实战笔记。
1. 项目定位:三货物版为什么是“刚刚好”的设计
1.1 自动售货机的完整流程映射
很多同学看到“自动售货机”就觉得复杂,其实把真实设备拆开看,核心逻辑就是一条线:顾客投币、系统累计金额、顾客选货、系统判断余额是否足够、够则扣款并启动出货机构、货物掉落后检测确认、最后找零。真实商用售货机还会叠加制冷、加热、联网支付、远程报表、赃物报警等一堆外围功能,但主交易链路的骨架永远不会变。
三货物版的意义,就是把这条主链路用最精简的方式完整呈现一遍。三个货道分别对应三组按钮、三台出货电机、三个出货检测传感器,和真实售货机的一货道一执行机构一一对应,而不是把三个货品当成三个“显示页面”敷衍过去。我见过不少毕设只做一个货道,画面倒挺花哨,但控制逻辑根本没有铺开,一问就露馅。三货物版正好逼着你把并行互锁、多路选择、资源竞争这些工程问题都考虑进去,训练价值完全不同。
1.2 为什么选 S7-300 + WinCC,而不是 200 SMART 或触摸屏
我记得有一次评审现场,有老师直接问学生:现在 1200 系列都普及了,你为什么还在用 S7-300?学生答不上来。其实这个问题不难回答:一是高校和培训机构的实验台存量大量使用 S7-300,课程体系、实验指导书都围绕它展开,毕业设计时间紧,用熟悉的平台完成作品是最稳妥的选择;二是 S7-300 的 DP 网络架构和 STEP 7 V5.x 的工程组态方式,在工业现场依然是常见存量系统,练好这套能力放到调试岗位上完全不过时;三是 WinCC V7.x 作为经典 SCADA 软件,面向中大型监控系统的组态逻辑(变量管理、画面、报警、归档、用户管理)比单纯用触摸屏完整得多,学习价值更高。
和 200 SMART + 触摸屏的方案相比,S7-300 + WinCC 的差别在“监控层”。触摸屏方案做的是单机本地人机界面,WinCC 方案则是把这台售货机当成一个过程控制对象接入上位机监控系统,涉及通讯协议、变量映射、数据归档、报警记录,后续往 MES、数字化车间方向扩展时,这套组态体系的通用性明显更强。这也是为什么很多学校坚持用这个组合做课程设计。
选型之前先想清楚你手上的硬件资源,别照着论文硬抄。常见的配置有两种:CPU 313C-2DP 自带部分集成 I/O,适合点数少的三货物方案;CPU 314C-2PN/DP 自带 PROFINET 口,如果实验室有交换机并且你想用网线直连 WinCC,最好选这种带 PN 口的型号。如果实验台是 CPU 312 + SM321/SM322 组合,也完全够用,只是接线量会多一些。
2. 硬件规划与 I/O 分配:接线之前先把点表想清楚
2.1 实验台硬件构成
按三货物方案,一套最小可运行系统大致包含这些东西:S7-300 PLC(建议 CPU 313C-2DP 或 314C-2PN/DP,至少带 16 点数字量输入和 16 点数字量输出,因为后续还要扩展)电源模块 PS307,一个 24V 开关电源给传感器和继电器供电,数字量输入模块(如果 CPU 集成点数不够)、数字量输出模块,三台 24V 减速电机作为货道推动机构,三组光电对射传感器或反射式光电开关用于出货检测,一组按钮作为模拟投币(1 元按钮和 0.5 元按钮,也可用真实硬币识别器输入脉冲),三个货物选择按钮,一个退币按钮。
真实商用售货机用的是自动硬币识别器,支持 1 元、5 角、1 角多币种识别,每个币种对应一根信号线,投一次输出一个脉冲。实验台上没条件装识别器,最合理的替代方案就是用按钮模拟币种输入,程序里按“角”累加,这样既保留了完整控制逻辑,又降低了硬件门槛。我做的项目中,直接在操作面板上放两个按钮分别标“投1元”“投0.5元”,每个按钮按一次代表投入一枚指定面额硬币。
出货机构也有很多实现方式。商用自动售货机多用螺旋弹簧货道,电机旋转一圈推出一瓶饮料,间隙传感器检测螺旋位置。实验台不追求机械精度,可以用 24V 减速电机带动一个推板,通电 2 到 3 秒把货物推出货道滑落到取货口,出料口装对射光电开关,货物经过时遮光产生一个下降沿信号,就认为出货成功。
2.2 I/O 分配表与选型理由
设计 I/O 点表时我习惯把“将来可能用到的点”先留出来,宁可点表空着也不能把点分配得满满当当。三货物版的核心点表大致如下:
| 信号名称 | I/O 地址 | 类型 | 说明 |
|---|---|---|---|
| 投币1元按钮 | I0.0 | 数字量输入 | 模拟投入1元硬币,脉冲有效 |
| 投币0.5元按钮 | I0.1 | 数字量输入 | 模拟投入5角硬币,脉冲有效 |
| 选择货物A按钮 | I0.2 | 数字量输入 | 对应货道A |
| 选择货物B按钮 | I0.3 | 数字量输入 | 对应货道B |
| 选择货物C按钮 | I0.4 | 数字量输入 | 对应货道C |
| 退币按钮 | I0.5 | 数字量输入 | 请求退回余额 |
| 货道A出货检测 | I0.6 | 数字量输入 | 光电传感器,检测货物掉落 |
| 货道B出货检测 | I0.7 | 数字量输入 | 光电传感器 |
| 货道C出货检测 | I1.0 | 数字量输入 | 光电传感器 |
| 货道A电机 | Q0.0 | 数字量输出 | 见注:接中间继电器 |
| 货道B电机 | Q0.1 | 数字量输出 | 见注:接中间继电器 |
| 货道C电机 | Q0.2 | 数字量输出 | 见注:接中间继电器 |
| 退币机构 | Q0.3 | 数字量输出 | 控制退币指示灯或退币电机 |
| 可购买指示 | Q0.4 | 数字量输出 | 指示当前可交易状态 |
| 故障蜂鸣器 | Q0.5 | 数字量输出 | 卡货/故障时报警 |
这套表的核心思路是“输入按功能分组、输出按执行机构分组”,同一个功能域的信号尽量放在相邻地址,例如三个选择按钮集中在 I0.2 到 I0.4,三个货道电机集中在 Q0.0 到 Q0.2。为什么这么做?调试的时候你拿着 STEP 7 的变量表对照实际端子,地址分布越规整,查线越省时间。我在一次现场调试中吃过教训,把按钮和传感器混插在模块的不同字节上,最后查一个信号断点花了半个下午。
另外要特别说明:PLC 的数字量输出模块内部是晶体管或继电器触点,直接接 24V 电机问题不大,但如果你的货道电机是 220V 交流电机,必须在 PLC 输出和电机之间加中间继电器。实验台环境我坚持用 24V 直流减速电机,安全性高、控制方便、学生操作时风险小。所有传感器和按钮用 24V 电源,接线时注意传感器棕蓝黑三线的极性和信号线,黑色输出线接 PLC 输入端子,不要把常开常闭选错。
2.3 执行机构与接线注意
接线这件事看着基础,却是项目成败的第一关口。我在实验室见到过好几起“程序没问题但设备不动”的事故,最后都是接线导致的。第一,PLC 输出公共端要弄清楚是源型还是漏型,S7-300 的数字量输出模块通常带一组公共端子,接线前先查模块手册,确定负载接法。第二,每个输出回路必须串接合适的熔断器或空气开关,哪怕是实验台,短路保护不能省,否则一次误接线就能烧掉模块。第三,传感器电缆和电机电缆分开走线槽,24V 信号线和动力线捆在一起,轻则信号干扰导致误触发,重则直接损坏输入模块。
装完线不要急着上电,先做一次绝缘检查和通断测试。把 PLC 程序置为 STOP,用万用表逐个测量输入端子的电位变化:按下按钮,对应的输入指示灯应当亮起;传感器挡住,对应的输入指示灯应当变化。输出侧反过来测,强制一个点输出,听继电器有没有吸合声。这一步做扎实了,后面跑程序时心里踏实很多。
3. PLC 程序设计:从流程图到 STEP 7 程序
3.1 状态机设计:售货机就是一整套判断链条
写程序之前我建议先画状态图,哪怕手画也行。三货物售货机的状态可以分成几个:空闲态、投币累计态、可选购态、出货执行态、找零态、故障态。空闲态下系统等待投币,收到投币脉冲就进入投币累计态;累计金额大于 0 时进入可选购态,此时允许选择货物;选完货并判断余额足够,进入出货执行态,启动货道电机并监视出货传感器;出货确认后根据剩余金额决定进入找零态还是回到可选购态;如果投币后长时间不选择,支持主动退币回到空闲态。
把这个状态机写清楚后,你会发现编程就变成了“每个状态对应一段逻辑”的工作,而不是对着 I/O 表瞎写。用生活化类比来解释:售货机就像一个收款员,顾客给钱(投币),收款员记账(金额累计),顾客报商品名(选择),收款员看钱够不够(余额判断),够就收钱交货(扣款出货),不够就摇头提示(余额不足),最后该找零就找零(退币)。一个收款员在同一时刻只能服务一个顾客,售货机也一样,同一时刻只能处理一个交易过程,这类“串行业务”天然适合用状态机表达。
3.2 编程实现细节:金额、选择、出货、退币
我按 STEP 7 的 LAD/STL 编程习惯,把几个关键逻辑段拆开讲。程序块建议拆分:OB1 里调用 FC1(金额处理)、FC2(货物选择与出货)、FC3(退币与故障),数据统一放在 DB1,别把临时数据全堆在 M 区里,否则后面 WinCC 连变量时地址乱成一团。
金额处理,核心是“角”为单位的整数运算。我设定货物 A 价格 25(角,即 2.5 元)、货物 B 价格 30(角,即 3 元)、货物 C 价格 35(角,即 3.5 元),用 MW10 保存当前余额。投币 1 元按钮对应加 10,投币 0.5 元按钮对应加 5。为什么不用浮点数直接存元?因为浮点比较和累加在 PLC 里容易产生小数误差,教务里 2.5 元售价和 1 元硬币相加计算出的结果看着是 3.5,实际浮点位存储可能是 3.4999,一比较就出问题。用整数角避免所有这类坑,这是工业现场处理金额、重量、长度等数值,并配有最小计量单位时的通用做法。
投币 1 元这个动作,不能拿常开触点直接做累加,否则按住按钮不放会把金额一直加上去。必须用边沿检测。STEP 7 里可以用 FP 上升沿指令配合一个辅助位,也可以直接在 LAD 里拖一个 P 触点。代码演示如下:
A I 0.0 FP M 20.0 L MW 10 L 10 +I T MW 10 L 200 // 余额上限 200 角 >I JC OVER T MW 10 OVER: NOP 0这段逻辑的意思是:检测到 1 元按钮的上升沿后,把 MW10 加 10,然后判断是否超过 200 角(20 元)上限,超过就不写入,防止顾客反复投币把数据溢出。实验台环境数据溢出可能只是显示错乱,但如果将来的控制器把余额用于驱动执行机构,溢出后果就是逻辑紊乱,所以每一步都值得做得规范。
货物选择与出货段可以这样写。三个选择按钮对应的边沿信号置位各自的选择标志,同时复位其他两个,实现互锁。判断余额时用 MW10 和存储价格参数的 MW14(A)、MW16(B)、MW18(C)比较:
A M 30.0 // 选中货物A标志 L MW 10 L MW 14 >=I S Q 0.0 // 启动货道A电机 S M 40.0 // 出货中标志但这里注意,如果不在“选中”信号上做一个一次性脉冲处理,这段比较逻辑会在每个扫描周期都满足条件,电机一直转,根本停不下来。解决办法是用“出货命令”标志配合定时器:当选中的边沿到来且余额足够,置位出货命令位;货道电机由出货命令位控制;出货定时器 T1 延时 3 秒后自动切断电机输出;出货检测传感器在 3 秒内检测到货物通过,则确认出货成功。用一个边沿脉冲触发“扣款 + 启动定时器 + 置位命令”,让整个动作只执行一次,这是顺序控制的基本功。
扣款动作在“出货成功”之后执行或与启动电机同时执行都行,但必须防止“扣了款却没出货”的丢钱场景。我的做法是:检测到出货成功信号后,MW10 扣减对应价格,同时把选择标志全部复位;如果定时器计时结束还没检测到出货信号,说明卡货了,置位故障位,输出蜂鸣器报警,并且恢复余额到扣款前——当然恢复余额需要一个临时变量先把扣款前的值存起来,实务里我是在启动出货命令时就把扣款前的余额复制到 MW12,确认出货失败时用 MW12 覆盖回 MW10。这种“先备份、失败回滚”的思路,在工业控制项目里同样适用。
退币逻辑相对简单:按退币按钮后,如果 MW10 大于 0,置位 Q0.3(退币机构),同时用一个定时器延时 2 秒后复位,再将 MW10 清零。真实售货机的退币机构是一个电机带翻转板,把暂存仓里的硬币倒进出币口;实验台上用一个指示灯或一个 24V 小电机表示即可。
3.3 程序中的边界条件与互锁设计
我整理了一份三货物版里最容易遗漏的边界条件清单:
- 快速连续按两次选择按钮,必须保证只响应第一次选择,第二次在“出货执行态”内不做任何处理。可以在状态机里增加一个“忙”标志位,任何选择输入先判断“忙”位。
- 投币后余额不足时选择货物,系统不能扣款也不能启动电机,只点亮“余额不足”指示灯,并等待顾客继续投币或改选其他货物。
- 余额为零时按退币按钮,不要执行任何动作,避免一次无意义的输出抖动。
- 出货传感器本身就是常闭型光电对射时,初始状态是 1,货物遮挡时变为 0,程序里做取反或者使用下降沿检测。这类信号极性搞反,是联调时最常出现的低级错误。
- 所有货道电机输出程序必须和选择标志互锁,绝对不能在未选中的情况下因为程序扫描顺序问题误启动其他货道。
- 定时器必须设置好记忆功能。S7-300 里带 S 端的定时器(保持型接通延时)适合断断续续的启动信号,普通 TON 适合一次性延时,本项目出货定时器用普通 TON 就够。
编程时还有一个习惯值得培养:把价格参数、时间参数放在 DB 里而不是硬编码到程序段中。比如 A 货价格存在 DB1.DBW4,出货电机运行时间存在 DB1.DBW6。这样 WinCC 管理员界面可以直接修改这些参数,不用重新下载程序;实际调试时改价格、调出货时间隔,直接在上位机改一遍就能看效果,谁用谁知道。
4. WinCC 监控画面设计:让设备“看得见”
4.1 画面布局与管理页面
WinCC 画面的设计目标不是“好看”,是“信息可达”——操作员站在屏幕前,一眼就能看懂当前售货机处于哪个状态、余额多少、哪个货道缺货、有没有故障。三货物版画面我建议分成三个区域:顶部是全局状态栏,中间是商品选择区,底部是交易区和功能按钮。
商品选择区放三个货物框,每个框包含货物图片、名称、价格、库存量、出货状态指示灯。点击货物图片就相当于按下了 PLC 上的选择按钮,这个交互用 WinCC 按钮的“鼠标动作”触发一个置位变量即可。交易区放当前余额数值、投放按钮(投1元、投0.5元)、退币按钮。故障报警区放卡货报警、缺货报警显示。最后再加一个“管理员登录”按钮,进入一个隐藏页面,可修改三种货物的价格、补货数量、查看历史交易计数。
画面布局的实操细节:I/O 域显示余额时,变量连接 MW10,格式设为十进制 3 位;因为 MW10 存储的是“角”,画面上直接显示角会让人看得别扭,可以在一个 C 脚本里把值除以 10 后显示,或者干脆在画面里加一个说明标签“余额(角)”。商用产品肯定会做单位换算,毕设里做到统一单位更专业。
4.2 变量与 C 脚本的正确打开方式
WinCC 里涉及 PLC 的变量全部在“变量管理”中建立,三货物版至少需要这些外部变量:余额(对应 PLC MW10)、选择A/B/C 置位位(对应 M30.0 到 M30.2)、投币1元脉冲位、投币0.5元脉冲位、退币脉冲位、货道 A/B/C 状态、故障状态、三种货物的价格和库存。
这里有一个容易跑偏的点:很多同学喜欢在 WinCC 按钮的 C 脚本里直接做金额加法,比如SetTagWord("Balance", GetTagWord("Balance") + 10);,这样做在画面上看起来立刻有效,但一旦 PLC 处于运行状态,PLC 里的 MW10 和 WinCC 里的“画面余额”会发生覆盖竞争,两边谁先写谁后写,逻辑完全不可控。正确做法是:WinCC 按钮脚本只负责“产生一个脉冲信号”,比如用 C 脚本把投币1元使能位置 1,同时启动一个 0.5 秒的定时清位动作,PLC 收到这个脉冲后在自己的程序里完成余额累加。逻辑计算永远放在 PLC 侧,HMI 只做人机交互和状态显示,这是我对所有做组态的同学的第一条建议。
下面是按钮“投1元”的 C 脚本示例,在病症周期的画面运行系统中,它置位一个外部变量然后延时复位:
SetTagBit("Coin1Enable", 1); __delay(200); // 保持200ms后复位 SetTagBit("Coin1Enable", 0);实际做项目时我不建议在 C 脚本里用__delay阻塞画面运行,更好的做法是把 Coin1Enable 置 1,然后 WinCC 内部设定一个“画面周期”脚本,在 200ms 后再复位。甚至在要求不高时,直接用 PLC 输入按钮代替画面按钮,WinCC 只做状态显示,连信号互锁的问题都省了。我的原则是:能少写脚本就少写,脚本越多,组态软件崩溃和出错的可能性越大。
4.3 画面刷新与报警设置
WinCC 变量刷新速度是可调的,默认 250ms 对大多数场景够用。三货物版里出货电机动作只有 2 到 3 秒,250ms 的刷新完全能捕捉状态变化。但如果你在画面里做了一个“电机运行”指示灯,希望它像现实电机一样闪动,不能靠外部变量刷新,应该用 WinCC 的对象动态对话框,把“闪烁”属性关联到电机状态变量的非 0 状态,刷新周期设 500ms 即可。
报警记录也是 WinCC 的核心功能。我在画面里添加了“卡货报警”“缺货报警”“投币器故障”三个报警事件,并用 WinCC 的报警控件显示报警列表。组态时先要在“报警记录”编辑器中定义消息文本和触发变量,然后在画面控件中选择对应报警组。这里有一个容易被忽略的操作:WinCC 的报警触发变量一般要用二进制变量,而且必须是“变化时触发”,所以 PLC 侧报警信号要做一个 1 秒以上的持续脉冲,不能一闪而过,否则画面上报警可能没来得及记录就消失了。
5. S7-300 与 WinCC 通讯:四种连接方式对比
5.1 经典 MPI 调试口方式
早期项目中最常见的 WinCC 与 S7-300 通讯方式是 MPI。PLC 的 MPI 口通过 PC Adapter(USB 编程电缆)或 CP5611 通讯卡连接上位机,WinCC 中使用 SIMATIC S7 Protocol Suite 连接,选择 MPI 通道,设置站地址为 2(默认 PLC 地址)、机架号 0、插槽号根据 CPU 型号填写。
MPI 方式的优点是不需要额外组态网络参数,适合单机调试和实验台。缺点同样明显:通讯速率只有最高 12 Mbps 左右,而且 PC Adapter 与 WinCC 同时使用时稳定性一般;一旦上位机重启或拔插 USB,WinCC 通讯就可能断开,需要重启 WinCC 运行系统。
5.2 工业以太网方式
如果 CPU 带 PN 口,或者安装了 CP343-1 以太网模块,强烈建议走工业以太网。WinCC 中 SIMATIC S7 Protocol Suite 连接选择 TCP/IP 通道,PLC 侧设置独立的 IP 地址,比如 192.168.0.1,上位机设 192.168.0.2,直连网线或通过交换机连接。
这个方式有几个绕不过的细节。第一,PLC 侧必须启用 PUT/GET 通讯。在 STEP 7 的硬件组态里双击 CPU,在通讯属性中勾选“允许使用 PUT/GET 通讯”,不勾选的话 WinCC 的 S7 连接会建立失败。第二,WinCC 新建连接时,要正确填写机架号和插槽号。CPU 313C-2DP 通常填机架 0、插槽 2,具体以硬件组态为准,填错会导致连接建立但读不出数据。第三,如果上位机有多块网卡,WinCC 的 TCP/IP 通道会默认绑定第一块网卡,需要手动指定连接使用的网卡。
5.3 OPC UA / 中间件方式
还有一种常见组合是 WinCC 连接 KEPServerEX 等 OPC 服务器,再通过 KEP 的 Siemens TCP/IP 驱动访问 S7-300。为什么要绕一圈?因为 WinCC 自带 S7 驱动,理论上不需要 OPC,但实际项目中存在两类情况:一是 WinCC 版本和 PLC 驱动兼容性差,比如老版本 WinCC 访问新型 CPU 时常出问题;二是现场上位机已经用了第三方 SCADA 平台,需要统一通过 OPC UA 汇总数据。KEP 本质上是一个协议转换网关,将西门子的 S7 协议转换成 OPC UA/DA 标准接口,WinCC 侧添加 OPC 客户端连接,指向本机或者远程的 OPC 服务器。这种方式扩展性强,但会因为多一层转发带来额外的延迟,对本项目这种对小数据量没有明显影响。
5.4 仿真联调方式(PLCSIM + WinCC)
如果手头没有真实 PLC,或者不想在硬件上反复折腾,可以用 STEP 7 V5.x 自带的 PLCSIM 仿真器配合 WinCC 做全流程联调。流程是:先在 STEP 7 中编译下载到 PLCSIM 虚拟机,把程序跑起来,再打开 WinCC 运行系统,通讯连接选择 PLCSIM 对应的通道(通常使用 MPI 通道或直接选“PLCSIM”通道)。PLCSIM 的优点是能够仿真定时器、计数器、位存储器,适合验证逻辑正确性;缺点是没法仿真实际接线和传感器电气特性,所以最后的硬件接线问题仍然躲不掉。
我个人的建议是“仿真先行、实机验证”:先花两天在 PLCSIM 上把三货物流程跑通,把 WinCC 画面和变量都调好,再带着验证过的程序去实验室碰硬件,这样可以把“软件问题”和“硬件问题”分开排查,联调压力小一大截。
这四种通讯方式我用一个表总结一下,方便对照选择:
| 方式 | 硬件要求 | WinCC 侧通道 | 适用场景 | 主要坑 |
|---|---|---|---|---|
| MPI | PC Adapter / CP5611 | SIMATIC S7 Protocol Suite → MPI | 单机实验台 | 地址参数不匹配,拔插后易断 |
| 工业以太网 | CPU PN 口或 CP343-1 | SIMATIC S7 Protocol Suite → TCP/IP | 多数项目首选 | 忘记启用 PUT/GET 通讯 |
| OPC UA / KEP | 上位机装 KEP 等 OPC 服务器 | OPC Client 连接 | 第三方系统集成 | 驱动授权、点位映射繁琐 |
| PLCSIM 仿真 | 无需 PLC 硬件 | PLCSIM 专用连接 | 教学、逻辑预验证 | 无法验证真实接线 |
6. 联调实战:问题定位与排查速查
6.1 联调前的检查清单
我每次做联调都不会直接上电跑,而是按清单逐项确认,这套习惯是从现场调设备养成的。清单大致如下:
- PLC 处于 RUN 状态吗?SF 红灯有没有亮?如果有 SF 灯,先进 STEP 7 的模块信息看故障代码。
- 程序已下载到 CPU 的哪一个块?下载的是不是最新编译版本?以后修改过程序一定要先编译再下载,出现“逻辑和画面不一致”的怪问题,多半是下载漏了块。
- WinCC 变量管理里连接状态是否 OK?打开变量管理,查看连接属性里的“状态”,显示绿色或正常字样才算建立好。
- 通讯地址是否一致?PLC 站地址、机架号、插槽号、IP 地址,两边逐项核对。
- 画面运行系统是否已激活?WinCC 编辑器里的画面和运行系统中的画面是两个状态,改完画面必须激活运行系统才生效。
- 外部变量的数据类型是否匹配?MW10 是 Word,WinCC 里建的变量类型也必须是 Word/无符号 16 位,类型不一致会导致显示乱码或数值错误。
这段清单看着简单,但真有同学带着“WinCC 画面打不开”“变量全部显示 0”的问题来问我,我一查发现 WinCC 运行系统根本没启动,或者 PLC 程序地址和 WinCC 变量连接的地址差了 1 个字节,都是低级问题,确认清单能省掉大量无效调试时间。
6.2 高频故障与解决方案
根据带学生做这类项目的经验,我把常见问题整理成速查表,按故障现象、可能原因、处理办法三列展开:
| 故障现象 | 可能原因 | 处理办法 |
|---|---|---|
| WinCC 打开工程无显示 | 工程路径包含中文或非法字符;版本不匹配 | 工程目录放到纯英文路径,换个 WinCC 版本重新导入 |
| 画面上 PLC 变量全部不变/显示 0 | 通讯连接未建立;变量连接地址错误 | 检查变量管理连接状态,核对 DB 块地址和偏移 |
| 连不上 PLC,通讯状态报错 | PUT/GET 未启用;IP 网段不一致;防火墙拦截 | 启用通讯权限,设置同一网段,关闭 Windows 防火墙或加白名单 |
| 投币金额不累加 | 按钮信号没做边沿检测;I/O 地址接错 | 检查程序是否用 FP/P 触点,用变量表监控输入位 |
| 按下选择按钮没反应 | “忙”标志位被置位;状态机未回到可选购态 | 查看当前状态位和忙标志,复位后再试 |
| 电机转了但检测不到出货 | 传感器极性错误;检测窗口太短 | 检查传感器的常开常闭极性,延长定时器窗口 |
| 一直报警出货超时 | 光电传感器没对准;货物没触发传感器 | 重新用万用表确认传感器遮挡时输入状态变化 |
| WinCC 画面闪烁严重或卡顿 | 画面刷新周期设置太短;CPU 被通讯拖累 | 把变量刷新时间调到 500ms 或 1s,合理使用局部刷新 |
排查时要养成分层思维:问题到底出在电气层、PLC 层还是上位机组态层?每层用一个现象验证。电气层看模块指示灯、万用表测电位;PLC 层用变量表和程序状态监控;上位机组态层看 WinCC 连接状态和变量监控。能确认一层没问题再进入下一层,不要上来就改程序或重装 WinCC。
6.3 我印象最深的几个坑
第一个坑是 WinCC 打开工程显示空白画面。有次在实验室帮学生调试,工程文件拷贝到另一台电脑后,画面编辑器打开全是灰色网格,运行系统启动后也没有任何对象。搞了半天发现是显卡驱动和 WinCC 的渲染兼容问题,把 WinCC 的图形运行方式从“硬件加速”改成“软件渲染”才好。如果你的 WinCC 打开正常但画面加载异常,先别急着重装软件,检查一下图形属性设置。
第二个坑是 PLCSIM 下载程序时提示“无法建立到仿真模块的连接”。常常是上一轮仿真会话没有正常退出,PLCSIM 的后台进程锁住了通讯接口。处理办法是打开 Windows 任务管理器,结束S7Sim相关进程,再重新启动 PLCSIM 下载。
第三个坑是变量名大小写问题。WinCC C 脚本里变量名写错了大小写不会报编译错误,但运行时功能不执行。一次调试投币按钮,脚本里写coIn1Enable,PLC 里的变量名却是Coin1Enable,C 语言对大小写敏感,运行起来怎么按都没反应。这类错误靠人眼特别难查,后来我习惯在写完 C 脚本后做一次全局搜索,逐一核对脚本里引用的变量名和变量管理中的名称是否完全一致。
再补充一个通讯相关的细节:西门子 S7-300 的存储区中,DB 块默认不勾选“非保持”,大多数情况下没问题,但如果你在 WinCC 里连接的是 DB1.DBW0 这类地址,务必在 STEP 7 里查看 DB1 是否设置了“非保持”或者偏移是否正确。DB 块偏移错误是“画面数值和 PLC 监控不一致”的头号原因。
7. 项目复盘与下一步扩展思路
做完这套三货物售货机,最好再花一点时间思考扩展性,这也是我会在学生验收时追问的问题。三货物版的代码结构其实已经搭好了框架,扩展成五货物、十货物,只是把货道数据和 I/O 点重复配置,难的是如何从“选择 A 就驱动 Q0.0”这种手写逻辑,升级成“用货道编号索引数据块、统一处理出货检测”的结构化设计。工业上这种问题通常用“数据块数组 + 循环遍历”解决,把每种货物的价格、库存、电机地址、传感器地址做成一条记录,程序只写一套处理逻辑,靠索引切换货道。
往数字化方向走,还可以在现有 WinCC 工程上加数据归档和报表功能,把每天每种货物的销量、投币总额、故障次数记录下来,形成一个简单的经营分析界面。如果你还想接入云平台或者 ERP,前面提到的 OPC UA 中间件方式就能派上用场,把 PLC 数据统一汇到上层系统,售货机从单机设备变成物联网终端。这些扩展在本次项目代码之上都是自然生长,并不需要推翻重来,这也是三货物版选型“刚刚好”的另一个原因:体积小,五脏俱全,既有完工度,又有生长空间。
我个人在反复做这类项目的过程中体会最深的一点是:自动化项目最值钱的不是代码,是“逻辑自洽”。你把状态机画明白,边界条件想清楚,通讯机制看透,剩下的接线和填表都是熟练工。自动售货机只是一个载体,背后训练的是顺序控制、互锁保护、上位机联调这些工控核心能力,这套能力换到物料分拣、立体车库、生产线上一样成立。所以如果你正在为这个题目熬夜,不如沉住气,把控制流程从头到尾推演几遍再动手,磨刀不误砍柴工。