倒霉熊大大 发表于 2014-12-13 15:30:31

mark{:lol:}{:lol:}{:lol:}   

qs6361036 发表于 2014-12-13 16:21:46

研究一下 PID ,经典又好用的算法!

bd7qw 发表于 2014-12-13 20:20:45

没测试过温度,用自己的PID用在压力调节控制过

niu14789 发表于 2014-12-15 11:24:56

好东西~~~~~~~~~~~

毛毛 发表于 2014-12-31 12:33:19

bd7qw,能说说你是怎样用PID控制压力的吗?

fiaanull 发表于 2014-12-31 16:41:35

PID小白路过,感谢分享!

wang55 发表于 2014-12-31 17:10:28

这么好的资料,来学习一下。

毛毛 发表于 2014-12-31 17:11:10

楼主,这个PID程序能用在气源压力控制吗?

毛毛 发表于 2015-1-1 12:39:34

楼主是否有FB41/42/43的PID程序啊?

hanshiruo 发表于 2015-1-1 14:28:08

好人....

szxszx 发表于 2015-1-1 17:26:07

下载学习下,以后会用到

stevenh 发表于 2015-1-2 15:25:35

谢谢分享!

DS1993 发表于 2015-1-11 12:41:54

标记一下

derive3000 发表于 2015-1-11 23:25:18

这个资料好啊,学习学习

jungleyang 发表于 2015-1-12 14:19:43

强悍,谢谢楼主!!!!

nic_911 发表于 2015-1-12 15:17:49

已经下载,以后用时再研究下,谢谢楼主~~~{:biggrin:}

小小不懂 发表于 2015-1-12 15:51:16

研究一下,前段时间做过PID,但效果不怎么理想,谢谢楼主分享

一棵葱 发表于 2015-1-12 17:23:59

学习学习!!

为而不争 发表于 2015-2-3 14:43:48

你好关于:基于西门子PID程序的C程序代码(带自整定功能哦) 这个能用于电机速度控制吗

DM_2014 发表于 2015-2-3 14:54:43

收了,感谢楼主

tyw996 发表于 2015-2-3 18:57:19

为而不争 发表于 2015-2-3 14:43
你好关于:基于西门子PID程序的C程序代码(带自整定功能哦) 这个能用于电机速度控制吗 ...

不建议用于电机速度控制

magicoctoier1 发表于 2015-2-3 23:17:54

有点复杂,研究一下!

guosheng5688 发表于 2015-2-4 15:32:58

谢谢楼主分享,我要好好研究下

mandzy 发表于 2015-2-4 17:21:49

每次调PId参数都是一件痛苦的事,谢谢楼主分享

hbnpmw 发表于 2015-2-18 16:24:51

不错,整理了一下准备开始使用

myowl 发表于 2015-2-18 21:51:15

标记一下,谢谢共享呀

longhua 发表于 2015-2-20 20:55:45

这个自整定不置可否用于四轴?

novelcrab 发表于 2015-3-10 21:11:12

pid自整定 MARK

crazylata 发表于 2015-3-22 23:07:56

怎么没办法下载啊?

xzp21st 发表于 2015-3-23 09:38:27

好东西 谢谢分享

guanglv2008 发表于 2015-3-23 10:42:12

好东西收藏了谢谢分享   。。。

zhangxiaojin 发表于 2015-3-24 12:11:43

很好的一个东西。下来研究研究

小小不懂 发表于 2015-3-24 15:28:37

先MARK,好资料了

喜羊羊 发表于 2015-3-24 15:37:10

好资料,感谢分享。

zeroOne 发表于 2015-3-31 09:13:44

看不懂,哈哈哈哈,谢谢!

hyc 发表于 2015-3-31 10:25:54

自己只研究过增量式PID

xukaiming 发表于 2015-3-31 10:49:32

这个不错

聆听风声 发表于 2015-3-31 11:59:03

标记一下!

mcuuser2015 发表于 2015-4-2 14:23:56

今天用来控温,效果还不错,在0.5度内波动,可能优化的还不够好。

