技术论坛

PID的无扰动切换

作者 主题
至圣

经验值: 19345
发帖数: 2077
精华帖: 72
主题:【分享】PID的无扰动切换
推荐帖


只看楼主 楼主 2020-06-28 14:49:49

PID的无扰动切换,简而言之就是手动调节切换到自动调节时,自动调节积分项从当前手动输出开始,就是将当前输出给积分初始化。

手上有个倍福PLC项目,用变频风机调节管道气体温度,我在调用系统PID库指令时,发现积分项被定义成静态变量,从库指令外部根本没法对积分项操作,如此简单的需求,居然不能实现,只好用自己动手写一段PID程序:

1,先定义PID接口


FUNCTION_BLOCK PID
VAR_INPUT
 Man_Auto:BOOL; (*手动自动切换,手动:=1,自动:=0*)
 Man_Value:REAL;   (*手动给定输入值*)
 PVn : REAL;           (*过程值输入,或反馈值、测量值*)
 SPn :REAL;             (*自动调节时的设定值、目标值*)
 Kc :REAL;           (*P参数0.01-99.99*)
 Ts :REAL;             (*PID的扫描执行周期,单位秒;比如100ms执行一次,则为0.1s*)
 Ti :REAL;            (*积分时间,单位秒;0.1-99.99*,不允许为0,可在外部限制*)
 Td :REAL;             (*微分时间,单位秒;0.01-99.99*)
END_VAR

VAR_OUTPUT
 Mn :REAL;        (*PID输出*)
END_VAR


VAR

 ManAutoLast:BOOL;   (*手动自动切换的上次状态*)
 AutoEdge:BOOL;        (*自动状态上升沿*)
 Mx:REAL;           (*PID计算的积分项*)
 EVn:REAL;          (*本次周期目标值与过程值的偏差,error value的首字母*)
 EVn0:REAL;          (*上一次计算周期的偏差值*)
 MPn:REAL;          (*PID计算的比例项*)
 MDn:REAL;            (*PID计算的微分项*)
END_VAR

(********)

2,PID程序:

AutoEdge:= ManAutoLast  AND (NOT Man_Auto ); (***手动转自动上升沿**)
ManAutoLast:=Man_Auto;
IF AutoEdge THEN
    Mx:= LIMIT(20.0,Man_Value,60.0);  (*自动调节时,积分初始化*)  
END_IF

IF Man_Auto THEN
     Mn:= LIMIT(20.0,Man_Value, 60.0);   (*手动调节时给定值*)
ELSE
     EVn:=(SPn - PVn ) ;                         (*自动调节PID计算*)
     MPn  := LIMIT(-60.0,(Kc * EVn),60.0) ;   (*设置比例项的边界*)
            IF Mn>0.0 AND  Mn<100.0 THEN      (*为防止积分饱和,设置冻结积分计算的条件*)
                       Mx:=LIMIT(18.0,( Kc*Ts/Ti*EVn+Mx), 100.0);   (*积分项计算公式,并设置边界*)
             END_IF
     MDn := Kc * Td / Ts * (EVn  -  EVn0);
     Mn:=LIMIT(18.0,(MPn+Mx+MDn),60.0);    (*PID计算:= 比例项+积分项+微分项;积分项是主干*)
     EVn0:=EVn;    
END_IF



大道至简,知易行难
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1629752&b_id=66&s_id=0&num=34

至圣

经验值: 19345
发帖数: 2077
精华帖: 72
回复:PID的无扰动切换
推荐帖


只看楼主 楼主 1楼 2020-06-28 14:51:57

以上程序大体上可以直接在1500plc上使用,只是limit指令需要稍微修改一下。

若问最简洁的PID计算,舍此其谁?


大道至简,知易行难
以下网友喜欢您的帖子:

  
至圣

经验值: 13019
发帖数: 1815
精华帖: 22
回复:PID的无扰动切换
推荐帖


只看楼主 3楼 2020-06-29 09:01:10


感谢分享,造的轮子还不错;官方手册里也有类似切换的步骤。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 18407
发帖数: 2409
精华帖: 1
回复:PID的无扰动切换
推荐帖


只看楼主 4楼 2020-06-29 10:34:13

看来倍福有待改进1


 
以下网友喜欢您的帖子:

  
至圣

