简介:这份文档面向自动化、机电一体化专业学生及PLC初学者,围绕西门子S7-200系列PLC在自动售货机监控系统中的应用展开,可用于课程设计、毕业设计选题或自学参考,帮助解决从硬件选型到梯形图编写缺乏完整案例的问题。资源为单个doc文档,压缩包约490KB,内容按绪论、PLC概述、自动售货机设计、工作流程与结论组织,涵盖自动售货机的发展背景与国内外现状、方案论证、PLC的组成特点与循环扫描原理、定时器与数学运算指令的使用、I/O点分配、顺序功能图与梯形图设计,以及外部接线图的绘制,并采用STEP7软件完成程序编写。文中以一次交易过程为例,将识别、分拣、存储、出货拆分为多个程序块分别实现,便于读者理解S7-200在售货机中的控制作用与调试思路。目前已有183人学习下载。
1. 一台自动售货机的控制难点,不在机械结构上
自动售货机最容易被低估的部分是时间边界。投币后两分钟不按任何键要原路退币,购买成功后二十秒无操作要把余额吐出来,出货瞬间指示灯要闪而不是常亮,缺货时对应按键要按了没反应还不扣余额——这四类需求全部是定时器与状态互锁的活,和弹簧、货道、电机关系不大。这份基于西门子 S7-200 的设计文档,把一台支持食品、饮料、日用三大类共六种商品的售货机拆成了 36 个 I/O 点,用选择性分支加并发分支的顺序功能图(SFC)描述流程,再落到 STEP7 里的梯形图。它适合两类人看:一类是刚接触 PLC、想找一个完整项目练梯形图的,另一类是手上有 S7-200 老设备、需要把控制逻辑重新梳理一遍的。下面按照硬件接线、计价运算、流程分支、仿真排错的顺序,把这份设计拆开讲。
2. S7-200 的 I/O 点分配与外部接线落地
2.1 CPU 选型与点数预算
这份设计用到 18 个输入点、18 个输出点,合计 36 点。S7-200 系列里 CPU226 本体就有 24 入 / 16 出,加上一个 8 点输出扩展模块(如 EM222)刚好覆盖;如果选 CPU224(14 入 / 10 出),则需要补两块扩展模块。常见做法是先把输入输出清点一遍,留出 15% 左右的余量再定 CPU 型号,因为缺货信号、备用按键这类需求在调试阶段经常冒出来。
选 S7-200 而不是继电器硬接线的理由很直接:六种商品的价格比较、余额判断、找零组合,本质是六路并行的数值比较,用继电器搭要几十个中间继电器和比较电路,改一次价格就要重新接线。PLC 里改一个常数就完事。
2.2 36 个 I/O 点的功能映射
原始设计的 I/O 分配如下表,编号和符号沿用文档,方便和后面的梯形图地址对上。
| 序号 | 符号 | 功能 | 序号 | 符号 | 功能 |
|---|---|---|---|---|---|
| I0.0 | SB1 | 找零按钮 | Q3.1 | — | 食品五角红灯(售完) |
| I0.1 | SB2 | 食品五角按钮 | Q3.2 | — | 食品一元红灯(售完) |
| I0.2 | SB3 | 食品一元按钮 | Q3.3 | — | 饮料一元红灯(售完) |
| I0.3 | SB4 | 饮料一元按钮 | Q3.4 | — | 饮料二元红灯(售完) |
| I0.4 | SB5 | 饮料二元按钮 | Q3.5 | — | 日用二元红灯(售完) |
| I0.5 | SB6 | 日用二元按钮 | Q3.6 | — | 日用三元红灯(售完) |
| I0.6 | SB7 | 日用三元按钮 | Q0.0 | — | 找零输出 |
| I2.0 | SB8 | 投五角硬币 | Q0.1 | — | 出食品五角 |
| I2.1 | SB9 | 投一元硬币 | Q0.2 | — | 出食品一元 |
| I2.5 | SB10 | 找零五角 | Q0.3 | — | 出饮料一元 |
| I2.6 | SB11 | 找零一元 | Q0.4 | — | 出饮料二元 |
| I3.1 | SB12 | 食品五角行程开关 | Q0.5 | — | 出日用二元 |
| I3.2 | SB13 | 食品一元行程开关 | Q0.6 | — | 出日用三元 |
| I3.3 | SB14 | 饮料一元行程开关 | Q2.1 | — | 食品五角绿灯 |
| I3.4 | SB15 | 饮料二元行程开关 | Q2.2 | — | 食品一元绿灯 |
| I3.5 | SB16 | 日用二元行程开关 | Q2.3 | — | 饮料一元绿灯 |
| I3.6 | SB17 | 日用三元行程开关 | Q2.4 | — | 饮料二元绿灯 |
| Q2.5 | — | 日用二元绿灯 | |||
| Q2.6 | — | 日用三元绿灯 |
注意输入点并不是连续的:I0.x 一组给按键,I2.x 给投币和找零面额选择,I3.x 给出货行程开关。这样分组不是强迫症,而是为了在梯形图里用字节传送指令(MOV_B)一次性读入一整组状态,减少触点数量。
2.3 硬币识别信号与行程开关的接入方式
硬币识别器(投币器)输出的是脉冲信号,五角一路、一元一路,接到 I2.0 和 I2.1。这里有个实际工程上的细节:投币器输出的脉冲宽度通常在 30~100ms,S7-200 的普通输入点扫描周期在毫秒级,直接接会漏计。常见做法是在投币信号上加一个上升沿检测(EU 指令)做单次计数,或者把输入滤波时间调到合适值。
行程开关 I3.1~I3.6 装在六个货道的出货口,货品落下时触碰,作用是确认"东西真的出来了",而不是仅仅发了出货指令就认为交易完成。这一路信号在梯形图里用来复位对应的出货输出,属于典型的闭环确认。
2.4 接线图到梯形图地址的对应
外部接线做完之后,梯形图里用的地址必须和接线图一一对应,否则调试时会出现"按了按钮灯不亮"这类问题。文档里给出的外部接线图遵循一个简单原则:输入设备一端接 24V 公共端,另一端接 PLC 输入端子;输出设备(指示灯、出货电机继电器)一端接输出端子,另一端接负载电源。S7-200 的 1M、2M 是输入公共端,1L+、2L+ 是输出公共端,接线时不要把它们接反。
提示:S7-200 的输入点分两组公共端(1M 对应 I0.x/I1.x,2M 对应 I2.x 及以上),如果一组里混接了不同电平的信号,会出现部分点读不进来的情况。接线前先把输入点按公共端分组列一遍。
3. 计价核心:双整数加减与 TON 定时器
3.1 币值为什么要放大成整数
投币有五角和一元两种,商品价格有 0.5、1、2、3 元。如果直接在程序里存 0.5,就要走浮点运算(ADD_R、SUB_R),梯形图里的比较指令和显示都会变复杂。文档采用的做法是把币值统一放大 10 倍:五角记为 5,一元记为 10,二元记为 20,三元记为 30,全部走整数运算。余额存在一个双整数寄存器里,比如 VD100。
这个做法在工控里很常见,本质是用定点数代替浮点数。优点是运算快、比较可靠、不会出现浮点舍入误差导致"余额 0.9999 元不够买 1 元商品"这种问题。缺点是编程时要记住所有价格都乘了 10,显示给人看的时候要再除回去。
3.2 ADD_DI 与 SUB_DI 的指令写法
投币和扣款用双整数加减指令。投五角加 5,投一元加 10;购买成功时减去对应商品的价格。语句表写法如下:
// 投币:五角硬币脉冲上升沿,余额 VD100 加 5 LD I2.0 EU +D 5, VD100 // 投币:一元硬币脉冲上升沿,余额 VD100 加 10 LD I2.1 EU +D 10, VD100 // 购买食品五角:按下按键且余额足够,余额减 5 LD I0.1 A >=D VD100, 5 EU -D 5, VD100指令说明:+D是双整数加法,-D是双整数减法,操作数前一个是加数或减数,后一个是结果寄存器。EU是上升沿检测,只让信号跳变的那一个扫描周期起作用,避免按住按钮时余额被反复加。>=D是双整数比较。
这里有个容易踩的坑:EU必须和前面的触点在同一逻辑行里连用,如果单独放在中间继电器上再检测,沿信号会被扫描周期吃掉。另外一个坑是余额寄存器 VD100 要确保没有被别的子程序或中断改写,否则会出现余额自己变化的现象。
3.3 TON 定时器的时基选择
S7-200 的 TON(接通延时定时器)时基由定时器编号决定,不是随便选的:
| 定时器编号范围 | 时基 | 最大定时 |
|---|---|---|
| T32、T96 | 1 ms | 32.767 s |
| T33~T36、T97~T100 | 10 ms | 327.67 s |
| T37~T63、T101~T255 | 100 ms | 3276.7 s |
这份设计里 T37~T56 全部用的是 100ms 时基。原文提到 T37~T42 延时 8 秒,T43 计时 20 秒,T44 与 T43 配合做成投币 2 分钟无操作找零。换算成设定值:
- 8 秒 ÷ 100ms = 80,即 PT = 80
- 20 秒 ÷ 100ms = 200,即 PT = 200
- 2 分钟 = 120 秒 ÷ 100ms = 1200,即 PT = 1200
如果用 10ms 时基(比如 T33),同样 8 秒要写 PT = 800。选时基的通用原则是:定时时间越长,用时基越大的定时器,精度反而够用,还能省一个编号资源。100ms 时基的绝对误差最大 100ms,对售货机这种场景完全够。
3.4 三类超时逻辑的参数拆解
把文档里的定时器需求整理成参数表:
| 定时器 | 触发条件 | 时长 | PT 值(100ms) | 动作 |
|---|---|---|---|---|
| T37~T42 | 按下对应商品按钮 | 8 s | 80 | 出货指示灯闪烁 |
| T43 | 交易完成后无操作 | 20 s | 200 | 退余款 |
| T43 + T44 | 投币后无按键 | 2 min | 1200 | 退还所投硬币 |
| T46~T56 | 两两配合 | 周期可调 | — | 指示灯闪烁电路 |
T37~T42 一共六个(对应六种商品),按下按钮后各自启动,用常开触点驱动指示灯。闪烁的实现方式是让 T37 的常闭触点去复位 T38,T38 的常开触点再驱动灯,两个定时器互相打断,形成固定周期。这种"两定时器自复位"是 PLC 里最省资源的闪烁电路,比用系统时钟存储器位(SMB 里的时钟位)更可控,因为闪烁频率可以自己调。
T43 和 T44 的配合是这份设计里比较巧的一处:T43 计时 20 秒,T44 计时 2 分钟,两个定时器的输出都指向同一个退币逻辑。区别在触发条件——T43 在交易完成后启动,T44 在投币时启动。这样处理的好处是,即使顾客投币后一直不按按键,2 分钟后仍然会退币,不会出现投币后卡死不动的情况。
4. 从 SFC 到梯形图:选择性分支与并发分支
4.1 主流程为什么用选择性分支
顺序功能图里的选择性分支结构,是"一个控制流进入多个可能分支中的某一个,且同一时刻只有一路执行"。自动售货机的主流程正好符合:顾客可能买食品、买饮料、买日用,三者互斥,不会同时买两样。用选择性分支描述,进入条件分别是各自按键信号加余额判断,谁先满足谁执行。
反过来,如果用并发分支描述主流程,就会出现"买食品和买饮料同时出货"的逻辑,这在程序和实际机械上都是灾难。选分支结构前先问自己一句:这些动作是"选一个"还是"同时做",答案决定了用哪种结构。
4.2 并发分支用在找零和出货
并发分支用在另一个位置:成功的购买动作里,出货和找零是同时发生的。顾客按下一元食品键,货道电机启动,同时余额里减去 10、再扣掉实际价格、剩余部分进入找零队列。这两个动作没有先后依赖,用并发分支(双水平线表示公共转移条件)来组织,梯形图里体现为两个并联的输出支路在同一个转移条件下同时置位。
注意:并发分支的公共转移条件必须写在同一逻辑步里,如果写成串联的两个子步,实际执行会变成顺序而不是并发,找零会延迟一个扫描周期。
4.3 缺货互锁与红灯逻辑
缺货逻辑是这份设计里互锁做得最细的地方。当某个货道的行程开关连续多次没有触发,或者对应商品计数减到零,就置位缺货标志,对应红灯 Q3.x 点亮,而绿灯 Q2.x 熄灭。顾客按下该商品按键时,程序里用缺货标志的常闭触点串联在启动条件上,所以按键无效、余额不减、不出货。
这套互锁的关键在于"按键无效"和"不减余额"要同时满足。如果只断开了出货输出却漏了扣款支路,就会出现"按了没反应但钱少了"的严重问题。梯形图里这两种输出通常同处一个逻辑段,缺货触点放在共同的上游。
4.4 梯形图里的关键段写法
把上述互锁和出货逻辑写成语句表,结构大致如下:
// 缺货判断:食品五角商品计数为 0,置位缺货标志 M1.0 LDW= VW200, 0 = M1.0 // 启动食品五角出货:按键按下、余额够、且不缺货 LD I0.1 A >=D VD100, 5 AN M1.0 AN Q0.1 EU S Q0.1, 1 // 行程开关确认出货,复位出货输出并扣款 LD I3.1 R Q0.1, 1 -D 5, VD100逻辑说明:第一段用缺货标志 M1.0 表示该商品库存为零,这个标志会被绿灯和出货启动两条支路同时引用。第二段里AN M1.0是缺货互锁,AN Q0.1防止重复启动,EU保证一次按键只出货一次。第三段用行程开关 I3.1 的上升沿复位输出并扣款,-D 5, VD100是双整数减法,把五角商品的价格从余额里扣掉。
参数上需要注意的是扣款金额和商品价格常量要一致,改价时不能只改显示不改运算。常见做法是把六种商品的价格放在连续的数据寄存器里(如 VW300~VW310),梯形图里用间接寻址取值,这样改价只需要改数据块,不用动程序。
5. 仿真验证与几个容易翻车的地方
5.1 用 STEP7-Micro/WIN 配合仿真跑单步
程序写完之后,先在 STEP7-Micro/WIN 里做编译检查,再把程序导出给 S7-200 仿真软件(常见的 S7-200 仿真工具支持导入 Micro/WIN 的 AWL 文件或项目文件)。仿真时重点验证三条时间线:投币后 2 分钟不操作是否退币、购买完成后 20 秒是否退余款、按下商品键后指示灯是否闪烁 8 秒后停止。
单步验证的操作顺序:先手动置位 I2.0 模拟投五角,看 VD100 是否变成 5;再置位 I2.1 投一元,看是否变成 15;然后置位 I0.1 按食品五角键,观察 Q0.1 是否置位、VD100 是否减到 10;最后置位 I3.1 模拟行程开关,确认 Q0.1 复位。每一步之间留出足够扫描周期,仿真器的定时器是按真实时间走的,2 分钟的超时验证不要用加速模式,否则定时器行为会和实机不一致。
5.2 定时器编号与复位竞争
定时器最容易出问题的地方是编号冲突和复位竞争。T37~T42 六个定时器分别管六个商品的闪烁,如果写程序时不小心把两个商品分到同一个定时器编号,会出现"买 A 商品 B 商品的灯也闪"。检查方法是把定时器编号列一张表,和商品一一对应。
复位竞争出现在定时器交叉复位的场合。T37 的常闭复位 T38、T38 的常闭复位 T37 这种结构,如果两个定时器的 PT 值设成一样,可能出现两个都停在中间状态不切换。稳妥的做法是让两个定时器的 PT 值不相等(比如一个 10、一个 20),保证总有一个能先走完。
5.3 闪烁电路的参数调法
指示灯闪烁周期由两个定时器的 PT 值之和决定:周期 ≈ (PT1 + PT2) × 时基。要 1 秒闪一次的视觉效果,用 100ms 时基时,PT1 = PT2 = 5 就能得到 1 秒周期(500ms 亮 + 500ms 灭)。要改闪烁快慢,只改 PT 值即可,不用动电路结构。
调试时如果发现指示灯常亮不闪,先查两个定时器是不是都被同一个触点启动了;如果灯完全不亮,检查闪烁输出后面是不是还串了一个常闭的自锁触点把输出断开了。这两类问题在仿真里比在实机上更容易定位,所以上电前把闪烁段单独跑一遍是省时间的做法。
本文还有配套的精品资源,点击获取