damy2008 发表于 2015-9-23 19:24:08

学习一下,非常好的资料。

bigrocks 发表于 2015-9-23 20:35:08

mark,学习ing{:smile:}{:smile:}{:smile:}

windancerhxw 发表于 2015-9-23 22:34:07

{:handshake:}maark一下

片羽之神 发表于 2015-9-24 00:01:21

mark        ~~学习了!

初音之恋 发表于 2015-9-24 11:45:31

学习一下,好资料

wzavr 发表于 2015-9-29 01:10:21

tyw996 发表于 2013-6-1 09:39
我测试的控温精度能达到0.1度(结果出来后,我自己都感到惊叹),当然这只是在我这个项目中的测试结果。以 ...

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

wzavr 发表于 2015-9-29 16:25:21

请问下各位参与这个程序的高手,
发现程序中有一段:

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

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

wzavr 发表于 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 ;

chinaboy25 发表于 2015-9-29 17:25:57

wzavr 发表于 2015-9-29 17:07
请问你提出的疑问解决了吗?

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


还没弄懂为什么?
你呢?

wzavr 发表于 2015-9-29 18:38:34

chinaboy25 发表于 2015-9-29 17:25
还没弄懂为什么?
你呢?

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

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

tyw996 发表于 2015-9-29 21:32:20

本帖最后由 tyw996 于 2015-9-29 21:51 编辑

wzavr 发表于 2015-9-29 18:38
在发现这2段应该是程序有问题的地方后,
因为没找到lz改编前西门子原来的程序,也没在手册中找到对应可供参 ...

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

wzavr 发表于 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,移植前的源程序能不能上传做个参考.

tyw996 发表于 2015-9-29 21:54:35

chinaboy25 发表于 2015-9-23 16:26
请问下楼主:程序的 591行是写错了还是我理解错了?
                              if( TD != 0.0 && ! MA ...

参见上面的回复。

wzavr 发表于 2015-9-29 22:03:07

看过西门子的原版程序了, 确实是这样, 但是计算方法有高手能解释下吗?
难道c语言我看糊涂了..... 哭啊.....

tyw996 发表于 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;

tyw996 发表于 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)型的,就是很小的数理论上计算也是有偏差的。

wzavr 发表于 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的输出就不会出现跳变.

tyw996 发表于 2015-9-29 22:40:20

本帖最后由 tyw996 于 2015-9-29 22:44 编辑

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

xinmulan 发表于 2015-9-30 09:29:16

楼主这么深入啊

撞线 发表于 2015-10-12 16:33:12

记录一下,要重点看看。

weiz198901 发表于 2015-10-19 10:56:22

你好,最近一看你发的PID自整定程序,调试了好久,一直是30005,没有用脉冲,只是LMM驱动。。PID()调用和CYCLE的时间是一样的。。不知道怎么调试下去了

tyw996 发表于 2015-10-20 14:06:37

weiz198901 发表于 2015-10-19 10:56
你好,最近一看你发的PID自整定程序,调试了好久,一直是30005,没有用脉冲,只是LMM驱动。。PID()调用和 ...

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

zuokong2006 发表于 2015-10-21 15:18:56

收藏,慢慢学习

霸气侧漏 发表于 2015-11-3 17:36:37

这代码有点多,很复杂的感觉

yxylxj 发表于 2015-12-24 10:42:07

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

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

yanzhiwei 发表于 2015-12-24 15:57:29

很复杂   

北大实验室606 发表于 2015-12-26 15:54:53

用过很多pid就是还没用过自整定…

Recoochang 发表于 2015-12-26 16:02:34

感谢分享

weiming4033 发表于 2016-1-18 13:26:18

一直要学习自整定,看一下。

lm4766 发表于 2016-1-18 20:05:59

好东西,多谢楼主

guchangwei1991 发表于 2016-1-21 21:36:35

楼主 这个怎么用了

pango 发表于 2016-1-27 10:14:42

学习一下,感谢楼主分享

holdkcsxym 发表于 2016-3-12 17:47:31

