zoukankan      html  css  js  c++  java
  • 西门子PLC SCL语言开发学习笔记(二)

    今天来讲下scl两个关键的点

    一、按键事件

    比如地址I0.0是某个按钮的状态,他只有True和False两个状态,所以我们要获得按下事件需要我们自己模拟。

    #KeyPress := "Btn1" AND NOT #LastKey;

    #LastKey := "Btn1";

    这样通过对#KeyPress判断是否为True即可获得一次点击事件,相当于 |P|

    把上一次的存起来,然后判断按下,如果你想把按键放在松开时也可以。

    因为大多数事情都是用按键触发的,掌握这一点才能开始跑代码。

    二、定时器

    PLC在梯形图中使用定时器很困难,比如TON  5秒,需要输入一直保持True,持续5s后输出变为True,TOF则需要输入从True变成False,然后持续5秒后输出False,自带各种逻辑,一旦碰到复杂的条件判断头都晕了,我是只能做到间隔时间打开几个灯,但要做另一个按钮还能间隔关上就不会了。

    我们写程序的只需要一个计时器就好了,不需要你带这么多乱七八糟的逻辑,我们自己决定到时间了干嘛就好了。

    1)     使用TON TORN

    使用TON很简单,让一个变量保持True,然后判断输出是否时间到了,时间到了既可以做事情了,同时让输入变为False。

    TORN则还含有Reset功能,他能累计计时,同时能取到计时了多久,下面这个程序展示了一开始就给TimerStart设置为True,开始计时并变灯的情况。

     下面是代码块,不要忘了这是被循环不断执行的,大概功能是第五秒打开一个灯,第10秒再打开一个,到15秒重置, 为了代码简单理解就不加各种为了严谨的判断了

    #TimerStart := TRUE; // 随便打开一下,就不写事件了
    
    "IEC_Timer_0_DB".TONR(IN := #TimerStart,
    
                         PT := T#15S,  // 计时15秒
    
                         Q => #TmpOut, //计时完毕,我们不去用这个
    
                         R:= #Reset,
    
                         ET => #Time1);//  ET为取出计时了多久
    
    IF #Reset THEN
    
        #Reset := FALSE;
    
    END_IF;
    
     
    
    IF #Time1 >= T#5s THEN
    
        "Light1" := TRUE;
    
    END_IF;
    
     
    
    IF #Time1 >= T#10s THEN
    
        "Light2" := TRUE;
    
    END_IF;
    
     
    
    IF #TmpOut THEN
    
        "Light1" := FALSE;
    
        "Light2" := FALSE;
    
        #Reset := TRUE;
    
    END_IF;

    2)时钟存储器位

    首先右键PLC进入属性

    找到时钟存储器位

    我们把地址放到100那里去,这样子这几个存储器里,就会有震荡,不断在True  False之间来回变化,比图1HZ会在一秒的开始变为True,到一半变为False,再下一秒开始变True,通过他的变化就能计时了

    下面这个程序,再按下按钮1后亮一个灯,过5秒再亮一个,再过5秒再亮一个,关闭时也是间隔灭灯,不考虑打开过程中关闭等情况。

    IF #TT <> "Clock_1Hz" THEN //一个不断根据震荡时间增加的Count 计数器
    
        #Count += 1;
    
    END_IF;
    
    #TT := "Clock_1Hz";
    
     
    
    #KeyPress := "Btn1" AND NOT #LastKey;
    
    #LastKey := "Btn1";
    
     
    
    IF #KeyPress AND NOT "Light1" THEN // 开灯事件
    
        #TurnOn := TRUE;
    
        #TurnOff := FALSE;
    
        #Count := 0;  //重置计数器
    
    END_IF;
    
     
    
    IF #KeyPress AND "Light1" THEN // 关灯事件
    
        #TurnOn := FALSE;
    
        #TurnOff := TRUE;
    
        #Count := 0;
    
    END_IF;
    
     
    
    IF #TurnOn THEN // 持续处理开灯
    
        "Light1" := TRUE;
    
        IF #Count >= 5 * 2 THEN
    
            "Light2" := TRUE;
    
        ELSIF #Count >= 20 THEN
    
            "Light3" := TRUE;
    
        END_IF;
    
    END_IF;
    
     
    
    IF #TurnOff THEN
    
        "Light1" := FALSE;
    
        IF #Count >= 10 THEN
    
            "Light2" := FALSE;
    
        ELSIF #Count >= 20 THEN
    
            "Light3" := FALSE;
    
        END_IF;
    
    END_IF;

    3) 时间函数

    其实PLC里面本来也有很多时间函数,比如获取当前机器时间,比较时间差等,我们完全可以很灵活的去使用这些方法,变得和编程无异,这里就不介绍了

    结语:我们可以识别按钮事件,然后获得了好用的计时器后,scl的逻辑处理剩下的就都是写代码了和调方法了,没有什么能难倒我们程序员了

    SCL逻辑比梯形图更严谨明白,复杂逻辑控制更简单,是我们程序员的好帮手。

    以后会继续挖掘SCL的写法,教大家SCL能代替梯形图的写法,做到是个程序员就无门槛

    暂时告一段落

  • 相关阅读:
    多屏共享
    md5-linux_shell
    2017年会所得
    linux无线网络配置_转
    (转)台式机华硕主板双显卡切换,怎么舒服怎么来
    Apache FtpServer 实现文件的上传和下载
    (转载)Windows 上搭建Apache FtpServer
    Eclipse常用设置
    博客园文章样式修改
    黑马公社学习
  • 原文地址:https://www.cnblogs.com/gxrsprite/p/9544431.html
Copyright © 2011-2022 走看看