作者 | 主题 |
---|---|
v_wind 侠圣 经验值:2551 发帖数:299 精华帖:3 |
楼主 2017-10-12 11:06:40
主题:分享一段小程序30秒平均值 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的,编译时仅仅改动一点点,真是太方便了。以下是源程序截图。 |