📄 自控源程序.frm
字号:
X1 = 480
X2 = 600
Y1 = 6000
Y2 = 6000
End
Begin VB.Line Line31
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 5640
Y2 = 5640
End
Begin VB.Line Line32
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 5280
Y2 = 5280
End
Begin VB.Line Line33
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 4920
Y2 = 4920
End
Begin VB.Line Line34
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 4560
Y2 = 4560
End
Begin VB.Line Line36
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 600
X2 = 600
Y1 = 960
Y2 = 1920
End
Begin VB.Line Line37
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 3840
Y2 = 3840
End
Begin VB.Line Line38
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 3480
Y2 = 3480
End
Begin VB.Line Line39
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 3120
Y2 = 3120
End
Begin VB.Line Line40
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 2760
Y2 = 2760
End
Begin VB.Line Line41
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 2400
Y2 = 2400
End
Begin VB.Line Line42
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 2040
Y2 = 2040
End
Begin VB.Line Line43
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 1680
Y2 = 1680
End
Begin VB.Line Line44
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 480
X2 = 600
Y1 = 480
Y2 = 0
End
Begin VB.Line Line46
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 600
X2 = 720
Y1 = 0
Y2 = 480
End
Begin VB.Label Label2
BackColor = &H80000008&
Caption = "1"
BeginProperty Font
Name = "宋体"
Size = 14.25
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H8000000E&
Height = 495
Left = 240
TabIndex = 6
Top = 4080
Width = 255
End
Begin VB.Label Label9
BackColor = &H80000008&
Caption = "1.5"
ForeColor = &H8000000E&
Height = 255
Left = 120
TabIndex = 5
Top = 2280
Width = 375
End
Begin VB.Label Label10
BackColor = &H80000008&
Caption = "0.5"
ForeColor = &H8000000E&
Height = 255
Left = 120
TabIndex = 4
Top = 5880
Width = 375
End
Begin VB.Line Line35
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 600
X2 = 360
Y1 = 4200
Y2 = 4200
End
Begin VB.Line Line45
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 600
X2 = 600
Y1 = 120
Y2 = 960
End
Begin VB.Line Line47
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 600
X2 = 480
Y1 = 1320
Y2 = 1320
End
Begin VB.Line Line48
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 600
X2 = 480
Y1 = 960
Y2 = 960
End
Begin VB.Line Line49
BorderColor = &H8000000E&
BorderWidth = 2
X1 = 600
X2 = 360
Y1 = 600
Y2 = 600
End
Begin VB.Label Label11
BackColor = &H80000012&
Caption = "2"
BeginProperty Font
Name = "宋体"
Size = 14.25
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H8000000E&
Height = 255
Left = 240
TabIndex = 3
Top = 480
Width = 135
End
Begin VB.Line Line9
BorderColor = &H8000000E&
X1 = 1800
X2 = 9840
Y1 = 7200
Y2 = 7200
End
Begin VB.Line Line28
BorderColor = &H80000005&
X1 = 10200
X2 = 9960
Y1 = 6240
Y2 = 6120
End
Begin VB.Line Line29
BorderColor = &H80000005&
X1 = 10200
X2 = 9960
Y1 = 6240
Y2 = 6360
End
Begin VB.Line Line5
BorderColor = &H8000000E&
X1 = 5880
X2 = 9600
Y1 = 5640
Y2 = 5640
End
Begin VB.Line Line7
BorderColor = &H8000000E&
X1 = 5880
X2 = 9600
Y1 = 6840
Y2 = 6840
End
Begin VB.Line Line65
BorderColor = &H8000000E&
X1 = 5880
X2 = 5640
Y1 = 6240
Y2 = 6120
End
Begin VB.Line Line67
BorderColor = &H8000000E&
X1 = 5880
X2 = 5640
Y1 = 6240
Y2 = 6360
End
End
Attribute VB_Name = "PID控制器"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim G, U As Double
Public D, ESS
Dim A, F, B, J, i, L, K, W, LX, DN, KJ, KN, KM, ESSTTC
Dim H, Q As Integer
Dim Tbc, Ttc, JY, XP, PW, CJ, QW, ZX, PL, EM, tao
Dim Ym, Tm, Ytg, SJ, V, ESS0
Dim NN, MM, C, o, N, XT
Dim XX(7, 9), Z(9), Uk()
Public Sub SYMM()
Command3_Click
End Sub
Private Sub Command1_Click()
PID控制器.Hide
PID控制器.Show
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Command3_Click()
'-----------------------------------求输入函数--------------------------------------------
i = 1
C = Text3: o = C
L = Len(o)
Do
Z(i) = Left(o, 1): o = Right(o, L - 1)
If Z(i) = "+" Then Let N = i
If Z(i) = "i" Or Z(i) = "I" Then Let CJ = CSng(Mid(C, N + 1, i - N - 1)) '脉冲输入
If Z(i) = "S" Or Z(i) = "s" Then Let ZX = CSng(Mid(C, N + 1, i - N - 1)) '正弦输入
If Z(i) = "U" Or Z(i) = "u" Then Let JY = CSng(Mid(C, N + 1, i - N - 1)) '阶跃输入
If Z(i) = "T" Or Z(i) = "t" Then Let XP = CSng(Mid(C, N + 1, i - N - 1)) '斜坡输入
If Z(i) = "^" Then Let PW = CSng(Mid(C, N + 1, i - N - 2)) '抛物线输入
L = Len(o): i = i + 1
Loop While L > 0
W = -1
'------------------------------------输入绘图参数-------------------------------------------
Do
If ZX <> 0 Then PL = InputBox(" 正弦函数频率ω=?", "输入绘图参数", 1, 3000, 100)
Tbc = InputBox(" 采样周期 T=? ", "输入绘图参数", 0.01, 3000, 100)
Ttc = InputBox(" 波形长度 t=? ", "输入绘图参数", 20, 3000, 100)
Ytg = InputBox(" 波形高度 Y=? ", "输入绘图参数", 2, 3000, 100)
Loop While Ytg = "" Or Tbc = ""
'-------------------------------------读取纯滞后时间tao ------------------------------------------
W = CSng(Text1): W = W / Tbc: ReDim Uk(W): tao = CInt(W)
'-------------------------------------给出系统差分方程------------------------------
XX(4, 2) = 16220.5: XX(4, 1) = -32000: XX(4, 0) = 15780.5: XX(5, 0) = 20
'系统差分方程16220.5y(k)-32000y(k-1)+15780.5y(k-2) = 20u(k) XX(4, i) =a(i);XX(5, j)=b(j)
'分母阶数 NN:
NN = 2
'分子阶数 MM:
MM = 0
'计算u(k)=XX(3, MM)
XX(3, MM) = JY + XP * Tbc * W + 0.5 * PW * Tbc * Tbc * W * W + ZX * Sin(6.283 * PL * Tbc * W)
If CJ <> 0 Then XX(3, 0) = CJ / Tbc '脉冲函数u(k)=1/T
'仿真迭代开始
W = -1
Do
W = W + 1
If Abs(XX(6, NN)) < 99999 Then Call DYYN_Paint '调用打印y(k)子程序
If NN <= 1 And MM <= 1 Then XX(6, NN) = XX(3, MM) * XX(1, 0) / (XX(0, 0) + XX(1, 0))
If NN > MM Then Call JSYN '调用计算y(k)子程序
XT = JY + XP * Tbc * W + 0.5 * PW * Tbc * Tbc * W * W + ZX * Sin(6.283 * PL * Tbc * W)
If XX(6, NN) > Ym Then Let Ym = XX(6, NN): Tm = Tbc * W '记录y(k)的最大值及时间
ESS = XT - XX(6, NN)
If Tbc * W < Ttc Then ESSTTC = ESS '记录稳态误差
Loop While U <= 12000 And Abs(XX(6, NN)) < 99999
'仿真迭代结束
If Abs(XX(6, NN)) > 99999 Then DrawWidth = 8: PSet (5400, 3300), QBColor(14 - D): Print " 系统不稳定!"
'变量清零
W = 0: Q = 0
For i = 2 To 7
For J = 0 To NN
XX(i, J) = 0
Next J
Next i
DrawWidth = 4: PSet (2000, 500 + D * 200), QBColor(15 - D): Print " Y 1格="; Ytg / 20; " T 1格="; Ttc / 20; "(秒)"; " Cm = "; Ym; " Tm = "; Tm; "(秒)"; " e("; Ttc; ")="; ESSTTC
Ym = 0: Tm = 0
D = D + 1
End Sub
'------------------计算输出y(k)-----------------------------------------
Public Sub JSYN()
A = 0: B = 0
For J = 0 To NN - 1
A = A + XX(4, J) * XX(6, J)
XX(6, J) = XX(6, J + 1)
Next J
For J = 0 To MM - 1
B = B + XX(5, J) * XX(3, J)
XX(3, J) = XX(3, J + 1)
Next J
B = B + XX(5, J) * XX(3, J)
XX(6, NN) = (B - A) / XX(4, NN) 'y(k)= XX(6, nn)
A = 0: B = 0: If NN > 0 Then XX(6, NN - 1) = XX(6, NN)
'------------------------------PID控制-------------------------------------------------
XT = JY + XP * Tbc * W + 0.5 * PW * Tbc * Tbc * W * W + ZX * Sin(6.283 * PL * Tbc * W) '输入量r(t)=XT
bl = CSng(Text2): JF = CSng(Text5): WF = CSng(Text4) '读取PID参数
If Check1.Value = 1 Then
If W * Tbc > Ttc / 1.4 Then XX(6, NN) = XX(6, NN) - 0.2
End If '模拟干扰信号
For J = tao To 1 Step -1: Uk(J) = Uk(J - 1): Next J '模拟纯滞后
ESS = XT - XX(6, NN) '计算系统误差e=r-y
EM = EM + ESS '误差积分
Uk(0) = bl * ESS + JF * EM + WF * ((ESS - ESS0) / Tbc) '计算控制量其中(ESS - ESS0) / Tbc误差的微分
ESS0 = ESS
XX(3, MM) = Uk(tao) '控制量延迟后,作为被控对象的输入量
If XX(3, MM) < -1 * CSng(Text9) Then XX(3, MM) = -1 * CSng(Text9) '控制量限幅
If XX(3, MM) > CSng(Text9) Then XX(3, MM) = CSng(Text9)
'-----------------------------------------------------------------------
End Sub
'------------------打印y(k)-----------------------------------------
Private Sub DYYN_Paint()
DrawWidth = 2
G = Int(7790 - 7200 * XX(6, NN) / Ytg): U = Int(Tbc * W * 9600 / Ttc + 600) 'G-y坐标;U-x坐标
If D = 7 Then D = 8
If D = 14 Then D = 0
PSet (U, G), QBColor(15 - 1 * D)
DrawWidth = 1
G = Int(7800 - 1.05 * 7200 * XT / Ytg): PSet (U, G), RGB(0, 0, 0)
G = Int(7800 - 7200 * XT / Ytg): PSet (U, G), RGB(250, 0, 0)
G = Int(7800 - 0.95 * 7200 * XT / Ytg): PSet (U, G), RGB(0, 0, 0)
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -