S7-200自动售货机PLC控制:梯形图、SFC与TON定时互锁设计
2026/9/18 11:54:55 网站建设 项目流程

简介:这份文档面向自动化、机电一体化专业学生及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.0SB1找零按钮Q3.1食品五角红灯(售完)
I0.1SB2食品五角按钮Q3.2食品一元红灯(售完)
I0.2SB3食品一元按钮Q3.3饮料一元红灯(售完)
I0.3SB4饮料一元按钮Q3.4饮料二元红灯(售完)
I0.4SB5饮料二元按钮Q3.5日用二元红灯(售完)
I0.5SB6日用二元按钮Q3.6日用三元红灯(售完)
I0.6SB7日用三元按钮Q0.0找零输出
I2.0SB8投五角硬币Q0.1出食品五角
I2.1SB9投一元硬币Q0.2出食品一元
I2.5SB10找零五角Q0.3出饮料一元
I2.6SB11找零一元Q0.4出饮料二元
I3.1SB12食品五角行程开关Q0.5出日用二元
I3.2SB13食品一元行程开关Q0.6出日用三元
I3.3SB14饮料一元行程开关Q2.1食品五角绿灯
I3.4SB15饮料二元行程开关Q2.2食品一元绿灯
I3.5SB16日用二元行程开关Q2.3饮料一元绿灯
I3.6SB17日用三元行程开关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、T961 ms32.767 s
T33~T36、T97~T10010 ms327.67 s
T37~T63、T101~T255100 ms3276.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 s80出货指示灯闪烁
T43交易完成后无操作20 s200退余款
T43 + T44投币后无按键2 min1200退还所投硬币
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 值即可,不用动电路结构。

调试时如果发现指示灯常亮不闪,先查两个定时器是不是都被同一个触点启动了;如果灯完全不亮,检查闪烁输出后面是不是还串了一个常闭的自锁触点把输出断开了。这两类问题在仿真里比在实机上更容易定位,所以上电前把闪烁段单独跑一遍是省时间的做法。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询