Podręcznik

Strona: SEZAM - System Edukacyjnych Zasobów Akademickich i Multimedialnych
Kurs: Integracja Technik Sztucznej Inteligencji
Książka: Podręcznik
Wydrukowane przez użytkownika: Gość
Data: wtorek, 7 października 2025, 13:17

1. Wstęp

Celem części projektowej jest samodzielna, praktyczna implementacja wybranych metod prezentowanych w modułach Zastosowania Logiki Rozmytej, Zastosowania Sieci Neuronowych oraz Zastosowania Algorytmów Inteligencji Masowej. Zadaniem jest wybór, a następnie implementacja odpowiednich metod do realizacji kilku mini-zadań projektowych. Wszystkie zadania związane są z zagadnieniami regulacji i modelowania prostego obiektu dydaktycznego, którym jest zespół trzech zbiorników połączonych szeregowo wraz z podsystemem zasilania wodą (TTS).

2. Obiekt regulacji i modelowania

Obiektem regulacji i modelowania jest zespół trzech zbiorników połączonych szeregowo wraz z podsystemem zasilania wodą. Schemat obiektu został przedstawiony na rysunku poniżej.

Schemat zespołu trzech zbiorników wraz z układem regulacji
Schemat zespołu trzech zbiorników wraz z układem regulacji

