点击蓝字关注公众号
玩 转 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
扫码加好友
进入工控交流群共同学习
长按二维码或扫码
关注公众号
工业自控定期更新 |