問題如題,动态变量假定为三个。
要求: 1、用大中型PLC的指令寫
2、用一般的微型PLC指令寫出算法。 在自由擂区历经一月多没有人打擂,只好今天移到这里来,继续让大家活动活动手脚了! 奖励就是请你喝几杯,哈哈!如果你觉得太容易,本问题可以进一步将难度加大。
原创最多,阐述最详细,程序越准确者获一等奖
工控PLC擂台每周一期,本期待49期结束一周后结贴。奖项设置:一等奖1名:50MP,二等奖5名:10MP,三等奖10名:30积分。
MP介绍:gongkongMP即工控币,是中国工控网的用户积分与回馈系统的一个网络虚拟计价单位,类似于大家熟悉的QB,1个MP=1元人民币。
MP有什么用?兑换服务:以1个MP=1元来置换中国工控网的相关服务。 兑换现金:非积分获得的MP可兑换等值现金(满100MP后、用户可通过用户管理后台申请兑换)。
楼主最近还看过
此外还有一个问题在http://www.gongkong.com/webpage/forum/201109/2011090213555200001-1.shtml
请朋友们及时回答,现在想知道答案!答案要有理论和事实依据!
回复本条
DATA_BLOCK DB_Controller
VAR
// 测量值
Measurement : REAL;
// 设定值
Setpoint : REAL;
// 控制输入
ControlInput : REAL := 0.0;
// PID控制器参数
Kp : REAL := 1.0; // 比例增益
Ki : REAL := 0.1; // 积分增益
Kd : REAL := 0.01; // 微分增益
// PID控制器内部变量
Error : REAL := 0.0;
PrevError : REAL := 0.0;
Integral : REAL := 0.0;
Derivative : REAL := 0.0;
// 前馈补偿
Feedforward : REAL := 0.0;
END_VAR
// 主程序
PROGRAM MainProgram
// 定义临时变量
VAR_TEMP
Temp1 : REAL;
Temp2 : REAL;
Temp3 : REAL;
END_VAR
// 计算误差
L DB_Controller.Setpoint
L DB_Controller.Measurement
SUB
T DB_Controller.Error
// 计算积分项
L DB_Controller.Integral
L DB_Controller.Error
ADD
T DB_Controller.Integral
// 计算微分项
L DB_Controller.Error
L DB_Controller.PrevError
SUB
T DB_Controller.Derivative
// 计算PID控制器输出
L DB_Controller.Kp
L DB_Controller.Error
MUL
T Temp1
L DB_Controller.Ki
L DB_Controller.Integral
MUL
T Temp2
L DB_Controller.Kd
L DB_Controller.Derivative
MUL
T Temp3
L Temp1
L Temp2
ADD
T Temp1
L Temp1
L Temp3
ADD
T DB_Controller.ControlInput
// 添加前馈补偿
L DB_Controller.ControlInput
L DB_Controller.Feedforward
ADD
T DB_Controller.ControlInput
// 更新上一时刻的误差
L DB_Controller.Error
T DB_Controller.PrevError
// 结束主程序
END_PROGRAM
回复本条
修改后的
DATA_BLOCK DB_Controller
VAR
// 测量值
Measurement : REAL;
// 设定值
Setpoint : REAL;
// 控制输入
ControlInput : REAL := 0.0;
// PID控制器参数
Kp : REAL := 1.0; // 比例增益
Ki : REAL := 0.1; // 积分增益
Kd : REAL := 0.01; // 微分增益
// PID控制器内部变量
Error : REAL := 0.0;
PrevError : REAL := 0.0;
Integral : REAL := 0.0;
Derivative : REAL := 0.0;
// 前馈补偿
Feedforward : REAL := 0.0;
// 卡尔曼滤波器参数
StateEstimate : REAL := 0.0;
KalmanGain : REAL := 0.5; // 卡尔曼增益
ProcessNoise : REAL := 0.01; // 过程噪声
MeasurementNoise : REAL := 0.1; // 测量噪声
// 边界条件
MinControlInput : REAL := -10.0; // 最小控制输入
MaxControlInput : REAL := 10.0; // 最大控制输入
MaxIntegral : REAL := 100.0; // 积分项的最大值
MinIntegral : REAL := -100.0; // 积分项的最小值
END_VAR
// 主程序
PROGRAM MainProgram
// 定义临时变量
VAR_TEMP
Temp1 : REAL;
Temp2 : REAL;
Temp3 : REAL;
PredictedState : REAL;
Innovation : REAL;
END_VAR
// 卡尔曼滤波器预测步骤
L DB_Controller.StateEstimate
T PredictedState
// 卡尔曼滤波器更新步骤
L DB_Controller.Measurement
L PredictedState
SUB
T Innovation
L DB_Controller.KalmanGain
L Innovation
MUL
T Temp1
L PredictedState
L Temp1
ADD
T DB_Controller.StateEstimate
// 计算误差
L DB_Controller.Setpoint
L DB_Controller.StateEstimate
SUB
T DB_Controller.Error
// 计算积分项,并进行饱和处理
L DB_Controller.Integral
L DB_Controller.Error
ADD
T Temp1
L DB_Controller.MaxIntegral
L Temp1
MIN
T Temp1
L DB_Controller.MinIntegral
L Temp1
MAX
T DB_Controller.Integral
// 计算微分项
L DB_Controller.Error
L DB_Controller.PrevError
SUB
T DB_Controller.Derivative
// 计算PID控制器输出
L DB_Controller.Kp
L DB_Controller.Error
MUL
T Temp1
L DB_Controller.Ki
L DB_Controller.Integral
MUL
T Temp2
L DB_Controller.Kd
L DB_Controller.Derivative
MUL
T Temp3
L Temp1
L Temp2
ADD
T Temp1
L Temp1
L Temp3
ADD
T Temp1
// 添加前馈补偿
L Temp1
L DB_Controller.Feedforward
ADD
T DB_Controller.ControlInput
// 对控制输入进行饱和处理
L DB_Controller.MaxControlInput
L DB_Controller.ControlInput
MIN
T Temp1
L DB_Controller.MinControlInput
L Temp1
MAX
T DB_Controller.ControlInput
// 更新上一时刻的误差
L DB_Controller.Error
T DB_Controller.PrevError
// 结束主程序
END_PROGRAM
回复本条