Zbiór zmiennych procesowych wraz z opisem, jednostkami oraz możliwym zakresem zmienności przedstawiono w tabeli poniżej. Zbiór tej obejmuje zmienne związane z działaniem układu regulacji (w tym wartość zadaną SP, sygnał sterujący na element wykonawczy CV, oraz wielkość regulowaną PV, którą jest poziom wody w trzecim zbiorniku) oraz inne dostępne pomiarowo wielkości procesowe (położenie zaworu regulacyjnego, przepływy, poziomy wody w zbiornikach. Wartość zadania SP, chociaż jest sygnałem wejściowych, została przedstawiona jako zmienna procesowa, gdyż w symulatorze, który będzie wykorzystywany wartość ta może być podana przez użytkownika (operatora) lub generowana automatycznie (dla ułatwienia realizacji zadania). Zatem zmienna procesowa SP reprezentuje rzeczywistą wartość, która podawana jest na wejście regulatora.

Zmienne procesowe obiektu TTS
Symbol Opis Jednostki Zakres
SP Wartość zadana poziomu wody w zbiorniku 3 m 0…0.5
CV Sygnał sterujący na wyjściu regulatora % 0…100
P Ciśnienie za pompą kPa 80…260
G Sygnał sprzężenia zwrotnego położenia zaworu % 0…100
F1 Przepływ wody przez zawór l/min 0…28
dP Różnica ciśnień na zaworze kPa 0…260
L1 Poziom wody w zbiorniku I m 0…1
L2 Poziom wody w zbiorniku II m 0…1
L3 Poziom wody w zbiorniku III m 0…1
F2 Wypływ wody ze zbiornika 3 l/min 0…35

Oddzielnie określony jest zestaw sygnałów sterujących, który przedstawiono w tabeli poniżej. Sygnały te reprezentują faktyczne wielkości sterujące podawane przez operatora. W symulatorze przewidziane możliwość automatycznego generowania wartości zadanej według określonych wzorów - skoki w całym możliwych zakresie zmian, skoki wokół ustalonego punktu pracy, zmiany sinusoidalne. Oczywiście, w razie potrzeb, użytkownik możne zaprojektować dowolny, wymagany przebieg wartości zadanej, który będzie podawany jako zmiana sygnału SPman.

Zbiór sygnałów sterujących dla TTS
Symbol Opis Jednostki Zakres
PIDmode Wybór ręcznego trybu pracy regulatora (0 – auto, 1 - manual). W trybie ręcznym na wyjście podawana jest wartość CVman. - {1, 2}
SPmode Tryb generowania wartości zadanej: 1 – manual, 2 – skoki w całym zakresie, 3 – skoki wokół ustalonego pkt. pracy, 4 – sinusoida. - {1, 2, 3}
SPman Pożądana wartość zadana (wykorzystywana w trybie SPmode=1). m 0…0.5
CVmode Tryb generowania sygnału sterującego w trybie pracy ręcznej regulatora: 1 – manual, 2 – przebieg trójkątny w całym zakresie zmian - {1, 2}
CVman Wartość sygnału sterującego zaworu V1 w ręcznym trybie pracy regulatora % 0…100

2.1. Układ regulacji

W obiekcie wykorzystywany jest jednoobwodowy układ regulacji realizujący zadanie utrzymania zadanego poziomu wody w trzecim zbiorniku poprzez oddziaływanie na element wykonawczy, którym jest zawór regulacyjny o nieliniowej charakterystyce statycznej. Domyślnie zastosowany jest regulator PID z funkcją anty-windup (przeciwdziałanie nasycenia części całkującej), o ogólnej charakterystyce działania opisanej transmitancją:

 G(s)=k_p(1+\frac{1}{T_is}+\frac{T_ds}{s+1})

gdzie:  k_p – współczynnik wzmocnienia,  T_i – stała całkowania,  T_d – stała różniczkowania.

Przyjęto, że nominalnym punktem pracy:

 SP_{nom} = 0.2\ [m]

2.2. Zakłócenia procesowe

Jako zakłócenie procesowe rozpatrywana jest zmiana dodatkowego, o nieznanej wartości (z punktu widzenia operatora i układu regulacji), dopływu wody do zbiornika trzeciego – zmiany wokół pewnej, określonej stałej wartości, przy czym:

  • stała wartość dopływu: 7 [l/min],
  • wahania: ±1 [l/min],
  • okres zmiany: 300 [s].
Zakłócenie procesowe - przebieg niemierzalnego dopływu wody do zbiornika III
Zakłócenie procesowe - przebieg niemierzalnego dopływu wody do zbiornika III

3. Symulator

Rolę procesu w realizowanych projektach pełni przygotowany symulator TTS. W symulatorze zamodelowano zarówno komponenty instalacji i urządzenia wykonawcze, jak i implementację klasycznego regulatora PID. W oprogramowaniu symulatora przygotowano także miejsce na dodanie i symulację kodu użytkownika związanego z realizowanymi zadaniami: modelowania, regulacji rozmytej, itp.

Symulator zrealizowany został w postaci prostego środowiska symulacyjnego przygotowanego w języku Python w postaci kilku klas. Środowisko symulacyjne realizuje proste obliczenia ze stałym okresem próbkowania wg. algorytmu zapisanego w postaci jednoprzebiegowego schematu bloków funkcyjnych – konfigurowanych w postaci tekstowej, bez interfejsu graficznego. W symulatorze zamodelowane są także człony dynamiczne opisane w czasie ciągłym, np. człon inercyjny 1-rzędu o transmitancji  \frac{1}{s+1}) .

Domyślnie, symulator prowadzi obliczenia z okresem próbowania:

 t_p^{sim} = 0.05\ [s]

Wartość ta może zostać zmieniona, ale nie jest to ani zalecane, ani konieczne. Przy większych zmianach okresu próbkowania (szczególnie przy jego wydłużaniu) symulator może być niestabilny.

Powyższy okres próbkowania jest zbyt mały dla symulacji działania układu regulacji (realizowanego normalnie na urządzeniu typu sterownik PLC). Przyjęto następujący okres próbkowania dla układu regulacji:

 t_p^{cont} = 0.2\ [s]

Zakłada się także, że dane pomiarowe z procesu, np. na potrzeby archiwizacji i budowy modeli, dostępne są z dłuższym okresem próbkowania. Przyjęto:

 t_p^{mon} = 1\ [s]

3.1. Moduły programowe symulatora

Na rysunku poniżej pokazano ogólną strukturę i moduły środowiska symulacyjnego.

Moduły programowe środowiska symulacyjnego
Moduły programowe środowiska symulacyjnego

W skład środowiska wchodzą:

  • common - moduły reprezentujące klasy podstawowe, takie jak:
    • Value (valye.py): sygnały przesyłane pomiędzy blokami,
    • Block i SampledBlock (block.py): reprezentacja bloków funkcyjnych (z próbkowaniem dla bloków ciągłych),
    • Path (path.py): torów przetwarzania – jednostek porządkujących schematy bloków funkcyjnych,
    • WithIOVars (with_io_vars.py): obiekty z sygnałami we/wy zapisywanym i odczytywanymi przez użytkownika,
    • utils.py: funkcje pomocnicze,
  • libraries - moduły bibliotek tematycznych, w tym:
    • distontinuities.py: bloki o nieciągłej charakterystyce (look-up-table, limiter),
    • linear_dynamic.py: bloki czasu ciągłego liniowe, dynamiczne (człon inercyjny 1-rzędu, człon całkujący 1-rzędu, człon różniczkujący rzeczywisty 1-rzędu, ),
    • logic.py: bloki logiczne (operatory podstawowe, operatory relacji),
    • math_operations.py: podstawowe bloki matematyczne (suma/różnica, iloczyn/iloraz, wzmocnienie, signum, moduł, wielomian, funkcja wykładnicza),
    • signal_routing_and_organize: bloki podsystemów oraz operacji na sygnałach (podsystem, selektor 2-wejściowy, selektor wielowejściowy),
    • sources: bloki generatorów sygnałów (czas, wartość stała, sygnał losowy, generator przebiegów periodycznych),
  • subsystems - moduł podsystemów, w tym:
    • tempaltes.py: gotowe bloki szablonów podsystemów: zbiornik, rura, trzy zbiorniki szeregowe, pompa z rurociągiem, pozycjoner, zawór, zawór regulacyjny, regulator PID,
    • symulator.py: główna klasa symulatora,
  • params/general_params.py - moduł parametrów,
  • projects – moduły projektów do wykonania (przykładowy kod),
  • input - domyślny katalog plików wejściowych,
  • output - domyślny katalog plików wyjściowych,
  • run_simulation.py - plik uruchomieniowy symulatora w trybie wsadowym,
  • run_step_by_step.py - plik uruchomieniowy symulatora w trybie krokowym,
  • run_examples.ipynb - różne przykłady wykorzystania symulatora wraz z wizualizacją wyników w postaci notebooków Jupyter-a.

3.2. Struktura symulatora

Ogólny schemat blokowy symulatora TTS został pokazany na rysunku poniżej.

Schemat blokowy symulatora TTS
Schemat blokowy symulatora TTS

W skład symulatora wchodzą:

  • TTS: podsystem obiektu (obejmuje elementy instalacji, wykonawcze oraz pomiarowe),
  • PID: podsystem regulatora PID,
  • Generator SP: pomocniczy podsystem generatora wartości zadanej SP,
  • Noise: podsystem symulacji czujników pomiarowych,
  • Manual, CVman: symboliczne oznaczenie sygnałów sterujących (wejściowych) – sygnał trybu pracy regulatora (PIDmode) oraz wartości sygnału sterującego w trybie pracy ręcznej (CVman).

Powyższe podsystemy zostały zamodelowane w klasie TtsPidSim modułu simulator.py. Na rysunku oznaczono także okresy próbkowania, z którymi poszczególne podsystemy są obliczane. W funkcji inicjalizacyjnej klasy odpowiadają im sekcje:

  • # SP generator,
  • # Controller path,
  • # Simulator path,
  • # Measurements path.

Cały symulator zaimplementowany jest w postaci klasy TtsPidSim. A jego utworzenie w kodzie wygląda jak na listing poniżej.

Listing: Parametry uruchomieniowe oraz utworzenie obiektu symulatora

# General sampling time [s]
tp = 0.05
# Processing rates: Controller, Monitoring
pr = {'control': 2, 'monit': 20}

system = TtsPidSim(tp, pr)
	

