☰
PLC花式喷水池控制:时序逻辑与梯形图工程实现
2026/10/28 2:10:32 网站建设 项目流程

简介:面向自动化、电气控制及相关专业课程设计场景的PLC花式喷水池控制方案,围绕西门子PLC与Step7 V5.5展开,适合需要完成喷水池控制课设、复习梯形图编程或准备仿真调试的学生参考。压缩包共1个doc文件,约956KB,内容以课程设计报告形式组织,涵盖硬件配置、I/O地址分配、PLC外部接线与主电路、系统流程图、梯形图程序及仿真调试结果。方案设置4组喷头,可按选择开关实现逆序启动、顺序启动、交替喷水与正反向顺序喷水等四种花样,并说明单步/连续运行、定时控制与停止逻辑。已有1755人学习,读者可据此梳理从控制任务分析、地址分配到程序编写和仿真验证的完整思路,也可作为电气控制类课设的排版与报告撰写参照。

1. 花式喷水池的 PLC 控制:四组喷头真正被控制的不是顺序,是时间

做 plc 课设的人拿到这道题,十有八九第一反应是画顺序流程图:1 号喷完 2 号喷,2 号喷完 3 号喷,一条链排下去。可真到写梯形图就会发现,这条“顺序”根本不存在——四组喷头在任何一个时刻只有“喷”和“不喷”两种状态,所谓花样,不过是四个开关量在时间轴上的一种排布。真正要设计的东西不是动作先后,而是“把连续时间切成若干区间,每个区间里决定哪几个输出为 1”。想通这一层,后面所有的延时、计数、交替、正反序,都会塌缩成同一个问题:时间怎么切,切完怎么组合。而组合一旦用线圈硬堆,双线圈、定时器复位、停止后状态残留这三个坑就会同时找上门。这套逻辑值得拆到底,因为它是所有时序类 PLC 程序的通用骨架,喷水池只是把它摆到了明面上。

2. I/O 分配表:8 个输入点如何锁死梯形图的骨架

2.1 输入输出地址表:Q4.0 到 Q4.3 的映射为什么容易接反

这套系统的物理量极少:8 个输入、4 个输出。输入侧是启动、停止、单步、连续,加四个花样选择位;输出侧是四组喷水管的电磁阀。地址分配如下:

类型设备地址说明
输入启动按钮I0.0常开,按下为 1
输入停止按钮I0.1常闭,正常为 1,按下为 0
输入单步开关I0.2旋钮位置,非脉冲
输入连续开关I0.3旋钮位置,非脉冲
输入选择开关 1~4I0.4~I0.7四位一一对应四种花样
输出1 号喷水管Q4.0外环
输出2 号喷水管Q4.1一次外环
输出3 号喷水管Q4.2内环
输出4 号喷水管Q4.3中心

表里藏着一个新手最常接错的地方:喷头编号和地址编号是反着的。1 号喷头对 Q4.0,4 号喷头对 Q4.3,而花样描述里反复出现“4 号先喷”“1 号先喷”,读程序时脑子里要来回翻一次。更麻烦的是“几号喷头”在不同段落里既指物理位置又指动作顺序,写注释时必须统一成地址,否则调试阶段会怀疑人生。

输出侧从 Q4.0 开始而不是从 Q0.0 开始,这件事本身不是编程决定的,是硬件组态决定的。中型 PLC 的 I/O 模块起始地址在组态里配置,模块挂在第几个槽、前面占了多少字节,直接决定第一个可用通道是 Q0.0 还是 Q4.0。程序里写 Q4.0,前提是组态里那块输出模块的起始地址确实是 4。这两件事对不上,就会出现仿真里 Q4.0 亮得漂漂亮亮、现场端子上量不出电压的情况,第 5 章会细说。

从程序设计角度,这张表的价值不在于记录,而在于它天然规定了程序的“段落”。I0.4~I0.7 是四个互斥的模式位,它们决定了程序往下分成四条几乎平行的支路;I0.0 和 I0.1 是所有支路共用的总开关;I0.3 决定这段逻辑跑一遍还是跑到底。把这层关系理清,梯形图的网络划分基本就定了,剩下的只是每条支路内部的定时器怎么排。

