完整FB41的SCL源码.docx
《完整FB41的SCL源码.docx》由会员分享,可在线阅读,更多相关《完整FB41的SCL源码.docx(20页珍藏版)》请在冰豆网上搜索。
![完整FB41的SCL源码.docx](https://file1.bdocx.com/fileroot1/2023-6/24/fcea8877-224f-48eb-9de0-7a7898c97aa5/fcea8877-224f-48eb-9de0-7a7898c97aa51.gif)
完整FB41的SCL源码
最近在论坛看到好多网友寻找西门子PLCFB41的SCL源码,现在就将我从网上搜集(因原始出处好像不能访问了,时间久了我也忘记了,)的源码贴出来,此源程序来源于网络,不保证编译后与原版一致,仅供参考.源码我粗略看了一遍,好象是不完全微分PID,但由于使用的是位置式PID,所以里面还做了手自动的无扰动切换,但个人感觉无扰动切换还是增量PID好,无需做任何处理就直接支持.源码可以通过编译,内容如下:
FUNCTION_BLOCK”CONT_C”
TITLE='continuousPIDcontroller'
AUTHOR:
MT
FAMILY:
ICONT
NAME:
CONT_C
VERSION:
’1.5'
KNOW_HOW_PROTECT
VAR_INPUT
COM_RST:
BOOL:
=FALSE; //完全重启动
MAN_ON:
BOOL:
=TRUE; //手动值打开
PVPER_ON:
BOOL:
=FALSE; //外设过程变量打开
P_SEL:
BOOL:
=TRUE; //比例作用打开
I_SEL:
BOOL:
=TRUE; //积分作用打开
INT_HOLD:
BOOL:
=FALSE; //积分作用保持
I_ITL_ON:
BOOL:
=FALSE; //积分作用初始化
D_SEL:
BOOL:
=FALSE; //微分作用打开
CYCLE:
TIME:
=T#1S; //采样时间
SP_INT:
REAL:
=0。
0; //内部设定值
PV_IN:
REAL:
=0.0; //过程变量输入
PV_PER:
WORD:
=W#16#0;//外设过程变量
MAN:
REAL:
=0.0; //手动值
GAIN:
REAL:
=2。
0; //比例增益
TI:
TIME:
=T#20S; //积分复位时间
TD:
TIME:
=T#10S; //微分时间
TM_LAG:
TIME:
=T#2S; //微分作用时间延时
DEADB_W:
REAL:
=0.0; //死区带宽
LMN_HLM:
REAL:
=100。
0; //积分值上限
LMN_LLM:
REAL:
=0.0; //积分值下限
PV_FAC:
REAL:
=1。
0; //过程变量因子
PV_OFF:
REAL:
=0.0; //过程变量偏移量
LMN_FAC:
REAL:
=1.0; //调节值因子
LMN_OFF:
REAL:
=0。
0; //调节值偏移量
I_ITLVAL:
REAL:
=0.0; //积分作用的初始化值
DISV:
REAL:
=0.0; //干扰变量
END_VAR
VAR_OUTPUT
LMN:
REAL:
=0.0; //调节值
LMN_PER:
WORD:
=W#16#0;//外设调节值
QLMN_HLM:
BOOL:
=FALSE; //达到调节值上限
QLMN_LLM:
BOOL:
=FALSE; //达到调节值下限
LMN_P:
REAL:
=0.0; //比例分量
LMN_I:
REAL:
=0。
0; //积分分量
LMN_D:
REAL:
=0。
0; //微分分量
PV:
REAL:
=0。
0; //
ER:
REAL:
=0.0; //误差信号
END_VAR
VAR
sInvAlt:
REAL:
=0.0; //上周期比例偏差值
sIanteilAlt:
REAL:
=0.0; //上周期积分值
sRestInt:
REAL:
=0。
0; //上周期积分偏差量(浮点数计算偏差)
sRestDif:
REAL:
=0.0; //上周期微分偏差量(浮点数计算偏差)
sRueck:
REAL:
=0。
0; //
sLmn:
REAL:
=0。
0; //上周期调节值
sbArwHLmOn:
BOOL:
=FALSE; //上周期达到调节值上限
sbArwLLmOn:
BOOL:
=FALSE; //上周期达到调节值下限
sbILimOn:
BOOL:
=TRUE; //备用-本程序没有使用该变量
END_VAR
VAR_TEMP
rCycle:
REAL; //采样时间浮点值
Iant:
REAL; //积分增量
Diff:
REAL; //积分量
Istwert:
REAL; //过程变量浮点值
ErKp:
REAL; //偏差比例值
rTi:
REAL; //积分时间浮点值
rTd:
REAL; //微分时间浮点值
rTmLag:
REAL; //微分作用时间延时浮点值
Panteil:
REAL; //比例值
Ianteil:
REAL; //积分值
Danteil:
REAL; //微分值
Verstaerk:
REAL; //
RueckDiff:
REAL; //
RueckAlt:
REAL; //上周期积分量
dLmn:
REAL; //调节量
gf:
REAL; //Hilfwert
rVal:
REAL; //RealHilfsvariable
END_VAR
IFCOM_RSTTHEN//PID初始化
sIanteilAlt:
=I_ITLVAL;
LMN:
=0。
0;
QLMN_HLM:
=FALSE;
QLMN_LLM:
=FALSE;
LMN_P:
=0.0;
LMN_I:
=0.0;
LMN_D:
=0.0;
LMN_PER:
=W#16#0;
PV:
=0.0;
ER:
=0.0;
sInvAlt:
=0。
0;
sRestInt:
=0.0;
SRestDif:
=0。
0;
sRueck:
=0.0;
sLmn:
=0.0;
sbArwHLmOn:
=FALSE;
sbArwLLmOn:
=FALSE;
ELSE
rCycle:
=DINT_TO_REAL(TIME_TO_DINT(CYCLE))/1000。
0; //采样时间转换为浮点数值
Istwert:
=DINT_TO_REAL(INT_TO_DINT(WORD_TO_INT(PV_PER)))*0。
003616898;
Istwert:
=Istwert*PV_FAC+PV_OFF; //外设输入转换为浮点数值
IFNOTPVPER_ONTHEN //过程变量选择
Istwert:
=PV_IN;
END_IF;
PV:
=Istwert;
ErKp:
=SP_INT—PV; //计算偏差
IFErKp〈—DEADB_WTHEN
ER:
=ErKp+DEADB_W;
ELSIFErKp〉DEADB_WTHEN
ER:
=ErKp—DEADB_W;
ELSE
ER:
=0.0;
END_IF;
ErKp:
=ER*GAIN;//偏差比例增益
rTi:
=DINT_TO_REAL(TIME_TO_DINT(TI))/1000.0;
rTd:
=DINT_TO_REAL(TIME_TO_DINT(TD))/1000。
0;
rTmLag:
=DINT_TO_REAL(TIME_TO_DINT(TM_LAG))/1000.0;
IFrTi〈rCycle*0.5THEN //积分时间必须>=采样时间的0。
5倍
rTi:
=rCycle*0.5;
END_IF;
IFrTd rTd:
=rCycle;
END_IF;
IFrTmLag〈rCycle*0.5THEN //微分作用延时时间必须>=采样时间的0.5倍
rTmLag:
=rCycle*0.5;
END_IF;
IFP_SELTHEN //比例作用投入
Panteil:
=ErKp;
ELSE
Panteil:
=0。
0;
END_IF;
IFI_SELTHEN //积分作用投入
IFI_ITL_ONTHEN //积分初始化
Ianteil:
=I_ITLVAL;
sRestInt:
=0.0;
ELSIFMAN_ONTHEN //手动值输入时的积分量计算,用于用于手动切换自动无扰切换
Ianteil:
=sLmn—Panteil-DISV;
sRestInt:
=0.0;
ELSE //积分计算
Iant:
=(rCycle/rTi)*(ErKp+sInvAlt)*0.5+sRestInt;
IF((Iant>0。
0ANDsbArwHLmOn)ORINT_HOLD)OR(Iant<0。
0ANDsbArwLLmOn)THEN//抗积分饱和
Iant:
=0.0;
END_IF;
Ianteil:
=sIanteilAlt+Iant;//当前积分值:
=上时刻积分值+本次积分量
sRestInt:
=sIanteilAlt—Ianteil +Iant;//感觉sRestInt一直等于0。
0;?
不知为何,通过运行发现不为0。
0,可能是浮点数计算误差
END_IF;
ELSE
Ianteil:
=0.0;
sRestInt:
=0.0;
END_IF;
Diff:
=ErKp;
IFNOTMAN_ONANDD_SELTHEN //微分作用投入
Verstaerk:
=rTd/(rCycle*0。
5+rTmLag);
Danteil:
=(Diff-sRueck)*Verstaerk;
RueckAlt:
=sRueck;
RueckDiff:
=rCycle/rTd*Danteil+sRestDif;
sRueck:
=RueckDiff+RueckAlt;
sRestDif:
=RueckAlt-sRueck+RueckDiff;//同积分一样计算微分误差量
ELSE //
Danteil:
=0。
0;
sRestDif:
=0。
0;
sRueck:
=Diff;
END_IF;
dLmn:
=Panteil+Ianteil+Danteil+DISV;//PID输出
IFMAN_ONTHEN//PID手动之打开
dLmn:
=MAN;
ELSE
IFNOTI_ITL_ONANDI_SELTHEN //干扰量处理
IFIanteil〉LMN_HLM—DISVANDdLmn>LMN_HLMANDdLmn-LMN_D〉LMN_HLMTHEN
rVal:
=LMN_HLM—DISV;
gf:
=dLmn-LMN_HLM;
rVal:
=Ianteil-rVal;
IFrVal〉gfTHEN
rVal:
=gf;
END_IF;
Ianteil:
=Ianteil—rVal;
ELSIFIanteil rVal:
=LMN_LLM—DISV;
gf:
=dLmn-LMN_LLM;
rVal:
=Ianteil-rVal;
IFrVal rVal:
=gf;
END_IF;
Ianteil:
=Ianteil—rVal;
END_IF;
END_IF;
END_IF;
LMN_P:
=Panteil;
LMN_I:
=Ianteil;
LMN_D:
=Danteil;
sInvAlt:
=Erkp;
sIanteilAlt:
=Ianteil;
sbArwHLmOn:
=FALSE;
sbArwLLmOn:
=FALSE;
IFdlmn>=LMN_HLM THEN //调节辆限幅(上限)
QLMN_HLM:
=TRUE;
QLMN_LLM:
=FALSE;
dlmn:
=LMN_HLM;
sbArwHLmOn:
=TRUE;
ELSE
QLMN_HLM:
=FALSE;
IFdLmn<=LMN_LLMTHEN //调节辆限幅(下限)
QLMN_LLM:
=TRUE;
dlmn:
=LMN_LLM;
sbArwLLmOn:
=TRUE;
ELSE
QLMN_LLM:
=FALSE;
END_IF;
END_IF;
sLmn:
=dLmn;
dLmn:
=dLmn*LMN_FAC+LMN_OFF;
LMN:
=dLmn;
dLmn:
=dLmn*276。
48;
IFdLmn>=32512.0THEN
dLmn:
=32512.0;
ELSIFdLmn<=-32512.0THEN
dLmn:
=—32512.0;
END_IF;
LMN_PER:
=INT_TO_WORD(DINT_TO_INT(REAL_TO_DINT(dLmn)));
END_IF;
END_FUNCTION_BLOCK
yanyan
pid块FB41SCL源代码
查看日志列表发表于01月26日15:
08
FUNCTION_BLOCK"CONT_C”
TITLE=’continuousPIDcontroller'
AUTHOR:
MT
FAMILY:
ICONT
NAME:
CONT_C
VERSION:
’1。
5'
KNOW_HOW_PROTECT
VAR_INPUT
COM_RST:
BOOL:
=FALSE;//完全重启动
MAN_ON:
BOOL:
=TRUE;//手动值打开
PVPER_ON:
BOOL:
=FALSE;//外设过程变量打开
P_SEL:
BOOL:
=TRUE;//比例作用打开
I_SEL:
BOOL:
=TRUE;//积分作用打开
INT_HOLD:
BOOL:
=FALSE;//积分作用保持
I_ITL_ON:
BOOL:
=FALSE;//积分作用初始化
D_SEL:
BOOL:
=FALSE;//微分作用打开
CYCLE:
TIME:
=T#1S;//采样时间
SP_INT:
REAL:
=0.0;//内部设定值
PV_IN:
REAL:
=0.0;//过程变量输入
PV_PER:
WORD:
=W#16#0;//外设过程变量
MAN:
REAL:
=0。
0;//手动值
GAIN:
REAL:
=2。
0;//比例增益
TI:
TIME:
=T#20S;//积分复位时间
TD:
TIME:
=T#10S;//微分时间
TM_LAG:
TIME:
=T#2S;//微分作用时间延时
DEADB_W:
REAL:
=0。
0;//死区带宽
LMN_HLM:
REAL:
=100.0;//积分值上限
LMN_LLM:
REAL:
=0。
0;//积分值下限
PV_FAC:
REAL:
=1.0;//过程变量因子
PV_OFF:
REAL:
=0.0;//过程变量偏移量
LMN_FAC:
REAL:
=1.0;//调节值因子
LMN_OFF:
REAL:
=0.0;//调节值偏移量
I_ITLVAL:
REAL:
=0.0;//积分作用的初始化值
DISV:
REAL:
=0.0;//干扰变量
END_VAR
VAR_OUTPUT
LMN:
REAL:
=0.0;//调节值
LMN_PER:
WORD:
=W#16#0;//外设调节值
QLMN_HLM:
BOOL:
=FALSE;//达到调节值上限
QLMN_LLM:
BOOL:
=FALSE;//达到调节值下限
LMN_P:
REAL:
=0.0;//比例分量
LMN_I:
REAL:
=0.0;//积分分量
LMN_D:
REAL:
=0.0;//微分分量
PV:
REAL:
=0.0;//
ER:
REAL:
=0.0;//误差信号
END_VAR
VAR
sInvAlt:
REAL:
=0.0;//上周期比例偏差值
sIanteilAlt:
REAL:
=0。
0;//上周期积分值
sRestInt:
REAL:
=0.0;//上周期积分偏差量(浮点数计算偏差)
sRestDif:
REAL:
=0。
0;//上周期微分偏差量(浮点数