[三菱] 玩转ST语言

[复制链接]
查看27589 | 回复0 | 2024-8-8 09:20:24 | 显示全部楼层 |阅读模式


点击蓝字关注公众号

玩    转    ST    语    言

案例要求:对某模拟量进行每小时、每班(每个班8小时,一天三个班)的平均值、最大值、最小值数据进行统计,模拟量采集周期为1次/秒,统计后在表格中显示,每班统计的前5分钟对前一天统计的数据清零。

本案例中使用了数组、条件语句、循环语句等综合应用的方式进行编程,需要对控制算法有一定的基础,不适合初学者。

本案例使用和利时M6进行组态(只要支持ST语言的组态软件都可以组态,使用和利时主要是为了方便仿真)。



1、新建自定义功能块:

首先打开工程总控,再双击需要组态的现场控制站,打开AutoThink(算法),添加用户程序,弹出的窗口上语言选择结构化文本ST、属性POU类型选择功能块FB,然后点击确定。



2、对自定义功能块的变量定义:

左侧双击打开刚新建好的用户程序中的自定义功能块,然后在右侧窗口变量列表中添加输入变量、输出变量、局部变量,添加好后点击保存。

(01). 输入变量



        (02). 输出变量





        (03). 局部变量



3、编写ST语言:

在编程主窗口中写入以下程序:

IF NUM_01=NUM THEN

    RUN_01:=TRUE;

    ARR_01[SS]:=AI;

ELSIF NUM_01<>NUM THEN

    RUN_01:=FALSE;

END_IF;

P_01(CLK:=RUN_01 AND SS=0);

IF P_01.Q THEN

    A:=0;

    TEM_01:=0;

    VAR_02:=0;

    VAR_03:=4294967295;

    FOR A:=0 TO 59 BY 1 DO

        TEM_01:=TEM_01+ARR_01[A];

        VAR_01:=TEM_01/60;

        IF ARR_01[A]>VAR_02 THEN

            VAR_02:=ARR_01[A];

        END_IF;

        IF ARR_01[A]<VAR_03 THEN

            VAR_03:=ARR_01[A];

        END_IF;

        IF A=60 THEN

        EXIT;

        END_IF;

    END_FOR;

    ARR_02[MM,0]:=VAR_01;

    ARR_02[MM,1]:=VAR_02;

    ARR_02[MM,2]:=VAR_03;

END_IF;

P_02(CLK:=RUN_01 AND MM=0 AND SS=0);

IF P_02.Q THEN

    B:=0;

    TEM_02:=0;

    VAR_05:=0;

    VAR_06:=4294967295;

    FOR B:=0 TO 59 BY 1 DO

        TEM_02:=TEM_02+ARR_02[B,0];

        VAR_04:=TEM_02/60;

        IF ARR_02[B,1]>VAR_05 THEN

            VAR_05:=ARR_02[B,1];

        END_IF;

        IF ARR_02[B,2]<VAR_06 THEN

            VAR_06:=ARR_02[B,2];

        END_IF;

        IF B=60 THEN

        EXIT;

        END_IF;

    END_FOR;

END_IF;

P_03(CLK:=NUM=1 AND MM=0 AND SS=0);

