FUNCTION_BLOCK BS_AVERAGE VAR_EXTERNAL END_VAR VAR_INPUT Input :INT; Num :INT:=30; Delay :Time:=t#100ms; END_VAR VAR_OUTPUT Output :INT; END_VAR VAR Avg_num :INT; Value_temp :ARRAY[0..30]OF DINT; ton1 :ton; Value_sum :DINT; temp :BOOL; i,j,k :INT:=1; ton0 :ton; ini :BOOL; END_VAR (*Automatically declared*) VAR_EXTERNAL END_VAR (** {* **) (** **) (** 时 间:20191006 **) (** 版 本:1.1 **) (** 作 者:姚立 **) (** 名 称:平均采样程序 **) (** 说 明:平均采样默认20次,间隔100ms **) (** 备 注: **) (** 依赖块: **) (** 时 间:20211110 **) (** 版 本:1.2 **) (** 作 者:潘平 **) (** 名 称:平均采样程序 **) (** 说 明:平均采样默认30次,间隔100ms,修正程序未做平均值计算问题,始终位于初始化程序内运行 **) (** 备 注: **) (** 依赖块: **) (** *} **) (** **) (** if ini=0 then **) (* if - Cond *) LD ini EQ 0 JMPCN ODK_SKIP_000000000000001_000000000000001 (* then - Stmts *) (** ini:=1; **) (* assign - Stmt *) LD 1 ST ini JMP ODK_END_IF_000000000000001 (** end_if; **) (* if - End *) ODK_SKIP_000000000000001_000000000000001: ODK_END_IF_000000000000001: (** **) (** if Num>30 then **) (* if - Cond *) LD Num GT 30 JMPCN ODK_SKIP_000000000000002_000000000000001 (* then - Stmts *) (** Avg_num:=30; **) (* assign - Stmt *) LD 30 ST Avg_num JMP ODK_END_IF_000000000000002 (** else **) (* else *) ODK_SKIP_000000000000002_000000000000001: (* else - Stmts *) (** Avg_num:=Num; **) (* assign - Stmt *) LD Num ST Avg_num (** end_if; **) (* if - End *) ODK_END_IF_000000000000002: (** **) (** {*初始化30s无延时采样,30s后每avg_delay采样1次*} **) (** ton0(in:=ini,PT:= t#30s); **) (* call - Stmt *) CAL ton0 ( in := ini, PT := t#30s ) (** if ton0.q=0 then **) (* if - Cond *) LD ton0.q EQ 0 JMPCN ODK_SKIP_000000000000003_000000000000001 (* then - Stmts *) (** k:=k+1;{*程序开始时,取值次数不足20次,为k次*} **) (* assign - Stmt *) LD k ADD 1 ST k (** if k>Avg_num then **) (* if - Cond *) LD k GT Avg_num JMPCN ODK_SKIP_000000000000004_000000000000001 (* then - Stmts *) (** k:=Avg_num; **) (* assign - Stmt *) LD Avg_num ST k JMP ODK_END_IF_000000000000004 (** end_if; **) (* if - End *) ODK_SKIP_000000000000004_000000000000001: ODK_END_IF_000000000000004: (** Value_temp[1]:=INT_TO_DINT(Input); **) (* assign - Stmt *) LD Input INT_TO_DINT ST Value_temp[1] (** for i:=(Avg_num-1) to 1 by -1 do **) (* for - Init *) LD Avg_num SUB 1 ST i EQ 1 JMPC ODK_FOR_STMTS_000000000000005 (* for - Cond *) ODK_FOR_000000000000005: LD Avg_num SUB 1 GT 1 JMPC ODK_FOR_DOWN_000000000000005 LD 0 GT( -1 ) JMPC ODK_END_FOR_000000000000005 LD 1 LT i JMPC ODK_END_FOR_000000000000005 JMP ODK_FOR_STMTS_000000000000005 ODK_FOR_DOWN_000000000000005: LD 1 GT i JMPC ODK_END_FOR_000000000000005 LD 0 LT( -1 ) JMPC ODK_END_FOR_000000000000005 (* for - Stmts *) ODK_FOR_STMTS_000000000000005: (** j:=i+1; **) (* assign - Stmt *) LD i ADD 1 ST j (** Value_temp[j]:=Value_temp[i]; **) (* assign - Stmt *) LD Value_temp[i] ST Value_temp[j] (* for - By *) LD -1 ADD i ST i (** end_for; **) JMP ODK_FOR_000000000000005 (* for - End *) ODK_END_FOR_000000000000005: (** Value_sum:=0; **) (* assign - Stmt *) LD 0 ST Value_sum (** for i:=1 to Avg_num by 1 do **) (* for - Init *) LD 1 ST i EQ Avg_num JMPC ODK_FOR_STMTS_000000000000006 (* for - Cond *) ODK_FOR_000000000000006: LD 1 GT Avg_num JMPC ODK_FOR_DOWN_000000000000006 LD 0 GT 1 JMPC ODK_END_FOR_000000000000006 LD Avg_num LT i JMPC ODK_END_FOR_000000000000006 JMP ODK_FOR_STMTS_000000000000006 ODK_FOR_DOWN_000000000000006: LD Avg_num GT i JMPC ODK_END_FOR_000000000000006 LD 0 LT 1 JMPC ODK_END_FOR_000000000000006 (* for - Stmts *) ODK_FOR_STMTS_000000000000006: (** Value_sum:=Value_sum+Value_temp[i]; **) (* assign - Stmt *) LD Value_sum ADD Value_temp[i] ST Value_sum (* for - By *) LD 1 ADD i ST i (** end_for; **) JMP ODK_FOR_000000000000006 (* for - End *) ODK_END_FOR_000000000000006: (** output:=DINT_TO_INT(Value_sum/INT_TO_DINT(k)); **) (* assign - Stmt *) LD Value_sum DIV ( k INT_TO_DINT ) DINT_TO_INT ST output JMP ODK_END_IF_000000000000003 (** else **) (* else *) ODK_SKIP_000000000000003_000000000000001: (* else - Stmts *) (** ton1(PT:= Delay ); **) (* call - Stmt *) CAL ton1 ( PT := Delay ) (** ton1.in:=not ton1.q; **) (* assign - Stmt *) LD ton1.q NOT ST ton1.in (** temp:=0; **) (* assign - Stmt *) LD 0 ST temp (** if ton1.q=1 and temp=0 then **) (* if - Cond *) LD ton1.q EQ 1 AND ( temp EQ 0 ) JMPCN ODK_SKIP_000000000000007_000000000000001 (* then - Stmts *) (** k:=k+1;{*程序开始时,取值次数不足30次,为k次*} **) (* assign - Stmt *) LD k ADD 1 ST k (** if k>Avg_num then **) (* if - Cond *) LD k GT Avg_num JMPCN ODK_SKIP_000000000000008_000000000000001 (* then - Stmts *) (** k:=Avg_num; **) (* assign - Stmt *) LD Avg_num ST k JMP ODK_END_IF_000000000000008 (** end_if; **) (* if - End *) ODK_SKIP_000000000000008_000000000000001: ODK_END_IF_000000000000008: (** temp:=1; **) (* assign - Stmt *) LD 1 ST temp (** Value_temp[1]:=INT_TO_DINT(Input); **) (* assign - Stmt *) LD Input INT_TO_DINT ST Value_temp[1] (** for i:=(Avg_num-1) to 1 by -1 do **) (* for - Init *) LD Avg_num SUB 1 ST i EQ 1 JMPC ODK_FOR_STMTS_000000000000009 (* for - Cond *) ODK_FOR_000000000000009: LD Avg_num SUB 1 GT 1 JMPC ODK_FOR_DOWN_000000000000009 LD 0 GT( -1 ) JMPC ODK_END_FOR_000000000000009 LD 1 LT i JMPC ODK_END_FOR_000000000000009 JMP ODK_FOR_STMTS_000000000000009 ODK_FOR_DOWN_000000000000009: LD 1 GT i JMPC ODK_END_FOR_000000000000009 LD 0 LT( -1 ) JMPC ODK_END_FOR_000000000000009 (* for - Stmts *) ODK_FOR_STMTS_000000000000009: (** j:=i+1; **) (* assign - Stmt *) LD i ADD 1 ST j (** Value_temp[j]:=Value_temp[i]; **) (* assign - Stmt *) LD Value_temp[i] ST Value_temp[j] (* for - By *) LD -1 ADD i ST i (** end_for; **) JMP ODK_FOR_000000000000009 (* for - End *) ODK_END_FOR_000000000000009: (** Value_sum:=0; **) (* assign - Stmt *) LD 0 ST Value_sum (** for i:=1 to Avg_num by 1 do **) (* for - Init *) LD 1 ST i EQ Avg_num JMPC ODK_FOR_STMTS_00000000000000A (* for - Cond *) ODK_FOR_00000000000000A: LD 1 GT Avg_num JMPC ODK_FOR_DOWN_00000000000000A LD 0 GT 1 JMPC ODK_END_FOR_00000000000000A LD Avg_num LT i JMPC ODK_END_FOR_00000000000000A JMP ODK_FOR_STMTS_00000000000000A ODK_FOR_DOWN_00000000000000A: LD Avg_num GT i JMPC ODK_END_FOR_00000000000000A LD 0 LT 1 JMPC ODK_END_FOR_00000000000000A (* for - Stmts *) ODK_FOR_STMTS_00000000000000A: (** Value_sum:=Value_sum+Value_temp[i]; **) (* assign - Stmt *) LD Value_sum ADD Value_temp[i] ST Value_sum (* for - By *) LD 1 ADD i ST i (** end_for; **) JMP ODK_FOR_00000000000000A (* for - End *) ODK_END_FOR_00000000000000A: JMP ODK_END_IF_000000000000007 (** end_if; **) (* if - End *) ODK_SKIP_000000000000007_000000000000001: ODK_END_IF_000000000000007: (** output:=DINT_TO_INT(Value_sum/INT_TO_DINT(k)); **) (* assign - Stmt *) LD Value_sum DIV ( k INT_TO_DINT ) DINT_TO_INT ST output (** end_if; **) (* if - End *) ODK_END_IF_000000000000003: (** **) (** **) END_FUNCTION_BLOCK