搜索
bottom↓
楼主: tyw996

基于西门子PID程序的C程序代码(带自整定功能哦)

  [复制链接]

出0入0汤圆

发表于 2015-9-23 19:24:08 | 显示全部楼层
学习一下,非常好的资料。

出0入0汤圆

发表于 2015-9-23 20:35:08 | 显示全部楼层
mark,学习ing

出0入0汤圆

发表于 2015-9-23 22:34:07 | 显示全部楼层
maark一下

出0入0汤圆

发表于 2015-9-24 00:01:21 | 显示全部楼层
mark        ~~学习了!

出0入16汤圆

发表于 2015-9-24 11:45:31 | 显示全部楼层
学习一下,好资料

出0入0汤圆

发表于 2015-9-29 01:10:21 | 显示全部楼层
tyw996 发表于 2013-6-1 09:39
我测试的控温精度能达到0.1度(结果出来后,我自己都感到惊叹),当然这只是在我这个项目中的测试结果。以 ...

控温精度0.1度, 请问你的测量温度精度是多少?

出0入0汤圆

发表于 2015-9-29 16:25:21 | 显示全部楼层
请问下各位参与这个程序的高手,
发现程序中有一段:

LMN_I = sIanteilAlt + rDiff ;
sRestInt = sIanteilAlt - LMN_I + rDiff ;

这个变量 sRestInt  最后不是一直为0吗?
还是我哪里理解错误了?

出0入0汤圆

