S-funktio on ohjelmointikielellä (Matlab, C, Fortran) laadittu oma algoritmi tai dynaamisen järjestelmän kuvaus, jota voidaan käyttää Simulink-malleissa kuin mitä tahansa valmista lohkoa. S-funktion rakenne on hyvin yleinen ja funktio voi kuvata niin jatkuva- kuin diskreettiaikaisia systeemejä sekä näiden yhdistelmiä eli hybridisysteemejä. liitetään Simulink-malliin käyttäen S-function lohkoa, joka löytyy hakemistosta User-Defined Functions. BL40A0000 SSKMO KH 1 function[sys,x0, % omafunktio M-file % switch(flag) S-funktiolohko, sen parametri-ikkuna ja lähdekoodia sisältävä tiedosto. BL40A0000 SSKMO KH 2
Yleisin syy S-funktioiden käyttämiseen on tarve standardi Simulink-lohkoja erikoisemmille lohkoille. S-funktioita voidaan käyttää mm. Uuden yleiskäyttöisen lohkon lisääminen Simulinkkiin Olemassa olevan C-koodatun osion sisällyttäminen simulointimalliin Systeemin kuvaaminen suoraan matemaattisilla yhtälöillä Kuvaamaan todellista toteutusrakennetta (esim. säätöalgoritmi sulautetussa järjestelmässä) Animaation käyttäminen BL40A0000 SSKMO KH 3 Kaikkien Simulink-lohkojen, myös S-funktiolohkon, rakennetta voidaan kuvata oheisella kaaviolla u (tulot) x (tilat) y (lähdöt) Tilavektori voi muodostua jatkuva-aikaisista tai diskreettiaikaisista tiloista tai molempien yhdistelmänä. Tilat ovat s-funktion sisäisiä muuttujia jotka eivät välttämättä näy suoraan ulospäin. Tiloja ei tarvitse välttämättä käyttää. BL40A0000 SSKMO KH 4
Tulojen, lähtöjen ja tilojen väliset matemaattiset riippuvuussuhteet voidaan esittää yleisesti muodossa y = x& x = f c ( t, x, u) d ( t, x, u) f ( t, x, u) c d = k+ 1 u ("differenssiyhtälöt") x = x 0 f + x d (lähtö) Tärkein! (tilojen derivaatat) BL40A0000 SSKMO KH 5 Simulink suorittaa a vaiheittain tietyn syklin mukaisesti: 1. Funktion alustus 2. Seuraavan aika-askeleen laskenta (jos käytössä muuttuvan askelpituuden integrointimenetelmä) 3. Lähtöjen laskenta (simuloinnin aika-askel) 4. Diskreettien tilojen päivitys (simuloinnin aika-askel) 5. Integrointi (funktion sisäinen aika-askel) Simulink ohjaa S-funktion suoritusta lippujen (flag) avulla. Käyttäjän tehtäväksi jää vain kullakin lipun arvolla suoritettavien funktioiden laatiminen. BL40A0000 SSKMO KH 6
S-funktion simulointivaiheet Simulointivaihe Suoritettava S-funktion rutiini Lippu (Flag) Alutus (Initialization) mdlinitializesizes flag = 0 Seuraavan suoritushetken laskenta mdlgettimeofnextvarhit flag = 4 (Next Sample Hit) Lähtöjen (outputs) laskenta mdloutputs flag = 3 Diskreettien tilojen päivitys mdlupdate flag = 2 Derivaattojen laskenta mdlderivatives flag = 1 Simuloinnin lopetus mdlterminate flag = 9 Koska S-funktion rutiineiden tulee olla nimeltään täsmälleen yo. taulukon mukaisia, on suositeltavinta käyttää valmista S-funktiopohjaa sfuntmpl.m, joka löytyy hakemistosta matlabhakemisto/toolbox/simulink/blocks BL40A0000 SSKMO KH 7 Toinen helppo tapa on käyttää pohjana valmiita Simulinkin S-funktioesimerkkejä. Näistä saa listan komennolla help blocks. Esimerkkien lähdekoodit löytyvät samasta hakemistosta kuin alkuperäinen S-funktiopohja. Käydään lopuksi läpi esimerkki simple_esim, jossa esitetään mm. vaihtoehto tilojen käyttämiselle. Mieti kuitenkin, miten esimerkissä voitaisiin hyödyntää tiloja x. BL40A0000 SSKMO KH 8
Esimerkissä lähtösignaalin uusi arvo saadaan lisäämällä edellisen suorituskerran lähtösignaalin arvoon tulosignaalin ja edellisen lähtösignaalin erotus kertoimella a =0 1 skaalattuna eli y(k) = y(k-1) + a*(u(k)-y(k-1)) simple _e sim Sine Wave S-Function Scope Random Num be r S-funktion Matlab-koodi simple_esim.m on seuraava: BL40A0000 SSKMO KH 9 function [sys,x0,str,ts] = simple_esim(t,x,u,flag,kerroin) %SIMPLE_ESIM S-function whose output is its old output added with the % scaled difference between the new input and previous output value. % This M-file illustrates how to construct an M-file S-function that % computes an output value based upon its input and old output value. % The output of this S-function can be expressed: % % y = y(k-1)+kerroin*(u(k)-y(k-1)) % % See sfuntmpl.m for a general S-function template. % % Sa2730000 Säätötekniikan ja sign. käs. matem. ohj. % Riku Pöllänen 17.10.2005 BL40A0000 SSKMO KH 10
% Dispatch the flag. The switch function controls the calls to % S-function routines at each simulation stage of the S-function. switch flag, case 0 [sys,x0,str,ts]=mdlinitializesizes; case 3 sys=mdloutputs(t,x,u,kerroin); case { 1, 2, 4, 9 } sys=[]; % Unhandled flags otherwise % Unexpected flags (error handling) error(['unhandled flag = ',num2str(flag)]); end % End of function simple_esim. BL40A0000 SSKMO KH 11 %=================================================================== % mdlinitializesizes: Return the sizes, initial conditions, and % sample times for the S-function. %=================================================================== function [sys,x0,str,ts] = mdlinitializesizes() sizes = simsizes; sizes.numcontstates = 0; sizes.numdiscstates = 0; sizes.numoutputs = -1; % -1 = dynamically sized, (1 ok too) sizes.numinputs = -1; % -1 =dynamically sized, (1 ok too) sizes.dirfeedthrough = 1; % Has direct feedthrough i.e. y=f(u) sizes.numsampletimes = 1; BL40A0000 SSKMO KH 12
sys = simsizes(sizes); str = []; x0 = []; ts = [-1 0]; % End of mdlinitializesizes. % Inherited sample time. If discrete system set ts % for sample time %=================================================================== % mdloutputs % Return the output vector for the S-function %=================================================================== function sys = mdloutputs(t,x,u,kerroin) persistent yprev % Definition of variables which values will be % stored in memory between s-function calls % Initialization of persistent variables so that they have values % also when s-function is execute first time. if(t==0) yprev=0; end BL40A0000 SSKMO KH 13 % Calculation of block output and place it into variable sys sys = yprev + kerroin*(u-yprev); % Save new value of yprev for the next call yprev=sys; % end mdloutputs BL40A0000 SSKMO KH 14
Huomioita sizes.numoutputs sizes.numinputs sizes.dirfeedthrough määrittelee lähtövektorin dimension määrittelee tulovektorin dimension lipulla ilmoitetaan onko funktion lähtö eksplisiittisesti tulosignaalin funktio esim. y = k u(1) ts = [-1 0]; S-funktion suoritusvälin määrittely: -1 (ei määritelty), 0 (jatkuva-aikainen), >0 diskreettiaikainen, Voi olla myös vektori, ei tarvitse olla tasavälinen BL40A0000 SSKMO KH 15 Huomioita persistent yprev1 määrittelee funktion sisäisen (lokaalin) muuttujan yprev1 jonka arvon Simulink tallettaa muistiin joka suorituskerran jälkeen. Tämän avulla on helppo operoida mdloutputs(t,x,u) rutiinissa ilman S-funktion tilojen käyttöä. persistent määritellyt lokaalit muuttujat on kuitenkin alustettava esim. if(t==0) yprev1=0; end Muutoin muutujien suhteen voidaan toimia kuten missä tahansa Matlabfunktiossa eli määrittelyjä ei tarvita. BL40A0000 SSKMO KH 16
Huomioita Funktiomäärittelyyn voidaan lisätä syöteparametrejä, joiden arvo annetaan sitten s-funktiolohkon Parameters ikkunaan. function [sys,x0,str,ts] = simple_esim(t,x,u,flag,kerroin) BL40A0000 SSKMO KH 17