Guest User

controller 2

a guest
May 18th, 2024
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.36 KB | None | 0 0
  1. function [delta_tau, e, u] = myFunction(IT2_Strecke, tau, a2, a1, a0, b2, b1, b0, u_max, u_min, w, x)
  2.  
  3. coder.extrinsic("tf", "d2c", "c2d", "tfdata");
  4.  
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6. % Initialisierung der persistenten Variablen %
  7. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  8.  
  9. persistent ek_1; % vorheriger interne Regelfehler
  10. persistent ek_2; % interner Regelfehler vor zwei Zyklen
  11. persistent ek_3; % interner Regelfehler vor drei Zyklen
  12.  
  13. persistent uk_1; % vorherige ausgegebene Stellgröße
  14. persistent uk_2; % ausgegebene Stellgröße vor zwei Zyklen
  15. persistent uk_3; % ausgegebene Stellgröße vor drei Zyklen
  16.  
  17. persistent b2_neu; % Zählerkoeffizienten mit neuer Abtastzeit
  18. persistent b1_neu; % Zählerkoeffizienten mit neuer Abtastzeit
  19. persistent b0_neu; % niedrigster Zählerkoeffizienten mit neuer Abtastzeit
  20.  
  21. persistent a2_neu; % Nennerkoeffizienten mit neuer Abtastzeit
  22. persistent a1_neu; % Nennerkoeffizienten mit neuer Abtastzeit
  23. persistent a0_neu; % niedrigster Nennerkoeffizienten mit neuer Abtastzeit
  24.  
  25. persistent tau_neu; % neu berechnete Abtastzeit
  26.  
  27. if isempty(tau_neu)
  28. tau_neu = 0.1;
  29. end
  30.  
  31. if isempty(ek_1)
  32. ek_1 = 0;
  33. ek_2 = 0;
  34. ek_3 = 0;
  35.  
  36. uk_1 = 0;
  37. uk_2 = 0;
  38. uk_3 = 0;
  39. end
  40.  
  41. if isempty(b2_neu)
  42. b2_neu = 0;
  43. b1_neu = 0;
  44. b0_neu = 0;
  45.  
  46. a2_neu = 0;
  47. a1_neu = 0;
  48. a0_neu = 0;
  49. end
  50.  
  51. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  52. % Berechnung des Regelfehlers %
  53. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  54.  
  55. ek = w -x; % aktueller Regelfehler im Vergleich zum w0 - x
  56.  
  57. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  58. % Dead-Beat-Regelalgorithmus %
  59. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  60.  
  61. % Bei a1, a2 und b1 gibt die Zahl den Exponenten an -> a*z, a*z^2 und b*z
  62. b1b0 = b1 + b0;
  63. b2b1b0 = b2 + b1 + b0;
  64.  
  65. if IT2_Strecke < 1
  66. % PT2
  67. uk = (1 / b1b0) * (ek + a1 * ek_1 + a0 * ek_2 + b1 * uk_1 + b0 * uk_2);
  68. else
  69. % IT2
  70. uk = (1 / b2b1b0) * (ek + a2 * ek_1 + a1 * ek_2 + a0 * ek_3 + b2 * uk_1 + b1 * uk_2 + b0 * uk_3);
  71. end
  72.  
  73. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  74. % Ermittlung der neuen Abtastzeit %
  75. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  76.  
  77. if IT2_Strecke < 1
  78. %%%%%%%%%%%%%%%
  79. % PT2-Strecke %
  80. %%%%%%%%%%%%%%%
  81.  
  82. gz = tf([b2 b1 b0],[a2 a1 a0], tau); % Übertragungsfunktion der diskretisierten Strecke erstellen
  83. gs = d2c(gz); % Übertragungsfunktion der eingegebenen Strecke erstellen
  84.  
  85. if (uk > u_max && abs(ek_1) < 0.001 && abs(ek_2) < 0.001) % andere Bedingungen damit eine neue Abtastzeit nur aus einer Ruhelage ermittelt wird
  86. while (uk > u_max)
  87. tau_neu = tau_neu + 0.001;
  88.  
  89. gz_neu = c2d(gs, tau_neu); % kontinuierliche Strecke mit neuer Abtastzeit diskretisieren
  90.  
  91. [numerator, denominator] = tfdata(gz_neu); % Koeffizienten der diskretiesierten Strecke extrahieren
  92.  
  93. % Umwandlung von Zell-Arrays in normale Arrays
  94. numerator_array = cell2mat(numerator);
  95. denominator_array = cell2mat(denominator);
  96.  
  97. % Zähler
  98. b2_neu = numerator_array(1);
  99. b1_neu = numerator_array(2);
  100. b0_neu = numerator_array(3); % niedrigster Exponent
  101.  
  102. % Nenner
  103. a2_neu = denominator_array(1);
  104. a1_neu = denominator_array(2);
  105. a0_neu = denominator_array(3); % niedrigster Exponent
  106.  
  107. b1b0_neu = b1_neu + b0_neu;
  108. uk = (1 / b1b0_neu) * (ek + a1_neu * ek_1 + a0_neu * ek_2 + b1_neu * uk_1 + b0_neu * uk_2);
  109. end
  110.  
  111. assignin('base', 'tau_neu', tau_neu);
  112.  
  113. assignin('base', 'b2_neu', b2_neu);
  114. assignin('base', 'b1_neu', b1_neu);
  115. assignin('base', 'b0_neu', b0_neu);
  116.  
  117. assignin('base', 'a2_neu', a2_neu);
  118. assignin('base', 'a1_neu', a1_neu);
  119. assignin('base', 'a0_neu', a0_neu);
  120. end
  121.  
  122. if (uk < u_min && abs(ek_1) < 0.001 && abs(ek_2) < 0.001) % andere Bedingungen damit eine neue Abtastzeit nur aus einer Ruhelage ermittelt wird
  123. while (uk > u_max)
  124. tau_neu = tau_neu + 0.001;
  125.  
  126. gz_neu = c2d(gs, tau_neu); % kontinuierliche Strecke mit neuer Abtastzeit diskretisieren
  127.  
  128. [numerator, denominator] = tfdata(gz_neu); % Koeffizienten der diskretiesierten Strecke extrahieren
  129.  
  130. % Umwandlung von Zell-Arrays in normale Arrays
  131. numerator_array = cell2mat(numerator);
  132. denominator_array = cell2mat(denominator);
  133.  
  134. % Zähler
  135. b2_neu = numerator_array(2);
  136. b1_neu = numerator_array(3);
  137. b0_neu = numerator_array(4); % niedrigster Exponent
  138.  
  139. % Nenner
  140. a2_neu = denominator_array(2);
  141. a1_neu = denominator_array(3);
  142. a0_neu = denominator_array(4); % niedrigster Exponent
  143.  
  144. b1b0_neu = b1_neu + b0_neu;
  145. uk = (1 / b1b0_neu) * (ek + a1_neu * ek_1 + a0_neu * ek_2 + b1_neu * uk_1 + b0_neu * uk_2);
  146. end
  147.  
  148. assignin('base', 'tau_neu', tau_neu);
  149.  
  150. assignin('base', 'b2_neu', b2_neu);
  151. assignin('base', 'b1_neu', b1_neu);
  152. assignin('base', 'b0_neu', b0_neu);
  153.  
  154. assignin('base', 'a2_neu', a2_neu);
  155. assignin('base', 'a1_neu', a1_neu);
  156. assignin('base', 'a0_neu', a0_neu);
  157. end
  158. else
  159. %%%%%%%%%%%%%%%
  160. % IT2-Strecke %
  161. %%%%%%%%%%%%%%%
  162.  
  163. gz = tf([b2 b1 b0],[1 a2 a1 a0], tau); % Übertragungsfunktion der diskretisierten Strecke erstellen
  164. gs = d2c(gz); % Übertragungsfunktion der eingegebenen Strecke erstellen
  165.  
  166. if (uk > u_max && abs(ek_1) < 0.001 && abs(ek_2) < 0.001 && abs(ek_3) < 0.001) % andere Bedingungen damit eine neue Abtastzeit nur aus einer Ruhelage ermittelt wird
  167. while (uk > u_max)
  168. tau_neu = tau_neu + 0.001;
  169.  
  170. %IT2 = tf(10, [0.02 0.3 1 0]);
  171.  
  172. gz_neu = c2d(gs, tau_neu); % kontinuierliche Strecke diskretisieren
  173.  
  174. [numerator, denominator] = tfdata(gz_neu); % Koeffizienten der diskretiesierten Strecke extrahieren
  175.  
  176. % Umwandlung von Zell-Arrays in normale Arrays
  177. numerator_array = cell2mat(numerator);
  178. denominator_array = cell2mat(denominator);
  179.  
  180. % Zähler
  181. b2_neu = numerator_array(2);
  182. b1_neu = numerator_array(3);
  183. b0_neu = numerator_array(4); % niedrigster Exponent
  184.  
  185. % Nenner
  186. a2_neu = denominator_array(2);
  187. a1_neu = denominator_array(3);
  188. a0_neu = denominator_array(4); % niedrigster Exponent
  189.  
  190. b2b1b0_neu = b2_neu + b1_neu + b0_neu;
  191. uk = (1 / b2b1b0_neu) * (ek + a2_neu * ek_1 + a1_neu * ek_2 + a0_neu * ek_3 + b2_neu * uk_1 + b1_neu * uk_2 + b0_neu * uk_3);
  192. end
  193.  
  194. assignin('base', 'tau_neu', tau_neu);
  195.  
  196. assignin('base', 'b2_neu', b2_neu);
  197. assignin('base', 'b1_neu', b1_neu);
  198. assignin('base', 'b0_neu', b0_neu);
  199.  
  200. assignin('base', 'a2_neu', a2_neu);
  201. assignin('base', 'a1_neu', a1_neu);
  202. assignin('base', 'a0_neu', a0_neu);
  203. end
  204.  
  205. if (uk < u_min && abs(ek_1) < 0.001 && abs(ek_2) < 0.001 && abs(ek_3) < 0.001) % andere Bedingungen damit eine neue Abtastzeit nur aus einer Ruhelage ermittelt wird
  206. while (uk > u_max)
  207. tau_neu = tau_neu + 0.001;
  208.  
  209. gz_neu = c2d(gs, tau_neu); % kontinuierliche Strecke diskretisieren
  210.  
  211. [numerator, denominator] = tfdata(gz_neu); % Koeffizienten der diskretiesierten Strecke extrahieren
  212.  
  213. % Umwandlung von Zell-Arrays in normale Arrays
  214. numerator_array = cell2mat(numerator);
  215. denominator_array = cell2mat(denominator);
  216.  
  217. % Zähler
  218. b2_neu = numerator_array(2);
  219. b1_neu = numerator_array(3);
  220. b0_neu = numerator_array(4); % niedrigster Exponent
  221.  
  222. % Nenner
  223. a2_neu = denominator_array(2);
  224. a1_neu = denominator_array(3);
  225. a0_neu = denominator_array(4); % niedrigster Exponent
  226.  
  227. b2b1b0_neu = b2_neu + b1_neu + b0_neu;
  228. uk = (1 / b2b1b0_neu) * (ek + a2_neu * ek_1 + a1_neu * ek_2 + a0_neu * ek_3 + b2_neu * uk_1 + b1_neu * uk_2 + b0_neu * uk_3);
  229. end
  230.  
  231. assignin('base', 'tau_neu', tau_neu);
  232.  
  233. assignin('base', 'b2_neu', b2_neu);
  234. assignin('base', 'b1_neu', b1_neu);
  235. assignin('base', 'b0_neu', b0_neu);
  236.  
  237. assignin('base', 'a2_neu', a2_neu);
  238. assignin('base', 'a1_neu', a1_neu);
  239. assignin('base', 'a0_neu', a0_neu);
  240. end
  241. end
  242.  
  243. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  244. % Solange das System nicht in Ruhe ist, wird die Abtastzeit gehalten %
  245. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  246.  
  247. if IT2_Strecke < 1
  248. if (abs(ek_1) > 0.001 || abs(ek_2) > 0.001)
  249. b1b0_neu = b1_neu + b0_neu;
  250. uk = (1 / b1b0_neu) * (ek + a1_neu * ek_1 + a0_neu * ek_2 + b1_neu * uk_1 + b0_neu * uk_2);
  251. end
  252. else
  253. if (abs(ek_1) > 0.001 || abs(ek_2) > 0.001 || abs(ek_3) > 0.001)
  254. b2b1b0_neu = b2_neu + b1_neu + b0_neu;
  255. uk = (1 / b2b1b0_neu) * (ek + a2_neu * ek_1 + a1_neu * ek_2 + a0_neu * ek_3 + b2_neu * uk_1 + b1_neu * uk_2 + b0_neu * uk_3);
  256. end
  257. end
  258.  
  259. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  260. % Wenn Regelung fertig, Sollwert erreicht mit eine Genauigkeit kleiner als 0.01 %
  261. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  262.  
  263. if IT2_Strecke < 1
  264. if (abs(ek_2) < 0.001 && abs(ek_1) < 0.001 && abs(ek) < 0.001 && w ~= 0)
  265. uk = (1 / b1b0) * (ek + a1 * ek_1 + a0 * ek_2 + b1 * uk_1 + b0 * uk_2);
  266. tau_neu = tau;
  267. end
  268.  
  269. if (abs(ek_2) < 0.001 && abs(ek_1) < 0.001 && abs(ek) < 0.001 && w == 0)
  270. uk = 0;
  271. tau_neu = tau;
  272. end
  273. else
  274. if(abs(ek)<0.001)
  275. uk = 0;
  276. tau_neu = tau;
  277. end
  278. end
  279.  
  280. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  281. % Aktualisieren der Vergangenheitswerte %
  282. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  283.  
  284. ek_3 = ek_2;
  285. ek_2 = ek_1;
  286. ek_1 = ek;
  287.  
  288. uk_3 = uk_2;
  289. uk_2 = uk_1;
  290. uk_1 = uk;
  291.  
  292. %%%%%%%%%%%%%%%%%%%%%
  293. % Ausgabe der Werte %
  294. %%%%%%%%%%%%%%%%%%%%%
  295.  
  296. e = ek;
  297. u = uk;
  298.  
  299. delta_tau = tau_neu - tau;
  300. end
Add Comment
Please, Sign In to add comment