发表于 2015-9-29 17:07:55 | 显示全部楼层
chinaboy25 发表于 2015-9-23 16:26
请问下楼主:程序的 591行是写错了还是我理解错了?
                              if( TD != 0.0 && ! MA ...

请问你提出的疑问解决了吗?

同样的,我发现积分和微分都存在这样的问题

LMN_I = sIanteilAlt + rDiff ;
sRestInt = sIanteilAlt - LMN_I + rDiff ;

出0入0汤圆

发表于 2015-9-29 17:25:57 | 显示全部楼层
wzavr 发表于 2015-9-29 17:07
请问你提出的疑问解决了吗?

同样的,我发现积分和微分都存在这样的问题

还没弄懂为什么?
你呢?

出0入0汤圆

发表于 2015-9-29 18:38:34 | 显示全部楼层
chinaboy25 发表于 2015-9-29 17:25
还没弄懂为什么?
你呢?

在发现这2段应该是程序有问题的地方后,
因为没找到lz改编前西门子原来的程序,也没在手册中找到对应可供参考的部分.

在没解决上述疑问前,感觉无法将本PID做的非常完美,因为缺少了PID中很重要的积分和微分部分.

出0入0汤圆

 楼主| 发表于 2015-9-29 21:32:20 | 显示全部楼层
本帖最后由 tyw996 于 2015-9-29 21:51 编辑
wzavr 发表于 2015-9-29 18:38
在发现这2段应该是程序有问题的地方后,
因为没找到lz改编前西门子原来的程序,也没在手册中找到对应可供参 ...


" float    sRestDif = 0.0 ;   //上周期微分偏差量(浮点数计算偏差)", 看看变量做的注释怎么说的,如果每次都等于零那才怪了呢.理论上应该没问题的。实际移值过来的原程序也是这样的。我想这就是程序为保证精度才多方面考虑偏差的完美所在。

出0入0汤圆

发表于 2015-9-29 21:53:51 | 显示全部楼层
tyw996 发表于 2015-9-29 21:32
" float    sRestDif = 0.0 ;   //上周期微分偏差量(浮点数计算偏差)", 看看变量做的注释怎么说的,如果 ...

lz所说的 sRestDif  这个变量的注释也看过,但是实际程序中经过分析,计算后赋值给sRestDif  的好像是一直为0.


程序中 sRestDif 的计算过程是这样的:

RueckAlt = sRueck ;
RueckDiff = CYCLE / TD * LMN_D + sRestDif ;
sRueck = RueckDiff + RueckAlt ;
sRestDif = RueckAlt - sRueck + RueckDiff ;

请看下 sRestDif  在计算结果是不是会是0?


请问lz,移植前的源程序能不能上传做个参考.

出0入0汤圆

 楼主| 发表于 2015-9-29 21:54:35 | 显示全部楼层
chinaboy25 发表于 2015-9-23 16:26
请问下楼主:程序的 591行是写错了还是我理解错了?
                              if( TD != 0.0 && ! MA ...

参见上面的回复。

出0入0汤圆

发表于 2015-9-29 22:03:07 | 显示全部楼层
看过西门子的原版程序了, 确实是这样, 但是计算方法有高手能解释下吗?
难道c语言我看糊涂了..... 哭啊.....

出0入0汤圆

 楼主| 发表于 2015-9-29 22:03:51 | 显示全部楼层
本帖最后由 tyw996 于 2015-9-29 22:07 编辑

其实我想这个即使等于零,也不会影响I D多少的。但从编程者的思想来考虑应该是更严谨些,毕竟所用到的硬件及编译软件不定,没准编译给优化掉了都有可能呢。源程序不便完全公开,我只能给你贴一部分.
IF TI <> 0.0 AND NOT I_ITL_ON THEN
                  IF NOT MAN_ON AND NOT sbOptLmn AND NOT sbConzOn THEN
                      rDiff := CYCLE / TI * ( LMN_P + sInvAlt) * 0.5 + sRestInt ;
                      IF ( rDiff > 0.0 AND ( INT_HPOS OR QLMN_HLM ) ) OR ( rDiff < 0.0 AND ( INT_HNEG OR QLMN_LLM ) )THEN
                          rDiff := 0.0;
                      END_IF;
                      LMN_I := sIanteilAlt + rDiff ;
                      sRestInt := sIanteilAlt - LMN_I + rDiff ;
                  END_IF;
              ELSE
                  sRestInt := 0.0 ;
                  IF I_ITL_ON THEN
                      LMN_I := I_ITLVAL ;
                  ELSE
                      LMN_I := 0.0 ;
                  END_IF;
              END_IF;

出0入0汤圆

 楼主| 发表于 2015-9-29 22:17:07 | 显示全部楼层
本帖最后由 tyw996 于 2015-9-29 22:18 编辑

sRueck = RueckDiff + RueckAlt ;sRestDif = RueckAlt - sRueck + RueckDiff ;这是浮点运算,而且是float(float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38)型的,就是很小的数理论上计算也是有偏差的。

出0入0汤圆

发表于 2015-9-29 22:23:50 | 显示全部楼层
tyw996 发表于 2015-9-29 22:03
其实我想这个即使等于零,也不会影响I D多少的。但从编程者的思想来考虑应该是更严谨些,毕竟所用到的硬件 ...

已经看过西门子原本的源程序了,lz转c语言的过程没有错误,
但是在测试pid的过程中发现,
即使在控制温度达到设定温度值时, 输出控制LMN很难有一个斜坡式缓慢变化的控制曲线,
而是出现近乎垂直的跳变.

当把sRestDif = RueckAlt - sRueck + RueckDiff ;  改为  sRestDif = RueckDiff;后
发现LMN的输出就不会出现跳变.

出0入0汤圆

 楼主| 发表于 2015-9-29 22:40:20 | 显示全部楼层
本帖最后由 tyw996 于 2015-9-29 22:44 编辑

嗯,有人说过这个积分使用的是抗积分饱和,微分属于不完全微分功能,采用的递归调用方式,是通过公式导出来的,但从程序里真的很难看出来。到现在一直使用,没发现有过问题。

出0入0汤圆

发表于 2015-9-30 09:29:16 | 显示全部楼层
楼主这么深入啊

出0入0汤圆

发表于 2015-10-12 16:33:12 | 显示全部楼层
记录一下,要重点看看。

出0入0汤圆

发表于 2015-10-19 10:56:22 | 显示全部楼层
你好,最近一看你发的PID自整定程序,调试了好久,一直是30005,没有用脉冲,只是LMM驱动。。PID()调用和CYCLE的时间是一样的。。不知道怎么调试下去了

出0入0汤圆

 楼主| 发表于 2015-10-20 14:06:37 | 显示全部楼层
weiz198901 发表于 2015-10-19 10:56
你好,最近一看你发的PID自整定程序,调试了好久,一直是30005,没有用脉冲,只是LMM驱动。。PID()调用和 ...

问题太笼统了,比如一开始就出错还是整定开始一段时间出错,还有关键参数数值设置的多大(不合适)造成的,控制是什么系统等等。

出0入0汤圆

发表于 2015-10-21 15:18:56 | 显示全部楼层
收藏,慢慢学习

出0入0汤圆

发表于 2015-11-3 17:36:37 | 显示全部楼层
这代码有点多,很复杂的感觉

出0入0汤圆

发表于 2015-12-24 10:42:07 | 显示全部楼层
tyw996 发表于 2013-6-13 13:12
原程序之所以将所有变量定义成全局变量,就是这个意思。也就是说所有大写的变量都是接口,所以定义到.h文 ...

请教下 能不能做个详细解释 :1.哪个变量是 目标设定值  2.哪个是采样输入值  3.如何调用算法

出0入0汤圆

发表于 2015-12-24 15:57:29 | 显示全部楼层
很复杂   

出0入0汤圆

发表于 2015-12-26 15:54:53 来自手机 | 显示全部楼层
用过很多pid就是还没用过自整定…

出0入0汤圆

发表于 2015-12-26 16:02:34 来自手机 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2016-1-18 13:26:18 | 显示全部楼层
一直要学习自整定,看一下。

出50入0汤圆

发表于 2016-1-18 20:05:59 来自手机 | 显示全部楼层
好东西,多谢楼主

出0入0汤圆

发表于 2016-1-21 21:36:35 | 显示全部楼层
楼主 这个怎么用了

出0入0汤圆

发表于 2016-1-27 10:14:42 | 显示全部楼层
学习一下,感谢楼主分享

出0入0汤圆

发表于 2016-3-12 17:47:31 | 显示全部楼层
很强大,我以前移植过1200的PID微分项滤波的不完全微分PID不过没自整定,学习了。

出0入0汤圆

发表于 2016-3-14 11:40:04 | 显示全部楼层
研究研究,看看能不能用到我的小四轴上。嘿嘿嘿

出0入0汤圆

发表于 2016-3-15 14:23:28 | 显示全部楼层
好好研究一下!

出0入0汤圆

发表于 2016-3-15 16:52:57 | 显示全部楼层
PID自整定!

出0入0汤圆

发表于 2016-3-24 13:22:52 | 显示全部楼层
yelang1124 发表于 2014-3-12 16:47
首先感谢楼主的热心解答,在此谢谢!,下面还有几个疑惑,还请楼主在百忙之余帮小弟看下,谢谢

        ...

您好!
麻烦问一下,关于如何确定TUN_DLMN, 有没有一个好的建议,谢谢!

出0入0汤圆

发表于 2016-3-24 13:44:03 | 显示全部楼层
tyw996 发表于 2014-10-25 20:14
1、自整定开启是人为控制的,PHASE由1-->2是有条件的,如果满足条件才能自动到2阶段。30005已经告诉了你 ...

您好!
继电器控制建议不要开启脉冲发生器(因百分比很小时继电器可能不会动作,PID控制会不稳定)
那百分比很小时应该如何处理,谢谢!

出0入0汤圆

 楼主| 发表于 2016-3-25 22:30:22 | 显示全部楼层
qrsgcslqg2011 发表于 2016-3-24 13:44
您好!
继电器控制建议不要开启脉冲发生器(因百分比很小时继电器可能不会动作,PID控制会不稳定)
那百分 ...

1、TUN_DLMN默认设置20,应该能满足一般的应用,可根据自己的工况去修改。
2、低于一定值时就设置为零,人为改动下LMN就可以了。

出0入0汤圆

发表于 2016-4-13 09:57:18 | 显示全部楼层
正好要搞这个,学习学习

出0入0汤圆

发表于 2016-5-5 21:35:49 | 显示全部楼层
确实好东西,之后研究。

出0入0汤圆

发表于 2016-5-6 11:33:55 | 显示全部楼层
楼主,你这个算法不是实时在线式整定算法吧,不算自适应算法,中间有随机扰动你这个算法也适用吗

出0入0汤圆

发表于 2016-5-6 12:42:51 | 显示全部楼层
mark,收下了,谢谢!

出0入0汤圆

发表于 2016-6-10 23:32:08 | 显示全部楼层
,好东西,很详细的文档,谢谢楼主

出0入0汤圆

发表于 2016-6-12 23:09:07 | 显示全部楼层
研究下,最近在搞温控,楼主帮大忙啦,,感谢。

出0入0汤圆

发表于 2016-6-24 15:37:02 | 显示全部楼层
好像挺复杂,研究一下,

出0入0汤圆

发表于 2016-8-1 20:17:15 | 显示全部楼层
不错,有空研究研究

出0入0汤圆

发表于 2016-8-16 22:28:48 | 显示全部楼层
再帮顶一下

出0入0汤圆

发表于 2016-9-1 09:34:19 | 显示全部楼层
非常不错哟,感谢

出0入0汤圆

发表于 2016-9-1 16:47:50 | 显示全部楼层
不错,先LOOK LOOk

出0入0汤圆

发表于 2016-9-1 17:13:51 | 显示全部楼层
不错,收藏下

出0入0汤圆

发表于 2016-9-1 17:38:27 | 显示全部楼层
有点麻烦

出0入0汤圆

发表于 2016-9-1 17:54:03 | 显示全部楼层
感谢LZ,mark一下

出0入0汤圆

发表于 2016-9-1 21:28:12 | 显示全部楼层
请问,会有例程放送吗、

出0入0汤圆

发表于 2016-9-1 21:55:14 | 显示全部楼层
先做个记号,有时间详细看看

出0入0汤圆

发表于 2016-9-4 07:28:37 来自手机 | 显示全部楼层
太好了,好东西

出0入0汤圆

发表于 2016-9-4 07:29:32 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2016-10-8 16:34:10 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2016-10-11 19:15:46 | 显示全部楼层
你好,我在论坛看到你写的PID代码,我想学习着做一个温控器,不知道你的PID部分代码,可以买吗?如果可以留个联系方式,我联系你。

出0入0汤圆

发表于 2016-10-12 21:17:59 | 显示全部楼层
听说挺复杂的,载下来慢慢研究

出0入4汤圆

发表于 2016-10-13 06:17:09 来自手机 | 显示全部楼层
好好学习学习

出40入18汤圆

发表于 2016-10-13 10:20:42 | 显示全部楼层
楼主的工作非常有意义

出0入0汤圆

发表于 2016-10-13 10:33:50 | 显示全部楼层
学习一下,非常好的资料。

出0入0汤圆

发表于 2016-10-13 16:52:53 | 显示全部楼层
带自整定的就是牛逼的PID,不知这个PID算法带宽是多少。之前接触过一个老美的电机控制器带自整定,非常牛逼好用。

出0入0汤圆

发表于 2016-11-7 13:43:18 | 显示全部楼层
yelang1124 发表于 2014-3-12 16:47
首先感谢楼主的热心解答,在此谢谢!,下面还有几个疑惑,还请楼主在百忙之余帮小弟看下,谢谢

        ...

楼主,你好,你的那个西门子的FB58的PID自整定程序弄得这么样啦?我也在搞,但是有几个地方不明白,还希望指教啊

出0入0汤圆

发表于 2016-11-7 13:45:56 | 显示全部楼层
大神,你这个有移植好的DEMO吗?希望传一份啊

出0入0汤圆

发表于 2016-11-7 13:53:12 | 显示全部楼层
这个爽,我曾经手动整定过一个温度控制;当时没搞定自整定

出0入0汤圆

发表于 2016-11-7 14:03:47 | 显示全部楼层
yelang1124 发表于 2014-3-12 16:47
首先感谢楼主的热心解答,在此谢谢!,下面还有几个疑惑,还请楼主在百忙之余帮小弟看下,谢谢

        ...

大神你的这个FB58搞得这么样啦,这个上位机能不能共享一下

出0入0汤圆

发表于 2016-12-21 21:59:03 | 显示全部楼层
这个参数自整定确实比较繁琐

出0入0汤圆

发表于 2016-12-22 08:29:25 | 显示全部楼层
学习一下,非常好的资料

出0入0汤圆

发表于 2016-12-22 10:53:21 | 显示全部楼层
MARK  学习

出0入0汤圆

发表于 2017-1-11 23:23:59 | 显示全部楼层
请问一下 我软体设定当目标温度-目前温度<=TUN_DLMN启动自整定 PHASE一直卡在2 然后PWM完全不变化 温度一路飙升超过设定值PWM还是没变化 请问这有可能是什么原因呢?

出0入0汤圆

发表于 2017-1-12 00:28:47 | 显示全部楼层
mark一下

出0入4汤圆

发表于 2017-1-13 09:05:53 | 显示全部楼层
下了,谢谢

出0入0汤圆

发表于 2017-1-13 09:25:03 | 显示全部楼层
满满干货,控温PID资料及程序代码~

出0入0汤圆

发表于 2017-3-25 21:34:41 | 显示全部楼层
很好。。有空看看

出0入0汤圆

发表于 2017-6-8 10:40:08 | 显示全部楼层
这个FB58,是要在已经有一个比较稳定的PID控制的基础上,也就是有一个比较好的PID参数的基础上,再进行自整定吗?

出0入0汤圆

发表于 2017-6-11 14:12:16 | 显示全部楼层
非常好的资料,感谢楼主分享

出0入0汤圆

发表于 2017-8-6 14:36:39 来自手机 | 显示全部楼层
谢谢分享!pid整定

出0入0汤圆

发表于 2017-9-3 14:38:19 | 显示全部楼层
目前正在研究PID,谢谢楼主

出0入0汤圆

发表于 2017-9-5 09:33:19 | 显示全部楼层
自整定pid 好

出0入0汤圆

发表于 2017-9-5 10:09:19 | 显示全部楼层
@tyw996  能否留个联系方式。有偿使用楼主的例子指导,用在压力控制上。

出0入0汤圆

发表于 2017-9-6 17:04:18 | 显示全部楼层
学习下,谢谢分享!

出0入0汤圆

发表于 2017-9-7 00:48:32 | 显示全部楼层
可能能用上,先标记,再研究,谢谢分享!

出0入0汤圆

发表于 2017-9-7 22:23:39 | 显示全部楼层
多谢楼主分享!

出0入0汤圆

发表于 2017-9-9 21:44:38 | 显示全部楼层
非常好,收藏

出0入0汤圆

发表于 2017-10-18 15:22:39 | 显示全部楼层
非常好的资料,感谢分享

出0入0汤圆

发表于 2017-11-16 21:39:22 | 显示全部楼层
谢谢楼主 正在找这方面资料。明天开始研究下  研究之后再提看法

出0入0汤圆

发表于 2017-11-17 13:34:56 来自手机 | 显示全部楼层
MARK一下,以后用得到

出0入0汤圆

发表于 2018-3-9 18:39:56 | 显示全部楼层
翻老帖,看到这个,“共享一个西门子PLC上所使用的软件PID程序(FB58),我已将其改为C语言代码”   请问楼主FB58原本是用什么语言写的?

出0入0汤圆

发表于 2018-3-9 18:45:31 | 显示全部楼层
mark,学习了

出0入0汤圆

发表于 2018-3-10 08:05:58 | 显示全部楼层
谢谢楼主分享!!!

出0入0汤圆

发表于 2018-3-20 17:07:28 | 显示全部楼层
楼主我这个用你的C移植的怎么在脉冲输出的时候不对哦
                        if( QPULSE )
                        {
                                if( spassPTm < rP_B_TM || sPTm >= spassPTm || sPTm >= PER_TM - rP_B_TM )
                                {
                                        bIZv = TRUE ;
                                }
                                if( ! bIZv )
                                {
                                        QPULSE = FALSE ;
                                }
                        }
                        else if( spassPTm >= rP_B_TM && spassPTm >= PER_TM - sPTm && sPTm >= rP_B_TM )
                        {
                                QPULSE = TRUE ;
                        }
                        else
                        {
                                bIZv = TRUE ;
                        }
                       
                        if( bIZv )
                        {
                                if( spassPTm < PER_TM )
                                {
                                        spassPTm = spassPTm + CYCLE_P ;
                                }
                        }
                        else
                        {
                                spassPTm = CYCLE_P * 1.5 ;
                        }
能帮我解释一下吗谢谢

出0入0汤圆

发表于 2018-5-8 10:15:55 | 显示全部楼层
MARK学习了,正要用

出0入0汤圆

发表于 2018-5-9 12:49:46 | 显示全部楼层
学习一下,非常好的资料。

出0入0汤圆

发表于 2018-5-9 13:25:48 | 显示全部楼层
不错,标记一下。

出0入0汤圆

发表于 2018-5-9 18:03:27 | 显示全部楼层
好程序,谢谢。

出90入0汤圆

发表于 2018-6-19 16:00:46 | 显示全部楼层
有参考价值的帖子。

出0入0汤圆

发表于 2018-6-22 15:25:19 | 显示全部楼层
感谢楼主分享

出0入46汤圆

发表于 2018-8-12 09:39:07 | 显示全部楼层
本帖最后由 工程师030 于 2018-8-12 09:57 编辑

楼主你好,我的温度输出周期为1.2s,输出调节周期,pid()调用周期也是1.2s。PWM周期1200ms,分120份。
CYCLE、CYCLE_P、PER_TM都设置1.2,LMN_HLM、CON_ZONE设置120,PULSE_ON为关闭状态。
我在使用过程中一开始整定马上输出30005,这样设置有问题吗?请问还需要修改什么呢?

看到你之前的回复:CYCLE_P指的是脉冲采样周期,要开启PULSE_ON,就必须与你的PID程序调用周期(非CYCLE)一致,这样才能保证整定时不超过5%,
比如设置CYCLE_P=0.01,那你的PID调用周期也得是0.01s,你要用1S时间,那整定时肯定报错了。

CYCLE是调节周期吧?
CYCLE_P:脉冲发生器的采样时间,这个可以解释一下是什么意思吗?脉冲发生器是输出的PWM吗?采样时间又是指的什么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 15:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表