pow270345524 发表于 2015-4-2 14:25:15

mark 谢谢楼主

jerry7922 发表于 2015-4-13 10:58:24

感谢楼主的分享,正在学习中!!!

plot 发表于 2015-4-13 12:06:20

多谢分享,看看

292826936 发表于 2015-4-13 19:57:09


最近正在接触这方面!太太谢谢楼主了,非常好

freeboyxd 发表于 2015-4-13 20:09:57

谢谢楼主!

zhongjp85 发表于 2015-4-20 08:26:17

多谢LZ分享~~

PEcontrol 发表于 2015-4-20 09:10:21

自整定,标记看看

逸翮孤风 发表于 2015-5-26 19:10:05

表示以前调试PID都是凭感觉,得到PID三个值就和破解密码一样,真没想到还能自整定~~~好厉害啊,太感谢了!

spring152 发表于 2015-5-26 19:21:56

学习一下PID

bondxie3 发表于 2015-5-26 21:21:52

标记,学习!

lf8013 发表于 2015-5-28 20:24:46

谢谢楼主下来研究一下

sunang4379 发表于 2015-6-15 13:58:04

好资料,下来学习了!

dz0001xx 发表于 2015-7-3 21:29:06

看了一段没看很懂,楼主能把你自己的程序贴出来让大家学习学习!!!??

dz0001xx 发表于 2015-7-3 21:44:51

问题:
1,PID什么时候开始调用,假如设定温度是135°,测量温度从室温开始,是从一开始就调用PID,还是等温度达到假如100度再开始调用PID
2,死区是指恒温误差范围吗?,如我需要温度精度是±1度,banddead是不是就设置为1
3,PID调用周期和脉冲输出周期可以分开执行吗?比如,PID调用周期为1s,脉冲定时输出周期为10ms,100个脉冲以完成sLMN,对自整定有无影响?

embedded2015 发表于 2015-7-3 23:50:23

先标记再看。

Chris_gong 发表于 2015-7-4 11:41:57

这个不错有机会转换成别的品牌PLC程序试试

tyw996 发表于 2015-7-5 18:47:26

本帖最后由 tyw996 于 2015-7-5 18:48 编辑

dz0001xx 发表于 2015-7-3 21:44
问题:
1,PID什么时候开始调用,假如设定温度是135°,测量温度从室温开始,是从一开始就调用PID,还是等 ...

1、将MAN_ON =FALSE;就开始自动控制了
2、DEADB_W是死区控制,如果设为1就是在你设定值±1区间内PID不参与控制。
3、按你的比如就是每1秒PID值就更新一次LMN,输入值在1秒内有100次参与平均计算,对自整定无影响。

索达客 发表于 2015-7-8 10:35:09

谢谢楼主分享!学习了

dz0001xx 发表于 2015-7-9 16:50:45

做温度控制时 多长时间计算一次LMN值 比较合理

ZJetWay 发表于 2015-7-14 20:02:34

这是"专家PID自整定"程序吧,很复杂的说,如果弄懂了也很好用.

dgdzas 发表于 2015-7-14 20:37:57

哪位高人能总结个流程或控制思路。

0123456789 发表于 2015-7-14 21:23:36

这个得顶

wolflsh 发表于 2015-7-14 22:06:51

这个可以有,参考下

toptrying 发表于 2015-7-15 08:32:06

学习PID,谢谢楼主

stevenniu500 发表于 2015-7-15 21:39:54

标记一下,谢谢奉献。

leibwell 发表于 2015-7-15 22:02:41

MARK,谢谢分享

毛毛 发表于 2015-8-22 14:15:02

请问LZ,这个判断语句
rPvdtMax0 = PVDT_MAX - PVDT0 ;
if((( rPvDelt < 0.8 * rSeek || ! sbSpChange ) && QTUN_RUN && FIL_CYC < 1024 && siTime == 2 )&&
   ((( siCycle > 6 && PVDT == 0.0 || siStatus == 999 )|| ( ( rNoiPvdt > 60.0 && siCycle > 7 ) && ( POI_CYCL < 2 || srPvdt2 > 0.99 * srPvdtMax2 )))|| ( rNoiPvdt > 5.0 && siCycle > 15 &&POI_CYCL < 2 )) )

