4. 位逻辑与基本指令实战

在西门子PLC面试中,位逻辑与基本指令几乎是必考内容。面试官不会只问你“常开常闭是什么”,而是会给出一个具体任务,比如“用两个按钮控制一台电机的启动和停止,并加上过载保护”,然后观察你如何组织程序结构、如何选择指令、如何处理边界情况。本章围绕电机启停、报警锁存两类典型任务,把常开常闭、置位复位、边沿检测、定时器与计数器串成一条完整的答题链路。

一、常开常闭:不是“开关”,而是“条件”

很多初学者把常开触点理解为“按钮没按下时断开”,这在实际编程中容易出错。在PLC梯形图中,常开触点(| |)的本质是“检查位变量是否为1”,常闭触点(|/|)的本质是“检查位变量是否为0”。它反映的是变量当前状态,而不是物理按钮的机械状态。

以电机启停为例。假设启动按钮接在I0.0,停止按钮接在I0.1,过载保护接在I0.2,电机输出为Q0.0。停止按钮和过载保护通常使用物理常闭触点,即正常状态下I0.1和I0.2为1,按下停止或过载动作时变为0。因此程序中应使用常开触点检测I0.1和I0.2,而不是常闭触点。这一点在面试中经常被追问:“为什么停止按钮用常开触点?”正确回答是:物理常闭输入在正常时给PLC高电平,程序中用常开触点表示“正常条件成立”,一旦停止按钮按下或过载动作,输入变为0,常开触点断开,电机停止。这样设计符合故障安全原则——断线时输入为0,电机也会停止。

启动按钮通常使用物理常开触点,按下时I0.0为1,程序中用常开触点。启停控制的基本逻辑是:启动条件与停止条件、过载条件串联,再并联一个自锁触点。用梯形图表达就是:I0.0与Q0.0并联,再与I0.1、I0.2串联,输出到Q0.0。这就是最经典的起保停电路。

二、置位复位:让状态保持更清晰

起保停电路用自锁触点实现状态保持,而置位(S)和复位(R)指令则把“置位条件”和“复位条件”分开表达。对于电机启停任务,可以写成:当I0.0为1时,置位Q0.0;当I0.1为0或I0.2为0时,复位Q0.0。这种写法在面试中更受欢迎,因为它把启动和停止逻辑解耦,程序可读性更强。

但置位复位有一个关键陷阱:如果置位和复位条件同时满足,谁优先?在西门子S7-1200/1500中,如果同一扫描周期内先执行置位再执行复位,复位优先;如果先复位再置位,置位优先。因此面试中如果被问到“置位复位同时触发怎么办”,你应该回答:取决于程序顺序,实际工程中应通过互锁或条件判断避免同时触发,而不是依赖指令优先级。

报警锁存是置位复位的典型应用。假设一个温度报警信号为I0.3,当温度超过阈值时I0.3为1,要求报警输出Q0.1锁存,直到操作员按下复位按钮I0.4。程序可以写成:当I0.3为1时置位Q0.1;当I0.4为1时复位Q0.1。这样即使温度恢复正常,报警仍然保持,直到人工确认。面试中常追问:“如果报警信号是脉冲怎么办?”答案是:用置位指令锁存,或者用RS触发器,确保报警不丢失。

三、边沿检测:捕捉瞬间变化

边沿检测分为上升沿(P)和下降沿(N)。在西门子PLC中,上升沿检测可以用P触点或R_TRIG指令,下降沿用N触点或F_TRIG指令。边沿检测的核心是:只在信号变化的那个扫描周期内输出一个脉冲。

面试中常见的边沿检测应用是“按钮计数”或“单次触发”。例如,用一个按钮I0.5控制电机启动,要求按一次启动,再按一次停止。如果直接用I0.5的常开触点去置位和复位,由于按钮按下期间程序会多次扫描,可能导致状态反复翻转。正确做法是用上升沿检测:每次按下按钮产生一个脉冲,然后用这个脉冲去触发一个状态位翻转,或者用计数器实现奇偶控制。

在S7-1200中,使用R_TRIG指令的示例:将I0.5接入R_TRIG的CLK端,Q端输出一个扫描周期的脉冲。然后用这个脉冲去驱动一个SR触发器或CTU计数器。面试中如果被问到“边沿检测和普通触点有什么区别”,你可以回答:普通触点在信号为1期间每个扫描周期都导通,边沿检测只在信号变化的瞬间导通一个扫描周期,适合计数、单次触发和状态翻转。

四、定时器:从延时到顺序控制

