技术论坛

 分享一段小程序30秒平均值

返回主题列表
作者 主题
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的,编译时仅仅改动一点点,真是太方便了。以下是源程序截图。



您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。