IF AutoMode AND NOT EStop AND NOT GlobalFault AND SafetyDoorClosed AND UpstreamReady AND DownstreamReady AND AirPressureOK AND HomeDone AND NOT AlarmAckBusy THEN StartPermit := TRUE; END_IF;
语法上没问题,但可读性不太好。 特别是后期调试时,别人一眼不容易看出到底是哪个条件没满足。
更好的工程写法往往有两种思路。
第一种:拆成中间变量 StartPermit := AutoMode AND NOT EStop AND NOT GlobalFault AND SafetyDoorClosed AND UpstreamReady AND DownstreamReady AND AirPressureOK AND HomeDone AND NOT AlarmAckBusy;
然后再使用:
IF StartPermit THEN MotorRun := TRUE; END_IF;
这样逻辑会清晰很多。
第二种:分层判断 IF AutoMode THEN IF NOT EStop AND NOT GlobalFault THEN IF SafetyDoorClosed AND AirPressureOK THEN IF UpstreamReady AND DownstreamReady THEN StartPermit := TRUE; END_IF; END_IF; END_IF; END_IF;
这种方式也能写,但嵌套层次会比较深。 如果条件过多,阅读压力会变大。
所以工程上通常更推荐第一种: 复杂条件尽量提炼成有意义的中间变量。
这样做有几个好处:
逻辑更清楚 后续监控更方便 哪个条件不满足更容易查 程序整体更整洁 十三、嵌套 IF 能不能用
当然能用。 而且在很多 PLC 场景下是正常的。
例如:
IF AutoMode THEN IF StartPB THEN IF NOT Fault THEN MotorRun := TRUE; END_IF; END_IF; END_IF;
IF EStop THEN MotorRun := FALSE; ELSIF Fault THEN MotorRun := FALSE; ELSIF StopPB THEN MotorRun := FALSE; ELSIF AutoMode AND StartPB THEN MotorRun := TRUE; END_IF;
你会发现,这样写程序比一边想一边乱堆条件顺很多。
SCL 最怕的不是语法多,而是思路没整理就直接开写。 一旦思路先清楚,IF 和 CASE 都会自然很多。
二十五、这一篇最后,给你几个非常实用的工程建议 第一,先排高优先级条件,再排普通条件
尤其是安全、急停、故障、停止类逻辑,一般都应该放前面。
第二,复杂条件尽量提炼成中间变量
不要什么都硬塞进一行 IF 里。 程序不是越紧凑越高级,而是越清楚越值钱。
第三,嵌套可以用,但尽量别太深
超过三层以后,就要开始考虑是否能优化结构。
第四,一个变量多状态分支,优先考虑 CASE
特别是步骤号、模式号、状态码这类变量。
第五,写完判断后,用中文顺读一遍
能顺着读出来,通常结构就比较合理。 读着磕巴,程序多半也不够清楚。
小结
这一篇你最应该记住这些核心点:
IF 适合做条件判断,CASE 适合做多状态分支。 ELSIF 的本质是按优先级一层一层筛选。 ELSE 用来处理条件不成立时的另一种明确结果。 PLC 程序里,判断顺序非常重要,尤其是故障和安全条件的优先级必须清楚。 复杂条件不要一味堆在一行里,必要时要拆成中间变量。 步骤控制、状态机、模式切换这类逻辑,CASE 往往比多重 IF 更清楚。 在实际项目里,CASE 和 IF 经常配合使用,而不是互相替代。