经验值: 18898
发帖数: 2108
精华帖: 0
回复:PID的无扰动切换
推荐帖


只看楼主 5楼 2020-06-29 11:14:54

收藏了,感谢楼主分享!


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10582
发帖数: 1796
精华帖: 0
回复:PID的无扰动切换


只看楼主 6楼 2020-06-29 16:47:34


谢谢楼主的分享,学习了


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 7133
发帖数: 1022
精华帖: 2
回复:PID的无扰动切换
推荐帖


只看楼主 7楼 2020-06-30 08:56:09


谢谢楼主分享!


心有多远路就有多远
以下网友喜欢您的帖子:

  
侠圣

经验值: 2480
发帖数: 118
精华帖: 1
回复:PID的无扰动切换


只看楼主 8楼 2020-07-02 06:52:38
好贴,感谢分享。
学无止境
以下网友喜欢您的帖子:

  
至圣

经验值: 12573
发帖数: 2503
精华帖: 31
回复:PID的无扰动切换


只看楼主 9楼 2020-07-02 09:30:26
吓……
这个PID公式真的可以???
我在网上找的增量式式PID公式。手动时不执行PID计算,输出结果是可以通过触摸屏修改的。自动时由PID计算结果累加,触摸屏修改不了的。
比如,自动时每周期累加0.5到50时,切换到手动不计算PID了输出值一直就是50不变,此时可以通过触摸屏修改该输出值为想要的输出值60。当切换回自动后,又开始PID计算,输出值累加PID计算值是60.5,这样输出值就不会突变了。
 
以下网友喜欢您的帖子:

  
游民

经验值: 148
发帖数: 5
精华帖: 0
回复:PID的无扰动切换


只看楼主 10楼 2020-07-06 15:22:43


感谢你的分享。


 
以下网友喜欢您的帖子:

  
游民

经验值: 54
发帖数: 7
精华帖: 0
回复:PID的无扰动切换


只看楼主 11楼 2020-07-08 15:23:44

学习了,不错


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10022
发帖数: 2779
精华帖: 26
回复:PID的无扰动切换


只看楼主 12楼 2020-07-09 00:31:40

现在西门子的pid_compact功能块不具备这个功能吗?



 
以下网友喜欢您的帖子:

  
至圣

经验值: 15532
发帖数: 1735
精华帖: 0
回复:PID的无扰动切换


只看楼主 13楼 2020-07-09 08:20:07
以下是引用看雪001在2020-06-28 14:49:49的发言 >楼主

PID的无扰动切换,简而言之就是手动调节切换到自动调节时,自动调节积分项从当前手动输出开始,就是将当前输出给积分初始化。

手上有个倍福PLC项目,用变频风机调节管道气体温度,我在调用系统PID库指令时,发现积分项被定义成静态变量,从库指令外部根本没法对积分项操作,如此简单的需求,居然不能实现,只好用自己动手写一段PID程序:

1,先定义PID接口


FUNCTION_BLOCK PID
VAR_INPUT
 Man_Auto:BOOL; (*手动自动切换,手动:=1,自动:=0*)
 Man_Value:REAL;   (*手动给定输入值*)
 PVn : REAL;           (*过程值输入,或反馈值、测量值*)
 SPn :REAL;             (*自动调节时的设定值、目标值*)
 Kc :REAL;           (*P参数0.01-99.99*)
 Ts :REAL;             (*PID的扫描执行周期,单位秒;比如100ms执行一次,则为0.1s*)
 Ti :REAL;            (*积分时间,单位秒;0.1-99.99*,不允许为0,可在外部限制*)
 Td :REAL;             (*微分时间,单位秒;0.01-99.99*)
END_VAR

VAR_OUTPUT
 Mn :REAL;        (*PID输出*)
END_VAR


VAR

 ManAutoLast:BOOL;   (*手动自动切换的上次状态*)
 AutoEdge:BOOL;        (*自动状态上升沿*)
 Mx:REAL;           (*PID计算的积分项*)
 EVn:REAL;          (*本次周期目标值与过程值的偏差,error value的首字母*)
 EVn0:REAL;          (*上一次计算周期的偏差值*)
 MPn:REAL;          (*PID计算的比例项*)
 MDn:REAL;            (*PID计算的微分项*)
END_VAR

(********)

2,PID程序:

AutoEdge:= ManAutoLast  AND (NOT Man_Auto ); (***手动转自动上升沿**)
ManAutoLast:=Man_Auto;
IF AutoEdge THEN
    Mx:= LIMIT(20.0,Man_Value,60.0);  (*自动调节时,积分初始化*)  
END_IF

IF Man_Auto THEN
     Mn:= LIMIT(20.0,Man_Value, 60.0);   (*手动调节时给定值*)
ELSE
     EVn:=(SPn - PVn ) ;                         (*自动调节PID计算*)
     MPn  := LIMIT(-60.0,(Kc * EVn),60.0) ;   (*设置比例项的边界*)
            IF Mn>0.0 AND  Mn<100.0 THEN      (*为防止积分饱和,设置冻结积分计算的条件*)
                       Mx:=LIMIT(18.0,( Kc*Ts/Ti*EVn+Mx), 100.0);   (*积分项计算公式,并设置边界*)
             END_IF
     MDn := Kc * Td / Ts * (EVn  -  EVn0);
     Mn:=LIMIT(18.0,(MPn+Mx+MDn),60.0);    (*PID计算:= 比例项+积分项+微分项;积分项是主干*)
     EVn0:=EVn;    
END_IF



谢谢楼主分享!


海纳百川,厚德务实!
以下网友喜欢您的帖子:

  
至圣

经验值: 13019
发帖数: 1815
精华帖: 22
回复:PID的无扰动切换


只看楼主 14楼 2020-07-09 08:51:56

      有些应用自己造的轮子就不错;比如以前发的一个案例就用拼凑的方法造的轮子做的.

      图片一是单独的内环压力闭环精度±0.16帕斯卡.(全程十几个小时都有针对压力的外界微扰动).

      图片二是将压力作为内环,液位作为外环最终的微扰动液位数据精度±5um.(全程十几个小时都有针对液位的外界微扰动).

      刚开始根据传感器,执行器等因素认为给定压差200帕斯卡最多能精确到±1帕斯卡,最后自己拼凑计算数字精度上达到±0.16帕斯卡左右.

      刚开始根据传感器,执行器等因素认为给定液位6.4毫米最多能精确到±20um,最后自己拼凑计算数字精度上达到±5um.

      数据精度在同一个系统中的采样,滤波,控制,输出应该是自洽的,是可以说的过去的. 如果引入第三方测量精度应该不会相差太多.

      一个工况简单系统的压力控制做到±1到2帕斯卡可能相对容易,要做到0.2帕斯卡左右就难了要想很多办法;同样针对液位做到±20um可能相对容易,但是要做到5um左右就难了也要想很多办法.





 
以下网友喜欢您的帖子:

  
至圣

经验值: 19345
发帖数: 2077
精华帖: 72
回复:PID的无扰动切换


只看楼主 楼主 15楼 2020-07-09 10:51:17
以下是引用小釉在2020-07-09 00:31:40的发言 >12楼

现在西门子的pid_compact功能块不具备这个功能吗?


西门子的pid_compact功能块有个输入引脚叫做"I_ITLVAL",定义为“积分作用的初始化值”;同时输出还有一个“LMN_I”,定义为积分组件,我这里把两个引脚合二为一。

pid_compact功能块有些引脚比如“D-SEL”默认是不打开的,而“TD”(微分时间)默认是10s,有些人忘了打开微分开关,仅仅是调节微分时间,发现不起作用啊!我的程序里默认是打开微分,微分时间默认值是0,同样的设置,但简洁得多。

有的人喜欢刨根问题,有的人喜欢不求甚解,怎么说呢,看各人使用习惯吧




大道至简,知易行难
以下网友喜欢您的帖子:

  
至圣

经验值: 16723
发帖数: 1309
精华帖: 2
回复:PID的无扰动切换


只看楼主 16楼 2020-07-09 21:12:48

无扰切换很重要


同一个问题ID下,已经先回答此问题的人,如再参考我答案而修改自己答案的,就是王八蛋!
以下网友喜欢您的帖子:

  
至圣

经验值: 43587
发帖数: 15780
精华帖: 61
回复:PID的无扰动切换


只看楼主 18楼 2020-07-10 08:56:46

无扰动切换需要自动跟随,即手动状态下,自动输出值跟随手动输出值,自动状态下,手动输出值跟随自动输出值,这样在切换的时候,才能实现无扰动切换,不知道楼主什么意思呢?比如当前输出值是10%,难道你切换时候要非要输出20%~60%之间的值吗?你这是人为增加干扰,不是无扰。