2.2 停止按钮为什么在梯形图里画常开触点

启保停是 PLC 程序里最短也最容易写错的一段。物理停止按钮按行业习惯接常闭触点:不按时线路是通的,输入点为 1;按下时线路断开,输入点变 0。基于这一点,梯形图里要用常开触点去“取反”:

// 系统运行标志 M0.0 —— 启保停 A I0.0 // 启动按钮,常开,按下为 1 O M0.0 // 自锁:松开启动按钮后靠自己保持 AN I0.1 // 停止按钮:物理常闭,正常时 I0.1 = 1,此处取反后允许运行 = M0.0 // 输出运行标志

这段代码的关键在AN I0.1而不是A I0.1。如果现场把停止按钮接成了常开(不按时为 0),这段逻辑就完全反了:上电瞬间 I0.1 为 0,取反后为 1,M0.0 立刻被置位,装置在没人按启动的情况下自己跑起来。这是典型的“程序没错、接线不对”事故,而且它在仿真里永远不会暴露,因为仿真时你是手动强制 I0.1 的。

停止按钮用常闭接法不是玄学,是失效安全(fail-safe)的通用做法:线路断了、端子松了、按钮坏了,表现都是“输入为 0”,而 0 对应的是“停止”。换成常开接法,断线时输入恒为 0,系统会认为“没有人按停止”,继续运行——故障的表现是危险的,这是设计上不能接受的。这个思路可以推广到所有保护类信号:急停、超温、液位上限,一律用常闭,让“断线”自动等于“停机”。

M0.0 这个标志位在后文里会反复出现,它是所有花样支路的公共使能。把它单独提出来做一位,而不是在每个网络里重复写A I0.0 O ... AN I0.1,好处是停止逻辑只改一处;坏处是它把“系统是否运行”和“某个花样是否运行”变成了两级条件,写输出组合时必须两级都判断,漏掉一级就会出现“停了还在喷”的现象。

2.3 单步/连续用两个独立点带来的第三种状态

单步开关在 I0.2,连续开关在 I0.3,注意这是两个独立的输入点,不是同一个单刀双掷开关的两侧。如果程序按“两条平行支路”写——A I0.2走一次循环、A I0.3走无限循环——那么会出现第三种状态:两个点都不为 1。旋钮卡在中间、触点氧化、线松了,都会落到这个状态,程序的表现是“按启动毫无反应”,而你在程序里找不到任何一条能覆盖它的逻辑。

稳妥的写法是只认一个位,把“无信号”归到安全的一侧:

// 只用一个输入位定义模式,缺省即单步 A I0.3 = M0.1 // M0.1 = 1 连续运行;M0.1 = 0 单步(只跑一个循环)

这样一来,I0.2 在程序里根本不出现,单步是“连续位为 0”的默认结果。少用一个输入点,换来了确定性:任何异常状态都退化到“只跑一次”,设备不会失控地循环下去。 同样的思路适用于花样选择。I0.4~I0.7 是保持型旋钮,运行中被人拧一下会发生什么?如果程序直接用 I0.4~I0.7 作为各支路的使能条件,那么在花样 1 跑到第 10 秒时拧到花样 3,T1~T4 的使能瞬间消失、全部复位,同时花样 3 的计数器和振荡器从零开始,输出会出现一个不伦不类的瞬间组合。常见的处理是在启动的上升沿把选择结果锁存到 M 位:

A I0.0 // 启动按钮 A M0.0 FP M3.0 // 取启动上升沿,只在按下那一瞬间执行一次 A I0.4 S M1.1 // 锁存"花样1选中" A I0.5 S M1.2

锁存之后,运行期间程序只看 M1.1~M1.4,旋钮随便拧都不影响当前循环,直到本次循环结束、下一轮启动时重新采样。这是“运行中参数不可变”的常见实现思路,代价是旋钮的操作有延迟感——操作员拧了没反应,得等这一轮跑完。要不要这个延迟,取决于你更怕“误操作导致状态错乱”还是更怕“操作不跟手”。喷水池这种场合,前者显然更值得防。

3. 延时链的底层机制:定时器为什么不能简单级联

3.1 使能断开时谁清零:两种接通延时定时器的分水岭

