百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

西门子 PID之 FB41(西门子 p#)

bigegpt 2025-01-31 12:00 10 浏览

剑指工控微信技术群,很多人都在问PID的复杂的微积分算法如何形成程序的?我在这里把STEP7 里FB41源代码和注释给大家贴出来,让大家学习一下,FB41是积分PID。另外如果大家习惯了STEP7的PID也可以通过这个源代码移植到别的控制器上。


FUNCTION_BLOCK "CONT_C"
TITLE ='continuous PID controller'
AUTHOR : Jiansiting
FAMILY : JZGK
NAME : CONT_C
VERSION : '2.0'
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 ; //Real Hilfsvariable
END_VAR
IF COM_RST THEN //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 ; //外设输入转换为浮点数值
IF NOT PVPER_ON THEN //过程变量选择
Istwert := PV_IN ;
END_IF;
PV := Istwert ;
ErKp := SP_INT - PV ; //计算偏差
IF ErKp < -DEADB_W THEN
ER := ErKp + DEADB_W ;
ELSIF ErKp > DEADB_W THEN
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 ;
IF rTi < rCycle * 0.5 THEN //积分时间必须 >= 采样时间的0.5倍
rTi := rCycle * 0.5 ;
END_IF;
IF rTd < rCycle THEN //微分时间必须 >= 采样时间
rTd := rCycle ;
END_IF;
IF rTmLag < rCycle * 0.5 THEN //微分作用延时时间必须 >= 采样时间的0.5倍
rTmLag := rCycle * 0.5 ;
END_IF;
IF P_SEL THEN //比例作用投入
Panteil := ErKp ;
ELSE
Panteil := 0.0 ;
END_IF;
IF I_SEL THEN //积分作用投入
IF I_ITL_ON THEN //积分初始化
Ianteil := I_ITLVAL ;
sRestInt := 0.0 ;
ELSIF MAN_ON THEN //手动值输入时的积分量计算,用于用于手动切换自动无扰切换
Ianteil := sLmn - Panteil - DISV ;
sRestInt := 0.0 ;
ELSE //积分计算
Iant := ( rCycle / rTi ) * ( ErKp + sInvAlt ) * 0.5 + sRestInt ;
IF ( ( Iant > 0.0 AND sbArwHLmOn ) OR INT_HOLD ) OR ( Iant < 0.0 AND sbArwLLmOn )THEN //抗积分饱和
Iant := 0.0 ;
END_IF;
Ianteil := sIanteilAlt + Iant ; //当前积分值 := 上时刻积分值 + 本次积分量
sRestInt := sIanteilAlt - Ianteil + Iant ;
END_IF;
ELSE
Ianteil := 0.0 ;
sRestInt := 0.0 ;
END_IF;
Diff := ErKp ;
IF NOT MAN_ON AND D_SEL THEN //微分作用投入
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输出
IF MAN_ON THEN //PID手动之打开
dLmn := MAN ;
ELSE
IF NOT I_ITL_ON AND I_SEL THEN //干扰量处理
IF Ianteil > LMN_HLM - DISV AND dLmn > LMN_HLM AND dLmn - LMN_D > LMN_HLM THEN
rVal := LMN_HLM - DISV ;
gf := dLmn - LMN_HLM ;
rVal := Ianteil - rVal ;
IF rVal > gf THEN
rVal := gf ;
END_IF;
Ianteil := Ianteil - rVal ;
ELSIF Ianteil < LMN_LLM - DISV AND dLmn < LMN_LLM AND dLmn - LMN_D < LMN_LLM THEN
rVal := LMN_LLM - DISV ;
gf := dLmn - LMN_LLM ;
rVal := Ianteil - rVal ;
IF rVal < gf THEN
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 ;
IF dlmn >= LMN_HLM THEN //调节辆限幅(上限)
QLMN_HLM := TRUE ;
QLMN_LLM := FALSE ;
dlmn := LMN_HLM ;
sbArwHLmOn := TRUE ;
ELSE
QLMN_HLM := FALSE ;
IF dLmn <= LMN_LLM THEN //调节辆限幅(下限)
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 ;
IF dLmn >= 32512.0 THEN
dLmn := 32512.0 ;
ELSIF dLmn <= -32512.0 THEN
dLmn := -32512.0 ;
END_IF;
LMN_PER := INT_TO_WORD( DINT_TO_INT( REAL_TO_DINT( dLmn) ) ) ;
END_IF;
END_FUNCTION_BLOCK

相关推荐

或者这些Joplin插件也可以帮助你的笔记应用再一次强大

写在前面距离上次分享《搭建私有全平台多端同步笔记,群晖NAS自建JoplinServer服务》已过去一段时间,大家是否开始使用起来了呢?如果你和我一样已经使用过Joplin有一段时间了,那或许你也会...

Three.JS教程4 threejs中的辅助类

一、辅助类简介Three.js提供了一些辅助类(Helpers)以帮助我们更容易地调试、可视化场景中的元素。ArrowHelepr:创建箭头辅助器;AxisHelper:创建坐标轴辅助器;BoxH...

第2章 还记得点、线、面吗(二)(第二章还能敲钟吗)

glbgltf模型(webvrmodel)-gltf模型下载定制,glb模型下载定制,三维项目电商网站在线三维展示,usdz格式,vr模型网,网页VR模型下载,三维模型下载,webgl网页模型下载我...

如何检查Linux系统硬件信息?从CPU到显卡,一网打尽!

你可能会问:“我为什么要关心硬件信息?”答案很简单:硬件是Linux系统的根基,了解它可以帮你解决很多实际问题。比如:性能调优:知道CPU核心数和内存大小,才能更好地调整程序运行参数。故障排查:系统卡...

SpriteJS:图形库造轮子的那些事儿

从2017年到2020年,我花了大约4年的时间,从零到一,实现了一个可切换WebGL和Canvas2D渲染的,跨平台支持浏览器、SSR、小程序,基于DOM结构和支持响应式的,高...

平时积累的FPGA知识点(6)(fpga经典应用100例)

平时在FPGA群聊等积累的FPGA知识点,第六期:1万兆网接口,发三十万包,会出现掉几包的情况,为什么?原因:没做时钟约束,万兆网接口的实现,本质上都是高速serdes,用IP的话,IP会自带约束。...

芯片逻辑调度框架设计 都需要那些那些软件工具

设计芯片逻辑调度框架通常需要使用以下软件工具:1.逻辑设计工具:例如Vivado、Quartus、SynopsysDesignCompiler等,用于设计和实现逻辑电路。2.仿真工具:例如Mo...

ZYNQ与DSP之间EMIF16通信(正点原子领航者zynq之fpga开发指南v3)

本文主要介绍说明XQ6657Z35-EVM高速数据处理评估板ZYNQ与DSP之间EMIF16通信的功能、使用步骤以及各个例程的运行效果。[基于TIKeyStone架构C6000系列TMS320C6...

好课推荐:从零开始大战FPGA(从零开始的冒险4399)

从零开始大战FPGA引子:本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“...

业界第一个真正意义上开源100 Gbps NIC Corundum介绍

来源:内容由「网络交换FPGA」编译自「FCCM2020」,谢谢。FCCM2020在5月4日开始线上举行,对外免费。我们有幸聆听了其中一个有关100G开源NIC的介绍,我们对该文章进行了翻译,并对其中...

高层次综合:解锁FPGA广阔应用的最后一块拼图

我们为什么需要高层次综合高层次综合(High-levelSynthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。所谓的高层次语言,包括C、C++...

Xilinx文档编号及其内容索引(部分)

Xilinx文档的数量非常多。即使全职从事FPGA相关工作,没有几年时间不可能对器件特性、应用、注意事项等等有较为全面的了解。本文记录了我自使用Xilinx系列FPGA以来或精读、或翻阅、或查询过的文...

Xilinx Vivado联合Modelsim软件仿真

引言:Xilinx公司Vivado开发软件自带仿真工具,可以实现一般性能的FPGA软件仿真测试,其测试执行效率以及性能都不如第三方专用仿真软件Modelsim强。本文我们介绍下如何进行Vivado20...

体育动画直播是怎么做出来的?从数据到虚拟赛场的科技魔法!

你是否见过这样的比赛直播?没有真实球员,却能看梅西带球突破?足球比赛变成动画版,但数据100%真实?电竞比赛用虚拟形象直播,选手操作实时同步?这就是体育动画直播——一种融合实时数据、游戏引擎和AI的...

Dialogue between CPC and political parties of neighboring countries held in Beijing

BEIJING,May26(Xinhua)--TheCommunistPartyofChina(CPC)inDialoguewithPoliticalPartiesof...