发表于:2004-12-28 17:47:00
25楼
-------MCGS脚本pid的实现方法---------------------
'PID循环策略,可以放在mcgs的循环策略中,循环周期100毫秒
'Pv输出、Sv设定、OP值使用实时曲线显示即可。
' '* 确保控制周期不为0
If 控制周期 = 0 Then 控制周期 = 1
' '* 计算PV值的量程,并确保其不为0
PV量程 = sngPvMax - sngPvMin
If PV量程 <= 0 Then PV量程 = 1
'* '* PV值和SV值必须在设定的限值范围之内
If Pv输出 < 0 Then Pv输出 = 0
If Pv输出 > 300 Then Pv输出 = 300
If Sv设定 < 0 Then Sv设定 = 0
If Sv设定 > 300 Then Sv设定 = 300
' * 计算SV和PV值的差值,第一次计算时,取上次SVPV差值、过程中SVPV差值值和本次SVPV差值相同
m_SVPV差值 = Sv设定 - Pv输出
'设定上次SVPV差值的初值为111111;标记是否第一次进行PID计算,防止本次SVPV差值和1过程中SVPV差值的值为0
If 上次SVPV差值 = 111111 Then
上次SVPV差值 = 本次SVPV差值
过程中SVPV差值 = 本次SVPV差值
EndIf
'控制周期 :调节周期,和设备的采集周期相同(单位为:秒)
If 积分系数 <> 0 Then
输出增加值= 微分系数 * (本次SVPV差值 - 上次SVPV差值 + 本次SVPV差值 * 控制周期 / 积分系数 + (本次SVPV差值 - 2 * 上次SVPV差值 + 过程中SVPV差值) * 比例系数 / 控制周期)
Else
输出增加值= 微分系数 * (本次SVPV差值 - 上次SVPV差值 + (本次SVPV差值 - 2 * 上次SVPV差值 + 过程中SVPV差值) * 比例系数 / 控制周期)
EndIf
过程中SVPV差值 = 上次SVPV差值
上次SVPV差值 = 本次SVPV差值
'* 处在死区范围,输出值保持不变
If !Abs(本次SVPV差值) < !Abs(死区范围) Then 输出增加值= 0
'* 当PID控制的调节方向方向不一样时,输出值的处理方法不一致
If sngCtlDirection = 1 Then
OP值 = OP值 + 输出增加值
'* 正向控制时的超调处理
If !Abs(本次SVPV差值) >= 超调范围 And 超调范围 > 0 Then
If 本次SVPV差值 > 0 Then OP值 = 超调输出
EndIf
Else
OP值 = OP值 - 输出增加值
'* 反向控制时的超调处理
If !Abs(本次SVPV差值) >= 超调范围 And 超调范围 > 0 Then
If 本次SVPV差值 < 0 Then OP值 = 超调输出
EndIf
EndIf
If OP值 < 0 Then OP值 = 0
If OP值 > 100 Then OP值 = 100