| Description of pid_autotuner |
| AutotunerPID Toolkit |
 |
pid_autotuner
PURPOSE 
Supervisor of a PID autotuner (implmented as a Matlab S-function).
SYNOPSIS 
function [sys,x0,str,ts] = pid_autotuner(t,x,u,flag,Ts,As)
DESCRIPTION 
CROSS-REFERENCE INFORMATION 
This function calls:
- idareas IDAREAS Identification of a FOPDT model using the method of the
- pid_structure PID_STRUCTURE Structure selection for a ISA PID regulator.
- pid_tuning PID_TUNING Tune the parameters of a ISA-PID regulator with some
This function is called by:
SUBFUNCTIONS 
SOURCE CODE 
0001 function [sys,x0,str,ts] = pid_autotuner(t,x,u,flag,Ts,As)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 switch flag,
0026
0027 case 0,
0028 [sys,x0,str,ts] = mdlInitializeSizes(Ts);
0029
0030 case 3,
0031 [sys] = mdlOutputs(t,x,u,Ts,As);
0032
0033 case { 1, 2, 4, 9 }
0034 sys = [];
0035 otherwise
0036 error(['Unhandled flag = ',num2str(flag)]);
0037 end
0038
0039
0040
0041
0042
0043
0044
0045 function [sys,x0,str,ts] = mdlInitializeSizes(Ts)
0046 global Y_AUTOTUNING
0047
0048 Y_AUTOTUNING = [];
0049
0050
0051 sizes = simsizes;
0052
0053 sizes.NumContStates = 0;
0054 sizes.NumDiscStates = 0;
0055 sizes.NumOutputs = 2;
0056 sizes.NumInputs = 1;
0057 sizes.DirFeedthrough = 1;
0058 sizes.NumSampleTimes = 1;
0059
0060 sys = simsizes(sizes);
0061
0062 x0 = [];
0063 str = [];
0064 ts = [Ts 0];
0065
0066
0067
0068
0069
0070
0071
0072 function [sys] = mdlOutputs(t,x,u,Ts,As)
0073
0074
0075
0076
0077
0078 global PIDPARAMETERS
0079 global IDENTIFICATION_METHOD
0080 global TUNING_STRUCTURE
0081 global TUNING_METHOD
0082 global TUNING_PARAM
0083 global AUTOTUNE
0084 global AUTOMAN
0085
0086 global Y_AUTOTUNING
0087
0088 step_steadyThr = 0.05;
0089
0090 relay_steadyThr = 0.05;
0091
0092
0093 if AUTOTUNE
0094
0095 Y_AUTOTUNING = [Y_AUTOTUNING; u(1)];
0096 y = Y_AUTOTUNING;
0097
0098 if strcmp(IDENTIFICATION_METHOD,'STEP')
0099
0100
0101 N = fix(length(y)/10);
0102 if N > 15
0103
0104 deltay = abs(y(end)-y(1));
0105 yw = y(end-N:end);
0106
0107
0108 idok = (max(yw)-min(yw)) < step_steadyThr*(max(y)-min(y));
0109 else
0110 idok = 0;
0111 end
0112 if idok
0113 model = idareas(y,1,Ts);
0114 end
0115 elseif strcmp(IDENTIFICATION_METHOD,'RELAY')
0116
0117 dy = diff(y);
0118 ind = find(dy(1:end-1)>0 & dy(2:end)<0);
0119
0120
0121 if length(ind)>=4 & length(ind)<10
0122 ym = mean(y);
0123
0124
0125 idok = mean(abs(diff(y(ind(end-2:end))))) < relay_steadyThr*(max(y)-min(y));
0126
0127 idok = idok & any(abs(y(ind(end-1):ind(end))-ym) < relay_steadyThr/2*abs(max(y)-ym));
0128 elseif length(ind)>=10
0129
0130 idok = 1;
0131 else
0132 idok = 0;
0133 end
0134
0135 if idok
0136 model.A = max(y)-min(y);
0137 model.T = Ts*(ind(end)-ind(end-1));
0138 end
0139 end
0140
0141
0142 if idok
0143
0144 regStruct = pid_structure(model,TUNING_STRUCTURE);
0145
0146
0147 try
0148 [K,Ti,Td,N,b] = pid_tuning(model,TUNING_METHOD,TUNING_PARAM,regStruct,As);
0149
0150 PIDPARAMETERS = [K Ti Td N b];
0151 catch
0152
0153 end
0154
0155 AUTOTUNE = 0;
0156 end
0157
0158
0159 sys = [AUTOMAN 1];
0160 else
0161
0162 Y_AUTOTUNING = [];
0163
0164
0165 sys = [AUTOMAN 0];
0166 end
0167
| idareas | | pid_isatd |  |
Generated on Wed 17-Mar-2004 09:29:44 by m2html © 2003
|
|