在Codesys中用ST语言编写程序实现PID算法代码程序+视频教程

Codesys使用ST语言实现离散PID模型的仿真(非自带PID模型) 要实现恒压供水,恒温控制,恒转速等技术要求,在PLC控制中,一般我们通过通讯或者模拟量采集的方式获取数据,而这些数据的采集都需要一定的时间,数据内容都是离散的,也无法获取连续的数据参数,因此,我们在编程设计时,需要用到PID的离散数学模型。 阅读详情
AI摘要

本文详细介绍了PID控制原理,如何在Codesys平台使用ST语言实现PID算法,包括离散型PID公式、积分分离、抗积分饱和和变积分策略,并提供了代码示例和视频教程链接。,

Codesys下ST语言编程实现PID算法实战教程

一、PID介绍

PID 是 Proportional(比例)、Integral(积分)、Differential(微分)的首字母缩写;是一种结合比例、积分和微分三种环节于一体的闭环控制算法。PID 控制的实质是对目标值和实际值误差进行比例、积分、微分运算后的结果用来作用在输出上。

  • 比例 (P)

比例控制是最简单的一种控制方式,成比例的反应控制系统中输入与输出的偏差信号,只要偏差一旦产生,就立即产生控制的作用来减小产生的误差。比例控制器的输出与输入成正比关系,能够迅速的反应偏差,偏差减小的速度取决于比例系数 Kp,Kp 越大偏差减小的就越快,但是极易引起震荡;Kp 减小发生震荡的可能性减小,但是调节的速度变慢,单纯的比例控制存在不能消除的静态误差,这里就需要积分来控制。

  • 积分(I)

在比例控制环节产生了静态误差,在积分环节中,主要用于就是消除静态误差提高系统的无差度。积分作用的强弱,取决于积分时间常数 Ti,Ti 越大积分作用越弱,反之则越强。积分控制作用的存在与偏差 e(t) 的存在时间有关,只要系统存在着偏差,积分环节就会不断起作用,对输入偏差进行积分,使控制器的输出及执行器的开度不断变化,产生控制作用以减小偏差。在积分时间足够的情况下,可以完全消除静差,这时积分控制作用将维持不变。Ti 越小,积分速度越快,积分作用越强。积分作用太强会使系统超调加大,甚至使系统出现振荡。

  • 微分(D)

微分环节的作用是反应系统偏差的一个变化趋势,也可以说是变化率,可以在误差来临之前提前引入一个有效的修正信号,有利于提高输出响应的快速性, 减小被控量的超调和增加系统的稳定性,虽然积分环节可以消除静态误差但是降低了系统的响应速度,所以引入微分控制器就显得很有必要,尤其是具有较大惯性的被控对象使用 PI 控制器很难得到很好的动态调节品质,系统会产生较大的超调和振荡,这时可以引入微分作用。在偏差刚出现或变化的瞬间,不仅根据偏差量作出及时反应(即比例控制作用),还可以根据偏差量的变化趋势(速度)提前给出较大的控制作用(即微分控制作用),将偏差消灭在萌芽状态,这样可以大大减小系统的动态偏差和调节时问,使系统的动态调节品质得以改善。微分环节有助于系统减小超调,克服振荡,加快系统的响应速度,减小调节时间,从而改善了系统的动态性能,但微分时间常数过大,会使系统出现不稳定。微分控制作用一个很大的缺陷是容易引入高频噪声,所有在干扰信号比较严重的流量控制系统中不宜引入微分控制作用。

二、PID公式说明

PID的流程本质上是通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和

请添加图片描述

连续性PID的公式如下
u ( t ) = K ∗ p ⋅ e ( t ) + K ∗ i ⋅ ∫ ∗ 0 t e ( τ )   d τ + K ∗ d ⋅ d e ( t ) d t u(t) = K*_p \cdot e(t) + K_*i \cdot \int*_{0}^{t} e(\tau) \, d\tau + K_*d \cdot \frac{de(t)}{dt} u(t)=K∗p​⋅e(t)+K∗​i⋅∫∗0t​e(τ)dτ+K∗​d⋅dtde(t)​

  • (u(t)) 是时间 (t) 的控制输出。

  • (K*p)、(Ki) 和 (K_d) 分别是比例、积分和微分常数。

  • (e(t)) 是时间 (t) 的误差,计算方式为设定值与测量过程变量的差异。

  • 积分项涉及过去误差随时间的累积。

  • 微分项表示误差的变化率。 PID控制器的每个组成部分(比例、积分和微分)对整体控制作用有不同的贡献,调整这些常数对于实现所需的系统响应至关重要。

在实际的工程中,我们的Codesys控制器是按照扫描周期去执行程序的,是离散时间的系统控制,因此必须把公式转成离散化模型,这样控制器才可以进行计算。

离散型PID控制器的基本公式如下:
u [ k ] = K p ⋅ e [ k ] + K i ⋅ ∑ i = 0 k e [ i ] + K d ⋅ ( e [ k ] − e [ k − 1 ] ) u[k] = K_p \cdot e[k] + K_i \cdot \sum_{i=0}^{k} e[i] + K_d \cdot (e[k] - e[k-1]) u[k]=Kp​⋅e[k]+Ki​⋅i=0∑k​e[i]+Kd​⋅(e[k]−e[k−1])

  • (u[k]) 是时间步 (k) 的控制输出。
  • (K_p)、(K_i) 和 (K_d) 分别是比例、积分和微分常数。
  • (e[k]) 是时间步 (k) 的误差,计算方式为设定值与测量过程变量的差异。
  • 积分项涉及过去误差的累积,通常通过对误差进行累加求和得到。
  • 微分项表示当前误差与上一步误差的差异。

离散型PID控制器的每个组成部分对于控制离散时间系统具有不同的影响,调整这些常数以适应系统需求至关重要。

三、Codesys用ST语言实现PID算法流程

1 平台说明

  • 操作系统 : Windows10
  • 编程软件: Codesys v3.5 SP19
  • 编程语言:ST

2 工程创建流程

(1) 新建Codesys工程,依次点击【文件】—【新建工程】—【标准工程】— 输入名称,如下图所示

请添加图片描述

(2) 设备可以任意选,这里选择【CODESYS Control Win V3】,编程语言选择【结构化文本(ST)】,点击【确定】

请添加图片描述

(3) 右键点击【Application】—【添加对象】—【Pou】

请添加图片描述

(4) 【名称】为FB_PID , 【类型(T)】为功能块 ,【实现语言】为结构化文本(ST) .

请添加图片描述

(5) 在功能块FB_PID中,编写程序 实现PID功能

请添加图片描述

3、使用Codesys的trace功能进行仿真,如下所示

请添加图片描述

四、补充说明

1、积分分离的PID控制算法

当被控量与设定值偏差较大时,取消积分作用; 当被控量接近给定值时,引入积分控制,以消除静差,提高精度与稳定速度。

//实时误差值过大时,积分系数为0
IF (rCurrent_Error > 100) THEN 
	rKi := 0;
END_IF

2、抗积分饱和的PID控制算法

​ 所谓积分饱和现象是指若系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致u(k)达到极限位置。此后若控制器输出继续增大,u(k)也不会再增大,即系统输出超出正常运行范围而进入了饱和区。一旦出现反向偏差,u(k)逐渐从饱和区退出。进入饱和区愈深则退饱和时间愈长。此段时间内,执行机构仍停留在极限位置而不能随着偏差反向立即做出相应的改变,这时系统就像失去控制一样,造成控制性能恶化。这种现象称为积分饱和现象或积分失控现象
  防止积分饱和的方法之一——抗积分饱和法,该方法的思路是在计算u(k)时,首先判断上一时刻的控制量u(k-1)是否已经超出了极限范围: 若u(k-1)>umax,则只累加负偏差; 若u(k-1)<umin,则只累加正偏差。避免了控制量长时间在饱和区。

//如果当前值超过最大,则只积累负偏差
IF  rCurrentValue > rMaxValue THEN 
	IF rCurrent_Error < 0 THEN 
		rIntergral := rIntergral + rCurrent_Error;
	END_IF
END_IF
//如果当前值小于最小,则只积累正偏差
IF  rCurrentValue < rMinValue THEN 
	IF rCurrent_Error > 0 THEN 
		rIntergral := rIntergral + rCurrent_Error;
	END_IF
END_IF

3、变积分的PID控制算法

​ 变积分PID的基本思想是设法改变积分项的累加速度,使其与偏差大小相对应:偏差越大,积分越慢; 偏差越小,积分越快。具体实现思路为:

//如果大于150 系数为0
IF rCurrent_Error > 150 THEN 
	rRation := 0;
//如果在120和150 成比例变化
ELSIF rCurrent_Error > 120 AND rCurrent_Error<150  
	rRation := (150.0- rCurrent_Error) / 30.0;
ELSE //如果小于120,系数为1
	rRation := 1.0;
END_IF
//最终改变rKi
rKi := rKi * rRation;

五、完整视频以及代码下载(有偿)

为更好的理解在Codesys中用ST语言编写PID算法,已经录制成手把手详细的视频教程,并包括源代码以及FB_PID的使用事项。

请添加图片描述

CODESYS ST语言编程规范 part 5 本文介绍了CODESYS ST语言的代码管理与版本控制规范,重点包括Git工作流程、分支策略、提交信息规范和代码审查流程。采用Git Flow分支策略管理开发,规范提交信息格式(类型+范围+主题),要求代码合并前必须通过审查和测试。版本发布遵循语义化版本控制,使用标签标记重要版本。代码审查流程包括提交请求、自动检查、人工审查和批准合并等步骤,旨在确保代码质量和规范性。 阅读详情

相关推荐

Codesys ST语言实战:从零构建工业级PID控制功能块

本文详细介绍了如何使用Codesys ST语言从零构建工业级PID控制功能块。内容涵盖PID算法基础、开发环境搭建、核心算法实现、工程化扩展功能、调试优化技巧以及实际应用案例,帮助工程师快速掌握工业控制中的PID实现与优化方法。

weixin_38171245的博客 473

CODESYS采用ST语言建立的离散PID模型,可仿真运行

通过CODESYS的ST语言建立离散PID模型,结合离散PID的理论分析,验证了PID调节的三个参数的对调整过程及结果的影响和作用。 当然本文所建立的PID模型过于理想,没有干扰,没有测量误差,因此跟现场环境存在很大的差异,对于PID调节,仅能提供一点理论参考。 本文所使用的codesys版本为3.5.14.10,参考博客地址 离散PID理论分析 https://blog.youkuaiyun.com/qq_19979629/article/details/123380138 离散PID模型仿真 https://blog.youkuaiyun.com/qq_19979629/article/details/123451333

从理论到波形:用Codesys Trace功能仿真调试你的PID程序(ST语言实战)

本文详细介绍了如何利用Codesys的Trace功能进行PID程序的仿真调试,通过ST语言实现PID功能块,并利用Trace功能将抽象的控制过程可视化。文章涵盖了PID参数调试的实战技巧,包括比例、积分、微分参数的调整方法,以及常见波形问题的诊断与解决方案,帮助工程师从理论到实践掌握PID调试的艺术。

weixin_30819085的博客 481

Codesys V2.3 PID实例st文本编程

实现开始设定手动值,延时进入PID调节

Codesys ST语言PID调参避坑指南:从仿真到实战,手把手教你搞定温控/电机

本文详细介绍了在Codesys平台上使用ST语言进行PID参数调优的实战技巧,涵盖从仿真到工业现场的应用。通过经典Ziegler-Nichols法和现代启发式方法的结合,提供温度控制、电机调节等场景的参数整定策略,并分享积分管理、噪声处理等高级技术,帮助工程师快速解决超调、振荡等常见问题。

weixin_30820077的博客 589

【自动化学习笔记】ST语言学习第一章

在本章中,我们将介绍ST(结构化文本)语言以及CODESYS平台,并探讨为什么ST语言是工业自动化领域中常用的一种编程语言。我们将从基本概念开始,逐步深入了解其用途和优势。通过本章的学习,读者将对ST语言及其在工业自动化中的应用有一个初步的了解,并能够使用CODESYS平台进行简单的编程操作。在这一小节中,我们将介绍一些基本的编程概念和CODESYS的基本操作,以便读者对接下来的学习有一个基本的了解。

unlike353035108的博客 2160

PID算法

1.什么自动控制系统是 在无人直接参与下可使生产过程按预定程序进行的控制系统。 一个控制系统包括控制器、传感器、变送器、执行机构、输入输出接口。 具体过程是:控制器的输出经过输出接口、执行机构,加到被控系统上;控制系统的被控量,经过传感器、变送器,通过输入接口送到控制器。 自动控制系统可分为开环控制系统和闭环控制系统。 开环控制系统(open-loop control system) :输出对于输入没有影响。在开环控制系统中,系统输出只受输入的控制,控制精度和抑制干扰的特性都比较差。开环控制系统.

qq_41328470的博客 5953

从仿真到实战:用CODESYS Trace功能调试你的PID参数(ST语言版避坑指南)

本文详细介绍了如何利用CODESYS的Trace功能调试PID参数,通过ST语言实现从仿真到实战的完整流程。文章重点解析了PID算法在工业控制中的核心挑战,并提供了可视化调试方法和避坑指南,帮助工程师快速掌握参数整定技巧,提升系统响应性能。

weixin_30376083的博客 452

PID(程序学习)

经过几天对PID的学习,以及各种的查阅资料,今天自己动手写了一个闭环小车的PID调速程序。网上关于PID原理的资料文献都有很多,这里我就不多说了,直接给出自己写的程序,希望对那些看了很多资料不敢动手写程序的学者有一些帮助。(我自己也是一个PID的初学者,写这篇博客也是为了加深自己的理解,写的不好的地方,请大家多多提意见) 下面是.c文件的程序 #include&amp;amp;amp;lt;pid.h&amp;amp;amp;gt; #in...

键盘上的手艺人 7843

从C程序员视角看ST语言:CodeSys平台上的工业控制编程思维转换

本文从C程序员视角解析ST语言在CodeSys平台上的工业控制编程思维转换,重点对比了ST语言与C语言在语法、数据类型、程序结构等方面的差异,并介绍了CodeSys平台的任务调度、功能块编程等核心机制,帮助开发者快速适应工业控制编程环境。

weixin_28327051的博客 459

CODESYS增量式PID功能块(ST完整源代码)

增量式PID的详细算法公式和博途源代码,请参看下面的文章链接:博途1200/1500PLC增量式PID算法(详细SCL代码)_博图scl语言pid增量编码器_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 4327

【免费下载】 探索Codesys V2.3 PID控制:一个强大的ST文本编程实例

探索Codesys V2.3 PID控制:一个强大的ST文本编程实例 【下载地址】CodesysV2.3PID实例st文本编程 Codesys V2.3 PID实例st文本编程 项目地址: https://gitcode.com/...

gitblog_09723的博客 1712

CODESYS位置式PID(完整ST源代码)

CODESYS增量式PID完整源代码请参看下面文章链接:CODESYS增量式PID功能块(ST完整源代码)_RXXW_Dor的博客-优快云博客增量式PID的详细算法公式和博途源代码,请参看下面的文章链接:博途1200/1500PLC增量式PID算法(详细SCL代码)_博图scl语言pid增量编码器_RXXW_Dor的博客-优快云博客。ADRC自抗扰算法请参看下面文章链接:ADRC自抗扰控制(CODESYS平台完整源代码)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2829

PID_controller:Codesys 的简单 PID 控制器

*************************************************************** * A simple PID controller for Codesys. * by Alexander Jaworowski * This Library is licensed under a MIT License ***************************************************************

Codesys位置式PID闭环控制系统(PID+PWM控制无刷电机)

有关Codesys位置式PID算法公式和源代码,请参考下面文章链接:1、Codesys位置式PID2、博途PLC PWM输出控制。

RXXW_Dor的博客 1420

CODESYS无扰切换PID(ST源代码)

/运行信号//手自动切换//设置值、目标值yk : REAL;// 实际值、反馈信号;// 开环给定值;// 比例增益;// 积分时间 单位S;Td : REAL;// 微分时间 单位S;//采样时间 单位S// 滤波时间 单位S;//中断周期 默认10msEND_VARVAR_OUTPUT//uk : REAL;//控制器输出;//上一时刻的实际值;uDk : REAL;

RXXW_Dor的博客 1402

Codesys高速计数应用(ST功能块)

Codesys如何创建FB请参看下面文章链接:CODESYS增量式PID功能块(ST完整源代码)_RXXW_Dor的博客-优快云博客增量式PID的详细算法公式和博途源代码,请参看下面的文章链接:博途1200/1500PLC增量式PID算法(详细SCL代码)_博图scl语言pid增量编码器_RXXW_Dor的博客-优快云博客。Codesys环境下如何创建FCPLC模拟量输入 模拟量转换FC S_ITR (CODESYS平台)_codesys做模拟量功能块_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 1718

CODESYS斜坡函数功能块(ST源代码)

SMART PLC梯形图斜坡函数FC请参看下面文章链接:SMART PLC斜坡函数功能块(梯形图代码)_RXXW_Dor的博客-优快云博客斜坡函数Ramp的具体应用可以参看下面的文章链接:PID优化系列之给定值斜坡函数(PLC代码+Simulink仿真测试)_RXXW_Dor的博客-优快云博客很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1 低通滤波器对给定值进行平滑。

RXXW_Dor的博客 1973
下一篇: Codesys数据结构(1): 数据类型
林磊教育
博客等级 码龄3年 405粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值