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.

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.
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.
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ą:
gdzie: – współczynnik wzmocnienia,
– stała całkowania,
– stała różniczkowania.
Przyjęto, że nominalnym punktem pracy:
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].

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 .
Domyślnie, symulator prowadzi obliczenia z okresem próbowania:
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:
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:
3.1. Moduły programowe symulatora
Na rysunku poniżej pokazano ogólną strukturę i moduły ś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
iSampledBlock
(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.

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.
# General sampling time [s]
tp = 0.05
# Processing rates: Controller, Monitoring
pr = {'control': 2, 'monit': 20}
system = TtsPidSim(tp, pr)
gdzie:
3.3. Schemat wewnętrzna obiektu
Schemat blokowy obiektu został pokazany na rysunku poniżej.

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.

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
.
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)
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.
# 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.
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ładzietend
zdefiniowany został w pliku konfiguracyjnymgeneral_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 tymSPman
/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’
, metodasimulate
zwraca słownik z wektorami wartości czasu + wszystkich zmiennych procesowych (12) odpowiednio z okresem próbkowanialub
, przy czym zmienne procesowe przetwarzane z okresem
i tak zmieniają się zgodnie z tym okresem.
Wizualizacja słownika zwracanego przez metodę simulate
-
w trybie pracy krokowej – W tym trybie, przy ustawionym parametrze
log_output
(dowolna wartość), metodasimulation_step
zwraca listę wartości czas + wszystkie zmienne procesowe (12).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
i
.
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 ),
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 - 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.