Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ - Symulator układu dyskretnej regulacji PID - element inercyjny I rzędu.

nowikzdw 27 Gru 2012 17:40 3249 8
  • #1 27 Gru 2012 17:40
    nowikzdw
    Poziom 22  

    Witam szanowne grono kolegów.

    Zostałem zmuszony do nauki programowania(ale to akurat plus ;) ). Kupiłem 3 książki, jedną naszego kolegi z forum Mirka, druga to symfonia, i trzecia C++ w 24h.
    Czytam je uważnie, i staram się jak najwięcej wyciągnąć z wiedzy w nich zawartej.

    Niemniej mam niemały problem.
    Studiuje Automatykę i robotykę, i na jednym z przedmiotów
    (Oprogramowanie systemów mikroprocesorowych) dostaliśmy projekt do zrobienia.
    Używamy tam komputera dydaktycznego opartego na TMSie generalnie marnuje się ten procek tam, bo jak to powiedział prowadzący "odrywamy się od sprzętu".
    Krótko mówiąc mam napisać aplikację i wizualizować ją na wyświetlaczu tego komputera dydaktycznego.

    Trudno pisać program nie mając tego komputera w domu bo niby jak sprawdzać efekty pracy...
    Więc po krótkiej rozmowie z prowadzącym powiedział, że można napisać aplikację która będzie wszystko wyświetlać w oknie windowsowym.
    A teraz do sedna.

    Mam za zadanie zrobić symulator układu dyskretnej regulacji elementu inercyjnego 1 rzędu z czystym opóźnieniem. Regulator oczywiście PID.
    Program ma zawierać wizualizację dynamiczną zmieniającej się w stanie sygnału zadanego, sterującego , regulowanego oraz uchybu.

    Szczerze mówiąc nie bardzo wiem jak to ugryźć. Acha, projekt ma być
    zrobiony na klasach czyli wkrada nam się obiektówka, ale czytałem trochę o tym i wydaje się to niezbyt skomplikowane.
    Rozumiem że trzeba matematyczne równanie regulatora przenieść na program?
    Implementacja tego algorytmu w jakimś mikroprocesorze wydaje mi się, że była by prostsza(może się mylę ;))

    Kompilator jakiego używam to devC++. Mam Visual Studio, ale jak dla
    mnie zbyt rozbudowane narzędzie, nie potrafię się posługiwać ;)

    Jeżeli znalazł by ktoś chwilę żeby mi pomóc to może być tu - na forum, bądź PM. Może być też pomoc odpłatna - szanuje czas innych ludzi.

    Jeżeli ktoś mi zaproponuje cały projekt za określone $$ to darujcie sobie taką pomoc, natomiast jeżeli ktoś zechciałby mnie trochę naprowadzić chociażby od czego zacząć to zapraszam do dyskusji.

    Pozdrawiam, Kamil.

    0 8
  • #2 28 Gru 2012 20:03
    Raphaw
    Poziom 20  

    Polecam porzucenie dev-a, jest to przestarzałe, nierozwijane narzędzie. Na początek do nauki i prostych programów konsolowych się nada, ale będziesz miał problem z wizualizacją przebiegów. Proponuję machnąć w Visual studio (którą masz wersję?) projekt okienkowy, wrzucić jakiś suwak jako wartość zadaną, oraz kontrolkę chart do wyświetlania przebiegów.
    Co do samej struktury programu można by napisać 3 klasy: dla obiektu, regulatora i układu regulacji i w nich zaimplementować zależności matematyczne.
    Jeszcze jedno, co rozumiesz pod pojęciem "czystego opóźnienia" w obiekcie inercyjnym?
    W razie problemów pisz.
    Pozdrawiam.

    0
  • #3 28 Gru 2012 21:05
    kemot55
    Poziom 30  

    DevC jest popularny na PŁ :-(.
    To co musisz zrobić to rozwiązać równanie różniczkowe (lub różnicowe) dla elementu inercyjnego. Opóźnienie zostawiasz na razie w spokoju, regulator też.
    Tak naprawdę rozwiązanie sprowadza się to do jednego całkowania (pewnie najlepiej będzie metodą prostokątów). Wcześniej zakładasz jakieś próbkowanie (np. 100ms). Będzie potrzebne do algorytmu całkowania jak i do realizacji innych dyskretnych funkcji. Każdy krok obliczeń wykonuje się co czas próbkowania.
    Jak wyznaczysz odpowiedź na skok jednostkowy elementu inercyjnego i będzie to coś co przypomina teorię to możesz dodać opóźnienie. Opóźnienie to kolejka FIFO o długości: opóźnienie / próbkowanie (np. 1s opóźnienia i 100ms próbkowanie daje bufor 10-elementowy). FIFO przesuwa się o jeden co 100ms. To co "wychodzi" z FIFO "wchodzi" do algorytmu liczącego odpowiedź elementu inercyjnego jako wymuszenie.
    Jak to zrobisz to implementacja regulatora to już mały pikuś.

    Który rok studiów?

    0
  • #4 29 Gru 2012 07:31
    nowikzdw
    Poziom 22  

    Rok studiów 3, na temat tego jak są prowadzone zajęcia z programowania nie będę się wypowiadać.
    Co do czystego opóźnienia nie mam pojęcia co prowadzący miał na myśli, ale powiedzmy że elementem inercyjnym był by zbiornik, który napełniał by się wodą to za opóźnienie może robić np. wężownica, przez którą ta woda do zbiornika będzie się lała z opóźnieniem ;) Przynajmniej ja to tak rozumiem.

    Co do Visuala wersja 2010 ultimate. Co do Deva fakt, jest troche prymitywny i błędy kompilacji też czasami są takie, że ciężko wyłapać o co chodzi, ale tak jak mówisz jest popularny u nas.

    Kolego kemot55. Mówiąc że muszę rozwiązać równanie różniczkowe elementu inercyjnego, masz na myśli wyznaczenie transmitancji, czy po prostu czysto matematycznego rozwiązania? Swoją drogą muszę przyjąć jakiś element bo konkretnego równania nie mam podanego..

    0
  • Pomocny post
    #5 29 Gru 2012 09:03
    tronics
    Poziom 36  

    Cytat:
    ale powiedzmy że elementem inercyjnym był by zbiornik, który napełniał by się wodą to za opóźnienie może robić np. wężownica, przez którą ta woda do zbiornika będzie się lała z opóźnieniem

    Zły przykład. Przecież jeśli masz tam jakąś inercję to ledwie przy samym otwarciu zaworu, później zbiornik liniowo się będzie napełniał. Jeden z prostszych przykładów to regulacja temperatury (CO, powietrze itp. - duża stała czasowa) , albo regulacja napięcia w obwodzie pośredniczącym falownika (na baterii kondensatorów) - tutaj ze względu na wielokrotnie niższe stałe czasowe udział członu różniczkującego może być bardziej widoczny.

    0
  • Pomocny post
    #6 29 Gru 2012 12:25
    kemot55
    Poziom 30  

    Ja mam na myśli podstawowe równanie elementu inercyjnego: Tdy/dt+y=ku [co odpowiada transmitancji k/(sT+1) ] gdzie y - wyjście, u - wejście. Szukamy y!
    Wobec tego y=(1/T)∫(ku(t)-y(t))dt. Odpowiedź liczysz punkt po punkcie co czas próbkowania i już (w skrócie, bo oznaczenie "dt" będzie się tu nie bardzo na miejscu-przechodzimy do świata dyskretnego). Lepiej zostań w DevC. Pakowanie się w VC to spora inwestycja czasowa. Może się przydać w przyszłości, ale takie równianie to nie jest jakiś problem. Poza tym Pan A.R. uwielbia Dev'a i szkoda zaburzać jego światopogląd jakimś tam VC.
    Warto użyć też goolownika no i głowy.

    A co do zbiornika z otwartym zaworem wylewowym to jest to prawie element inercyjny pierwszego rzędu. Prawie, ponieważ funkcja wypływy zależy od wysokości co daje element nieliniowy (którego przybliżeniem jest el. in.) Nie wiem w jaki sposób (wg kolegi tronics) ten zbiornik ma się napełniać liniowo. To będzie prawdą jeżeli zakręcimy zawór i pompa da stały strumień na wejściu.

    0
  • #7 29 Gru 2012 12:58
    tronics
    Poziom 36  

    Cytat:
    A co do zbiornika z otwartym zaworem wylewowym to jest to prawie element inercyjny pierwszego rzędu

    Nie kojarzę by autor o takim czymś pisał. Nawet jednak w takim przypadku, o którym piszesz nie jest to jednak stricte inercyjny układ- chociaż... trochę przypomina rozładowujący się kondensator. Inercję masz także choćby w przypadku układu regulacji prędkości pojazdu (dajmy na to modelu o masie 3kg) - załączasz silnik i samochód nie zaczyna od np. 1m/s tylko się rozpędza do tej prędkości.
    Cytat:
    Ja mam na myśli podstawowe równanie elementu inercyjnego

    Tak, jest dobrze, ale z drugiej strony z bardzo przystępnej postaci symbolicznej transmitancji można względnie bezproblemowo przejść do formy impulsowej ze zmienną zespoloną z, a następnie wyprowadzić elegancko wzór z wykorzystaniem wyłącznie bufora n próbek (nie wiem teraz dokładnie ilu, ale podejrzewam, że minimum 3) - tyle gdyż oprócz obiektu trzeba też uwzględnić regulator prawda?

    0
  • #8 29 Gru 2012 14:31
    kemot55
    Poziom 30  

    Przecież napisałem "prawie" element inercyjny, bo taki układ zbiornika nie jest liniowy i nie można go jednoznacznie opisać transmitancją.

    A co do samochodu, to przy założeniu stałego momentu/siły napędowej i istnieniu tarcia dla wyjścia w postaci prędkości otrzymujemy element całkujący z inercją (na pewno pierwszego rzędu a może i wyższych). Ma się nijak do przykładu ze zbiornikiem.

    Oczywiście, że można rozwiązać problem poprzez analizę dyskretną, ale w moim odczuciu znacznie bardziej oczywiste jest numeryczne wykonanie całkowania (czyli dwa mnożenia i dodawanie - strasznie skomplikowane). Sprowadzi się do tego samego.
    Na tym etapie jeszcze nie ma mowy o regulatorze.
    Na starcie "niech się" policzy w jakimś programie C-podobnym odpowiedź obiektu na skok jednostkowy.

    Przy obiektowym programowaniu wyobrażam sobie, że regulator jest obiektem niezależnym od obiektu sterowania więc trudno tu zmiksować wszystko w jednym równaniu.

    0
  • #9 29 Gru 2012 23:11
    Raphaw
    Poziom 20  

    Cytat:
    Lepiej zostań w DevC. Pakowanie się w VC to spora inwestycja czasowa.

    W jaki sposób kolega proponuje wykonać końcową wizualizację przebiegów? Nauka OpenGL moim zdaniem to nieco większy wydatek czasowy, niż zapoznanie się z VS, które w wersji 2010 jest całkiem przyjazne.

    0