里面的这个判别是否没写完整( siCycle > 6 && PVDT == 0.0 || siStatus == 999 )?
KEIL里提示

tyw996 发表于 2015-8-22 14:34:19

毛毛 发表于 2015-8-22 14:15
请问LZ,这个判断语句
rPvdtMax0 = PVDT_MAX - PVDT0 ;
if((( rPvDelt < 0.8 * rSeek || ! sbSpChange ) && ...

你要觉得不放心的话就多加个括号吧,((siCycle > 6 && PVDT == 0.0 )|| siStatus == 999 )就这样,我用IAR没有提示这个警告。

毛毛 发表于 2015-8-22 14:47:36

谢谢。另外,程序里很多一些计算数值是怎么来的?不明白这些做运算或判别的数值的意义
如下面这段程序
LMN = dLmn * LMN_FAC + LMN_OFFS ;
                        dLmn = LMN * 264.8 ;
                        if( dLmn >= 32511.0 )
                        {
                                dLmn = 32511.0 ;
                        }
                        else if( dLmn <= -32512.0 )
                        {
                                dLmn = -32512.0 ;
                        }

毛毛 发表于 2015-8-22 14:53:27

LZ:我在尝试把这个PID用在压力控制上。该PID设定上关闭控制带(Control Zone)功能,关闭过程值转换增加对温度信号转换(PV_PER*0.1/0.01)方式的支持,选用控制输出方式:连续控制方式。除了上面这些,我还需要主意哪些方面?谢谢

tyw996 发表于 2015-8-22 15:14:55

本帖最后由 tyw996 于 2015-8-22 15:18 编辑

毛毛 发表于 2015-8-22 14:53
LZ:我在尝试把这个PID用在压力控制上。该PID设定上关闭控制带(Control Zone)功能,关闭过程值转换增加对 ...

你的以上两个问题一般是不需要修改的,那是针对PLC上应用的,因为是移值过来的,所以就没有改动,知道就行了,可以不理它。控制带一般也不做修改,除非你特殊应用。
压力控制应该是没问题的,按常规控制的方法就行,应该没有什么特殊要求吧,跟控温差不多。

毛毛 发表于 2015-8-22 21:11:34

LZ,这个PID是可以用在压力控制。我现在用你给的代码,使用代码的默认值并打开自整定功能。TUN_DLMN = 20.0时LMN始终等于20。由于我的PWM输出周期是100ms(定时器计时值是1000),所以LMN=20相当于2ms。这个值无法驱动电磁阀。后来调高TUN_DLMN到40、80,但LMN值在压力上升的初始阶段还是没法达到最大输出1000,而且压力稳定后,误差比较大(0.5~2KPa)。为什么会出现这种情况?

毛毛 发表于 2015-8-22 21:25:23

使用代码的默认值并打开自整定功能。LMN的输出就一直等于TUN_DLMN。奇怪

毛毛 发表于 2015-8-23 00:33:31

LZ,这个代码的自整定功能真的不错。用起来很爽。不过同样的设置在自整定时还是出现下面几个现象:
1、有时气压加到10来KPA就不动;
2、有时气压又超出设定值,并且不断增加;
3、整定后目标值与设定值差异大;

试了很久都是出现20110、22100,还真没弄到10000。不知道那里问题?
整个整定过程使用的都是程序默认参数,只是改了下面几个参数
CYCLE = 0.1;   //连续控制器的采样时间[秒]
CYCLE_P = 0.02 ;//脉冲发生器的采样时间[秒]       
PER_TM = 0.1;//1.0 ;   //周期[秒]       
LMN_HLM = 1000.0;//100.0;//可调节变量上限

如果这个代码不出现上面的3种现象,那就真的是动态自整定了。

gsq19920418 发表于 2015-8-23 07:00:53

这个代码可以用在电机控制方面吗?

aaabbbad 发表于 2015-8-23 07:34:01

收藏一下,目前还没有用自整定

毛毛 发表于 2015-8-23 11:35:16

LZ,能否抽空说说该代码自整定的使用。我发现只要气缸稍微有泄露,自整定程序在气压去到20KPA左右就停止了(目标值100KPA)。查看寄存器发现LMN=1.#QNAN,
GAIN=1.#INF,LMN_P=1.#INF,LMN_I=1.#QNAN。

我现在使用对的是PI控制器

毛毛 发表于 2015-8-23 11:43:44

补充一张运行停止时PID代码变量的数据

毛毛 发表于 2015-8-23 12:48:50

补充,发现自整定功能对1~2升的气罐整定没问题,当使用10升的气罐,程序就没法整定,现象和上面的微漏现象一样。正在找原因。。

yick 发表于 2015-8-23 12:59:08

虽然现在没做它了,但是关注mark一下,还是要的

tyw996 发表于 2015-8-24 13:54:50

毛毛 发表于 2015-8-23 12:48
补充,发现自整定功能对1~2升的气罐整定没问题,当使用10升的气罐,程序就没法整定,现象和上面的微漏现象 ...

1、你的用法是系统自动控制自整定应用吗?如果是这样的话,那么我提醒你一下,这种自整定方式是按手动方式设计的,整定条件不当的话很有可能会出现整定失败或者整定参数不合适情况。
2、自整定前对控制系统是有要求的,具体请参照我提供的PDF资料。你说PWM输出周期是100ms控制电磁阀,这个周期设置的太短了,对电磁阀来说控制太敏感,会影响控制精度,建议你延长PWM周期到秒级以上(我在应用中控制电磁阀一般设置为5秒),最小单个脉冲不低于300ms。

tyw996 发表于 2015-8-24 14:02:39

gsq19920418 发表于 2015-8-23 07:00
这个代码可以用在电机控制方面吗?

一般用于惯性较慢的控制系统,对快速闭环控制不太合适。

wenming 发表于 2015-8-24 14:05:05

这个已经移植到我们自己的PLC上,效果很好,谢谢楼主大师。

gsq19920418 发表于 2015-8-24 16:38:28

tyw996 发表于 2015-8-24 14:02
一般用于惯性较慢的控制系统,对快速闭环控制不太合适。

不知道你那是否有可以用于快速闭环控制系统上的PID呢?

毛毛 发表于 2015-8-25 18:03:25

LZ的意思是要使用自整定功能最好是MAN_ON=TRUE,而且自整定完毕后还需要自己做微调?
我这里的气缸容积不超过10L,如果把PWM周期设为秒级,恐怕 不好控制。
我气缸的容积里面有液体,空气容积在1~10之间变化。压力在10KPA~200kpa之间变化。使用者根据工艺要求自由设定。

毛毛 发表于 2015-8-25 18:44:05

LZ,自整定后STATUS_H=21120。在文档中只有这个说明类似。21xxx估计偏差N_PTN < 1在更好的条件下重复尝试。不太明白N_PTN的定义,以及“在更好的条件下重复尝试”这个个更好的条件是指?

sdu168_2 发表于 2015-8-25 22:43:22

感谢楼主分享~

xiaozuowei118 发表于 2015-8-27 13:51:26

这个程序小弟实在是看不懂,太复杂了

tyw996 发表于 2015-8-31 12:01:26

本帖最后由 tyw996 于 2015-8-31 12:09 编辑

毛毛 发表于 2015-8-25 18:03
LZ的意思是要使用自整定功能最好是MAN_ON=TRUE,而且自整定完毕后还需要自己做微调?
我这里的气缸容积不超 ...

1、在MAN_ON=TRUE或FALSE下都可以自整定,但前提是一定要满足自整定前先决条件,这得需要你人为去判断。
2、难道你用是超快速电磁阀(我还没见过),能在1ms的单脉冲内变化都能反应过来(比如50ms和51ms输出你觉得这个电磁阀开度时间PID能控制住吗)?我说的敏感是这个意思。

毛毛 发表于 2015-8-31 14:37:47

给电磁阀通电40MS,出气口就有气体出来。当然,我也怀疑电磁阀并没有全开,开度估计在1/3~1/4之间吧。


LZ,自整定后STATUS_H=21120。在文档中只有这个说明类似。21xxx估计偏差N_PTN < 1在更好的条件下重复尝试。不太明白N_PTN的定义,以及“在更好的条件下重复尝试”这个个更好的条件是指?

毛毛 发表于 2015-8-31 14:40:46

另外,在电磁阀能动作的情况下,多1ms和少1ms的区别还是蛮大的。我这边的电磁阀小于40ms的输出就没什么反应了,阀芯基本处于震动状态。

tyw996 发表于 2015-8-31 15:26:53

毛毛 发表于 2015-8-31 14:37
给电磁阀通电40MS,出气口就有气体出来。当然,我也怀疑电磁阀并没有全开,开度估计在1/3~1/4之间吧。




资料中:2xxxx 使用估计值找到的控制参数;检查控制响应或检查STATUS_H 诊断消息,并重复控制器整定。
2xxxx值也是可用的,可能需要手动去微调。
若不满意,则我还是认为可能是你控制响应的问题,你先不考虑响应快慢,先把PWM周期延长试试看看效果。
N_PTN资料中说的也挺含糊,我没用过此参数做参考。
这个“在更好的条件下重复尝试”我理解还是察看自整定第一阶段是否稳定是主要的。
还有,如果惯性大的系统PID参数可以不用PID,改用整定好PI控制试试。

毛毛 发表于 2015-8-31 18:25:38

2xxxx值是可以使用的。
好像自整定的值只对大于23KPA的或以上的能达到设定值,但也有时候会超1~2KPA,不知道为什么?
如果设定的压力值低于23KPA,运行自整定的参数,输出的最终压力都会大于设定值好几KPA。不知道问题在那里?

我现在使用的是PI控制。自整定后的参数存储在PI_CON这个结构体里还是其它地方?

adee4210 发表于 2015-9-4 15:49:35

adee4210 发表于 2015-9-4 15:52:02

tyw996 发表于 2015-9-4 16:51:11

adee4210 发表于 2015-9-4 15:52
楼主:
我用PT100+可控硅+加热器给一个容器里的水加热,需要用到哪些输入参数和输出参数? ...

PV_PER一般用不上;
问题太笼统了,看参考资料吧,看明白了再应用到你的项目去吧。

wc261034 发表于 2015-9-4 21:33:09

这个程序在哪弄得,西门子的就很高端吗

crazylata 发表于 2015-9-6 09:29:00

大家能否告之都用的什么型号的MCU?或者说得什么样的MCU才能跑得动这个PID的浮点运算?

bmelz 发表于 2015-9-7 07:09:56

mark,以后慢慢看!

默默七 发表于 2015-9-7 10:21:56

谢谢楼主分享

chinaboy25 发表于 2015-9-23 16:26:28

本帖最后由 chinaboy25 于 2015-9-23 16:42 编辑

请问下楼主:程序的 591行是写错了还是我理解错了?
                              if( TD != 0.0 && ! MAN_ON && ! sbOptLmn &&! sbConzOn )
                                              {
                                Verstaerk = TD / ( CYCLE * 0.5 + rTmLag ) ;
                                LMN_D = ( LMN_P - sRueck ) * Verstaerk ;
                                RueckAlt = sRueck ;
                                RueckDiff = CYCLE / TD * LMN_D + sRestDif ;
                                sRueck = RueckDiff + RueckAlt ;
                                sRestDif = RueckAlt - sRueck + RueckDiff ;                        }
                            sRestDif= RueckAlt - RueckDiff - RueckAlt + RueckDiff = RueckAlt - RueckAlt - RueckDiff + RueckDiff = 0;?
                           sRestDif   这个变量是   上一次微分偏差吧, 但最后计算结果怎么为0?
页: 1 2 3 [4] 5 6 7
查看完整版本: 基于西门子PID程序的C程序代码(带自整定功能哦)