gdzie:

  • tp - główny okres próbkowania symulacji  t_p^{sim} ,
  • pr{control,monit} – krotności przetwarzania dla regulatora i monitorowania, wykorzystywane do obliczenia  t_p^{cont} = p_{control}t_p^{sim} i  t_p^{mon} = p_{monit}t_p^{sim} .

3.3. Schemat wewnętrzna obiektu

Schemat blokowy obiektu został pokazany na rysunku poniżej.

Schemat blokowy symulatora obiektu – układ zasilania, zbiorniki, pomiary
Schemat blokowy symulatora obiektu – układ zasilania, zbiorniki, pomiary

W skład obiektu wchodzą:

  • Pump+pipe+control valve: podsystem układu zasilania wodą wraz z zaworem regulacyjnym,
  • Tanks: podsystem trzech zbiorników połączonych szeregowo,
  • Noise: podsystem pomiaru wielkości regulowanej wraz z symulacją zakłóceń pomiarowych.

Powyższe podsystemy zostały zamodelowane w klasie TtsPidSim modułu simulator.py. W funkcji inicjalizacyjnej klasy odpowiadają im sekcje:

  • # pump+pipe+control valve,
  • # three tanks,
  • # scaling and noise.

3.4. Generator wartości zadanej

Aby ułatwić pracę z symulatorem, szczególnie na początku, w symulatorze dodano blok generowania predefiniowanych przebiegów wartości zadanej. Schemat generatora pokazano na rysunku poniżej.

Schemat blokowy generatora SP
Schemat blokowy generatora SP

Użytkownik ma możliwość wyboru następujących trybów generowania wartości zadanej (sygnał SPmode):

  • 1 - wartość ustawiana „ręcznie” przez użytkownika poprzez sygnał SPman,
  • 2 – predefiniowane skoki (losowe) w całym zakresie możliwych zmian PV,
  • 3 – predefiniowane skoki wokół ustalonego pkt. pracy,
  • 4 – przebieg sinusoidalny obejmujący około 2/3 zmienności PV.

Oczywiście, np. w celu przeprowadzenia specyficznych testów, użytkownik może samodzielnie ustalić określony sygnał SP. W takim przypadku należy ustawić tryb generowania SP na manual oraz stosownie wyznaczać i ustawiać w kolejnych krokach symulacji wartość sygnału SPman.

4. Uruchomienie symulacji

W tej części omówiono sygnały wejściowe i wyjściowe symulatora, sposób jego parametryzacji j oraz uruchomienia symulacji, zarówno w trybie wsadowym (przetwarzanie przygotowanego pliku danych wejściowych) jak i krok po kroku.

4.1. Sygnały wejściowe i parametry symulatora

