一阶系统实现PID算法控制并进行仿真,具体功能如下:
1) 基本要求:实现PID算法和一阶系统差分方程仿真,PID算法中的四个参数和一阶系统的参数都可以通过菜单进行设定,系统对阶越函数的响应以图形方式实时显示在窗口中。
2) 附加功能:将系统的时间响应数据保存到数据库中,具体应包括下列属性:时间,输出值。将系统的历史响应重现。使用Teechart控件作为显示输出。就是实现这个文档里显示的那个界面,不用Vb,用javahttp://wenku.baidu.com/view/83cdc5c789eb172ded63b7e2.html
Vb的代码是模块
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)   '延迟执行Public Type OneLevelSys
    T As Double
    T1 As Double
End Type
 
Public Type PID
    SetPoint As Double    '设定目标
    Proportion As Double  '比例常数
    Integral As Double    '积分常数
    Derivative As Double  '微分常数
    LastError As Double   'Error[-1]
    PrevError As Double   'Error[-2]
    SumError As Double
End TypePublic sPID As PID
Public SysPar As OneLevelSys
Form1的代码有:
Private Sub Form_Load()
    sPID.Proportion = 100
    sPID.Integral = 0.5
    sPID.Derivative = 0
    sPID.SetPoint = 30    SysPar.T = 0.0003
    SysPar.T1 = 30
    
End SubPrivate Sub menu3_Click()
    Form4.Show
End SubPrivate Sub menu4_Click()
    Form2.Show
End SubPrivate Sub menu1_Click()
    Form3.Show
End Sub
Public Sub menu2_Click()
    Dim i As Integer
    Dim c As Double
    Dim u As Double
    Dim sOUT(20000) As Double
    
    Dim rOUT As Double
    Dim rIn As Double
    
    
    '数据库清空
    
    Data1.Recordset.MoveFirst
    Do While Not Data1.Recordset.EOF
        Data1.Recordset.Delete
        Data1.Recordset.MoveNext
    Loop
    
    
    c = 0
    u = 0
    For i = 1 To 20000 Step 1
       u = PIDCalc(sPID, c)
       sOUT(i - 1) = OneLevel(c, u, SysPar)
       
       Data1.Recordset.AddNew
       Data1.Recordset.Fields("time") = i                         '将当前数据存入数据库
       Data1.Recordset.Fields("value") = sOUT(i - 1)
       Data1.Recordset.Update
    Next i
    
      
     '画坐标系
    
    Form1.ScaleMode = 0
    Form1.ScaleLeft = -20
    Form1.ScaleTop = 90
    Form1.ScaleWidth = 390
    Form1.ScaleHeight = -100
    DrawWidth = 1
    Form1.Line (-12, 0)-(350, 0), vbBlack
    Form1.Line (346, 1)-(350, 0), vbBlack
    Form1.Line -(346, -1), vbBlack
    Form1.ForeColor = vbBlack
    Form1.Print "X"
    Form1.Line (0, -8)-(0, 80), vbBlack
    Form1.Line (1, 76)-(0, 80), vbBlack
    Form1.Line -(-1, 76), vbBlack
    Form1.CurrentX = -5
    Form1.CurrentY = 80
    Form1.Print "Y"
    Form1.CurrentX = -5
    Form1.CurrentY = -1
    Form1.Print "O"
    
    Form2.TChart1.AddSeries (scLine)
    Form2.TChart1.Series(0).Clear    '绘制系统的时间响应
    'Form1.Circle (0, 0), 20, vbRed
    For i = 1 To 20000 Step 1
        Form1.Line -(i / 60, sOUT(i - 1)), vbBlue
        If i Mod 20 = 0 Then
            Form2.TChart1.AutoRepaint = False
            Form2.TChart1.Series(0).Add sOUT(i - 1), i, vbGreen
            Form2.TChart1.AutoRepaint = True
            Form2.TChart1.Repaint
        End If        Text1.Text = i
        Text2.Text = sOUT(i - 1)
        Text1.Refresh                          '刷新数据表数据
        Text2.Refresh
        Call Sleep(0.01)                        '调用延迟0.01s
    Next i
    
End Sub

[b]
Form3的代码有:[
/b]
Option ExplicitPrivate Sub Form_Load()End SubPrivate Sub jcbutton1_Click()
   sPID.Proportion = Val(Form3.Text1.Text)
    sPID.Integral = Val(Form3.Text2.Text)
    sPID.Derivative = Val(Form3.Text3.Text)
    sPID.SetPoint = 30
    
    SysPar.T1 = Val(Form3.Text4.Text)
    SysPar.T = Val(Form3.Text5.Text)
    
    Form3.Hide
    Form1.Cls
End Sub
Private Sub jcbutton2_Click()
    Form3.Hide
End SubForm4的代码是:Private Sub Form_Load()End SubPrivate Sub jcbutton1_Click()
    Dim i As Integer
    Dim j As Integer
    Dim start As Integer
    Dim endpoi As Integer
    Dim sOUT(20000) As Double
    start = Val(Text1.Text)
    endpoi = Val(Text2.Text)
    
    Form4.Hide
    Form1.Cls
    
    Form1.ScaleMode = 0
    Form1.ScaleLeft = -20
    Form1.ScaleTop = 90
    Form1.ScaleWidth = 390
    Form1.ScaleHeight = -100
    DrawWidth = 1
    Form1.Line (-12, 0)-(350, 0), vbBlue
    Form1.Line (346, 1)-(350, 0), vbBlue
    Form1.Line -(346, -1), vbBlue
    Form1.ForeColor = vbBlue
    Form1.Print "X"
    Form1.Line (0, -8)-(0, 80), vbBlue
    Form1.Line (1, 76)-(0, 80), vbBlue
    Form1.Line -(-1, 76), vbBlue
    Form1.CurrentX = -5
    Form1.CurrentY = 80
    Form1.Print "Y"
    Form1.CurrentX = -5
    Form1.CurrentY = -1
    Form1.Print "O"
        Form1.Data1.Recordset.MoveFirst
    For i = 1 To start Step 1
        Form1.Data1.Recordset.MoveNext
    Next i
    
    For i = 1 To (endpoi - start) Step 1
       '读出数据库
       sOUT(i) = Form1.Data1.Recordset.Fields("value")
       Form1.Data1.Recordset.MoveNext
    Next i
    
    'Add Series at runtime
    Form2.TChart1.AddSeries (scLine)
    Form2.TChart1.Series(0).Clear
    
    '绘制系统的时间响应
    'Form1.Circle (0, 0), 20, vbRed
    For i = 1 To endpoi - start Step 1
        j = i + start
        Form1.Line -(j / 60, sOUT(i - 1)), vbBlack
        If i Mod 20 = 0 Then
            Form2.TChart1.AutoRepaint = False
            Form2.TChart1.Series(0).Add sOUT(i - 1), j, vbGreen
            Form2.TChart1.AutoRepaint = True
            Form2.TChart1.Repaint
        End If
        
        Form1.Text1.Text = j
        Form1.Text2.Text = sOUT(i - 1)
        Form1.Text1.Refresh
        Form1.Text2.Refresh
        Call Sleep(0.01)
    Next i
    
End SubPrivate Sub jcbutton2_Click()
    Form4.Hide
End Sub

解决方案 »

  1.   

    PID……
    貌似我还蛮熟的……
    不过只用PLC弄过这东东
    这种算法的研究意义还真不大其实业内有一句话,
    一切算出来P/I/D系数都是浮云
    真正做工程的时候只有一种算法
    工程凑试法(就是不断的改,不断的试,直到找到一个用户能接受的情况)
      

  2.   

     这个软件的难度是在内部的算法,至于界面显示使用Swing画图,没什么太大的难度。
      

  3.   

    求VB的详细算法唔。。
    我没学过VB。。求求
    我们就要交了