西门子PLC中使用SCL语言编程的技巧
v1.0 可编辑可修改 在西门子在西门子 PLCPLC 中使用中使用 SCLSCL 语言编程的技巧语言编程的技巧 前言:两年半前我就在工控网上发表了有关 SCL 编程的知识=10; END_IF; Count_ Actual 的初始值为 0,同时当系统新启动时,也需将其设为零。间隔更长时间的脉冲波编程都可以按照上面的方式编程。 6、尽量使用编程计数功能来替代定时器功能,这样使程序更可靠和易于阅读假设 _Condition 为输入,Output_Delay 为通过定 时处理后的输出,Timer_Setpoint 为时间设定点,Timer_Actual 为当前时间计数的实际值,“Impls_1Sec” 为系统编程产生的 1 秒 脉冲。 、在输入条件满足的情况下,延时输出的定时器: IF (NOT _Condition) THEN Timer_Actual:= 0; Output_Delay:= 0; ELSE IF (“Impls_1Sec” AND NOT Output_Delay) THEN Timer_ Actual:= Timer_ Actual +1; END_IF; Output_Delay:= Timer_Actual = Timer_Setpoint; END_IF; 5 v1.0 可编辑可修改 、有记忆的延时输出定时器,即在延时过程中,若输入条件终止,不影响延时,这种 定时器必须使用其它的信号复位。 IF _Condition THEN Output_Aux:=1; END_IF; IF (NOT Output_Aux) THEN Timer_Actual:= 0; Output_Delay:=0; ELSE IF (“Impls_1Sec” AND NOT Output_Delay) THEN Timer_ Actual:= Timer_ Actual +1; END_IF; Output_Delay:= Timer_Actual = Timer_Setpoint; END_IF; 若想终止 Output_Delay 的输出,必须在后面追加一条条件语句,用于复位 Output_Aux 6 v1.0 可编辑可修改 、立即输出,延时断开的定时器 IF _Condition THEN Timer_Actual:= 0; Output_Aux:= 0; Output_Delay:=1; // 立即输出 ELSE IF (“Impls_1Sec” AND NOT Output_Aux) THEN Timer_ Actual:= Timer_ Actual +1; END_IF; Output_Aux:= Timer_Actual = Timer_Setpoint; END_IF; IF Output_Aux THEN Output_Delay:=0; //延时断开 END_IF; 7 v1.0 可编辑可修改 、在检测到一个上升沿脉冲后,立即输出,并开始计时,在 时间到达后断开。 IF _Condition THEN Output_Aux:=1; END_IF; IF (NOT Output_Aux) THEN Timer_Actual:= 0; Timer_Arrived := 0; ELSE IF (NOT Timer_ Arrived AND “Impls_1Sec” ) THEN Timer_Actual:= Timer_Actual +1; END_IF; Timer_ Arrived := Timer_Actual = Timer_Setpoint; END_IF; IF Timer_ Arrived THEN Output_Aux:=0; END_IF; Output_Delay:= Output_Aux; 8 v1.0 可编辑可修改 通过以上的编程方式可以实现任何定时器功能,而代码却可以为不同的 PLC 系统所使用。 7、使用编程计数功能来替代计数器在 SCL 语言中使用计数功能是最为简单的,其关键是必须首先对输入进行脉冲检测假设 _Imp 为输入脉冲,CountImp 为输入脉冲检测,Counter 为计数值,Factor 为计数因子(更详细点就是每来一次脉冲,计数值增加多少)。 (*----- Create Impulse (Impulse uation) -----------------------------------------------------*) CountImp:= _Imp AND (NOT CountImp_Old); CountImp_Old:= _Imp; (*----- Counter ---------------------------------------------------------------------------------*) IF CountImp THEN Counter:= Counter+Factor; END_IF; 一个完整的计数程序应该还有计数器复位功能以及计数值上限检测条件(以防止计数值溢出)。 9 v1.0 可编辑可修改 8、 新故障/新警告的检测 一个完整的 FB 块应该能够检测故障/警告,以及新故障/新警告,假设 1, 2… n 对应故障 的输入(有信号表示 OK),Fault1, Fault2… Faultn 对应故障位,NFault1, NFault2…NFaultn 对应新故障位,Flt 和 NFlt 分别对 应综合的故障和新故障, Ackn 对应故障应答输入, 为常开点, Mute 对应新故障消除输入 (或者称为蜂鸣器沉寂) ,为常开点: Fault1:= NOT 1 OR (Fault1 AND NOT Ackn); NFault1:= Fault1 AND (Mute OR NFault1); Fault2:= NOT 2 OR (Fault2 AND NOT Ackn); NFault2:= Fault2 AND (Mute OR NFault2);… Flt := Fault1 OR Fault2 OR Faultn NFlt :=(Fault1 AND NOT NFault1) OR (Fault2 AND NOT NFault2) OR (Faultn AND NOT NFaultn) NFlt 就是最终的新故障输出指示,新警告的检测与之类似。 9、字中取位 字中取位有两种方式,一种是通过西门子所特有的字取位方式实现,一种是通过计算机编程的标准方式实现,假设 _Word 为输入参数,Word 类型,W0,W1,…W15 为位变量。 、通过西门子的M 变量实现: Temp_Aux:=MW[10]; MW[10]:=_Word; W0:=M[11,0]; W1:=M[11,1]; W2:=M[11,2]; W3:=M[11,3]; W4:=M[11,4]; W5:=M[11,5]; W6:=M[11,6]; W7:=