Wszystkie podstawowe sygnały wejściowe i parametry symulatora zdefiniowano jako zmienne wejściowe. Użytkownik może je zmieniać za pomocą metody klasy symulatora in_val__val(nazwa, wartość), której pierwszy parametr to nazwa zmiennej, a drugi to wartość, która ma postać ustawiona. Dostępne zmienne dotyczą nastaw regulatora PID (opisanych w rozdziale (Schemat wewnętrzny regulatora PID), sygnałów sterujących przedstawionych w opisie obiektu (Obiekt regulacji / modelowania) oraz dodatkowo możliwości włączania/wyłączania zakłócenia procesowego (distEnable).

Aby ułatwić pracę przygotowano specjalną funkcję ustawiającą domyśle wartości parametrów symulatora set_default_params(system) oraz funkcję ustawiającą wartości sygnałów sterujących set_modes(system) zdefiniowane w module utils.py.

Listing: Funkcja pomocnicza ustawiające domyślne wartości parametrów symulatora

def set_default_params(_system):
    _system.in_var_val('distEnable', 0)
    _system.in_var_val('kp', 10)
    _system.in_var_val('Ti', 15)
    _system.in_var_val('Td', 5)
    _system.in_var_val('Bias', 50)
    _system.in_var_val('Ienable', 1)
    _system.in_var_val('Denable', 1)
    
Listing: Funkcja pomocnicza ustawiające wartości sygnałów sterujących symulatora

def set_modes(_system, _sp_mode, _sp_man=0.2, _pid_mode=0, _cv_mode=1, _cv_man=0):
    # SP mode:
    #  1- manual
    #  2- steps in the whole range
    #  3- steps in working point (0.2)
    #  4- sinusoidal
    _system.in_var_val('SPmode', _sp_mode)
    _system.in_var_val('SPman', _sp_man)
    # PID mode:
    #  0 - auto
    #  1 - manual
    _system.in_var_val('PIDmode', _pid_mode)
    # CV mode:
    #  1- manual
    #  2- triangle
    _system.in_var_val('CVmode', _cv_mode)
    _system.in_var_val('CVman', _cv_man)
    

Dodatkowo, w pliku konfiguracyjnym general_params.py (moduł params) zdefiniowany jest podstawowy okres próbkowania oraz jego krotności dla zadania regulacji oraz monitorowania.

Listing: Plik konfiguracyjny ze zdefiniowanymi okresami próbkowania

# General sampling time [s]
tp = 0.05
# Processing rates: Controller, Monitoring
pr = {'control': 2, 'monit': 20}
    

Na listingu poniżej pokazano wykorzystanie funkcji pomocniczej do zapisu wszystkich dostępnych zmiennych wejściowych symulatora.

Listing: Przykład ustawienia domyślnych wartości zmiennych wejściowych symulatora za pomocą funkcji pomocniczej

from params.general_params import *
from subsystems.simulator import TtsPidSim
from common.utils import set_default_params

system = TtsPidSim(tp, pr)

set_default_params(system)
set_modes(system, 1, 0.2, 1, 2)
    

4.2. Uruchomienie symulacji

Symulację można uruchomić na dwa sposoby:

  • w trybie wsadowym – W tym trybie prowadzona jest symulacja w zadanym horyzoncie czasowym, dla ustalonej zmienności sygnałów SP/CV (zgodnie z ustawionymi parametrami). W tym przypadku wykorzystujemy metodę simulate(tend, log_output, progress), gdzie: tend – czas symulacji, log_output – flaga zwracania wartości wyjściowych z okresem próbkowania monitorowania (‘monit’) lub sterowania (‘control’), progres – flaga wyświetlania wskaźnika postępu. W poniższym przykładzie tend zdefiniowany został w pliku konfiguracyjnym general_params.py (moduł params).

    Listing: Uruchomienie symulatora w trybie wsadowym (plik run_simulation.py)
    
    from params.general_params import *
    from subsystems.simulator import TtsPidSim
    from common.utils import *
    
    system = TtsPidSim(tp, pr)
    
    set_default_params(system)
    set_modes(system, 1, 0.2, 1, 2)
    
    # Simulation horizont [s]
    tend = 2000
    
    proc_vars = system.simulate(tend, 'monit', True)
                
  • w trybie pracy krokowej – W tym trybie sterujemy symulacją wyzwalając kolejne kroki obliczeń. W tym przypadku wykorzystujemy metodę simulation_step(log_output), gdzie: log_output – flaga zwracania wartości wyjściowych. W poniższym przykładzie wykonano symulację dla takiego samego okresu i tych samych parametrów co w przykładzie dla trybu wsadowego. Użytkownik może w kolejnych krokach symulacji ustawiać pożądane wartości parametrów symulatora i zmieniać sygnały sterujące, w tym SPman/CVman.

    Listing: Przykład uruchomienie symulatora w trybie pracy krokowej (plik run_step_by_step.py)
    
    from params.general_params import *
    from subsystems.simulator import TtsPidSim
    from common.utils import set_default_params
    import math
    
    system = TtsPidSim(tp, pr)
    
    # Ustawienie parametrów domyślnych
    set_default_params(system)
    
    # Ustawienie parametrów charakterystycznych
    tend = 2000
    #   SP ustawiane ręcznie
    system.in_var_val('SPmode', 1)
    
    # Przechowywanie wartości t, SP i PV
    t = []
    SP = []
    PV = []
    for i in range(int(tend / tp) + 1):
        t.append(i*tp)
        # Generowanie i zapis wartości SP: sinusoida o okresie 1200 [s], amplitudzie 0.25 i biasie 0.25
        SP.append( 0.25*math.sin(2*math.pi/1200*i*tp)+0.25 )
        # Ustawienie wartości SP
        system.in_var_val('SPman', SP[i])
        rval = system.simulation_step('monit')
        # Odczyt i zapis wartości PV
        PV.append(system.out_var_val('PV'))
                

4.3. Zapis danych wyjściowych i wizualizacja wyników

Dane wyjściowe (pomiary) można odczytać w następujący sposób:

  • w trybie wsadowym – W tym trybie, przy ustawionym parametrze log_output=’monit’|’control’, metoda simulate zwraca słownik z wektorami wartości czasu + wszystkich zmiennych procesowych (12) odpowiednio z okresem próbkowania  t_p^{mon} lub  t_p^{cont} , przy czym zmienne procesowe przetwarzane z okresem  t_p^{mon} i tak zmieniają się zgodnie z tym okresem.

    Wizualizacja słownika zwracanego przez metodę simulate
    Wizualizacja słownika zwracanego przez metodę simulate
  • w trybie pracy krokowej – W tym trybie, przy ustawionym parametrze log_output (dowolna wartość), metoda simulation_step zwraca listę wartości czas + wszystkie zmienne procesowe (12).

    Wizualizacja listy zwracanego przez metodę simulation_step
    Wizualizacja listy zwracanego przez metodę simulation_step

    W każdym roku symulacji można także zapisać sygnały wejściowe i odczytać sygnały wyjściowe symulatora. Odpowiednie zmienne próbkowane są (zmiana wartości) zgodnie z okresami  t_p^{mon} i  t_p^{cont} .

    Listing: Przykład zapisu i odczytu zmiennych IO symulatora w kolejnych krokach symulacji
    
    # Ustawienie wartości SP
    system.in_var_val('SPman', 0.25)
    # Odczyt wartości PV
    PV = system.out_var_val('L3')
                

W obu przypadkach lista zwracanych wartości obejmuje zmienne: t (czas symulacji), SP, CV, PV (wartość L3, ale próbkowania z okresem  t_p^{cont} ), e (wartość odchyłki), P, G, dP, F1, L1, L2, L3, F2, dist (wartość zakłócenia procesowego – na potrzeby analizy i wyświetlania na wykresach).

Dodatkowo, w skoroszycie Jupytera run_examples.ipynb przygotowanie kilka przykładowych skryptów, które mogą pomóc w realizacji projektów:

  • Przykład 1: konfiguracja i wykonanie obliczeń dla prostego schematu blokowego,
  • Przykład 2: konfiguracja i wykonanie obliczeń dla schematu blokowego z podsystemami,
  • Przykład 3: wsadowa symulacja dla ustalonych parametrów konfiguracyjnych,
  • Przykład 4: krokowa symulacja dla ustalonych parametrów konfiguracyjnych,
  • Przykład 5: eksport danych zapisanych podczas symulacji,

    Listing: Przykład eksportu danych zapisanych podczas symulacji w trybie wsadowym do pliku CSV
    
    import pandas as pd
    
    df = pd.DataFrame(proc_vars)
    df.to_csv('output/'+outfilename, sep='\t', index=False)
                
  • Przykład 6: wizualizacja głównych zmiennych procesowych na podstawie zapisanych danych z symulacji,

    Wynik działania skryptu wizualizacji głównych zmiennych procesowych
    Wynik działania skryptu wizualizacji głównych zmiennych procesowych
  • Przykład 7: wizualizacja dodatkowych sygnałów (e, dist) na podstawie zapisanych danych z symulacji,
  • Przykład 8: wizualizacja dwóch sygnałów na oddzielnych wykresach,
  • Przykład 9: wizualizacja dwóch sygnałów na jednym wykresie.