pid 的输出不受控,一直是最大值,然后只要超过设定值输出就为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