这个图的控制任务我简要说明一下:
有个水罐,共3个液位开关,两个泵。B1表示低液位,B2表示高液位,B3表示超高液位。P1是一号泵,P2是2号泵。
两个圈的Ready状态,相当于SFC的初始步,一般没有动作输出。按下Start按钮后,状态转移到Idle状态,这个状态也没有输出。RE代表上升沿。当B2上升沿和P1_Last 为false时,状态转为RunP1,表示P1运行。状态RunP2表示P2运行。RunP12表示泵1和泵2都运行。


#RE_B2(CLK := #B2);
#RE_Run(CLK := #Start_stop);
#FE_Run(CLK := #Start_stop);
#Gone_3m(IN := (#State = #RunP12) and not #Reset,
PT := T#3M);
if #Gone_3m.Q then
#Light := true;
end_if;
if #Reset then
#Light := false;
end_if;
case #State of
#Ready:
if #RE_Run.Q then
#State := 1;
end_if;
#Idle:
#P1 := #P2 := false;
if #FE_Run.Q then
#State := #Ready;
elsif #RE_B2.Q and not #P1_Last then
#State := #RunP1;
elsif #RE_B2.Q and #P1_Last then
#State := #RunP2;
elsif #B3 then
#State := #RunP12;
end_if;
#RunP1:
#P1 := true;
#P1_Last := true;
if (not #B1) or #B3 or #FE_Run.Q then
#State := #Idle;
end_if;
#RunP2:
#P2 := true;
#P1_Last := false;
if (not #B1) or #B3 or #FE_Run.Q then
#State := #Idle;
end_if;
#RunP12:
#P1 := #P2 := true;
if (not #B1) or #FE_Run.Q then
#State := #Idle;
end_if;
end_case;
搞了两天状态机,跟着学了一下,分别用3S和倍福软件,感受了一下。谈下西门子的SCL的总体感受:
比起S7-300下SCL要好太多。但还有改进的空间。。。
1, 不支持枚举。在这里我用常量代替。不是很完美。。。
2, IDE的提示做的比较好,把光标放变量上,会提示变量的类型。
。
3, 和IEC61131-3标准相比,有些差距,不支持面向对象的编程。。
4, IDE上,不支持中间换行。。就是光标在字符中间,安Shift+Enter键,直接新起一行,
希望这个功能加快实现,其它IDE基本都有这个功能,当然不是指3s和倍服。是PC编程。。
5,在变量声明区,不支持手写声明,手写要快很多,其它的都支持两种声明,很方便。

6, 可以格式化代码,V13版的格式代码好像有问题,V14改进了,绝对比其它的要好,就是没有快捷键。
7, 在SCL编辑区,false和true常量不会自动转换为大些,这个好像差了些。
欢迎大家来我的博客,定期分享关于状态机的编程心得。
http://blog.csdn.net/dronghtom/article/details/72330906