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吗?采样时间又是指的什么?