source: trunk/eml/controllers/PIDIncr.mso @ 303

Last change on this file since 303 was 295, checked in by gerson bicca, 16 years ago

updated controllers models

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 10.2 KB
RevLine 
[1]1#*-------------------------------------------------------------------
[74]2* EMSO Model Library (EML) Copyright (C) 2004 - 2007 ALSOC.
3*
4* This LIBRARY is free software; you can distribute it and/or modify
5* it under the therms of the ALSOC FREE LICENSE as available at
6* http://www.enq.ufrgs.br/alsoc.
7*
8* EMSO Copyright (C) 2004 - 2007 ALSOC, original code
9* from http://www.rps.eng.br Copyright (C) 2002-2004.
10* All rights reserved.
11*
12* EMSO is distributed under the therms of the ALSOC LICENSE as
13* available at http://www.enq.ufrgs.br/alsoc.
[1]14*--------------------------------------------------------------------
15* Author: Tiago Osório
16* $Id: PIDIncr.mso 295 2007-06-21 19:48:17Z bicca $
17*-------------------------------------------------------------------*#
18using "types";
19
20Model MParameters
21
[294]22ATTRIBUTES
23        Pallete         = false;
24        Brief           = "Model of Parameters to be used with incremental PIDs.";
25       
[1]26        VARIABLES
27       
28        alpha      as positive (Brief="Derivative term filter constant", Default=1);
29        beta       as positive (Brief="Proportional term setPoint change filter");
30        bias       as control_signal (Brief="Previous scaled bias", Default=0.5);
31        derivTime  as time_sec (Brief="Derivative time constant");
32        intTime    as time_sec (Brief="Integral time constant");
33        gain       as positive (Brief="Controller gain", Default=0.5);
34        gamma      as positive (Brief="Derivative term SP change filter");
35        tau        as time_sec (Brief="Input filter time constant");
36        tauSet     as time_sec (Brief="Input filter time constant");
37       
38end
39
40Model MOptions 
41
[294]42ATTRIBUTES
43        Pallete         = false;
44        Brief           = "Model of Options to be used with incremental PIDs.";
45       
[1]46        VARIABLES       
47       
48        action     as Real     (Brief="Controller action: (-1) Direct,(1) Reverse", Default=-1);
49    autoMan    as Real     (Brief="Controller option: (0) Automatic, (1) Manual", Default=0);   
50        clip       as Real     (Brief="Controller option: (1) output clipped, (0) output unclipped", Default=1);
51
52end
53
54Model MPorts
55
[294]56ATTRIBUTES
57        Pallete         = false;
58        Brief           = "Model of Ports to be used with incremental PIDs.";
[295]59       
[1]60        VARIABLES
61       
62        input      as control_signal (Brief="Previous scaled input signal", Default=0.5);
63        output    as control_signal (Brief="Scaled output signal", Default=0.5);
64        setPoint   as control_signal (Brief="Scaled setPoint",Default=0.5);
65
66end
67
68Model MInternal_Variables
69       
[294]70        ATTRIBUTES
71        Pallete         = false;
72        Brief           = "Model of Internal Variables to be used with incremental PIDs.";
[295]73       
[1]74        VARIABLES
75
[176]76        dderivTerm    as control_signal (Brief="Derivative term",Unit='1/s', Default=0);
77        dFilt         as control_signal (Brief="Derivative term filtered", Default=0.5,Unit='1/s');
78        error         as control_signal (Brief="Error definition for proportional term",Unit='1/s');
79        errorD        as control_signal (Brief="Error definition for derivative term",Unit='1/s');
[1]80        errorI        as control_signal (Brief="Error definition for integral term");
81        inputFilt     as control_signal (Brief="Filtered input");
[176]82        dintTerm      as control_signal (Brief="Integral term", Default=0,Unit='1/s');
83        doutp         as control_signal (Brief="Sum of proportional, integral and derivative terms",Unit='1/s');
[1]84        outps         as control_signal (Brief="Variable outp scaled between -1 and 1");
85        outp          as control_signal (Brief="Variable outp");
[176]86        dpropTerm     as control_signal (Brief="Proportional term", Default=0,Unit='1/s');
[1]87        setPointFilt  as control_signal (Brief="Filtered setPoint", Default=0);
88
89end
90
[294]91Model PIDIncr
[1]92
[294]93ATTRIBUTES
94        Pallete         = true;
95        Icon            = "PIDIncr";
96        Brief           = "Model of incremental PIDs.";
97        Info            =
98        "
99        - Inputs
100        *       - a scaled processs variable.
101        *       - a scaled bias.
102        *       - a scaled setpoint.
103
104        - Outputs
105        *  - a scaled output.
106        ";
107       
108        PARAMETERS
109       
110        PID_Select as Switcher (Brief="Type of PID Incremental", Valid=["Ideal","Parallel","Series","Ideal_AWBT","Parallel_AWBT","Series_AWBT","Ideal_AW","Parallel_AW","Series_AW"], Default = "Ideal");
111       
[1]112        VARIABLES
113        Parameters         as MParameters;
114        Options            as MOptions;
115        Internal           as MInternal_Variables;
116        Ports              as MPorts;
[294]117        AWFactor     as Real     (Brief="Integral term multiplier used in anti-reset windup");
[1]118       
119        EQUATIONS
120
121        if (Parameters.tau equal 0) then
122                "Input first order filter"
[190]123                (Parameters.tau + 1e-3*'s')*diff(Internal.inputFilt)= Ports.input - Internal.inputFilt;
[1]124        else
125                "Input first order filter"
126                Parameters.tau*diff(Internal.inputFilt)= Ports.input - Internal.inputFilt;     
127        end
128
129        if (Parameters.tauSet equal 0) then
130                "setPoint first order filter"
[190]131                (Parameters.tauSet + 1e-3*'s')*diff(Internal.setPointFilt)= Ports.setPoint - Internal.setPointFilt;
[1]132        else
133                "setPoint first order filter"
134                Parameters.tauSet*diff(Internal.setPointFilt)= Ports.setPoint - Internal.setPointFilt;
135        end
136
137        if Options.autoMan equal 1 then
138                "Error definition for proportional term"
[190]139                Internal.error*'s' = Internal.inputFilt*(Parameters.beta-1.0);
[1]140                "Error definition for derivative term"
[190]141                Internal.errorD*'s'= Internal.inputFilt*(Parameters.gamma-1.0);
[1]142                "Error definition for integral term"           
143                Internal.errorI= 0;
144        else
145                "Error definition for proportional term"                       
146                Internal.error = Parameters.beta*diff(Internal.setPointFilt) - diff(Internal.inputFilt);
147                "Error definition for derivative term"
148                Internal.errorD = Parameters.gamma*diff(Internal.setPointFilt) - diff(Internal.inputFilt);
149                "Error definition for integral term"
150                Internal.errorI = Internal.setPointFilt-Internal.inputFilt;     
151        end
152       
153        "Calculate proportional term"
154        Internal.dpropTerm=Internal.error; 
155       
156        if (Parameters.derivTime equal 0) then
157                "Derivative term filter"       
[190]158                Parameters.alpha*(Parameters.derivTime + 1e-3*'s')*diff(Internal.dFilt) = Internal.errorD - Internal.dFilt;
[1]159        else
160                "Derivative term filter"       
161                Parameters.alpha*(Parameters.derivTime)*diff(Internal.dFilt) = Internal.errorD - Internal.dFilt;
162        end
163
164        "Calculate derivative term"
165        Internal.dderivTerm = Parameters.derivTime*diff(Internal.dFilt);
166       
167    "Unscaled output"
168        diff(Internal.outp)=Internal.doutp;
169
170        "Scale outp"
171        Internal.outps=2*Internal.outp-1;
172
173        if Options.clip equal 1 then
174                if abs(Internal.outps)>1 then
175                        "Calculate clipped output when it´s saturated"
176                        Ports.output=(sign(Internal.outps)*1+1)/2;
177                else
178                        "Calculate clipped output when it´s not saturated"
179                        Ports.output=Internal.outp;
180                end
181        else
182                "Calculate unclipped output"
183                Ports.output=Internal.outp;
184        end
185
[294]186switch PID_Select
[1]187       
[294]188case "Ideal":
[1]189       
190        "Calculate integral term"
191        Parameters.intTime*Internal.dintTerm = Internal.errorI;
192       
193        "Sum of proportional, integral and derivative terms"
194        Internal.doutp = Options.action*Parameters.gain*(Internal.dpropTerm + Internal.dintTerm + Internal.dderivTerm);
195
[294]196        "Calculate AWFactor - Not in use in this mode"
197        AWFactor=1;
[1]198       
[294]199case "Parallel":
[1]200       
201        "Calculate integral term"
202        Parameters.intTime*Internal.dintTerm = Internal.errorI;
203       
204        "Sum of proportional, integral and derivative terms"
205        Internal.doutp = Options.action*(Parameters.gain*Internal.dpropTerm + Internal.dintTerm + Internal.dderivTerm);
206
[294]207"Calculate AWFactor - Not in use in this mode"
208        AWFactor=1;
[1]209       
[294]210case "Series":
211       
[1]212        "Calculate integral term"
213        Parameters.intTime*Internal.dintTerm = Internal.errorI;
214       
215        "Sum of proportional, integral and derivative terms"
[176]216        Internal.doutp = Options.action*(Parameters.gain*(Internal.dpropTerm + Internal.dintTerm)*(1/'s' + Internal.dderivTerm)*'s');
[1]217       
[294]218        "Calculate AWFactor - Not in use in this mode"
219        AWFactor=1;
[1]220       
[294]221case "Ideal_AWBT":
[1]222       
223        "Calculate integral term with anti-windup and bumpless transfer"
224        Options.action*Parameters.gain*(Parameters.intTime*Internal.dintTerm-Internal.errorI) = Ports.output-Internal.outp;
225
226        "Sum of proportional, integral and derivative terms"
227        Internal.doutp = Options.action*Parameters.gain*(Internal.dpropTerm + Internal.dintTerm + Internal.dderivTerm);
228
[294]229        "Calculate AWFactor - Not in use in this mode"
230        AWFactor=1;
[1]231       
[294]232case "Parallel_AWBT":
[1]233       
234        "Calculate integral term with anti-windup and bumpless transfer"
235        Options.action*Parameters.gain*(Parameters.intTime*Internal.dintTerm-Internal.errorI) = Ports.output-Internal.outp;
236       
237        "Sum of proportional, integral and derivative terms"
238        Internal.doutp = Options.action*(Parameters.gain*Internal.dpropTerm + Internal.dintTerm + Internal.dderivTerm);
239
[294]240"Calculate AWFactor - Not in use in this mode"
241        AWFactor=1;
[1]242
[294]243case "Series_AWBT":
[1]244       
245        "Calculate integral term with anti-windup and bumpless transfer"
246        Options.action*Parameters.gain*(Parameters.intTime*Internal.dintTerm-Internal.errorI) = Ports.output-Internal.outp;
247
248        "Sum of proportional, integral and derivative terms"
[176]249        Internal.doutp = Options.action*(Parameters.gain*(Internal.dpropTerm + Internal.dintTerm)*(1/'s' + Internal.dderivTerm)*'s');
[1]250
[294]251"Calculate AWFactor - Not in use in this mode"
252        AWFactor=1;
[1]253       
[294]254case "Ideal_AW":
255       
[1]256        "Calculate integral term with anti-windup"
257        Parameters.intTime*Internal.dintTerm = AWFactor*Internal.errorI;
258       
259        "Sum of proportional, integral and derivative terms"
260        Internal.doutp = Options.action*Parameters.gain*(Internal.dpropTerm + Internal.dintTerm + Internal.dderivTerm);
261       
262        if abs(Internal.outps)>1 and (Options.action*sign(Internal.outps)*Internal.errorI)>0 then
263                "Calculate AWFactor"
264                AWFactor=-tanh(sign(Internal.outps)*Internal.outps*100-102);
265        else
266                "Calculate AWFactor"
267                AWFactor=1;
268        end
269
[294]270case "Parallel_AW":
[1]271       
272        "Calculate integral term with anti-windup"
273        Parameters.intTime*Internal.dintTerm = AWFactor*Internal.errorI;
274       
275        "Sum of proportional, integral and derivative terms"
276        Internal.doutp = Options.action*(Parameters.gain*Internal.dpropTerm + Internal.dintTerm + Internal.dderivTerm);
277       
278        if abs(Internal.outps)>1 and (Options.action*sign(Internal.outps)*Internal.errorI)>0 then
279                "Calculate AWFactor"
280                AWFactor=-tanh(sign(Internal.outps)*Internal.outps*100-102);
281        else
282                "Calculate AWFactor"
283                AWFactor=1;
284        end
285
[294]286case "Series_AW":
[1]287       
288        "Calculate integral term with anti-windup"
289        Parameters.intTime*Internal.dintTerm = AWFactor*Internal.errorI;
290       
291        "Sum of proportional, integral and derivative terms"
[176]292        Internal.doutp = Options.action*(Parameters.gain*(Internal.dpropTerm + Internal.dintTerm)*(1/'s' + Internal.dderivTerm)*'s');
[1]293       
294        if abs(Internal.outps)>1 and (Options.action*sign(Internal.outps)*Internal.errorI)>0 then
295                "Calculate AWFactor"
296                AWFactor=-tanh(sign(Internal.outps)*Internal.outps*100-102);
297        else
298                "Calculate AWFactor"
299                AWFactor=1;
300        end
301
302end
303
[294]304        INITIAL
305        Ports.output = Parameters.bias;
306        diff(Internal.dFilt) = 0/'s^2';
307        diff(Internal.inputFilt)=0/'s';
308        diff(Internal.setPointFilt)=0/'s';
309       
310end
311
312
Note: See TracBrowser for help on using the repository browser.