花样 1 的需求是:4 号先喷,2 秒后 3 号跟上,再 2 秒 2 号跟上,再 2 秒 1 号跟上,四组一起喷 15 秒后全停。表面看是四个延时首尾相接,很多人第一反应就是“T1 到了启动 T2,T2 到了启动 T3”,直接串成一条链。

串之前必须先分清定时器的复位行为,这是整个延时链能否成立的地基。接通延时定时器有两类:一类在使能端变 0 时立即复位,当前值清零、输出位归 0;另一类在使能端变 0 后仍保持当前值和输出状态,必须由复位端显式清除。前者的典型代表是 S_ODT(SD 指令),后者的典型代表是 S_ODTS(SS 指令)。

这个差别决定了级联的写法。用 S_ODT 级联时,T1 的使能是运行标志,T2 的使能是 T1 的输出位,T3 的使能是 T2 的输出位。当最后一个定时器到点、程序去断开运行标志时,T1 的使能消失,T1 立即复位,它的输出位变 0,于是 T2 的使能也消失,T2 复位……整条链像多米诺骨牌一样自动倒回去。这种“链式复位”是免费的,不需要额外写复位逻辑。

换成 S_ODTS 就是另一回事了。T3 到点后即使运行标志断开,T1、T2、T3 的当前值和输出位全都保持不动,下一轮启动时它们一上来就是“已到点”状态,输出直接跳到最终组合。这种定时器必须配一个复位网络,在循环结束时逐个复位,漏一个就出问题。它的价值在于“保持进度”:按下停止再按启动,能从上次断的地方接着走,而不是从头再来。喷水池这种场合不需要保持进度,反而是“停止即清零”更符合直觉,所以 S_ODT 是更自然的选择。

还有一个隐含的时间基准问题。定时器的设定值不是随便填个数就行的,它带分辨率:同样是设定 2 秒,用 10ms 分辨率的定时器,内部计数值是 200;用 100ms 分辨率的,内部计数值是 20。分辨率越细,可表示的最大延时越短,16 位当前值的上限是 32767,10ms 分辨率下最多只能表示 327 秒左右。这套系统里最长的延时是 30 秒,任何分辨率都够用,但换成需要几十分钟延时的大型时序程序,分辨率选错就会直接溢出,定时器永远到不了点,而且编译不报错——这是一类很隐蔽的故障。

3.2 花样 1 的四级延时链:用末级断首级实现自复位

把时间轴摊开看,花样 1 其实只有四个时间节点:0 秒(4 号起)、2 秒(3 号起)、4 秒(2 号起)、6 秒(1 号起),然后 21 秒(6+15)全部停止。所以不需要四个独立的 2 秒定时器各自计时,用一条累计的链就够了:

// 花样1:4→3→2→1 依次延时 2s 启动,全喷保持 15s // M10.0 = 花样1 被选中且系统运行中 A M10.0 // 花样1 运行条件 AN T4 // 末级到点后断开首级使能,整条链自动复位 L S5T#2S SD T1 // T1 到点 = 距启动已过 2s,3号该起了 A T1 // 以 T1 到点为新的起点 L S5T#2S SD T2 // T2 到点 = 距启动已过 4s,2号该起了 A T2 L S5T#2S SD T3 // T3 到点 = 距启动已过 6s,四组全喷 A T3 // 全喷段从这里开始计时 L S5T#15S SD T4 // T4 到点 = 全喷满 15s,本循环结束

四个定时器的使能条件分别是 M10.0、T1、T2、T3,串成一条链;而 T4 的常闭触点又回过头串在 T1 的使能里。这个环是本段代码的核心:T4 到点的那个扫描周期,T1 的使能条件失效,T1 复位 → T2 复位 → T3 复位 → T4 复位;到下一个扫描周期,T4 已经变 0,AN T4重新成立,T1 又开始计时。整条链自动进入下一轮,中间没有任何一行“重新启动”的代码。

这个环只有在连续模式下才该存在。单步模式要求跑完一轮就停在原地,所以 M10.0 必须在 T4 到点时被复位掉:

A T4 AN M0.1 // M0.1 = 0 表示单步 R M10.0 // 单步:一轮结束,退出花样1