很强大,我以前移植过1200的PID微分项滤波的不完全微分PID不过没自整定,学习了。

董董董 发表于 2016-3-14 11:40:04

研究研究,看看能不能用到我的小四轴上。嘿嘿嘿

andy_huang 发表于 2016-3-15 14:23:28

好好研究一下!

sunli_suzhou 发表于 2016-3-15 16:52:57

PID自整定!

qrsgcslqg2011 发表于 2016-3-24 13:22:52

yelang1124 发表于 2014-3-12 16:47
首先感谢楼主的热心解答,在此谢谢!,下面还有几个疑惑,还请楼主在百忙之余帮小弟看下,谢谢

      ...

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

qrsgcslqg2011 发表于 2016-3-24 13:44:03

tyw996 发表于 2014-10-25 20:14
1、自整定开启是人为控制的,PHASE由1-->2是有条件的,如果满足条件才能自动到2阶段。30005已经告诉了你 ...

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

tyw996 发表于 2016-3-25 22:30:22

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

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

ljgchina 发表于 2016-4-13 09:57:18

正好要搞这个,学习学习{:smile:}

jymt 发表于 2016-5-5 21:35:49

确实好东西,之后研究。

gzhua20088ssj 发表于 2016-5-6 11:33:55

楼主,你这个算法不是实时在线式整定算法吧,不算自适应算法,中间有随机扰动你这个算法也适用吗

richie550 发表于 2016-5-6 12:42:51

mark,收下了,谢谢!

裸奔的流浪者 发表于 2016-6-10 23:32:08

{:smile:},好东西,很详细的文档,谢谢楼主

ygliao80 发表于 2016-6-12 23:09:07

研究下,最近在搞温控,楼主帮大忙啦,,感谢。

longjunyi 发表于 2016-6-24 15:37:02

好像挺复杂,研究一下,

gzhua20088ssj 发表于 2016-8-1 20:17:15

不错,有空研究研究

windancerhxw 发表于 2016-8-16 22:28:48

再帮顶一下

xh2008email 发表于 2016-9-1 09:34:19

非常不错哟,感谢

墨逸、 发表于 2016-9-1 16:47:50

不错,先LOOK LOOk

wolyond 发表于 2016-9-1 17:13:51

不错,收藏下

lianfutiana 发表于 2016-9-1 17:38:27

有点麻烦

alwen 发表于 2016-9-1 17:54:03

感谢LZ,mark一下

阿豪博士 发表于 2016-9-1 21:28:12

请问,会有例程放送吗、

longjunyi 发表于 2016-9-1 21:55:14

先做个记号,有时间详细看看

zengqfa08 发表于 2016-9-4 07:28:37

太好了,好东西

eliterxzgxu 发表于 2016-9-4 07:29:32

感谢楼主分享

eliterxzgxu 发表于 2016-10-8 16:34:10

感谢楼主分享

dyl 发表于 2016-10-11 19:15:46

你好,我在论坛看到你写的PID代码,我想学习着做一个温控器,不知道你的PID部分代码,可以买吗?如果可以留个联系方式,我联系你。

shenwou 发表于 2016-10-12 21:17:59

听说挺复杂的,载下来慢慢研究

ronic 发表于 2016-10-13 06:17:09

好好学习学习

cooltommy 发表于 2016-10-13 10:20:42

楼主的工作非常有意义

ksn13 发表于 2016-10-13 10:33:50

学习一下,非常好的资料。

pinkwalkman 发表于 2016-10-13 16:52:53

带自整定的就是牛逼的PID,不知这个PID算法带宽是多少。之前接触过一个老美的电机控制器带自整定,非常牛逼好用。

EasyKit 发表于 2016-11-7 13:43:18

yelang1124 发表于 2014-3-12 16:47
首先感谢楼主的热心解答,在此谢谢!,下面还有几个疑惑,还请楼主在百忙之余帮小弟看下,谢谢

      ...

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

EasyKit 发表于 2016-11-7 13:45:56

