Wpis z mikrobloga

Cześć,

Chciałbym zamodelować w Simulinku system instalacji wodnej, który posiada wejście i wyjście. Celem jest sterowanie ciśnieniem. Posiłkowałem się prawem Boyle'a i napisałem prosty skrypt w Matlabie który symuluje zmianę ciśnienia wody przy stałym dopływie. Żeby uniknąć utraty precyzji przyjąłem, że jedna strona równania jest stała (PVconst)

Jako warunki początkowe użyłem ilość powietrza w rurach i początkowe ciśnienia. Wyjście z systemu to jakaś rura o współczynniku K, przepływ na wyjściu to iloczyn pierwiastka ciśnienia i współczynnika K.
Po odpaleniu wszystko działa i ciśnienie stabilizuje się w okolicach 120Bar

Pytanie jest następujące, czy byłby ktoś uprzejmy i pomógł mi w zamodelowaniu tego w Simulinku? Chciałbym aby działało w trybie ciągłym i żebym mógł zaprojektować pod to regulator . Z góry dziękuję

P_initial = 26;
V_air = 100;
V_constant = V_air;

PV_const = P_initial * V_air
P_current = 26;

pump_flow = 200; %litres/seconds

K_factor = 18;

sampling = 0.001

i_max = 10000;

P_res = zeros(1,i_max);

for i = 1:i_max
output = K_factor * sqrt(P_current) * sampling;
input = pump_flow * sampling;
V_air = V_air - (input - output);
V_air = max(0, V_air);
V_air = min(V_air, V_constant);
if V_air > 0
P_current = PV_const / V_air;
end
P_res(i) = P_current;
%P_current = P_new;
end

plot(P_res)

#matematyka #automatyka #matlab #simulink
  • 13
@Witty: Próbowałem ale nie wiem jak ogarnąć Vair i Pcurrent. Próbowałem zrobić sprzeżenie zwrotne z bloczkiem memory ale dostawałem jakieś śmieci na wykresie
@kobiaszu: do sprzężena zwrotnego w simulinku gdy symulujesz układ ciągły nie są potrzebne żadne dodatkowe bloczki, po prostu "przeciągasz" wyjście wstecz do odpowiedniego miejsca. Podlinkuj screen układu i całej funkcji.
@kobiaszu: no dobra, jak masz to tak jak teraz, to faktycznie nie zadziała. Nie możesz iteracyjnie sumować niczego, co uczestniczy w sprzężeniu zwrotnym w funkcji, bo simulink nie wie jaką wartość ma dać do sprzężenia zwrotnego w pierwszej iteracji. Do tego używaj bloczka Integrator (całkowanie numeryczne), w którym możesz przypisać wartość początkową.
@Witty: Hmm, to nie lepiej po prostu od razu pójść w przestrzeń stanu i zrobić to na state-space albo transmitancji?

Nie do końca rozumiem dlaczego pasowałby tu integrator, z tego co pamiętam to integrator == równanie różniczkowe
@kobiaszu: jeżeli masz jakikolwiek układ, który możesz przedstawić za pomocą state space lub transmitancji, to możesz go też zamodelować jako schemat blokowy z integratorem, no chyba, że ta transmitancja to G(s) = k ( ͡° ͜ʖ ͡°) W Twoim zapisie problem jest jeden - jaką wartość ma "P_current" w pierwszej iteracji wykonywanej przez simulink? Nie ma żadnej, bo nie ma czego wziąć ze sprzężenia zwrotnego, bo nie
@r4do5: @Witty:

Podłączyłem integratory z warunkami początkowymi(te same co w function block) i nie wygląda to za dobrze. Moim zdaniem problem istnieje w dosłownym przeniesieniu funkcji do Simulinka. Zauważ, że w skrypcie używam sztucznego samplingu i obliczenia zachodzą iteracyjnie. W fuction block w Simulinku usunąłem ten sampling i na dzień dobry zerowana jest wartość powietrza w rurach.
kobiaszu - @r4do5: @Witty: 

Podłączyłem integratory z warunkami początkowymi(te sa...

źródło: comment_LsujAJoKyaREAuyaGWNXufVZj5JfQdaI.jpg

Pobierz
@Witty: @r4do5: Dobra, to może od początku jak wygląda system. Można przyjąć, że jest to zbiornik z wodą, który zawiera w sobie jakąś jakość powietrza. Wyjście ze zbiornika to odpływ o współczynniku K. Wejście to stały dopływ wody powiedzmy 100l/min.
Jak obliczyć ciśnienie wody w tym systemie, znając rozmiar zbiornika, początkowe ciśnienie i ilość powietrza?
kobiaszu - @Witty: @r4do5: Dobra, to może od początku jak wygląda system. Można przyj...

źródło: comment_j8duT5CBEjhGvuh7NsgFnQERLLhSV4w5.jpg

Pobierz
@kobiaszu: niestety, na ostatnie pytanie odpowiem wprost: nie wiem. Ale jeżeli już się dowiesz i będziesz miał problem z samą implementacją w Matlabie/Simulinku, to daj znać ;)