S-Function是MATLAB系统函数(System Function)的简称,是指采用非图形化的方式(即计算机语言,区别于SIMULINK的系统模块)描述的一个功能块。用户可以采用MATLAB代码、C、C++、FORTRAM或Ada等语言编写S函数。S函数由一种特定的语法构成,用来描述并实现连续系统、离散系统以及混合系统等动态系统;S函数能够接受来自SIMULINK求解器的相关信息,并对求解器发出的命令做出适当的响应,这种交互作用非常类似于SIMULINK系统模块与求解器的交互作用。
S函数作为MATLAB与其他语言相结合的接口,可以使用各种编程语言提供的强大能力。例如,MATLAB语言编写的S函数可以充分利用MATLAB提供的丰富资源,方便地调用各种工具箱函数和图形函数;使用C语言编写的S函数可以方便地实现对操作系统的访问,如实现与其他进程的通信和同步等。
S函数模块位于SIMULINK模块库的用户自定义函数(User-Defined Functions)子库下,使用S函数可以方便地构建SIMULINK模型。
采用S-Function函数模块来实现PMSM的仿真建模,与前一种方法的区别仅仅是在图4-3b中的PMSM_nonS子系统的内部结构,如图4-18所示。其中的S函数模块中使用了PMSMdq.m的S函数,双击图中的s函数模块,出现图4-19所示的参数设置对话框,里面除了对S函数的函数源文件进行设置,还需要以数组形式设置S函数使用的参数:[L R psi_f IFP(3)IFP(1)IFP(2)],[id0,iq0,wr0,theta0]。
图4-18 S函数对PMSM建模的内部结构图
为使用方便,把图4-18的模型建成子系统,同时为方便输入电动机的各项参数,使用封装子系统(Mask Subsystem)功能建立接口变量,如图4-20所示。封装后的子系统被鼠标左键双击后会提供电动机参数输入的对话框,如图4-21所示。
图4-19 S函数参数设置对话框
图4-20 封装图4-18的参数对话框
SIMULINK在每个时间步(time step)内会多次调用S函数,每次调用时通过传入标志(flag)参数通知S函数分别进行模块初始化、变量输出和状态变量的更新等任务。从附录C的程序中可以看出模型主要使用了标志(flag):0、1、3。当flag为0时,S函数执行初始化部分;当flag为1时,S函数计算连续状态变量的微分值;当flag为3时,S函数执行程序的输出部分。
图4-21 电动机参数输入对话框
由于PMSM模型包含4个一阶微分方程,可以选择 i d 、 i q 、 ω 、 θ 这4个变量为状态变量,S函数内容详见附录C。该函数的输入依次为:
t:时间;
x:状态变量;
u:输出;
flag:标志变量;
parameters:电动机的参数,与图4-19中的参数设置对话框相对应;
x0_in:状态变量初始设定值,如图4-19所示。
函数的输出依次为:
sys:系统变量,同一时间步中,在不同标志(flag)下的sys含义不同;
x0:状态变量初始值;
str:SIMULINK保留位置,默认设置为空;
ts:S函数的采样时间(Sample Time),用于离散系统。
上述S函数的PMSM数学模型是建立在 dq 旋转坐标系中的,因此输入的电压也必须是旋转坐标系的变量,使用到的变换矩阵同图4-4。