IF P_03.Q THEN

    IF HH<>0 THEN

        C:=HH-1;

    END_IF;

    ARR_03[C,0]:=VAR_04;

    ARR_03[C,1]:=VAR_05;

    ARR_03[C,2]:=VAR_06;

    CASE HH OF

        1:AVG_01:=VAR_04;

           MAX_01:=VAR_05;

           MIN_01:=VAR_06;

        2:AVG_02:=VAR_04;

           MAX_02:=VAR_05;

           MIN_02:=VAR_06;

        3:AVG_03:=VAR_04;

           MAX_03:=VAR_05;

           MIN_03:=VAR_06;

        4:AVG_04:=VAR_04;

           MAX_04:=VAR_05;

           MIN_04:=VAR_06;

        5:AVG_05:=VAR_04;

           MAX_05:=VAR_05;

           MIN_05:=VAR_06;

        6:AVG_06:=VAR_04;

           MAX_06:=VAR_05;

           MIN_06:=VAR_06;

        7:AVG_07:=VAR_04;

           MAX_07:=VAR_05;

           MIN_07:=VAR_06;

        8:AVG_08:=VAR_04;

           MAX_08:=VAR_05;

           MIN_08:=VAR_06;

           VAR_07:=0;

           VAR_08:=0;

           VAR_09:=4294967295;

           D:=-1;

           WHILE

               D<=6 DO D:=D+1;

               TEM_03:=TEM_03+ARR_03[D,0];

               VAR_07:=TEM_03/8;

               IF ARR_03[D,1]>VAR_08 THEN

                   VAR_08:=ARR_03[D,1];

               END_IF;

               IF ARR_03[D,2]<VAR_09 THEN

                    VAR_09:=ARR_03[D,2];

               END_IF;

           END_WHILE

           AVG_AL:=VAR_07;

           MAX_AL:=VAR_08;

           MIN_AL:=VAR_09;

    END_CASE;

END_IF;

P_04(CLK:=NUM=2 AND MM=0 AND SS=0);

IF P_04.Q THEN

    IF HH<>8 THEN

        C:=HH-9;

    END_IF;

    ARR_03[C,0]:=VAR_04;

    ARR_03[C,1]:=VAR_05;

    ARR_03[C,2]:=VAR_06;

    CASE HH OF

        9:AVG_01:=VAR_04;

           MAX_01:=VAR_05;

           MIN_01:=VAR_06;

        10:AVG_02:=VAR_04;

             MAX_02:=VAR_05;

             MIN_02:=VAR_06;

        11:AVG_03:=VAR_04;

             MAX_03:=VAR_05;

             MIN_03:=VAR_06;

        12:AVG_04:=VAR_04;

             MAX_04:=VAR_05;

             MIN_04:=VAR_06;

        13:AVG_05:=VAR_04;

             MAX_05:=VAR_05;

             MIN_05:=VAR_06;

        14:AVG_06:=VAR_04;

             MAX_06:=VAR_05;

             MIN_06:=VAR_06;

        15:AVG_07:=VAR_04;

             MAX_07:=VAR_05;

             MIN_07:=VAR_06;

        16:AVG_08:=VAR_04;

             MAX_08:=VAR_05;

             MIN_08:=VAR_06;

             VAR_07:=0;

             VAR_08:=0;

             VAR_09:=4294967295;

             D:=-1;

             WHILE

                 D<=6 DO D:=D+1;

                 TEM_03:=TEM_03+ARR_03[D,0];

                 VAR_07:=TEM_03/8;

                 IF ARR_03[D,1]>VAR_08 THEN

                     VAR_08:=ARR_03[D,1];

                 END_IF;

                 IF ARR_03[D,2]<VAR_09 THEN

                     VAR_09:=ARR_03[D,2];

                 END_IF;

             END_WHILE

             AVG_AL:=VAR_07;

             MAX_AL:=VAR_08;

             MIN_AL:=VAR_09;

    END_CASE;

END_IF;

P_05(CLK:=NUM=3 AND MM=0 AND SS=0);

IF P_05.Q THEN

    IF HH<>16 THEN

        IF HH<>0 THEN

            C:=HH-17;

        ELSE

            C:=7;

        END_IF;

    END_IF;

    ARR_03[C,0]:=VAR_04;

    ARR_03[C,1]:=VAR_05;

    ARR_03[C,2]:=VAR_06;

    CASE HH OF

        17:AVG_01:=VAR_04;

             MAX_01:=VAR_05;

             MIN_01:=VAR_06;

        18:AVG_02:=VAR_04;

             MAX_02:=VAR_05;

             MIN_02:=VAR_06;

        19:AVG_03:=VAR_04;

             MAX_03:=VAR_05;

             MIN_03:=VAR_06;

        20:AVG_04:=VAR_04;

             MAX_04:=VAR_05;

             MIN_04:=VAR_06;

        21:AVG_05:=VAR_04;

             MAX_05:=VAR_05;

             MIN_05:=VAR_06;

        22:AVG_06:=VAR_04;

             MAX_06:=VAR_05;

             MIN_06:=VAR_06;

        23:AVG_07:=VAR_04;

             MAX_07:=VAR_05;

             MIN_07:=VAR_06;

        0:AVG_08:=VAR_04;

           MAX_08:=VAR_05;

           MIN_08:=VAR_06;

           VAR_07:=0;

           VAR_08:=0;

           VAR_09:=4294967295;

           D:=-1;

           WHILE

               D<=6 DO D:=D+1;

               TEM_03:=TEM_03+ARR_03[D,0];

               VAR_07:=TEM_03/8;

               IF ARR_03[D,1]>VAR_08 THEN

                   VAR_08:=ARR_03[D,1];

               END_IF;

               IF ARR_03[D,2]<VAR_09 THEN

                   VAR_09:=ARR_03[D,2];

               END_IF;

           END_WHILE

           AVG_AL:=VAR_07;

           MAX_AL:=VAR_08;

           MIN_AL:=VAR_09;

    END_CASE;

