Script to represent constant offset in scaling of data

2 ビュー (過去 30 日間)
Kurt
Kurt 2024 年 5 月 12 日
コメント済み: Mathieu NOE 2024 年 5 月 14 日
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 件のコメント
Kurt
Kurt 2024 年 5 月 14 日
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 2024 年 5 月 14 日
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 !

サインインしてコメントする。

回答 (0 件)

カテゴリ

Help Center および File ExchangeClassical Control Design についてさらに検索

製品


リリース

R2024a

Community Treasure Hunt

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

Start Hunting!

Translated by