📄 fuzzy_pid_module1.bas
字号:
Attribute VB_Name = "Fuzzy_PID_Module1"
Option Explicit
Public Kp(12, 12) As Single
Public Kd(12, 12) As Single
Public Ki(12, 12) As Single
Public E_Present As Single, E_Next As Single, ΔKp As Single, ΔKi As Single, ΔKd As Single
Public E As Integer, EC As Integer
Public Emax As Single, ECmax As Single, Kp_All As Single, Ki_All As Single, Kd_All As Single
Public Kp_Start As Single, Kd_Start As Single, Ki_Start As Single, E_All As Single, Control_Output As Single
Public Max_Output As Single, Control_tine As Single
Public Sub fuzzy_function()
E_Present = wencha
'MsgBox (E_Present)
wencha_Change = E_Present - E_Next
'MsgBox ("wencha_Change=" & wencha_Change)
E_Next = E_Present
'MsgBox ("E_Next=" & E_Next)
E_All = E_All + wencha
If wencha >= Emax Then
E = 6
ElseIf wencha <= -Emax Then
E = -6
Else
E = wencha * 6 / Emax
End If
'MsgBox (E)
If wencha_Change >= ECmax Then
EC = 6
ElseIf wencha <= -Emax Then
EC = -6
Else
EC = wencha_Change * 6 / Emax
End If
'MsgBox (EC)
If T > 950 Then
Kp_Start = 12 '比例系数初始值
Ki_Start = 12 * Val(AD_Form.Period_Txt.Text) / 12 '积分系数初始值
Kd_Start = 12 * 20 / Val(AD_Form.Period_Txt.Text) '微分系数初始值
ΔKp = 2 * Kp(E + 6, EC + 6) / 1.31 '比例调节范围(-2, 2)
ΔKi = Ki(E + 6, EC + 6) / 1.31 '积分调节范围(-1, 1)
ΔKd = Kd(E + 6, EC + 6) * 5 / 1.76 '微分例调节范围(-5, 5)
Kp_All = Kp_Start + ΔKp
Ki_All = Ki_Start + ΔKi
Kd_All = Kd_Start + ΔKd
Else
Kp_Start = 7 '比例系数初始值
Ki_Start = 7 * Val(AD_Form.Period_Txt.Text) / 100 '积分系数初始值
Kd_Start = 7 * 35 / Val(AD_Form.Period_Txt.Text) '微分系数初始值
ΔKp = Kp(E + 6, EC + 6) * 2 / 1.31 '比例调节范围(-2, 2)
ΔKi = Ki(E + 6, EC + 6) * 0.2 / 1.31 '积分调节范围(-0.2, 0.2)
ΔKd = Kd(E + 6, EC + 6) * 5 / 1.76 '微分例调节范围(-5, 5)
Kp_All = Kp_Start + ΔKp
Ki_All = Ki_Start + ΔKi
Kd_All = Kd_Start + ΔKd
End If
'MsgBox (Kp_All)
AD_Form.P_label.Caption = Format(Kp_All, "0.000")
AD_Form.I_label.Caption = Format(Ki_All, "0.000")
AD_Form.D_label.Caption = Format(Kd_All, "0.000")
If AD_Form.Man_opt = True Then
AD_Form.Frame2.Caption = ""
AD_Form.Frame3.Caption = "PID参数手动方式显示"
AD_Form.P_text.BackColor = &H80000005 '白色
AD_Form.I_text.BackColor = &H80000005
AD_Form.D_text.BackColor = &H80000005
Kp_All = Val(AD_Form.P_text.Text)
Ki_All = Val(AD_Form.I_text.Text)
Kd_All = Val(AD_Form.D_text.Text)
Control_Output = Kp_All * wencha + Ki_All * E_All + Kd_All * wencha_Change 'PID手动调节的控制量
Else
AD_Form.Frame2.Caption = "PID参数自动方式显示"
AD_Form.Frame3.Caption = ""
AD_Form.P_text.BackColor = &H8000000B '灰色
AD_Form.I_text.BackColor = &H8000000B
AD_Form.D_text.BackColor = &H8000000B
Control_Output = Kp_All * wencha + Ki_All * E_All + Kd_All * wencha_Change 'PID自动调节的控制量
End If
'If T <= 150 Then
'Max_Output = 100
'Else
'Max_Output = 3000
'End If
If Control_Output >= Max_Output Then
Max_Output = Control_Output
Control_tine = Control_Output * Val(DIO_Form.interval2.Text) / Max_Output
DIO_Form.interval1.Text = Format(Control_tine, "0.00")
End If
If Control_Output <= 0 Then
DIO_Form.interval1.Text = 0
Else
Control_tine = Control_Output * Val(DIO_Form.interval2.Text) / Max_Output
DIO_Form.interval1.Text = Format(Control_tine, "0.00")
End If
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -