Script to represent constant offset in scaling of data

2 views (last 30 days)
Hello,
I have the attached simulink model which appears to be working as I need it to. The idea is to scale my SP input from engineering units to 0-100%, which is how the controller operates. That way, my P/I/D settings are directly identical to those entered into the controller, and I can align the matlab data with the controller data.
How would I enter this into a simple matlab script?
K = 100/(MaxEU-MinEU)
C = 100*MinEU/(MaxEU-MinEU)
It correctly multiplies the SP input value by the gain K, then after the gain block adds an offset which is completely independent of the SP input. I am struggling to deal with this 'extra constant input' in a matlab script.
My goal is to have a SISO transfer function between the step input and the output of the first summing junction, that I can easily integrate into the rest of the model with series/parallel connections.
What does not work (as far as I can tell) is EUSP = tf(100/(MaxEU-MinEU) - 100*MinEU/(MaxEU-MinEU))
since it applies a static gain to the step input, including the offset term. With or without the tf.
Perhaps I need to use sumblk and directly assign inputs/outputs? Still a little confused how to set that constant input for the offset term.
  8 Comments
Kurt
Kurt on 14 May 2024
Mathieu,
Yes, the request for a simple matlab script was in bold face in the very first post.
I understand I do not need to use tf for gain and offset, but at the same time, it is effectively a gain block. And this is simply a small portion of the larger control system I am implementing. The goal is to integrate this gain/offset strategy into a LTI system so I can utilize matlab's standard control box functionality, such as margin, gain, step, impulse, pzmap, rlocus, etc. If it does not process the EU portion correctly, the gains will be off.
I am not certain if your solution will allow me to take that script and drop it into the larger control system. For example, you did not actually use the step() function - you provided output in a plot that looked like a step with discrete steps.
The hangup is someone may say "y=mx+b is not a LTI system", but somehow Simulink is managing to deal with it.
Larger system below, I need to incorporate this EU change into the SP and PV.
Kp = 1.8;
w = 2.683;
z = 1.234;
theta = 0; % USED FOR EXPONENTIAL TERM
% PID PARAMETERS
Kc = 1.3;
Ti = 1.1;
Td = 0.1;
capture = tf(Kp*w^2, [1 2*w*z w^2]);
model = pole(capture);
Te = -1/model(1);
Td0 = -1/model(2);
% PROCESS GAINS
MinEU = -1211;
MaxEU = 3400;
PWMgain = 0.3;
ExcGain = 8.12;
AltGain = Kp*(MaxEU-MinEU)/100/ExcGain/PWMgain;
PWM = tf(PWMgain); % PWM GAIN
PWM.InputName = 'COpct';
PWM.OutputName = 'EXC';
Exciter = tf([ExcGain], [Te 1]); % EXCITER GAIN AND DELAY
Exciter.InputName = 'EXC';
Exciter.OutputName = 'FLD';
Alternator = tf([AltGain], [Td0 1]); % ALTERNATOR GAIN AND DELAY
Alternator.InputName = 'FLD';
Alternator.OutputName = 'PV';
% EU SCALING
EU = tf(100/(MaxEU-MinEU));
offset = 100*MinEU/(MinEU-MaxEU);
EUPV = EU + offset;
EUPV.InputName = 'PV';
EUPV.OutputName = 'PVpct';
EUSP = tf(100/(MaxEU-MinEU) - 100*MinEU/(MaxEU-MinEU));
EUSP.InputName = 'SP';
EUSP.OutputName = 'SPpct';
% DERIVATIVE ON PROCESS VALUE
DoPV = pid(0, 0, Kc*Td);
DoPV.InputName = 'PVpct';
DoPV.OutputName = 'Deriv';
% PI CONTROLLER
RTAC = pidstd(Kc, Ti, 0);
RTAC.InputName = 'error';
RTAC.OutputName = 'RTACout';
% SUMMING JUNCTIONS
S1 = sumblk("error = SPpct - PVpct");
S2 = sumblk("COpct = RTACout - Deriv");
% INTERCONNECTIONS TO CREATE DoPV LOOP AND FINAL PID FEEDBACK
CL = connect(EUSP, RTAC, PWM, Exciter, Alternator, EUPV, DoPV, S1, S2, "SP", "PV");
% ------------------------------------------------------
duration = 3;
StepMag = 500;
figure('f', '2', 'Name', 'Step Response of Closed Loop')
respOpt = RespConfig('InputOffset', 0, 'Amplitude', StepMag, 'Delay', 0.1);
step(CL, duration, respOpt);
figure('f', '3', 'Name','Margin of Closed Loop System');
margin(CL)
damp(CL)
figure('f', '4', 'Name','Pole Zero Map of Closed Loop System');
pzmap(CL)
grid %, axis([-5 0 -4 4])
figure('f', '5', 'Name','Root Locus of Closed Loop System');
rlocus(CL)
Mathieu NOE
Mathieu NOE on 14 May 2024
yes you're right , I read a bit too fast your first post - now it's obvious
I supposed indeed that this was just a small portion from a larger project , so I understand the general use of tf objects as you now describe more what the intention is.
seems to me you're on the right track to achieve your goals , I have no further comment so far
when I started matlab 30+ years ago, there where not so many advanced tools and functions to study open and closed loop systems.
so good luck for the future !

Sign in to comment.

Answers (0)

Products


Release

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!