Advertisement
JachyHm

TrCh x6x

Dec 2nd, 2020
1,020
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.37 KB | None | 0 0
  1. TrCh = {
  2.     --nastavitelne konstanty
  3.     FMAX = 220, --maximalni celkova tazna sila [kN]
  4.     PREVOD = 74/30, --prevodovy pomer
  5.     IkABSMAX = 1200, --maximalni kotevni proud [A] (1200 pro 361, jinak 1100)
  6.     N_IkMAX = 36.725925, --uhlova rychlost TM [rad/s] pri ktere zacne regulace snizovat Ik - totozne pro vsechny x6x
  7.     N_IkMIN = 102.21191626409, --uhlova rychlost TM [rad/s] pri ktere prestane regulace snizovat Ik - totozne pro vsechny x6x
  8.     IbMIN = 15, --minimalni nezeslabeny budici proud [A] - pri w = 0
  9.     IbMAX = 120, --maximalni nezeslabeny budici proud [A] - pri w = 0 (120 pro 361, jinak 110)
  10.     IbINC_START = 100, --hodnota Ik kdy zacne stoupat Ib
  11.     D_KOLA = 1.215, --prumer kola [m]
  12.  
  13.     w_TM = 0, --omega TM [rad/s]
  14.     pt = 0, --pomerny tah 1MSK
  15.     targetIk = 0, --vysledny zadany kotevni proud 1MSK [A]
  16.     targetIb = 0, --vysledny zadany budici proud 1MSK [A]
  17.     ik = 0, --okamzita hodnota kotevniho proudu [A]
  18.     ib = 0, --okamzita hodnota budiciho proudu [A]
  19.  
  20.     nabehlyIb = false, --false dokud Ib nedosahl alespon 70% zadane hodnoty, blokuje nabeh Ik
  21.  
  22.     GetMaxIb = function(self) --vraci maximalni mozny Ib pro aktualni rychlost
  23.         ibMax = math.min(
  24.             self.IbMAX, --maximalni Ib az do UiMAX
  25.             1.615276 + (110 - 1.615276)/(1 + ((self.w_TM-101.449)/17.02498)^0.8428483) --uhlova rychlost TM kdy Ui == UiMAX
  26.         );
  27.  
  28.         return ibMax;
  29.     end,
  30.  
  31.     GetIb = function(self, maxIk) --vraci zadany budici proud v zavislosti na aktualnim pt
  32.         if (self.pt > 0) then --nenulove pt, jinak zadany Ib je nulovy
  33.             baseIb = self.IbMIN; --zakladni nejmensi mozny Ib
  34.             if (maxIk > self.IbINC_START) then --pokud Ik dosahl stanovene hodnoty, zacne se zvysovat Ib
  35.                 dIk = (self.IbMAX-self.IbMIN)/(self.IkABSMAX - self.IbINC_START); --zdvih na A Ik
  36.                 baseIb = self.IbMIN + (maxIk - self.IbINC_START)*dIk; --minimalni hodnota + vypocitany prirustek podle Ik
  37.             end
  38.             return math.min(baseIb, self:GetMaxIb()); --nesmi prekrocit maximalni fyzikalne mozny Ib
  39.         else
  40.             return 0;
  41.         end
  42.     end,
  43.    
  44.     GetIkForF = function(self, _kn) --vraci pozadovany kotevni proud pro zadanou taznou silu
  45.         _k = self.PREVOD/(81/23); --prepocet z charakteristiky 163 na pouzity prevod
  46.         ibKoef = 1 - ((math.max(self.w_TM-self.N_IkMIN, 0)*1.33709)/self.FMAX); --koeficient zeslabeneho budeni
  47.         kn = _kn/ibKoef; --fiktivni pozadovane kn vlivem zeslabeneho pole
  48.         exp_ik = 0; --exponencialni cast
  49.         if (kn > 0) then
  50.             exp_ik = math.sqrt(kn / (0.0005417 * _k));
  51.         end
  52.         lin_ik = (kn + 44.29796 * _k)/(0.3098367 * _k);
  53.         if (math.min(exp_ik, lin_ik) < 289.4343) then --bod prechodu z exponencialni na linearni krivku - vzdy 289.4343 A
  54.             return exp_ik; --pred bodem vrati exponencialni vysledek
  55.         else
  56.             return lin_ik; --za bodem linearni
  57.         end
  58.     end,
  59.  
  60.     GetIk = function(self, baseIk) --vraci skutecny mozny kotevni proud na zaklade pozadovaneho
  61.         if (self.w_TM > self.N_IkMAX) then --pri vetsi rychlosti nez bod zacatku snizovani Ik
  62.             dIk = (self.IkABSMAX-850)/(self.N_IkMIN-self.N_IkMAX); --zdvih na rad/s
  63.             baseIk = math.min(baseIk, math.max(self.IkABSMAX - (self.w_TM - self.N_IkMAX)*dIk, 850)) --vraceny Ik je minimem z Ik pozadovanym regulaci a vykonem omezeneho Ik
  64.         end
  65.         if (baseIk > self.targetIb/0.032) then --pokud sytici pomer Ik/Ib dosahl hodnoty 0.032
  66.             baseIk = self.targetIb/0.032; --limituje Ik takovym zpusobem aby pomer neklesl pod 0.032
  67.         end
  68.  
  69.         return baseIk;
  70.     end,
  71.  
  72.     GetF = function(self) --vraci skutecne vystupni kN podle okamzitych hodnot Ib a Ik
  73.         if self.ib > 0 and self.ik > 0 then --pokud jsou kotevni i budici proudy nenulove
  74.             ibNabehKoef = math.min(self.ib/self.targetIb,1); --jakesi pseudo omezeni pri neplnem buzeni
  75.             ibKoef = 1 - ((math.max(self.w_TM-self.N_IkMIN, 0)*1.33709)/self.FMAX); --koeficient zeslabeneho budiciho pole pri vysokych V
  76.             _k = self.PREVOD/(81/23); --prepocet z charakteristiky 163 na pouzity prevod
  77.             if (self.ik < 282.5367) then --bod prechodu z exponencialni na linearni krivku - vzdy 282.5367 A
  78.                 return (0.0005417 * _k * self.ik^2) * ibNabehKoef * ibKoef; --exponencialni cast pred bodem
  79.             else
  80.                 return (0.3098367 * _k * self.ik - 44.29796 * _k) * ibNabehKoef * ibKoef; --linearni cast za bodem
  81.             end
  82.         else
  83.             return 0;
  84.         end
  85.     end,
  86.  
  87.     Update = function(self,deltaTime,pozTah,speed) --update funkce TrCh, deltaTime - ubehly cas od posledniho volani [s], pozTah - navoleny tah, speed - rychlost [m/s]
  88.         self.pt = pozTah
  89.         self.w_TM = speed / self.D_KOLA * self.PREVOD * 2; --prepocet m/s na omegu
  90.         maxIk = self:GetIkForF(self.FMAX * self.pt); --teoreticky pozadovany Ik podle zadanych kN [A]
  91.         self.targetIb = self:GetIb(maxIk); --pozadovany Ib [A]
  92.         self.targetIk = self:GetIk(maxIk); --pozadovany Ik [A]
  93.         if (self.ib > self.targetIb) then --pokud skutecny Ib > pozadovany Ib
  94.             self.ib = math.max(self.ib - deltaTime*15, self.targetIb) --snizuj cca 15A/s
  95.             Call("SetControlValue", "IBA", 0, self.ib);
  96.             Call("SetControlValue", "IBB", 0, self.ib);
  97.         elseif (self.ib < self.targetIb) then --pokud pozadovany Ib > skutecny Ib
  98.             self.ib = math.min(self.ib + deltaTime*15, self.targetIb) --zvysuj cca 15A/s
  99.             Call("SetControlValue", "IBA", 0, self.ib);
  100.             Call("SetControlValue", "IBB", 0, self.ib);
  101.         end
  102.         if (self.ib <= 0) then --nulovy Ib
  103.             if (self.ik > 0) then --nenulovy Ik
  104.                 self.ik = math.max(self.ik - deltaTime*600, 0) --snizuj Ik cca. 600A/s
  105.                 Call("SetControlValue", "IKA", 0, self.ik);
  106.                 Call("SetControlValue", "IKB", 0, self.ik);
  107.             else
  108.                 self.ik = 0
  109.             end
  110.             self.nabehlyIb = false --Ib nedosahl 70% pozadovaneho
  111.         else
  112.             self.nabehlyIb = self.nabehlyIb or self.ib > math.min(self.targetIb, 15)*0.7 --Ib minimalne 70% pozadovaneho, jinak blokovany nabeh Ik
  113.             if (self.ik > self.targetIk) then --pokud skutecny Ik > pozadovany Ik
  114.                 self.ik = math.max(self.ik - deltaTime*600, self.targetIk) --snizuj Ik cca. 600A/s
  115.                 Call("SetControlValue", "IKA", 0, self.ik);
  116.                 Call("SetControlValue", "IKB", 0, self.ik);
  117.             elseif (self.ik < self.targetIk and self.nabehlyIb) then --pozadovany Ik > skutecny Ik a Ib jiz dosahl alespon 70%
  118.                 self.ik = math.min(self.ik + 350*deltaTime, self.targetIk) --zvysuj Ik cca. 350A/s
  119.                 Call("SetControlValue", "IKA", 0, self.ik);
  120.                 Call("SetControlValue", "IKB", 0, self.ik);
  121.             end
  122.         end
  123.         Call("SetControlValue", "Regulator", 0, math.min(self:GetF(),self.FMAX)/self.FMAX); --nastavi regulator podle okamzitych hodnot Ik a Ib
  124.     end
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement