一阶系统实现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
解决方案 »
- 【SWT】取消table中选中的项
- **java中的布局问题,在线***
- <html:img page="<bean:write name="personalInfo" property="headPic"/>"/>就出错,改成<img src>就不出错,怎么办
- 如何截获键盘消息啊,大家帮我看看这个简单的程序
- 怎么把java程序变成exe文件啊?
- calendar.clear(Calendar.DATE)不起作用
- 请问子类异常能不能被父类异常捕获?
- 如何通过JAVA备份SQL中的表
- 新手求问一个方法
- java.lang.NoClassDefFoundError又来了,谁来帮帮我!!!
- 关于用vector建立二维动态数组问题
- HASHMAP 问题
貌似我还蛮熟的……
不过只用PLC弄过这东东
这种算法的研究意义还真不大其实业内有一句话,
一切算出来P/I/D系数都是浮云
真正做工程的时候只有一种算法
工程凑试法(就是不断的改,不断的试,直到找到一个用户能接受的情况)
我没学过VB。。求求
我们就要交了