用6个变量实现pid代码

时间:2013-09-18 18:40:30

标签: vb.net pid

实现我拥有的pid代码,主要是我需要传递给函数的信息。有六个变量要通过,但我真的不知道要输入什么。 有点背景,我正在自动化我的家庭酿酒厂,虽然它已全部启动并运行,但RIM的温度控制已经到处都是。对于那些不熟悉RIM的人来说,这是一种确保被浸泡的谷物保持在非常恒定温度的方法。它通过使用泵和加热元件来加热从浸泡容器底部取出的流体并使其通过加热元件并在需要时加热流体。我现在运行的代码是愚蠢的,所以我需要用更智能的东西替换它,比如PID! 加热加热器元件计划使用每秒调用一次的简单函数,这将改变元件从100ms到1000ms的供电时间,具体取决于需要对温度进行多少校正。

好的,所以我有代码,它只是如何使用它!我希望使用vb.net在独立的Windows窗体项目中运行它。我知道我需要使用PID值,以便它适合我的应用程序,但是要让我开始做什么?

非常感谢您的帮助!

Public Function PID_output(ByVal process As Double, ByVal setpoint As Double, ByVal Gain As Double, _
                        ByVal Integ As Double, ByVal deriv As Double, ByVal deltaT As Double)

 Dim Er As Double
 Dim Derivative As Double
 Dim Proportional As Double
 Static Olderror As Double
 Static Cont As Double
 Static Integral As Double
 Static Limiter_Switch As Double

 Limiter_Switch = 1

 Er = setpoint - process

 If ((Cont >= 1 And Er > 0) Or (Cont <= 0 And Er < 0) Or (Integ >= 9999)) Then
     Limiter_Switch = 0
 Else
     Limiter_Switch = 1
 End If

 Integral = Integral + Gain / Integ * Er * deltaT * Limiter_Switch

 Derivative = Gain * deriv * (Er - Olderror) / deltaT

 Proportional = Gain * Er

 Cont = Proportional + Integral + Derivative
 Olderror = Er

 If (Cont > 1) Then
     Cont = 1
 End If
 If (Cont < 0) Then
     Cont = 0
 End If

Return (Cont)

End Function 

1 个答案:

答案 0 :(得分:0)

将PID用于加热过程比典型的PID应用有点棘手。原因是;当你需要加热时,你可能会开始给加热器通电。加热器的功率是您可以将多少能量泵入系统的关键,这样您可以加快它的加热速度。然而,当涉及冷却时,通常通过环境的性质来实现冷却。 我想说的是:系统不对称。

我可以根据您控件的“方向”为您提供不同的控制设置。如果过程比设定值低,则使用控制器1.但是,如果系统比设定值更热,请使用控制器2.

对于系统1,我绝对建议使用D术语,因为D术语是控制器在进度上积累热量的一种限制因素。担心的是;许多热控制系统具有相当大的热惯性和读回反馈的滞后(延迟)。这通常会导致高过冲(进度达到并以相当大的量通过设定值)。如果夸大,将永远振荡(波动):)

另外,对于冷却效果,说环境是20deg。现在,如果您的设定值为100,那么如果您的设定值为1000则完全不同。因为Delta T将是不同的(分别为80和980度),并且“试图变凉”的系统响应将是Delta T的函数。

冷却过程不是线性的,而是指数级的(就像电容器通过恒定电阻器放电一样)。如果您的设定点不会每天都在变化,那么您没事。但如果不是这样,您最好将设定点空间划分为区域,并为不同的设定点使用不同的控制器参数。

从哪里开始: 规则有不同的PID调整拇指。看看Ziegler Nichols的方法。但基本上,让你的进度保持凉爽(初始条件)然后给它全油门加热功率并记录时间 - 热量图。该图称为阶跃响应,将为您估算热惯性和系统滞后。当您检查Ziegler Nichols方法时,这将告诉您典型的起始PID值。