顺序不能反:先让 T4 断 T1 使能完成复位,再决定要不要退出。如果先复位 M10.0,T1 的使能同样会断,看似结果一样,但在连续模式下 M10.0 保持为 1,就必须靠 T4 那条自复位路径才能继续循环,两条路径的职责不能混。

3.3 保持段的关键:输出条件用“区间”而不是“再计一次时”

到这一步,四组喷头的动作条件可以直接从定时器位上读出来:

// 花样1 内部输出(M12.x 只是中间变量,不是最终 Q) A M10.0 = M12.3 // 4号:整个循环都在喷 A M10.0 A T1 = M12.2 // 3号:从 2s 起,到循环结束 A M10.0 A T2 = M12.1 // 2号:从 4s 起 A M10.0 A T3 = M12.0 // 1号:从 6s 起

注意这里用的是“与定时器位”,本质是判断“当前时刻是否已经越过某个节点”。因为 S_ODT 在使能保持期间输出位一直是 1,所以T3 = 1表示“启动已超过 6 秒”,而不是“刚好在第 6 秒”。这正是保持段能免费实现的原因:一旦越过 6 秒,1 号就一直是 1,直到 T4 把整条链打断。

反过来,如果试图用“再来一个 15 秒定时器控制全喷时长”的写法,也就是把 T4 的使能写成 M10.0,那 T4 会从启动那一刻开始计时,15 秒后就把整条链掐断,四组喷头只喷了 15 秒就全停,而不是“先依次起、再一起喷 15 秒”。这是延时链里最常见的语义错误:定时器的使能点必须是“这一段动作的起点”,不是“整个流程的起点”。

用区间判断还有一个附带好处:改时间只需要改一处。假如甲方要求把“一起喷 15 秒”改成 20 秒,只动 T4 的设定值;要求把级间延时从 2 秒改成 3 秒,动 T1~T3 三个值,其余代码一行不动。这种“时间参数和逻辑结构分离”的写法,在后续维护里的价值远超多写几行注释。

4. 交替与正反序:计数器和步标志怎么替代“手动排列时间”

4.1 花样 3:3 秒振荡器加计数器,交替 5 次到底怎么数

花样 3 的动作是:1、3 号同时喷,3 秒后 2、4 号喷、1、3 号停;交替运行 5 次后,四组一起喷 30 秒后停止。这里有两个容易含糊的地方:一是“交替 5 次”从哪算一次,二是 3 秒的节拍怎么产生。

关于计数,合理的解读是“1、3 喷”和“2、4 喷”各出现 5 次,也就是 5 个完整的交替周期,总时长约 30 秒,之后进入全喷段。如果按“切换 5 次”理解,最后一个状态会落在 2、4 喷上,接着突然跳到四组全喷,观感上不完整。工程上一般按前者实现,这不是技术问题,是需求理解问题,但必须在代码注释里写死,否则后面没法验收。

3 秒节拍可以用一个自复位定时器做成振荡器:

// 花样3:3s 振荡器,每 3s 产生一个扫描周期的脉冲 A M11.0 // 花样3 运行 AN T5 L S5T#3S SD T5 // T5 到点后,下一扫描周期被自己的常闭触点复位

关键在于AN T5串在自己的使能里。T5 到点 → 输出位为 1 → 下一个扫描周期AN T5不成立 → 定时器复位、输出位归 0 → 再下一个扫描周期重新开始计时。于是 T5 的输出位在每 3 秒里只有整整一个扫描周期为 1,其余时间都是 0。这个“只有一个扫描周期宽”的脉冲特性非常重要,它是后面计数和翻转能够正确工作的前提。

接着用这个脉冲翻转交替位、驱动计数器:

A T5 FP M3.1 // 取 T5 上升沿,确保一个周期只执行一次 X M20.0 // 交替位翻转:0 → 1、3 号喷;1 → 2、4 号喷 A T5 FP M3.2 // 用另一个沿存储位,避免互相干扰 CU C1 // 计数器加 1,计满 5 次后 C1 位为 1