END_IF;

IF HH>=0 AND HH<=7 THEN

    NUM_01:=1;

ELSIF  HH>=8 AND HH<=15 THEN

    NUM_01:=2;

ELSIF HH>=16 AND HH<=23 THEN

    NUM_01:=3;

END_IF;

IF HH=RH AND MM=RM AND SS=RS THEN

    A:=0;

    B:=0;

    C:=0;

    D:=0;

    TEM_01:=0;

    TEM_02:=0;

    TEM_03:=0;

    VAR_01:=0;

    VAR_02:=0;

    VAR_03:=0;

    VAR_04:=0;

    VAR_05:=0;

    VAR_06:=0;

    VAR_07:=0;

    VAR_08:=0;

    VAR_09:=0;

    AVG_01:=0;

    MAX_01:=0;

    MIN_01:=0;

    AVG_02:=0;

    MAX_02:=0;

    MIN_02:=0;

    AVG_03:=0;

    MAX_03:=0;

    MIN_03:=0;

    AVG_04:=0;

    MAX_04:=0;

    MIN_04:=0;

    AVG_05:=0;

    MAX_05:=0;

    MIN_05:=0;

    AVG_06:=0;

    MAX_06:=0;

    MIN_06:=0;

    AVG_07:=0;

    MAX_07:=0;

    MIN_07:=0;

    AVG_08:=0;

    MAX_08:=0;

    MIN_08:=0;

    AVG_AL:=0;

    MAX_AL:=0;

    MIN_AL:=0;

END_IF;

写好后编译保存。

        (01). 数据采集开始与每分钟平均值、最大值、最小值运算



        (02). 每小时平均值、最大值、最小值运算



        (03). 第一班(00:00~07:59)每小时统计数据输出



(04). 第一班全班8小时统计数据输出



(05). 第二班(08:00~15:59)每小时统计数据输出



(06). 第二班全班8小时统计数据输出



(07). 第三班(16:00~23:59)每小时统计数据输出



(08). 第三班全班8小时统计数据输出



(09). 班次运算,每8小时为一个班,一天三个班



(10). 数据清零,即数据统计前把前一天统计的数据清零,为新的数据统计做准备



4、添加模拟量中间点:

点击AutoThink(算法)窗口左侧的变量定义——全局变量——AM(模拟量中间点),打开AM(模拟量中间点)变量列表,添加模拟量中间点,添加好后击保存。









5、使用CFC语言算法组态:

(01). 新建一个用户程序,语言选择连续功能图CFC,属性选择程序块PRG,选择好后点击确定,然后双击打开新建好的CFC用户程序,在左侧用户程序中将写好的自定义程序块按住鼠标左键拖入到CFC编程主窗口中。

(02). 添加TIMER_EVENT块(调用系统时间),将所有引脚全部隐藏(不隐藏也可以,隐藏为的是编程界面看着整洁)。

(03). 添加输入元件、输出元件,在元件上填写变量并且与自定义功能块连线。

(04). 编译保存,关闭AutoThink(算法)。







END

扫码加好友

进入工控交流群共同学习





长按二维码或扫码

关注公众号

工业自控定期更新

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则