西门子PLC提供多种定时器:TON(接通延时)、TOF(断开延时)、TP(脉冲定时器)、TONR(保持型接通延时)。面试中最常考的是TON和TOF。

以电机星三角启动为例。假设主接触器Q0.0先启动,星接触器Q0.1启动,3秒后星接触器断开,角接触器Q0.2接通。程序可以这样写:启动按钮I0.0置位Q0.0和Q0.1;同时启动一个TON定时器,设定时间3秒;定时器到达后,复位Q0.1,置位Q0.2。这里的关键是定时器的IN端应保持为1,否则定时器会复位。面试中常问:“定时器时间到后,如果IN端变为0,定时器会怎样?”答案是:TON在IN端为0时复位,当前值清零,输出Q变为0。因此如果需要保持定时器完成状态,应使用TONR或通过置位指令锁存。

另一个常见任务是报警延时。例如,温度超过阈值后,如果持续5秒仍然超限,才触发报警。这可以用TON实现:将温度报警信号接入TON的IN端,设定5秒,定时器输出Q触发报警。如果温度在5秒内恢复正常,定时器复位,报警不触发。面试中如果被问到“如何防止误报警”,这就是标准答案。

五、计数器:报警锁存与次数控制

计数器分为加计数器(CTU)、减计数器(CTD)和加减计数器(CTUD)。在报警锁存任务中,可以用CTU记录报警次数。例如,每次温度超限产生一个脉冲,CTU计数加1,当计数值达到3时,输出一个“频繁报警”信号。复位按钮可以复位计数器。

面试中常考“计数器与定时器结合”的任务。例如:要求电机启动后,每运行10秒产生一个脉冲,共产生5个脉冲后停止。实现思路是:用一个TON定时器设定10秒,定时器输出Q作为CTU的计数脉冲,同时用Q的上升沿复位TON,形成循环。CTU设定值为5,当计数值达到5时,停止电机并复位计数器。这个任务考察的是定时器自复位和计数器级联,是面试中区分度较高的题目。

六、面试答题思路总结

面对位逻辑与基本指令的面试题,建议按以下步骤组织回答:第一,明确输入输出分配,说明物理触点的常开常闭类型;第二,画出或描述梯形图结构,优先使用起保停或置位复位;第三,说明边沿检测的使用场景,避免重复触发;第四,定时器和计数器的参数设定要具体,比如3秒、5次;第五,主动指出边界情况,如同时触发、断线保护、复位优先级。这样回答既完整又体现工程思维。

以下是一个可直接参考的电机启停与报警锁存程序结构示例,适用于S7-1200/1500:

// 输入分配
// I0.0 启动按钮(常开)
// I0.1 停止按钮(常闭)
// I0.2 过载保护(常闭)
// I0.3 温度报警(常开)
// I0.4 报警复位按钮(常开)

// 输出分配
// Q0.0 电机接触器
// Q0.1 报警指示灯

// 电机启停(起保停)
// Network 1
      I0.0      I0.1      I0.2
|------| |---+---| |-------| |------( Q0.0 )
|            |
|     Q0.0   |
|------| |---+

// 报警锁存(置位复位)
// Network 2
      I0.3
|------| |----------------------------( S ) Q0.1

      I0.4
|------| |----------------------------( R ) Q0.1

// 报警延时确认(TON)
// Network 3
      I0.3
|------| |----------------------------[ TON ]
                                      PT: T#5S
                                      Q: M0.0

// 频繁报警计数(CTU)
// Network 4
      M0.0
|------| |----------------------------[ CTU ]
                                      PV: 3
                                      Q: M0.1
                                      R: I0.4

这个示例中,电机启停使用起保停电路,报警锁存使用置位复位,报警延时使用TON,频繁报警使用CTU。面试时你可以根据题目要求调整参数和逻辑,但核心结构不变。需要特别注意的是,停止按钮和过载保护在程序中用常开触点,这是因为物理触点选用了常闭型,符合故障安全原则。如果面试官追问“如果停止按钮接常开怎么办”,你应该回答:程序中改用常闭触点,但断线时输入为0,常闭触点导通,电机不会停止,存在安全隐患,因此工程中停止按钮优先选用常闭触点。

最后,建议在面试前准备两到三个完整程序片段,涵盖电机启停、报警锁存、定时器延时和计数器计数。不要死记硬背,而是理解每个指令的输入条件、输出行为和边界情况。这样无论面试官如何变化题目,你都能从输入输出分配、逻辑结构、参数设定和异常处理四个层面给出清晰回答。