不要总是摸石头过河,已经造好桥了。


活到老,学到老!为了生活学习吧!
以下网友喜欢您的帖子:

  
至圣

经验值: 19345
发帖数: 2077
精华帖: 72
回复:PID的无扰动切换


只看楼主 楼主 19楼 2020-07-10 09:00:08
以下是引用宝冬在2020-07-09 23:02:36的发言 >17楼

西门子的PID也支持无扰切换(超驰控制),单个PID的语句如下:

"PID_Compact".PIDCtrl.PIDInit := TRUE;  

"PID_Compact".OverwriteInitialOutputValue := "PID_Compact".Output; 

或者

"PID_Temp".PIDCtrl.PIDInit := TRUE;  

"PID_Temp".OverwriteInitialOutputValue := "PID_Temp".PidOutputSum;


超驰控制并不等同于无扰动切换。

比如程序中限定积分项的范围(0-100%),积分项不是-100% - +100%,这个PID就不是所谓“三步法”,积分项超过0-100%这个边界,就停止积分运算,靠比例运算和微分运算迅速把过程值拉回来,这属于超驰控制的策略;

有时候靠一个传感器反馈过程值是不可靠的,传感器损坏或安装不到位导致反馈值并不真实,这时候需要两个或以上的传感器同时反馈过程值,程序中始终监控传感器的可靠性,一旦发现传感器异常,就切换到另一个通道,这种控制策略不能叫”冗余“,也是叫”超驰“。

 我这个系统就是用到两个K型热电偶监控管路中同一点温度值,K型热电偶测温范围-200 -1372℃,当热电偶通道开路时显示温度值1372℃,而管路温度正常值绝不会超过700℃,那么,判断热电偶工作是否正常只需要监控两个K型热电偶数值是不是超过700以上即可:

PROGRAM MainFanCtr
VAR
 PID1: PID;
        ActualValue:REAL;

END_VAR

……

IF K1<1000 AND K2<1000 THEN (*1,以DOC后温度作为PID过程值; 2,若K1、K2正常,取大值作为过程*)
             ActualValue:= MAX(K1,K2);
ELSE
             ActualValue:= MIN(K1,K2);
END_IF;

IF  HMI_AO0_I <0.1 THEN HMI_AO0_I :=0.1; END_IF; (*积分时间不可设置为0*)

PID1(

SPn:= ActualValue    ,

……



大道至简,知易行难
以下网友喜欢您的帖子:

  
至圣

经验值: 19345
发帖数: 2077
精华帖: 72
回复:PID的无扰动切换


只看楼主 楼主 20楼 2020-07-10 09:10:40
以下是引用zhangli0在2020-07-10 08:56:46的发言 >18楼

无扰动切换需要自动跟随,即手动状态下,自动输出值跟随手动输出值,自动状态下,手动输出值跟随自动输出值,这样在切换的时候,才能实现无扰动切换,不知道楼主什么意思呢?比如当前输出值是10%,难道你切换时候要非要输出20%~60%之间的值吗?你这是人为增加干扰,不是无扰。

不要总是摸石头过河,已经造好桥了。

你的理解有误!

我这里只需要手动切换到自动状态时,输出没有波动;而自动切换到手动时不必有这个要求(其实要这个需求也是很简单的)

标准封装的PID算法考虑到通用性,所有输入输出都在一个“量纲”内计算,即0-100%,而我的控制对象是变频器,要求的频率范围是20-60Hz,我无需搞一个量纲(FC105)然后再转换到工程量(FC106),这好比脱裤子放屁,多此一举。


大道至简,知易行难
以下网友喜欢您的帖子:

  
至圣

经验值: 19345
发帖数: 2077
精华帖: 72
回复:PID的无扰动切换


只看楼主 楼主 21楼 2020-07-10 09:27:38

帖子里面有些话并不是针对PID计算本身的算法逻辑,而是引申到一个问题:到底要不要重新造轮子?

你都没看懂这个PID内核的逻辑,却来发表你所谓的“重新造轮子的必要性”,那不是虾炒蛋吗?


大道至简,知易行难
以下网友喜欢您的帖子:

  
收起
PID的无扰动切换
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。