《累计流量(西门子程序)(共12页).doc》由会员分享,可在线阅读,更多相关《累计流量(西门子程序)(共12页).doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上累计流量(西门子程序)FUNCTION FLUXbase : VOIDVAR_IN_PUT PV : REAL ; /瞬时流量 CYC : REAL ; /采样时间(MS) PLL : REAL ; /最小瞬时流量END_VARVAR_IN_OUT OV_ER1 : REAL ; /累计偏差 OV_ER2 : REAL ; /累计偏差 PV_ALT : REAL ; /上周期瞬时流量 OV : REAL ; /流量累积输出END_VARVAR_TEMP tmpReal1 : REAL ; tmpReal2 :REAL ; OValt : REAL ; END_VARB
2、EGIN OValt := OV ; IF PV = PLL THEN tmpReal1 := PV * (CYC / 3.6E+6 ) + OV_ER1 ; tmpReal2 := tmpReal1 + OV_ER2 ; OV := tmpReal2 + OValt ; OV_ER1 := OV_ER2 - tmpReal2 + tmpReal1 ; OV_ER2 := OValt - OV + tmpReal2 ; ELSE OV := OValt ; END_IF ; IF OV = 1.e+009 THEN OV := 0.e+000; END_IF ; END_FUNCTION这是我
3、的累积计算,程序简单,精度也比较高OValt = 1.0e+006tmpReal2 = 0.1OV = OValt + tmpReal2 = 1.0e+006 + 0.1 = 1.0e+006OV_ER2 := OValt - OV + tmp Real2 = 1.0e+006 - 1.0e+006 + 0.1 = 0.1qlhcco 2008-5-13 18:36:36我把我的家底都抖给你了,这是浮点数在执行加减法时产生的误差,我把每次运算的误差再加的本次的积分里,不管再小的数,累加定量以后,他就可以加到OV里了,所以我的这个算法不会因为OV值大了而不能累积。你可以模拟一下,有偏差变量和没有
4、偏差变量的区别。你会发现其中的奥妙了。yzdatou 2008-5-14 7:11:04模拟了一下确实是对的。谢谢ls指教。你的思路很独特,受教了。qlhcco 2008-5-14 9:56:14我这个思路也不是完全是我自己的,其实是我在研究SETP7 FB41的PID功能是发现的,最后我就应用在累积计算的算法里了yzdatou 2008-5-14 19:20:34很佩服你的钻研精神,自愧弗如。另外,我思考再三,仍然要给你来个鸡蛋里面挑骨头,呵呵。假定累积量越来越大,最终达到8位数,而实际有效数字仅7位,那么这个累计量的个位数将不再变化了。qlhcco 2008-5-15 0:07:57确实是
5、这样的,这是由于浮点数的问题,这个问题不是不可以解决,dint型数据可以显示;可以将OV结果转换为DINT类型数据,OV_ER2也转换成DINT类型数据,OV(dint)+ OV_ER2( dint )= OUT(显示用)该输出不用于计算只是用于显示。你认为如何?yzdatou 2008-5-15 16:26:57你说的没错。我就是用dint类型变量来存储累积量,再用一个real变量存储小于1的累积量到1就进位。FUNCTION_BLOCK FB618 /TITLE = LEIJI/know_how_protectVERSION: 6.0AUTHOR: nyjNAME: nyjFAMILY:
6、chinaS7_m_c:=true/ Block ParametersVAR_INPUT / Input ParametersTongDaoDiZhiS7_m_c:=true:WORD:=0;/ AI adressXunHuanShiJianS7_m_c:=true:REAL:=100;/ unit:msLiangchengS7_m_c:=true:REAL:=0.0;/ m3/h(max) , t/h(max)QingLingS7_m_c:=true;S7_string_0:=false;S7_string_1:=true:BOOL:=0;/ back to zeroEND_VARVAR_O
7、UTPUT/ Output ParametersShunShiZhiS7_m_c:=true:REAL;/m3/h , t/hLeiJiZhiS7_m_c:=true:DINT;/m3 , tEND_VARVAR_IN_OUTLeiJiHH:DINT:=0;/(1e-?ee)LeiJiH:DINT:=0;/(1-1e)LeiJiL:REAL:=0.0;/(0.0-1.0)END_VARBEGIN IF WORD_TO_INT(TongDaoDiZhi) 27648 AND WORD_TO_INT(TongDaoDiZhi) 32767 AND WORD_TO_INT(TongDaoDiZhi)
8、 -32767 THEN TongDaoDiZhi:=27648; END_IF; ShunShiZhi:=WORD_TO_INT(TongDaoDiZhi)*Liangcheng/27648.0; LeiJiL:=LeiJiL+ShunShiZhi*XunHuanShiJian/.0; IF LeiJiL = 1.0 AND LeiJiL .0 THEN IF REAL_TO_DINT(LeiJiL)= .0 THEN IF REAL_TO_DINT(LeiJiL/.0)= .0 THEN LeiJiHH:= LeiJiHH+(LeiJiH DIV ); LeiJiH:= LeiJiH-(L
9、eiJiH DIV )*; END_IF; IF LeiJiL 0.0 THEN LeiJiL:=0.0; END_IF; IF LeiJiH 0 THEN LeiJiH:=0; END_IF; IF LeiJiHH = 1.e+016 THEN / OValt := 0.0 ; RS := true ; ELSE OValt := OV ; RS := False ; END_IF; tmpReal1 := ( PV + PV_ALT ) / 2.0 ; tmpReal2 := PV * (CYC / 3.6E+6 ) ; IF tmpReal1 = PLL THEN /小信号切除 tmpR
10、eal1 := tmpReal2 + OV_ER1 ; /计算当前积分量 tmpReal2 := tmpReal1 + OV_ER2 ; OV_ER1 := OV_ER2 - tmpReal2 + tmpReal1 ; /第1误差动态误差计算 tmpReal1 := tmpReal2 + OV_ER3 ; OV_ER2 := OV_ER3 - tmpReal1 + tmpReal2 ; /第2误差动态误差计算 tmpReal2 := tmpReal1 + OValt ; /下面的这个主要是在累积量清零后 /防止误差引起的显示负值的显示效果 IF RS THEN IF tmpReal2 = 0.0 THEN OV := 0.e+000; OV_ER3 := OValt - tmpReal2 + tmpReal1 ; ELSE OV := OV ; OV_ER3 := tmpReal2 ; END_IF ; ELSE OV := tmpReal2 ; OV_ER3 := OValt - tmpReal2 + tmpReal1 ; END_IF; ELSE OV := OValt ; END_IF ; PV_ALT := PV ;END_FUNCTION 专心-专注-专业