这里的FP(上升沿检测)不是可有可无的保险。翻转指令和计数器都是“执行一次就变一次”的操作,如果直接挂在 T5 的常开触点上,理论上 T5 只宽一个扫描周期,也只执行一次;但一旦哪天定时器换成保持型(输出位长时间为 1),X指令会每个扫描周期翻转一次,交替位彻底疯掉,而计数器因为有自带边沿检测反而不受影响——这种“一半对一半错”的故障最难查。加上沿检测,就把“靠定时器宽度保证只执行一次”变成了“靠沿检测保证只执行一次”,逻辑上更结实。

计数满之后的切换:

A C1 L S5T#30S SD T6 // 交替结束,进入全喷 30s A T6 R M11.0 // 花样3 结束 R C1 // 计数器必须复位,否则下次启动直接跳全喷

注意R C1这一行。计数器不是定时器,使能断开不会自动清零,它会把 5 这个值一直记着。停止后重新启动,A C1立刻成立,程序直接跳进全喷段——这是第 5 章要展开的典型故障,也是计数器与定时器行为差异最容易翻车的地方。

输出组合同样按区间取:

// 交替段:M20.0 = 0 时 1、3 号喷 A M11.0 AN C1 AN M20.0 = M13.1 // 1 号 A M11.0 AN C1 AN M20.0 = M13.2 // 3 号 // M20.0 = 1 时 2、4 号喷 A M11.0 AN C1 A M20.0 = M13.3 // 2 号 A M11.0 AN C1 A M20.0 = M13.4 // 4 号 // 全喷段:C1 已计满 A M11.0 A C1 = M13.1 = M13.2

最后三行是错的——同一个 M13.1 在一个网络里被赋值两次,前一次的结果会被后一次覆盖。这里只是示意逻辑意图,正确写法是把两段的驱动条件“或”起来,再输出一次。这个错误在后面会单独讲,因为它几乎每个初学者都会犯一次。

4.2 花样 4 的 12 步时间轴:正序起、全喷、正序停、间隔、反序起、全喷

花样 4 是四种模式里唯一无法用一条延时链解决的。它的动作分成六段:正序逐个启动(1→2→3→4,每级 2 秒)、四组全喷 30 秒、正序逐个停止(1、2、3、4 分别延时 2 秒停)、全停间隔 1 秒、反序逐个启动(4→3→2→1,每级 2 秒)、全喷 30 秒后全停。逐级启动和逐级停止交替出现,用“累计延时 + 区间判断”写会变成一堆嵌套条件,可读性极差。

正确做法是把它拆成离散的步,每个步只有一个稳定状态和一个转换条件:

步喷水的喷头组本步时长累计时刻
S112s2s
S21、22s4s
S31、2、32s6s
S41、2、3、430s36s
S52、3、42s38s
S63、42s40s
S742s42s
S8全停1s43s
S942s45s
S104、32s47s
S114、3、22s49s
S121、2、3、430s79s

整轮 79 秒。这张表就是程序的结构图:12 行对应 12 个步标志,每行的“喷水组”直接翻译成输出条件,“本步时长”翻译成一个定时器的设定值。把表画出来之后,梯形图几乎没有设计空间了,只剩机械翻译。这也是顺序控制设计法的价值所在——它把“想清楚”和“写下来”强行分成两个阶段,避免边写边改。

4.3 步进写法:置位下一步、复位当前步

有了步表,每个步的网络可以写成同一个模板:

// S1 → S2 的转换:S1 激活时启动 2s 定时器,到点置位 S2、复位 S1 A M30.1 // 当前步 S1 激活 L S5T#2S SD T10 A T10 // 本步时间到 S M30.2 // 置位下一步 R M30.1 // 复位当前步

这套模板有三个隐含约束,缺一个就出问题。

第一,定时器的使能必须是“当前步激活”,不能用“流程运行中”。用后者的话,所有 12 个定时器从启动瞬间就开始计时,30 秒后集体到点,步序彻底失控。

第二,转换必须成对:置位下一步的同时复位当前步。只置位不复位,会出现两个步同时激活,输出组合变成两步的并集,画面看着“多喷了一组”;只复位不置位,流程直接断在那里,没有任何输出。

