请叫我老铁
人生就像蒲公英,看似自由,却身不由己。
级别: 工控侠客

精华主题: 0
发帖数量: 905 个
工控威望: 4296 点
下载积分: 597 分
在线时间: 241(小时)
注册时间: 2015-08-28
最后登录: 2024-12-23
查看请叫我老铁的 主题 / 回贴
楼主  发表于: 2018-08-15 15:12
S7-1200  PID闭环运算  SCL  编写     不使用PID指令,自己编写算法。  博途V14    SP1可打开程序  带注释
附件: PID闭环运算程序.rar (344 K) 下载次数:6017
网站提示: 请不要用迅雷下载附件,容易出错
本帖最近评分记录:
  • 下载积分:+1(245503681) 感谢分享!
  • 下载积分:+3(jack_gaogm) 感谢分享!
  • 下载积分:+1(xhilyxhily)
    hoojjj
    级别: 正式会员
    精华主题: 0
    发帖数量: 6 个
    工控威望: 95 点
    下载积分: 534 分
    在线时间: 12(小时)
    注册时间: 2010-04-30
    最后登录: 2023-11-27
    查看hoojjj的 主题 / 回贴
    1楼  发表于: 2021-09-30 09:10
    FUNCTION_BLOCK "块_1"
    { S7_Optimized_Access := 'TRUE' }
    VERSION : 0.1
       VAR_INPUT
          p值 : Real;
          积分 : Real;
          反馈值 : Int;
          设定值 : Real;
          PID死区 : Real;
          PID上限 : Real;
          PID下限 : Real;
       END_VAR

       VAR_OUTPUT
          输出控制值 : Real;
          反馈过程值 : Real;
          PID输出 : Int;
       END_VAR

       VAR_TEMP
          当前误差 : Real;
          上次误差 : Real;
          计算当前输出值 : Real;
          计算上次输出值 : Real;
          反馈过程值临时存储 : Real;
          输出过程值临时存储 : Real;
       END_VAR


    BEGIN
        
        #反馈过程值临时存储 := INT_TO_REAL(#反馈值);//反馈值转成浮点数存入到临时存储区。
        #反馈过程值 := (#反馈过程值临时存储 - 0.0) / 27648.0 * (#PID上限 - #PID下限) + #PID下限;//反馈过程值处理公式。
        #当前误差 := #设定值 - #反馈过程值;//算出当前误差值。
        IF  ABS(#当前误差)<#PID死区 THEN//PID死区大于当前误差的绝对值时。(使用绝对值表示无论是整数还是负数都不允许超出比较范围)。
            #计算当前输出值 := 0;      //如果上述条件成立,当前输出值为0.
        ELSIF  ABS(#当前误差)>=#PID死区 THEN//PID死区小于等于当前误差,执行下面公式。
            #计算当前输出值 := #p值 * (#当前误差 - #上次误差) + #积分 * #当前误差;//此公式在S7-200PID课程有讲,PID输出=p值*(当前误差-上次误差)+积分*当前误差。
        END_IF;
        #输出控制值 := #计算当前输出值;//将当前值输出值传送到输出控制值,再进行下一步处理。
        IF #输出控制值 > #PID上限 THEN//如果输出控制值大于PID上限值。
            #输出控制值 := #PID上限;//将上限值写入输出控制值。
        ELSIF #输出控制值 < #PID下限 THEN//如果输出控制值小于PID下限值。
            #输出控制值 := #PID下限;//将下限值写入输出控制值。
        END_IF;
        #上次误差 := #当前误差;//处理完成将当前误差写入上次误差。
        #计算上次输出值 := #输出控制值;//处理完成将输出控制值写入上次输出值。
        #输出过程值临时存储 := (#输出控制值 - #PID下限) / (#PID上限 - #PID下限) * 27648.0 + 0.0;//PID输出处理成0.0--27648.0范围。
        #PID输出 := REAL_TO_INT(#输出过程值临时存储);//再小数0.0--27648.0转换成16位整数0-27648范围。
    END_FUNCTION_BLOCK
    hoojjj
    级别: 正式会员
    精华主题: 0
    发帖数量: 6 个
    工控威望: 95 点
    下载积分: 534 分
    在线时间: 12(小时)
    注册时间: 2010-04-30
    最后登录: 2023-11-27
    查看hoojjj的 主题 / 回贴
    2楼  发表于: 2021-09-30 11:40
    #计算当前输出值 := #p值 * (#当前误差 - #上次误差) + #积分 * #当前误差;
    這PID 有點問題, 好像不是很純正
    還是感謝分享
    hoojjj
    级别: 正式会员
    精华主题: 0
    发帖数量: 6 个
    工控威望: 95 点
    下载积分: 534 分
    在线时间: 12(小时)
    注册时间: 2010-04-30
    最后登录: 2023-11-27
    查看hoojjj的 主题 / 回贴
    3楼  发表于: 2021-09-30 11:59
    正確的PD 控制器如下計算方式

    #计算当前输出值 := #p值 *   #当前误差+ #微分 * (#当前误差 - #上次误差)