What is S-Function?
Transcription
What is S-Function?
What is S-Function? • S-Functions is computer language description of Simulink block • If written in MATLAB programming environment it is called M-file s-function • If written in ‘C/C++’ programming environment it is called C Mex s-function What S-Function Do? • Allows you to add your own code to simulink model or environment • Code can be written for continuous, discrete or hybrid system • Can be use with Real Time Workshop • Real Time workshop generates code for Simulink/s-function to run in real time ………..faster F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional How S-function Works • Mathematically simulink block consist of a set of inputs u, a set of states x, and set of outputs y • Simulation Stages • Initialization – • Simulation port widths, data types, sample time, memories allocation, execution order, evaluates block parameters loop – Execute block determined during initialization, computes/updates blocks states, derivatives and outputs during a sample time F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional M-file S-function M-files s-function is a matlab function [sys,x0,str,ts] = f(t,x,u,flag,p1,p2,………) Inputs f s-function name t is the current time x is the state vector flag indicates the task to be performed p1, p2 are block parameter to be changed externally Outputs sys x0 str ts Output of s-function [ initial value vector of states] not used [ ] [sample time offset time] M-file s-function template Examples: <matlabroot>/toolbox/simulink/blocks/msfuntmpl.m Sfundemos: >>sfundemos >> is matlab workspace prompt <matlabroot>/toolbox/simulink/simdemos User Manaul: http://www.mathworks.com/access/helpdesk/help/pdf_doc/simulink/sfunction.pdf Advantage: Easy to write and compatibility with matlab toolbox functions F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional C MEX s-function • Mex s-function are written in C or C++, Fortran, Adao • C Mex files can modify data structure of Simulink – SimStruct which is used for housekeeping • Can handle multiple data types and matrix signals • Used with Real Time Workshop , wrapper s-function How to build C Mex s-function • Simulink specific naming convention and housekeeping (SimStruct) standards should be followed by C Mex files •Template and examples in <matlabroot> / simulink /src sfuntmpl_basic.c • >> mex – setup should be run a priori to setup the compiler • C Mex files are compiled in MATLAB with mex command • Matlab Executable (mex) creates xxx.dll, dynamically loadable file excutable for simulink • S- function Builder F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional •S-Function Builder • Easiest way to embed your C code in Simulink model • S-function builder is a Simulink block • Act as calling program (wrapper) to C source code from Simulink – providing necessary interfacing options • S-function builder generates its own: • builder-name.c Have standard code representation similar to sfuntmpl_basic.c • builder-name_wrapper.c Customized interfacing options entered in builder • builder-name.tlc Permit code generated to run in accelerated and real time Workshop • builder-name.dll Simulink executable dll file F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional Importing C code into Simulink for Signal Processing Applications From… Call… How? C MATLAB MATLAB Engine ActiveX/COM & DDE MATLAB Compiler & runtime C Simulink MATLAB C Engine or COM [x,y,t] = sim(‘mymodel’,u0) MEX ActiveX/COM & DDE MATLAB Simulink >> sim(‘mymodel’) Simulink MATLAB M-code S-function Caution: interpreted, not compiled Simulink C S-function Builder C-code S-function F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional Structure of code to be imported: `main() and slicer.c´ test_slicer.exe //test_slicer.c main() { for(){ slicer(); } } t //slicer.c slicer() { return; } Structure of code after import: `wrapped slicer.c´ • Call your `slicer.c´ code from a wrapper to interface with Simulink • Compile both and link .dll • Simulink calls the DLL using several functions (“methods”) wrap_slicer.dll Simulink t //wrap_slicer.c mdlOutputs(S) { slicer(); } //slicer.c //definition // of //slicer() UNIX is a registered trademark of The Open Group F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional The “S-function” DLL contains several methods mdlInitializeSizes() mdlInitializeSampleTimes() mdlOutputs() n Done? y mdlTerminate() F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional yt = f(t, ut) y = outputs, t = time u = inputs What about leaf functions with states? • • • • int always_one(void) { int y = 0; y = y + 1; return y; } States preserved across time steps Independent set of states per instance – FIR, IIR, coders, decoders Also known as... int up(void) { – Computer science: “Re-entrant persistent storage” static int – Object-oriented: “property” y = y + 1; return y; – C++: “member variable” } y = 0; int counter(int *z) { *z = *z + 1; return *z; } not re-entrant Different from… – static variables in C are persistent but shared, – If a leaf contains static data it can only be instantiated once F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional Two main types of state available in Simulink • • Discrete states, xd Read-only (const) in the mdlOutput() method Available in S-Function Builder block and full S-function Work vectors, w Read-write in mdlOutput() Presently only accessible from full S-function API input u states xd, w output y=f(t,xd,w,u) F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional Approach depends on code structure 1) “Output-update” structure – use S-function Builder block – Leaf with separate output and update functions Use “discrete states”, update them in mdlUpdate() yt = f(t, xt, ut), xt+ t = g(t, xt, ut) y = outputs,t = time, x = states, u = inputs 2) General structure or advanced needs – use full S-function – Leaf with output and update functions intermixed Use “work vectors” , update them in mdlOutputs() [xt+ t , yt]= f(t, xt, ut) F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional 1) “Output-update” function.c structure mdlInitializeSizes() mdlInitializeSampleTimes() yt = f(t, xt, ut) y = outputs, t = time x = states, u = inputs mdlOutputs() “Division of labor is preferred” mdlUpdate() n Done? y mdlTerminate() F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional xt+t = g(t, xt, ut) 2) General leaf structure mdlInitializeSizes() mdlInitializeSampleTimes() mdlOutputs() n Done? y mdlTerminate() F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional yt = f(t, wt, ut) wt+t = g(t, wt, ut) y = outputs t = time w = work vec u = inputs Demonstrations • Examples of S-function builder • S-function Builder block features • Slicer: a memoryless block • IIR Filter: a block with memory – Output-update structure • S-function Builder • A Discrete state • Output in mdlOutputs()and update in mdlUpdate() – General structure • Full S-function • 1-element Work vector • Output and update in mdlOutputs() • Using the sample code as a resource • Tour of the S-function reference material F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional Debugging s-function.dll in MSVC • Open sfunc_name.dll file built by S-builder for e.g. simfunc_name.mdl in MSVC • Setup ‘breakpoint’ in sfunction.c using Right Mouse button • Click Right mouse button on sfunc_name.dll – open ‘setting’ dialouge box, select ‘debug’ tab, under executable field enter ‘C:\MATLAB6p5\bin\win32\matlab.exe’, OK! • load sfunction.c in MSVC on the desired line – enabled • Choose ‘build’ option from main menu and select ‘ start debug’ and Go! • MATLAB will start under debugging mode • Open simfunc_name.mdl for degguer ‘MATLAB’ • Run the file • Watch the stop sign in MSVC sfunction.c file, the program should stop with arrow • Select view from main menu and select ‘debug Windows – memory, variable, registers • use F11 or steps increment icons from the MSVC toolbar to step to next line in sfunction.c F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional S-function compilation issue* Microsoft Visual MATLAB C/C++ Ver 7.1 Version 7 Recommended Real Time Windows Workshop Version 6.0 Ver 2.2.0 Version 6 Ver 2.5.0 XP or 2000 98 or 2000 *MATLAB TECH NOTE 1601 • Always set MATLAB Command Window directory to the directory where source files are stored >> mex –setup % At matlab startup % >> rtwintgt –install % At startup % >> mex –g sfun_name.c % s-function debugging% F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional s-function use with Real Time Workshop For Real Time Window Target • Real time Workshop (RTW) generates portable , customize standalone C/C++ code of simulink model which operates in Real time • Target Language Compiler (TLC) transform Simulink Block into C/C++ • Simulink external mode enables communication between simulink and external process • Real Time Window Target (RTWT) is a component of RTW • RTWT helps to connect simulink model with external actuators and sensor for control and monitoring of Physical process F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional s-function examples using s-function builder and MSVC 6.0 Debugging • slicer.c and iir_general.c Webinar http://www.mathworks.com/cmspro/req4858.html • <%matlabroot>/extern/examples/mex/ • <%matlabroot>/toolbox/simulink/blocks/ i) fnpointer - use pointers to pass simulink matrix data to and from external source in C. MATLAB7, RTWT compilation ii) myadd - add matrix internally using array indexes, MATLAB7 iii) disc_stsp7 – Discrete state updates internally, MATLAB7 iv) fnmat – use pointers and array index for internal and external codes, MATLAB7 v) ludlub – Linear system equation solver, using C source code from ‘Numerical Recipes in C’ ludcmp.c & lubksb.c, MATLAB 6.5 vi) mylms – Least mean square , MATLAB7, RTWT F. Nagi Dep. Of Mech Eng. Universiti Tenaga Nasional