软件综合设计(分散)报告
姓名:丘瑶瑶
班级:自动化1001班
学号:100900404
目录
一.设计目的…………………………….3
二.设计内容………………………….....3
三.设计思想
1.数字PID及其算法…………………………………….3
2.离散控制系统的数学描述…………………………….5
四.界面简介……………………………6
五.各模块程序介绍及调试结果
1.程序介绍……………………………………………….7
2.调试结果展示…………………………………………11
3.调试中遇到的问题……………………………………14
六.心得体会…………………………14
七.程序代码…………………………15
一.设计目的
通过本课程设计实习,使学生在下列方面有所了解和提高:
1、 掌握Visual Basic进行程序设计的基本思路和方法
2、 能利用Visual Basic编程实现简单的任务
3、 结合控制系统理论用VB进行计算机控制仿真
二.设计内容
1、 对一阶系统实现PID算法控制并进行仿真,具体功能如下:
1) 基本要求:实现PID算法和一阶系统差分方程仿真,PID算法中的四个参数和一阶系统的参数都可以通过菜单进行设定,系统对阶越函数的响应以图形方式实时显示在窗口中。
2) 附加功能:将系统的时间响应数据保存到数据库中,具体应包括下列属性:时间,输出值。将系统的历史响应重现。使用Teechart控件作为显示输出。
三.设计思想
1、数字PID及其算法
在模拟系统中,PID算法的时域表达式为
(1) 式中
P(t):调节器的输出信号
e(t):调节器的偏差信号,等于给定值与测量值之差
:调节器的比例系数
:调节器的积分时间
:调节器的微分时间
计算机控制是一种采样控制,只能根据采样时刻的偏差来计算控制量。因此,在计算机控制系统中,必须对上进行离散化处理,用数字形式的差分方程代替连续系统的微分方程,此时积分项和微分项可用求和及增量式表示:
(2)
(3)
将式(2)、(3)代入式(1),则可得到离散的PID表达式:
(4)
式中:采样周期。若使系统的精度足够高,则T应该尽量小。
:第k次采样时的偏差值;
:第(k-1)次采样时的偏差值;
k:采样序号,
:第k次采样时调节器的输出
由于(4)的输出值与阀门开度的位置一一对应,因此,通常(4)称为位置型PID的位置控制算式。
由(4)可以看出,要想计算,不仅需要本次与上次的偏差信号和,而且还要在积分项中把历次的偏差信号进行相加,即,这样,不仅计算繁琐,而且为保存还要占用很多内存。为此,作如下改动。
根据递推原理,可写出(k-1)次的PID输出表达式:
(5)
用式(5)减去(4),可得:
(6)
式中:积分系数
:微分系数
式(6)称为增量式PID控制算式。
增量型PID算法的算式为:
(7)
设
所以:
2.离散控制系统的数学描述
设系统为一阶惯性环节,系统的传递函数为:
其微分方程为:
(9)
差分方程和微分方程在形式上有一定的相似之处,设时间间隔T足够小,当时,可有:
于是式(9)可写成:
经整理后,得:
(10)
在T足够小的条件下,微分方程(9)可以近似成差分方程(10),T值越小,则近似得越好。
四.界面简介
1.TeeChar控件的使用
TeeChar是第三方插入控件,用来绘画图形。点击就可在工程界面显示一个如上图所示的TeeChar界面
2.参数设定.yy
可在参数设定.yy模块中输入PID参数KP、KI、KD以及一阶系统参数T、T1,按“SURE”键则可将参数导入工程。
3.查询状态模块
在查询状态模块中的“起始时间”、“终止时间”输入图像显示的范围。
五.各模块程序介绍及调试结果
1)各模块程序介绍
1.离散PID表达式:将其用VB语言表示为:
Private Function PIDCalc(ByRef pp As PID, ByVal NextPoint As Double) ;ByRef是引用参数,ByVal是传递值。
Dim dError As Double
Dim Error As Double ;定义dError、Error两个变量为Double型
Error = pp.SetPoint - NextPoint '偏差
pp.SumError = Error + pp.SumError '积分
dError = pp.LastError - pp.PrevError '当前微分
pp.PrevError = pp.LastError
pp.LastError = Error
PIDCalc = pp.Proportion * Error + pp.Integral * pp.SumError + pp.Derivative * dError
End Function
2.离散控制系统的数学描述
设系统为一阶惯性环节,则将其离散化为
用VB语言描述如下,其中u=x(nT),c=y(nT)
Private Function OneLevel(ByRef c As Double, ByVal u As Double, ByRef Param As OneLevelSys)
c = Param.T / Param.T1 * u - (Param.T / Param.T1 - 1) * c
OneLevel = c
End Function
设置了显示3D和非3D效果,以及是否显示背景色。通过下列语句实现
Private Sub Check1_Click()
TChart1.Aspect.View3D = Check1.Value
End Sub
Private Sub Check2_Click()
TChart1.Panel.Gradient.Visible = Check2.Value
End Sub
初始参数设定:
Private Sub Form_Load()
sPID.Proportion = 168
sPID.Integral = 0.5
sPID.Derivative = 0.5
sPID.SetPoint = 30
SysPar.T = 0.0002
SysPar.T1 = 35
End Sub
3.PID参数设定
Private Sub OKButton_Click()
sPID.Proportion = Val(Form1.Text2.Text)
sPID.Integral = Val(Form1.Text3.Text)
sPID.Derivative = Val(Form1.Text5.Text)
sPID.SetPoint = 30
SysPar.T1 = Val(Form1.Text6.Text)
SysPar.T = Val(Form1.Text7.Text)
'Form1.TChart1.Series(0).Clear
Form1.Cls
End Sub
4.时域模拟模块:将程序写入数据库,
Private Sub simulate_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
'Add Series at runtime
TChart1.AddSeries (scLine)
TChart1.Series(0).Clear
'TChart1.Axis.Left.SetMinMax 1, 20000
'TChart1.Axis.Top.SetMinMax 1, 40
5. '绘制系统的时间响应
'Form1.Circle (0, 0), 20, vbRed
For i = 1 To 20000 Step 1
If i Mod 20 = 0 Then
TChart1.AutoRepaint = True
TChart1.Series(0).Add sOUT(i - 1), i, vbBlue
TChart1.AutoRepaint = True
TChart1.Repaint
End If
'TChart1.Visible = false
Text1.Text = i
Text4.Text = sOUT(i - 1)
Text1.Refresh
Text4.Refresh
Call Sleep(0.01)
Next i
End Sub
6.查询模块数据保存于数据库
Private Sub OKButton1_Click()
Dim i As Integer
Dim j As Integer
Dim start As Integer
Dim endpoi As Integer
Dim sOUT(20000) As Double
start = Val(Text8.Text)
endpoi = Val(Text9.Text)
Form1.Cls
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
Form1.TChart1.AddSeries (scLine)
Form1.TChart1.Series(0).Clear
7. '绘制系统的时间响应
'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
Form1.TChart1.AutoRepaint = False
Form1.TChart1.Series(0).Add sOUT(i - 1), j, vbBlue
Form1.TChart1.AutoRepaint = True
Form1.TChart1.Repaint
End If
'TChart1.Repaint
'TChart1.Visible = True
Form1.Text1.Text = j
Form1.Text4.Text = sOUT(i - 1)
Form1.Text1.Refresh
Form1.Text4.Refresh
Call Sleep(0.01)
Next i
End Sub
8.定义模块
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 'Sums of Errors
End Type
Public sPID As PID
Public SysPar As OneLevelSys
2)调试结果:
程序运行界面如下:
设定参数如下,进行时域模拟:
模拟结果如下:
查询10000瘩20000的结果:
设定参数,时域模拟:
模拟结果如下:
查询100到10000的结果
3)调试中遇到的问题:
由于初次使用VB软件,在调试中遇到很多问题,比如说simulink模块命名的重复性,在end模块后添加注释的时候没有加“’”
,名字定义和模块程序中的不符合,插入TeeChar空间的时候属性设置不正确。
六.心得体会
在没有任何基础的情况下,能把VB的基本功能以及基本的语法弄清楚,感觉收获已经很大了。在程序运行和调试的时候遇到很多问题都无从下手,后来通过翻阅书籍、上网百度和同学讨论将问题解决了。软件综合设计这门课设没有安排课程,也没有安排时间,在紧凑的时间中将其功能以及程序读懂,以及会编写基础的VB程序,这已经是这次课程设计中最大的收获了。
七.程序代码:
Private Function PIDCalc(ByRef pp As PID, ByVal NextPoint As Double)
Dim dError As Double
Dim Error As Double
Error = pp.SetPoint - NextPoint '偏差
pp.SumError = Error + pp.SumError '积分
dError = pp.LastError - pp.PrevError '当前微分
pp.PrevError = pp.LastError
pp.LastError = Error
PIDCalc = pp.Proportion * Error + pp.Integral * pp.SumError + pp.Derivative * dError
End Function
Private Function OneLevel(ByRef c As Double, ByVal u As Double, ByRef Param As OneLevelSys)
c = Param.T / Param.T1 * u - (Param.T / Param.T1 - 1) * c
OneLevel = c
End Function
Private Sub CancelButton_Click()
Form1.Hide
Form1.Cls
End Sub
Private Sub Cancelbutton2_Click()
Form1.Cls
End Sub
Private Sub Check1_Click()
TChart1.Aspect.View3D = Check1.Value
End Sub
Private Sub Check2_Click()
TChart1.Panel.Gradient.Visible = Check2.Value
End Sub
Private Sub Form_Load()
sPID.Proportion = 200
sPID.Integral = 1
sPID.Derivative = 1
sPID.SetPoint = 30
SysPar.T = 0.0003
SysPar.T1 = 50
End Sub
Private Sub OKButton_Click()
sPID.Proportion = Val(Form1.Text2.Text)
sPID.Integral = Val(Form1.Text3.Text)
sPID.Derivative = Val(Form1.Text5.Text)
sPID.SetPoint = 30
SysPar.T1 = Val(Form1.Text6.Text)
SysPar.T = Val(Form1.Text7.Text)
'Form1.TChart1.Series(0).Clear
Form1.Cls
End Sub
Private Sub OKButton1_Click()
Dim i As Integer
Dim j As Integer
Dim start As Integer
Dim endpoi As Integer
Dim sOUT(20000) As Double
start = Val(Text8.Text)
endpoi = Val(Text9.Text)
Form1.Cls
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
Form1.TChart1.AddSeries (scLine)
Form1.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
Form1.TChart1.AutoRepaint = False
Form1.TChart1.Series(0).Add sOUT(i - 1), j, vbBlue
Form1.TChart1.AutoRepaint = True
Form1.TChart1.Repaint
End If
'TChart1.Repaint
'TChart1.Visible = True
Form1.Text1.Text = j
Form1.Text4.Text = sOUT(i - 1)
Form1.Text1.Refresh
Form1.Text4.Refresh
Call Sleep(0.01)
Next i
End Sub
Private Sub simulate_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
'Add Series at runtime
TChart1.AddSeries (scLine)
TChart1.Series(0).Clear
'TChart1.Axis.Left.SetMinMax 1, 20000
'TChart1.Axis.Top.SetMinMax 1, 40
'绘制系统的时间响应
'Form1.Circle (0, 0), 20, vbRed
For i = 1 To 20000 Step 1
If i Mod 20 = 0 Then
TChart1.AutoRepaint = True
TChart1.Series(0).Add sOUT(i - 1), i, vbYellow
TChart1.AutoRepaint = True
TChart1.Repaint
End If
'TChart1.Visible = false
Text1.Text = i
Text4.Text = sOUT(i - 1)
Text1.Refresh
Text4.Refresh
Call Sleep(0.01)
Next i
End Sub