以下代码在PLC中跑不动 请查看我的另外一篇采用二分法迭代算法,是能正常运行的哦。。呵呵以下是地址
http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1510127&b_id=4&s_id=23&num=1
湿球温度等计算
以下迭代确实CPU跑不动原因在于迭代算法计算量太大。本人以写出新的代码采用二分法进行迭代运算一切OK! 成功计算出湿球温度的核心代码如下
//#########################二分法迭代运算猜测湿球温度########################################################
//湿球温度是介于干球温度和湿球温度之间的故而减小运算迭代,由于等焓值故而可带入湿球温度迭代计算出的焓值相等即可得出该湿球温度
TEMP_tlow := Tdp; //露点值赋给低限
TEMP_thigh := Tdb;//干球温度赋给高限
// I:=1;
FOR I:= 1 TO 10000 BY 1 DO //迭代1000次 实际用不着
TEMP_dt:=(TEMP_thigh-TEMP_tlow)*0.5;//二分法
TEMP_twb:=TEMP_tlow+TEMP_dt;
//----------------------------------------------------------------------- Kpa
//计算该湿球温度下的饱和空气压力KPa(千帕)
TEMP_Ta := TEMP_twb + 273.15;
IF TEMP_twb<0.0 THEN
TEMP_pws:=0.001*EXP(C_1/TEMP_Ta+C_2+C_3*TEMP_Ta+C_4*TEMP_Ta**2+C_5*TEMP_Ta**3+C_6*TEMP_Ta**4+C_7*LN(TEMP_Ta));
ELSE
TEMP_pws:= 0.001*EXP(C_8/TEMP_Ta+C_9+C_10*TEMP_Ta+C_11*TEMP_Ta**2+C_12*TEMP_Ta**3+C_13*LN(TEMP_Ta));
END_IF;
//-----------------------------------------------------------------------g/kg(a)
//计算该湿球温度下的含湿量
TEMP_d:=621.945 * (TEMP_pws/(ATM - TEMP_pws));
//-----------------------计算焓值-------------------------------------------------kJ/kg
//计算该湿球温度下的焓值
TEMP_hmid:= 1.006 * TEMP_twb + 0.001*TEMP_d* (2501 + 1.86 * TEMP_twb);
//--------------------------------------------------------------------
IF (H-TEMP_hmid)>=0.0 THEN
TEMP_tlow:=TEMP_twb;
ELSE
TEMP_thigh:=TEMP_twb;
END_IF;
IF ABS(TEMP_dt)<0.0001 THEN//设置迭代精度
EXIT;
END_IF;
END_FOR;
Twb:=TEMP_twb;//返回迭代猜测正确的湿球温度
其中CONST
C_1 :=-5.6745359E+03;
C_2 :=6.3925247E+00;
C_3 :=-9.6778430E-03;
C_4 :=6.2215701E-07;
C_5 := 2.0747825E-09;
C_6 := -9.4840240E-13;
C_7 := 4.1635019E+00;
C_8 :=-5.8002206E+03;
C_9 :=1.3914993E+00;
C_10:=-4.8640239E-02;
C_11 := 4.1764768E-05;
C_12 :=-1.4452093E-8;
C_13:= 6.5459673E+00;
(* *)
END_CONST
以下代码保留不删贴供大家学习
湿球温度的计算,计算公式采用网上的一篇论文以及一个C语言的代码修改而来
但是程序并不能在PLC中进行正常运行 因为指数运算又迭代计算会触发CPU进入STOP(本人仅在仿真测试)
计算时间过长而触发CPU 进入STOP模式,这里不讨论该问题 仅讨论算法问题,这个也论证了一点 要实现智能制造等若算法复杂并不适合PLC来做事情 应该使用服务器来跑复杂的运算给结果给PLC就可以了
//####################################################
//露点焓值等公式法 迭代算法PLC跑不动
//EBCLW 20171225
//####################################################
FUNCTION_BLOCK FB14
TITLE = 'DP&H'
AUTHOR: EBC_LW
NAME: DPH
VERSION: '0.01'
FAMILY: EBC
KNOW_HOW_PROTECT
VAR_INPUT
Tdb:REAL:=23.0; //干球温度℃
RH:REAL:=55.0;//湿度%
B:REAL:=101326.0; //大气压力Pa(帕)
END_VAR
VAR_OUTPUT
Tdp:REAL;//露点温度℃
Twb:REAL;//湿球温度℃
H:REAL;//空气焓值Kj/KgDA
//Ps:REAL;//空气的水蒸气分压力hPa(百帕)
//d:REAL;//空气的含湿量g/KgDA
//Rb:REAL;//饱和空气密度Kg/M2
Pv:REAL;//饱和空气压力Pa(百帕)
d:REAL;//空气含湿量
//Cd:REAL;//湿空气的比热Kj/(KgDA*K)
//Tw:REAL;//湿球温度
//ERR:INT;//错误代码
END_VAR
VAR_TEMP
I:REAL;//
J:INT;
LogEW:REAL;
//Pv:REAL;
Pw:REAL;
Hw:REAL;
Tw:REAL;//测试用的湿球温度
dw:REAL;
//TEMP1:REAL;
E:REAL;//偏差
E1:REAL;
E2:REAL;
EE1:REAL;
EE2:REAL;
END_VAR
VAR
// Static Variables
END_VAR
//=====================================================================
//露点温度计算
//LogEW=0.66077+7.5T/(237.3+T)+[log10(RH)-2]
//Dp=[(0.66077-logEW)×237.3]/(logEW-8.16077)
//Dp--dew_point露点温度 RH--相对湿度 T--空气温度
LogEW:= 0.66077 + 7.5 * Tdb / (237.3 + Tdb) + (LOG(RH)- 2) ;
Tdp:=((0.66077- logEW)*237.3)/(logEW - 8.16077) ;
//=====================================================================
//焓值的计算
Pv:=611.2*EXP((18.678-Tdb/234.5)*Tdb/(Tdb+257.14));
d:=0.6219*(0.01*RH*Pv/(B-0.01*RH*Pv));
H:=1.01*Tdb+(2500+1.84*Tdb)*d;
//=====================================================================
//湿球温度的计算
//设H=Hw 湿度100% 则计算湿球温度
//通过带入数值计算Hw比较和H的大小
// 初始化
I:=0;//迭代次数
Tw:=Tdp;//迭代的湿球温度初值
E:=0;
E1:=0;
E2:=0;
EE1:=0;
EE2:=0;
J:=0;
IF Tdb>=0 & Tdb<60 THEN
Hw:=1.01*Tw+0.6219*(2500+1.84*Tw)*(611.2*EXP(Tw*(18.678-Tw/234.5)/(Tw+257.14)))/(101326-(611.2*EXP(Tw*(18.678-Tw/234.5)/(Tw+257.14))));
E:=ABS(Hw-H);
WHILE E > 0.02 DO
Hw:=1.01*Tw+0.6219*(2500+1.84*Tw)*(611.2*EXP(Tw*(18.678-Tw/234.5)/(Tw+257.14)))/(101326-(611.2*EXP(Tw*(18.678-Tw/234.5)/(Tw+257.14))));
E:=Hw-H;
E2:=E1;
E1:=E;
I:=I+E;
EE2:=EE1;
EE1:=E1-E2;//微分
IF E>0 THEN
Tw:=Tw-0.1*ABS(E)+0.001*I+0.01*EE1;//修正输入值
ELSE
Tw:=Tw+0.1*ABS(E);
END_IF;
IF E1-E2<0 THEN
Tw:=Tw+0.005;
ELSE
Tw:=Tw-0.005;
END_IF;
Hw:=1.01*Tw+0.6219*(2500+1.84*Tw)*(611.2*EXP(Tw*(18.678-Tw/234.5)/(Tw+257.14)))/(101326-(611.2*EXP(Tw*(18.678-Tw/234.5)/(Tw+257.14))));
E:=ABS(Hw-H);
J:=J+1;
IF J>1000 THEN//迭代超过1000,跳出
IF E>3 THEN
Hw:=1.01*Tw+0.6219*(2500+1.84*Tw)*(611.2*EXP(Tw*(18.678-Tw/234.5)/(Tw+257.14)))/(101326-(611.2*EXP(Tw*(18.678-Tw/234.5)/(Tw+257.14))));
E:=Hw-H;
IF E<0 THEN//继续+
Tw:=Tw-0.1*E;
IF Tw>Tdb THEN
Tw:=Tdb*0.99;//
END_IF;
END_IF;
END_IF;
Twb:=Tw;
END_IF;
END_WHILE;
END_IF;
END_FUNCTION_BLOCK
//原创程序 QQ 275578306