第三,步标志在流程结束后必须全部复位。12 个步标志中只要残留一个,下次启动时那一步立刻被当成“已激活”,配合它的定时器会立刻计时,表现为“一按启动就跳步”。

输出部分则完全按步表组合,不掺任何时序判断:

// 1 号喷头在哪些步里喷水:S1、S2、S3、S4、S12 A M30.1 O M30.2 O M30.3 O M30.4 O M30.12 = M40.0 // 花样4 内部:1 号喷水

这种写法的好处在改需求时体现得最明显。假如甲方要求把 S8 的间隔从 1 秒改成 0.5 秒,只动 S8 那个定时器的设定值;要求反序启动慢一点,只动 S9~S11 三个定时器。步表和输出的对应关系完全不用碰。相比之下,用累计延时写的版本,改一个时间点就要重新核对后面所有区间判断,改完还得重新验证一遍全部逻辑。

代价也很直接:12 个步、12 个定时器,程序规模随步数线性增长,而且每个定时器都是独立编号、独立管理,号段一乱就会出现“两个步共用一个定时器”的隐性错误。如果花样再扩到 8 种,这套写法还能撑住,但到 20 步以上就要考虑换结构了——这是第 6 章的话题。

5. 排查清单:仿真通过但现场翻车的五个地方

5.1 程序结构类故障

现象:四种花样单独仿真都正确,一切换模式就乱;或者某个输出点始终不亮,但程序里明明有它的线圈。

原因:双线圈。同一个 Q 地址在程序的不同网络里被赋值不止一次,扫描执行到最后一次赋值时,前面的结果被完全覆盖。梯形图是顺序执行的,一个扫描周期内对同一地址多次写入,只有最后一次有效。花样 1 写一遍 Q4.0、花样 2 又写一遍 Q4.0,最后跑出来的是花样 4 那一遍的结果,跟当前选中的花样毫无关系。定时器号复用是同一类问题的另一种形态:T1 在花样 1 里用了一次、在花样 3 里又用一次,后一个网络的定时器参数直接覆盖前一个,前一个延时时间变得莫名其妙。

解决:所有输出线圈只在程序最末尾出现一次,前面各花样只操作中间变量(M 位),最后统一做“或”运算:

// 统一输出:整个程序中 Q4.0 只出现这一次 A M12.0 // 花样1 的 1 号 O M13.0 // 花样2 的 1 号 O M14.0 // 花样3 的 1 号 O M40.0 // 花样4 的 1 号 = Q4.0

定时器按花样分段规划号段:花样 1 用 T1~T4,花样 2 用 T5~T9,花样 3 用 T10~T12,花样 4 用 T13~T24。号段规划写在注释里,比事后查表快得多。

现象:按停止再按启动,花样 3 直接进入全喷 30 秒;花样 1 从第二轮的位置继续,而不是从头开始。

原因:停止逻辑只复位了运行标志 M0.0,没有复位计数器、交替位、步标志。定时器因为使能断开自动清零,看起来“恢复正常”,于是掩盖了其他元件状态残留的事实。计数器尤其危险:它不接使能端,也不随运行标志复位,5 次这个值会一直保鲜到下次启动。步标志同理,残留一个 M30.x 就等于提前进入了某一步。

解决:停止按钮触发一个专门的总复位网络,把该复位的全部列出来,一个不漏:

A I0.1 // 停止按钮按下(常闭断开,此处用常开触点取反) AN M0.0 R M1.1 // 花样选择锁存 R M1.2 R M1.3 R M1.4 R M20.0 // 交替位 R M30.1 // 步标志,从 1 到 12 全部列出 R C1 // 计数器

更稳的做法是加一个“首次扫描”初始化:上电第一个扫描周期把整个 M 区和 C 区清一遍,杜绝上次掉电前的残留。

5.2 硬件与组态类故障

现象:仿真时 Q4.0 有输出指示,现场用表量端子却没有电压;或者接上线之后,动作对应到了错误的喷头。

原因:程序里的地址和硬件组态里模块的起始地址不一致。中型 PLC 的 I/O 地址由模块在机架上的位置和组态参数决定,输出模块挂在某槽位、起始地址设为 0,那么物理通道只有 Q0.0~Q0.7,程序里的 Q4.0

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

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

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

立即咨询