PID 输出一直为1 点击:875 | 回复:0



黄家磊

    
  • 精华:0帖
  • 求助:29帖
  • 帖子:35帖 | 80回
  • 年度积分:0
  • 历史总积分:177
  • 注册:2015年8月01日
发表于:2016-03-19 18:28:50
楼主

各位前辈,我写了段程序,再测试外环PID 的时候发现不论输入怎么变化,偏差为正,输出VD208一直冲着1去,最终会变为1.0。偏差为负,输出VD208一直冲着0去,最终会变为0.0,就只有1和0这两个值,没有中间值!!!主程序用电位器模拟VW104液位反馈,子程序进行了设置,中断里面执行PID,下面是我的程序。

主程序  模拟电位器测试PID程序段模拟AI4W液位,测试外环用

Network 1 

LD     SM0.1

MOVB   100, SMB34                  //设定定时中断时间为100ms

ATCH   INT_0:INT0, 10              //连接INT0到定时中断0(事件10)

ENI   

Network 2

LD     SM0.0

MOVB   SMB28, AC0                  //SMB28代表模拟电位器0位置的数字值范围是0~255

BTI    AC0, AC0                    //BTI字节转换为整数指令

ITD    AC0, AC0                    //整数转换为双整数

DTR    AC0, AC0                    //双整数转换为实数,进行除法运算

/R     1.275, AC0                  //(0~255)/1.275=(0~200),调整SMB28数字值范围以便于

TRUNC  AC0, AC0                    //全部以整数形式与要模拟的量AIW 0~4000对应

DTI    AC0, AC0

*I     16, AC0                     //AC0范围调整至0~3200

MOVW   AC0, VW104                  //将AC0复制给相应模拟量,此处为VW104

子程序TITLE=外环PID参数表的生成,归一化等内容

Network 1 // 网络标题

// 定义外环PID 参数表

LD     SM0.0                       //外环PID参数表元素赋值

MOVR   0.8, VD216                  //对采样时间Ts赋值Ts=0.1写入PID参数表中地址VD216

MOVR   1.0, VD220                  //对积分常数Ti赋值Ti=30.0写入PID参数表中地址VD220

MOVR   0.0, VD224                  //对微分常数Td赋值Td=0.0写入PID参数表中地址VD224

MOVR   0.0, VD228                  //对积分前值Mx赋值Mx=0.0写入PID参数表中地址VD228

MOVR   20.0, VD236                 //对增益Kc赋值Kc=20.0(0.0~100.0)

 

Network 2 

// 增益Kc 归一化

LD     SM0.0

MOVR   VD236, AC0                  //读入增益KC值进行归一化处理

/R     100.0, AC0                  //Kcm=Kc/100

MOVR   AC0, VD212                  //增益Kc归一化(0.0~1.0)写入PID参数表中地址VD212

 

Network 3 

// 给定值Sv 归一化

LD     SM0.0

MOVW   50, VW408                   //液位给定工程量设置为50mm

MOVW   VW408, AC0                  //读入液位给定值VW408进行归一化处理

+I     200, AC0                    //Sv-(-200)=Sv+200(给定值-液位下限)

ITD    AC0, AC0                    //整数转换为双整数

DTR    AC0, AC0                    //双整数转换为实数,进行实数除法运算

/R     400.0, AC0                  //(Sv+200)/400 (400为液位量程,对液位给定值归一化0~1)

LDR>=  AC0, 1.0                    //当设定值归一化之后大于1,进行限定,按1.0处理

MOVR   1.0, AC0                    //将1.0写入AC0

LDR<=  AC0, 0.0                    //当设定值归一化之后小于0,限定,按0.0处理

MOVR   0.0, AC0                    //将0.0写入AC0

LD     SM0.0

MOVR   AC0, VD204                  //液位给定值Sv归一化赋值给VD204(0.0~1.0)

 

 

 

 

中断程INT0序TITLE=模拟量采样、外环PID计算

Network 1 // 网络标题

// 采样值归一化,填入参数表

LD     SM0.0

XORD   AC0, AC0                    //清空累加器AC0

MOVW   VW104, AC0                  //读入反馈量液位值VW104(800~4000)

-I     +800, AC0                   //调整VW104范围至0~3200

ITD    AC0, AC0                    //整数转换为双整数

DTR    AC0, AC0                    //双整数转换为实数,进行实数除法运算

/R     3200.0, AC0                 //归一化液位值

MOVR   AC0, VD200                  //过程变量当前值PVn归一化(0.0~1.0)写入PID参数表中地址VD200

Network 2 

// PID功能实现

LD     SM0.0

PID    VB200, 0                    //调用PID功能,环路编号为0

MOVR   VD200, VD232                //更新过程变量前值PV(n-1)

MOVR   VD208, AC0                  //PID运算结果VD208Mn=(0.0~1.0)

-R     0.5, AC0                    //将范围调整至(-0.5~+0.5)

*R     3200.0, AC0                 //外环控液位PID输出值转换为-1600~1600,作为内环流量次给定

TRUNC  AC0, AC0                    //对AC0进行取整操作

DTI    AC0, AC0                    //双整数转换为整数

MOVW   AC0, VW240                  //输出外环PID运算结果,作为内环水量次给定(-1600~+1600)

CRETI

 

 




热门招聘
相关主题

官方公众号

智造工程师