FUNCTION_BLOCK "DW_Mean30Seconds"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
IN : Real;
END_VAR
VAR_OUTPUT
OUT : Real;
END_VAR
VAR
i : Int := 1;
k : Int := 1;
iArrayMean30Seconds : Array[1..30] of DInt;
iSumArrayMean30Seconds : DInt;
IEC_Timer_0_Instance_1 {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
END_VAR
BEGIN
#IEC_Timer_0_Instance_1(IN := 1,
PT := t#1s);
If #IEC_Timer_0_Instance_1.Q = TRUE Then
(*********************** 修改部分 *****************************************
定时器输入复位要用 #IEC_Timer_0_Instance_1(IN := 0, PT := t#1s);形式
#IEC_Timer_0_Instance_1.IN:=0; 写法无法把定时器Q断开。 之前程序确实执行不正确,原因就是定时器语法问题。
***********************************************************************************)
#IEC_Timer_0_Instance_1(IN := 0,
PT := t#1s);
#iSumArrayMean30Seconds := #iSumArrayMean30Seconds - #iArrayMean30Seconds[#i];
#iArrayMean30Seconds[#i] := REAL_TO_DINT(#IN * 100);
#iSumArrayMean30Seconds := #iSumArrayMean30Seconds + #iArrayMean30Seconds[#i];
#OUT := DINT_TO_REAL(#iSumArrayMean30Seconds) / (#k * 100);
If #i < 30 Then
#i := #i + 1;
Else
#i := 1;
End_If;
(*Anzahl der Werte im Array*)
If #k < 30 Then
#k := #k + 1;
Else
#k := 30;
End_If;
End_If;
(*----------END FUNKTIONBLOCK----------*)
END_FUNCTION_BLOCK
以上是一段老外编写的30S平均值得程序,这时大概10年前编的,用的是巴赫曼PLC写的,我给编译成TIA14的,编译时仅仅改动一点点,真是太方便了。以下是源程序截图。