MCGS触摸屏-PID_脚本实现 点击:1354 | 回复:13



勇士-王者之师

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 34回
  • 年度积分:56
  • 历史总积分:150
  • 注册:2004年11月11日
发表于:2023-03-18 10:49:52
楼主


PID_脚本实现.MCG

image.png


image.png


image.png


image.png


image.png

最后贴上脚本:


液位计算:

outputwater =sngOp/100


sngPv=sngPv+inputwater/100-outputwater 


if sngPv>100 then 

   sngPv=100

endif


if sngPv<=0 then 

   sngPv=0

endif


k1=1

if inputwater <=0 then k1=0


k2=1

if outputwater<=0 then k2=0


PID控制:

'* asngDataValue(0) = PV

   '* asngDataValue(1) = SV

   '* asngDataValue(2) = OP

   '* asngDataValue(3) = P

   '* asngDataValue(4) = I

   '* asngDataValue(5) = D


'   sngParP          = 250  '*  比例系数P

'   sngParI          = 50   '*  积分系数I

'   sngParD          = 5    '*  微分系数D

'   sngPvMin         = 0    '*  PV 值下限

'   sngPvMax         = 300  '*  PV 值上限

'   sngSvMin         = 0    '*  SV 值下限

'   sngSvMax         = 300  '*  SV 值上限

'   sngOpMin         = 0   '*  OP 值下限

'   sngOpMax         = 100 '*  OP 值上限

'   sngChangeMin     = 1   '*  死区范围

'   sngChangeMax     = 10  '*  调节范围

'   sngOutPutMax     = 80  '*  超调时输出

'   sngCtlDirection  = 1   '*  调节方向

'   sngControlT      = 100   '*  PID的调控周期,和设备的采集周期相同


'   Dim sngPVRange         '*  PV值的量程

'   Dim sngOutdx           '*  PID计算出的输出增加值

'


'   '*  确保控制周期不为0

   If sngControlT = 0 Then sngControlT = 1


'   '*  计算PV值的量程,并确保其不为0

   sngPVRange = sngPvMax - sngPvMin

   If sngPVRange <= 0 Then sngPVRange = 1


'   '*  把超调值由百分比转换成实际物理量

'   sngChangeMax = sngPVRange * sngChangeMax / 100


'* ======================================================================================

'   '*  PV值和SV值必须在设定的限值范围之内

'   If sngPv < sngPvMin Then sngPv = sngPvMin

'   If sngPv > sngPvMax Then sngPv = sngPvMax

'   If sngSv < sngSvMin Then sngSv = sngSvMin

'   If sngSv > sngSvMax Then sngSv = sngSvMax


   If sngPv < 0 Then sngPv = 0

   If sngPv > 300 Then sngPv = 300

   If sngSv < 0 Then sngSv = 0

   If sngSv > 300 Then sngSv = 300



'  * =================================================================================================

'  *  计算SV和PV值的差值,第一次计算时,取m_sngSvPvdx1、m_sngSvPvdx2值和m_sngSvPvdx相同


' m_sngSvPvdx    '*  本次调控时SV和PV值的差值

' m_sngSvPvdx1   '*  上次调控时SV和PV值的差值

' m_sngSvPvdx2   '*  调控过程中SV和PV值的差值的累计和


   m_sngSvPvdx = sngSv - sngPv


'设定m_sngSvPvdx1的初值为111111;标记是否第一次进行PID计算,防止m_sngSvPvdx和1m_sngSvPvdx2的值为0


   If m_sngSvPvdx1 = 111111 Then

     m_sngSvPvdx1 = m_sngSvPvdx

     m_sngSvPvdx2 = m_sngSvPvdx

   EndIf



'*  进行PID运算,sngParI=0 和 sngParI<>0的算法不一样