大神,你这个有移植好的DEMO吗?希望传一份啊

hanweng2012 发表于 2016-11-7 13:53:12

这个爽,我曾经手动整定过一个温度控制;当时没搞定自整定

EasyKit 发表于 2016-11-7 14:03:47

yelang1124 发表于 2014-3-12 16:47
首先感谢楼主的热心解答,在此谢谢!,下面还有几个疑惑,还请楼主在百忙之余帮小弟看下,谢谢

      ...

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

cxh321 发表于 2016-12-21 21:59:03

这个参数自整定确实比较繁琐

hefeizdl 发表于 2016-12-22 08:29:25

学习一下,非常好的资料

失落的孤独 发表于 2016-12-22 10:53:21

MARK学习

whatdavid 发表于 2017-1-11 23:23:59

请问一下 我软体设定当目标温度-目前温度<=TUN_DLMN启动自整定 PHASE一直卡在2 然后PWM完全不变化 温度一路飙升超过设定值PWM还是没变化 请问这有可能是什么原因呢?

308594151 发表于 2017-1-12 00:28:47

mark一下

jiulong855@.163 发表于 2017-1-13 09:05:53

下了,谢谢

dela2000 发表于 2017-1-13 09:25:03

满满干货,控温PID资料及程序代码~

cpholr1 发表于 2017-3-25 21:34:41

很好。。有空看看

SailJune 发表于 2017-6-8 10:40:08

这个FB58,是要在已经有一个比较稳定的PID控制的基础上,也就是有一个比较好的PID参数的基础上,再进行自整定吗?

catzsh 发表于 2017-6-11 14:12:16

非常好的资料,感谢楼主分享

diyer_zhou 发表于 2017-8-6 14:36:39

谢谢分享!pid整定

老来多遗忘 发表于 2017-9-3 14:38:19

目前正在研究PID,谢谢楼主

zhq_chd 发表于 2017-9-5 09:33:19

自整定pid 好

zhq_chd 发表于 2017-9-5 10:09:19

@tyw996能否留个联系方式。有偿使用楼主的例子指导,用在压力控制上。{:smile:}

kuailechengyang 发表于 2017-9-6 17:04:18

学习下,谢谢分享!

tuowai 发表于 2017-9-7 00:48:32

可能能用上,先标记,再研究,谢谢分享!

netawater 发表于 2017-9-7 22:23:39

多谢楼主分享!

SCS_Super 发表于 2017-9-9 21:44:38

非常好,收藏

浮生莫若闲 发表于 2017-10-18 15:22:39

非常好的资料,感谢分享

liaozlei 发表于 2017-11-16 21:39:22

谢谢楼主 正在找这方面资料。明天开始研究下研究之后再提看法

lcmdw 发表于 2017-11-17 13:34:56

MARK一下,以后用得到

光明星1号 发表于 2018-3-9 18:39:56

翻老帖,看到这个,“共享一个西门子PLC上所使用的软件PID程序(FB58),我已将其改为C语言代码”   请问楼主FB58原本是用什么语言写的?

xiangbin099 发表于 2018-3-9 18:45:31

mark,学习了

heyangfengyue 发表于 2018-3-10 08:05:58

谢谢楼主分享!!!

slf0909061 发表于 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 ;
                        }
能帮我解释一下吗谢谢

杨遥 发表于 2018-5-8 10:15:55

MARK学习了,正要用

ljgchina 发表于 2018-5-9 12:49:46

学习一下,非常好的资料。

jiangxingyuan 发表于 2018-5-9 13:25:48

不错,标记一下。

qsv 发表于 2018-5-9 18:03:27

好程序,谢谢。

hzpyl 发表于 2018-6-19 16:00:46

有参考价值的帖子。

shiruquaan23 发表于 2018-6-22 15:25:19

感谢楼主分享

工程师030 发表于 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吗?采样时间又是指的什么?
页: 1 2 3 4 [5] 6 7
查看完整版本: 基于西门子PID程序的C程序代码(带自整定功能哦)