I was assigned an existing app project. There i should implement a Simulink model for a dead beat controller. The Simulink model works for every input i give, but only when doing it with my test file.
In the main file give the transfer function Gs to the model, the tau value, the value of u_min and u_max. The controller should get the variables, regulate it and give me back the u, corrected w and corrected e. But the simulation gets into a loop and i cant do anything. It crashes right wenn i do :
simOut = sim('Deadbeatregler.slx','SimulationMode','normal');
It worked for sometime. Dont remember changing anything.
I will show the app designer code for my recall function. The other codes i put in a pastebin link.
Callback Function:
% Button pushed function: StartButton
function StartButtonPushed(app, event)
%Löschen aller Text- und Diagramm-Inhalte
app.StreckeTextArea.Value = '';
app.DeadBeatReglerTextArea.Value = '';
app.MesswerteTable.Data = {};
cla(app.RegelAxes);
cla(app.StellAxes);
%Streckenübertragungsfunktion in die Funktion holen
Gs = evalin('base','Gs');
%Entscheidung, welche Strategie gewählt wird
% IT2_Strecke = 0 -> PT2 oder IT2_Strecke = 1 -> IT2
%Teststrecke
%IT2_Strecke = 0;
%PT2 = tf(3, [0.1 0.7 1]);
%IT2 = tf(10, [0.02 0.3 1 0]);
%Eingabewerte auslesen und übergeben
assignin('base','u_max',app.U_maxEditField.Value);
assignin('base','u_min',app.U_minEditField.Value);
assignin('base','tau',app.AbtastzeitEditField.Value);
%assignin('base','IT2',0);
IT2_Strecke = evalin('base','IT2_Strecke');
%auswahlModi = app.RegelstrategieButtonGroup.Text;
u_max = evalin('base','u_max');
u_min = evalin('base','u_min');
if IT2_Strecke < 1
%%%%%%%%%%%%%%%
% PT2-Strecke %
%%%%%%%%%%%%%%%
%gs = PT2;
tau = evalin('base', 'tau');
gz = c2d(Gs, tau); % kontinuierliche Strecke diskretisieren
[numerator, denominator] = tfdata(gz); % Koeffizienten der diskretiesierten Strecke extrahieren
% Zähler
b2 = numerator{1}(1);
b1 = numerator{1}(2);
b0 = numerator{1}(3); % niedrigster Exponent
% Nenner
a2 = denominator{1}(1);
a1 = denominator{1}(2);
a0 = denominator{1}(3); % niedrigster Exponent
assignin('base','b2',b2);
assignin('base','b1',b2);
assignin('base','b0',b0);
assignin('base','a2',a2);
assignin('base','a1',a1);
assignin('base','a0',a0);
else
%%%%%%%%%%%%%%%
% IT2-Strecke %
%%%%%%%%%%%%%%%
%gs = IT2;
tau = evalin('base', 'tau');
gz = c2d(Gs, tau); % kontinuierliche Strecke diskretisieren
[numerator, denominator] = tfdata(gz); % Koeffizienten der diskretiesierten Strecke extrahieren
% Zähler
b2 = numerator{1}(2);
b1 = numerator{1}(3);
b0 = numerator{1}(4); % niedrigster Exponent
% Nenner
a2 = denominator{1}(2);
a1 = denominator{1}(3);
a0 = denominator{1}(4); % niedrigster Exponent
assignin('base','b2',b2);
assignin('base','b1',b2);
assignin('base','b0',b0);
assignin('base','a2',a2);
assignin('base','a1',a1);
assignin('base','a0',a0);
end
%Debug
%gs = evalin('base', 'gs');
%app.DebugTextArea.Value = gs;
%Werte aus Simulation holen
simOut = sim('Deadbeatregler.slx','SimulationMode','normal');
Sollwert_korr_w = simOut.get('Sollwert_korr_w');
Sollwert_korr_e = simOut.get('Sollwert_korr_e');
Sollwert_korr_u = simOut.get('Sollwert_korr_u');
Sollwert_Regelgroesse = simOut.get('Sollwert_Regelgroesse');
Sollwert_Stellgroesse = simOut.get('Sollwert_Stellgroesse');
Abtastzeit_Regelgroesse = simOut.get('Abtastzeit_Regelgroesse');
Abtastzeit_Stellgroesse = simOut.get('Abtastzeit_Stellgroesse');
%Debug
assignin('base',"Sollwert_Stellgroesse",Sollwert_Stellgroesse);
assignin('base',"Abtastzeit_Stellgroesse",Abtastzeit_Stellgroesse);
assignin('base',"Sollwert_korr_u",Sollwert_korr_u);
assignin('base',"Sollwert_korr_w",Sollwert_korr_w);
assignin('base',"Sollwert_korr_e",Sollwert_korr_e);
if IT2_Strecke < 1
% Ausgabe der Streckenübertragungsfunktion Gz
app.StreckeTextArea.Value = sprintf('t%.5fz + %.5fnGz(z) = ―――――――――――――――――― nt%.5fz² + %.5fz',b2,b1,a2,a1);
% Ausgabe des Dead-Beat-Reglers Gz
app.DeadBeatReglerTextArea.Value = sprintf('tz² + %.5fz + %.5fnGr(z) = ―――――――――――――――――――――― nt%.5fz³ + %.5fz² + %.5fz',a1,a2,b1+b2,-b1,-b2);
else
% Ausgabe der Streckenübertragungsfunktion Gz
app.StreckeTextArea.Value = sprintf('t%.5fz² + %.5fz + %.5fnGz(z) = ―――――――――――――――――― ntz³ + %.5fz² + %.5fz + %.5f',b1,b2,b3,a1,a2,a3);
% Ausgabe des Dead-Beat-Reglers Gz
app.DeadBeatReglerTextArea.Value = sprintf('tz³ + %.5fz² + %.5fz + %.5fnGr(z) = ―――――――――――――――――――――― nt%.5fz³ + %.5fz² + %.5fz + %.5f',a1,a2,a3,b1+b2+b3,-b1,-b2,-b3);
end
% Ausgabe Ausregelschritte und Gesamtregeldauer
letzter_zeitpunkt = app.AbtastzeitEditField.Value(end);
if IT2_Strecke == 0
app.kEditField.Value = 1;%countervariable;
app.TrsEditField.Value = 1;%zeitvariable;
else
app.kEditField.Value = 1;%countervariable;
app.TrsEditField.Value = 1;%zeitvariable;
end
%Tabelle für U, W, E
%Wenn Abtastzeit
%Wenn Sollwert
%Wenn Keine
tabellenzeit = Sollwert_korr_u.time;
values1 = Sollwert_korr_u.signals.values;
values2 = Sollwert_korr_w.signals.values;
values3 = Sollwert_korr_e.signals.values;
Data = table(tabellenzeit, values1, values2, values3);
uitable_data = table2cell(Data);
app.MesswerteTable.Data = uitable_data;
% Plot der Stellgröße
if app.SollwertkorrekturButton.Value
stairs(app.StellAxes, Sollwert_Stellgroesse.time, Sollwert_Stellgroesse.signals.values, "LineWidth", 1.5);
elseif app.AbtastzeitButton.Value
stairs(app.StellAxes, Abtastzeit_Stellgroesse.time, Abtastzeit_Stellgroesse.signals.values, "LineWidth", 1.5);
elseif app.keineButton.Value %für 'keine' wird der Graph für Sollwertkorrektur verwendet
stairs(app.StellAxes, Sollwert_Stellgroesse.time, Sollwert_Stellgroesse.signals.values, "LineWidth", 1.5);
end
%Plot der Regelgröße
if app.SollwertkorrekturButton.Value == 1
plot(app.RegelAxes, Sollwert_Regelgroesse.time, [Sollwert_Regelgroesse.signals.values], "LineWidth", 1.5);
elseif app.AbtastzeitButton.Value == 1
plot(app.RegelAxes, Abtastzeit_Regelgroesse.time, [Abtastzeit_Regelgroesse.signals.values], "LineWidth", 1.5);
else app.keineButton.Value%für 'keine' wird der Graph für Sollwertkorrektur verwendet
plot(app.RegelAxes, Sollwert_Regelgroesse.time, [Sollwert_Regelgroesse.signals.values], "LineWidth", 1.5);
end
%% Fehlerausgabe
if app.AbtastzeitEditField.Value <= 0
app.StreckeTextArea.Value = 'Abtastzeit muss größer als 0 sein!';
app.DeadBeatReglerTextArea.Value = 'Abtastzeit muss größer als 0 sein!';
elseif app.U_maxEditField.Value < app.U_minEditField.Value
app.StreckeTextArea.Value = 'U_max muss größer als U_min sein!';
app.DeadBeatReglerTextArea.Value = 'U_max muss größer als U_min sein!';
elseif app.U_maxEditField.Value <= 0
app.StreckeTextArea.Value = 'U_max muss positiv sein!';
app.DeadBeatReglerTextArea.Value = 'U_max muss positiv sein!';
elseif app.U_minEditField.Value > app.U_maxEditField.Value
app.StreckeTextArea.Value = 'U_min muss größer als U_max sein!';
app.DeadBeatReglerTextArea.Value = 'U_min muss größer als U_max sein!';
elseif app.U_minEditField.Value >= 0
app.StreckeTextArea.Value = 'U_min muss negativ sein!';
app.DeadBeatReglerTextArea.Value = 'U_min muss negativ sein!';
end
end
Complete App designer Code:
https://pastebin.com/X6hcpV0i
PID DesignerMod: (only things i added were from line 412 to 442
https://pastebin.com/B3JXxyQj
Simulink code for controller:
Controller 1:
https://pastebin.com/Pk20zNax
Controller 2:
https://pastebin.com/4ap72Jys
I hope someone can find the thing i overlooked or the thing that is missing or wrong.
Tried chatgpt, colleagues, forum articles…
The test function should be :
Zähler: 3
Nenner: 0.1 0.7 1
Transfer Function Gs: 30/((s+5)(s+1)
Ruklesy is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.