'sngControlT :调节周期,和设备的采集周期相同(单位为:秒)



   If sngParI <> 0 Then

      sngOutdx = sngParP * (m_sngSvPvdx - m_sngSvPvdx1 + m_sngSvPvdx * sngControlT / sngParI + (m_sngSvPvdx - 2 * m_sngSvPvdx1 + m_sngSvPvdx2) * sngParD / sngControlT)

   Else

      sngOutdx = sngParP * (m_sngSvPvdx - m_sngSvPvdx1 + (m_sngSvPvdx - 2 * m_sngSvPvdx1 + m_sngSvPvdx2) * sngParD / sngControlT)

   EndIf


   m_sngSvPvdx2 = m_sngSvPvdx1

   m_sngSvPvdx1 = m_sngSvPvdx


   '*  处在死区范围,输出值保持不变

   If !Abs(m_sngSvPvdx) < !Abs(sngChangeMin) Then sngOutdx = 0


   '*  当PID控制的调节方向方向不一样时,输出值的处理方法不一致

   If sngCtlDirection = 1 Then

     sngOP = sngOP + sngOutdx


      '*  正向控制时的超调处理

      If !Abs(m_sngSvPvdx) >= sngChangeMax And sngChangeMax > 0 Then

         If m_sngSvPvdx > 0 Then sngOP = sngOutPutMax

      EndIf

   Else

      sngOP = sngOP - sngOutdx


      '*  反向控制时的超调处理

      If !Abs(m_sngSvPvdx) >= sngChangeMax And sngChangeMax > 0 Then

         If m_sngSvPvdx < 0 Then sngOP = sngOutPutMax

      EndIf

   EndIf


   '*  OP值必须在设定的限值范围之内

   'If sngOP < sngOpMin Then sngOP = sngOpMin

   'If sngOP > sngOpMax Then sngOP = sngOpMax


   If sngOP < 0 Then sngOP = 0

   If sngOP > 100 Then sngOP = 100


正在下载,请等待……
下载附件需0积分!



楼主最近还看过



徐丫头

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 91回
  • 年度积分:463
  • 历史总积分:463
  • 注册:2023年1月30日
发表于:2023-03-20 11:24:23
1楼

谢谢

linhai0215

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 37回
  • 年度积分:8
  • 历史总积分:13
  • 注册:2008年10月05日
发表于:2023-03-20 21:10:39
2楼
学习领孜

huoshi

  • 精华:0帖
  • 求助:22帖
  • 帖子:347帖 | 2576回
  • 年度积分:561
  • 历史总积分:23189
  • 注册:2020年3月27日
发表于:2023-03-21 07:43:11
3楼

谢谢老师分享学习学习

chenrenfu

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 651回
  • 年度积分:23
  • 历史总积分:127
  • 注册:2011年9月08日
发表于:2023-03-21 08:58:44
4楼

感谢分享!

丸子爱玩

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 64回
  • 年度积分:172
  • 历史总积分:233
  • 注册:2021年12月30日
发表于:2023-03-22 08:37:27
5楼

感谢分享!

LBX112233

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 713回
  • 年度积分:214
  • 历史总积分:601
  • 注册:2012年5月10日
发表于:2023-03-28 15:07:39
6楼

谢谢分享,,,学习学习。。

白羊座

  • 精华:0帖
  • 求助:2帖
  • 帖子:11帖 | 86回
  • 年度积分:37
  • 历史总积分:181
  • 注册:2019年10月19日
发表于:2023-03-31 19:57:12
7楼

感谢分享


LuckyShel

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 8回
  • 年度积分:43
  • 历史总积分:98
  • 注册:2022年11月11日
发表于:2023-04-03 10:50:31
8楼

谢谢老师分享学习学习

卢国才

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 114回
  • 年度积分:110
  • 历史总积分:160
  • 注册:2022年3月02日
发表于:2023-05-12 17:13:40
9楼

666

sumex

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 113回
  • 年度积分:0
  • 历史总积分:89
  • 注册:2017年4月02日
发表于:2023-05-12 18:23:52
10楼

可以啊,不收费

勇士-王者之师

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 34回
  • 年度积分:56
  • 历史总积分:150
  • 注册:2004年11月11日
发表于:2023-05-14 17:21:38
11楼

"sumex" 的回复,发表在10楼
        对内容: 【可以啊,不收费】进行回复:

        -----------------------------------------------------------------


共享精神嘛。开源。大家共同学习进步。

ooky

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 93回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2023-05-14 18:08:22
12楼

楼主的无私奉献,谢谢

晕菜123456

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 445回
  • 年度积分:6
  • 历史总积分:80
  • 注册:2017年4月11日
发表于:2023-06-14 14:06:04
13楼

感谢楼主无私分享


热门招聘
相关主题

官方公众号

智造工程师