主要内容

编写二级MATLAB s函数

关于二级MATLAB s -函数

Level-2 MATLAB®S-function API允许您使用MATLAB语言创建具有多个输入和输出端口的自定义块,并能够处理由Simulink产生的任何类型的信号万博1manbetx®模型,包括任何数据类型的矩阵和帧信号。二级MATLAB s函数API与创建C MEX s函数的API密切相关。创建C MEX s -函数的大部分文档也适用于二级MATLAB s -函数。为了避免重复,本节重点介绍编写二级MATLAB s函数的具体信息。

二级MATLAB s函数是定义类实例的属性和行为的MATLAB函数二级MATLAB s函数在Simulink模型中引用MATLAB函数的块。万博1manbetxMATLAB函数本身包含一组回调方法(参见二级MATLAB s函数回调方法),当更新或模拟模型时万博1manbetx,Simulink引擎会调用。回调方法执行初始化和计算s函数定义的块的输出的实际工作。

为了方便执行这些任务,引擎将一个运行时对象作为参数传递给回调方法。运行时对象有效地充当S-Function块的MATLAB代理,允许回调方法在模拟或模型更新期间设置和访问块属性。

关于运行时对象

当Simulink万博1manbetx引擎调用二级MATLAB s函数回调方法时,它将传递一个实例万博1manbetx仿真软件。MSFcnRunTimeBlock类作为参数传递给方法。该实例被称为S-Function块的运行时对象,用于二级MATLAB S-Function回调方法SimStruct结构服务于C MEX s -函数回调方法。该对象使该方法能够提供和获取关于块端口、参数、状态和工作向量的各种元素的信息。该方法通过获取或设置属性或调用块运行时对象的方法来实现这一点。的文档万博1manbetx仿真软件。MSFcnRunTimeBlock类获取有关获取和设置运行时对象属性以及调用运行时对象方法的信息。

运行时对象不支持MATLAB稀疏矩阵。万博1manbetx例如,如果变量是一个运行时对象,在二级MATLAB s函数中,下面这行会产生一个错误:

block.Outport(1)。数据= speye(10);

在哪里speye命令形成一个稀疏单位矩阵。

请注意

除MATLAB s -函数外,其他MATLAB程序也可以使用运行时对象来获取正在模拟的模型中关于MATLAB s -函数的信息。看到在模拟中访问块数据使用仿真软件万博1manbetx获取更多信息。

二级MATLAB s函数模板

使用基本的Level-2 MATLAB s函数模板msfuntmpl_basic.m来开始创建一个新的二级MATLAB s函数。该模板包含二级MATLAB s函数API定义的所需回调方法的骨架实现。要编写更复杂的s函数,请使用带注释的模板msfuntmpl.m

要创建MATLAB s函数,请复制模板并根据需要编辑副本,以反映您正在创建的s函数的期望行为。下面两节介绍MATLAB代码模板的内容。一节写一个二级MATLAB s函数的例子描述了如何编写一个二级MATLAB s函数来模拟单位延迟。

二级MATLAB s函数回调方法

二级MATLAB s函数API定义了组成二级MATLAB s函数的回调方法的签名和一般目的。s函数本身提供了这些回调方法的实现。实现依次确定块属性(例如,端口、参数和状态)和行为(例如,块输出作为时间的函数以及块输入、状态和参数)。通过创建带有适当回调方法集的s函数,可以定义满足应用程序特定需求的块类型。

二级MATLAB s函数必须包含以下回调方法:

  • 一个设置函数初始化s函数的基本特征

  • 一个输出函数来计算s函数输出

您的s函数可以包含其他方法,这取决于s函数定义的块的需求。Level-2 MATLAB S-function API定义的方法通常对应于C MEX S-function API定义的同名方法。有关在模拟期间何时调用这些方法的信息,请参见流程视图万博1manbetxSimulink引擎与C S-Functions的交互

下表列出了所有二级MATLAB s函数回调方法及其在cmex中的对应方法。

使用设置方法

的主体设置方法初始化对应的Level-2 MATLAB S-function块实例。在这方面,设置方法类似于mdlInitializeSizes而且mdlInitializeSampleTimes由cmex s -函数实现的回调方法。的设置方法执行以下任务:

  • 初始化块的输入和输出端口的数量。

  • 为这些端口设置维度、数据类型、复杂性和采样时间等属性。

  • 指定块采样时间。看到指定采样时间使用仿真软件万博1manbetx有关如何指定有效采样时间的详细信息。

  • 设置S-function对话框参数的个数。

  • 通过将MATLAB S-function中局部函数的句柄传递给RegBlockMethodS-Function块运行时对象的方法。请参阅相关文档万博1manbetx仿真软件。MSFcnRunTimeBlock的信息RegBlockMethod方法。

写一个二级MATLAB s函数的例子

下面的步骤说明了如何编写一个简单的二级MATLAB s函数。如果适用,这些步骤包括s函数示例中的示例msfcn_unit_delay.m在模型中使用msfcndemo_sfundsc2.所有代码行都使用变量名s函数运行时对象。

  1. 复制二级MATLAB s函数模板msfuntmpl_basic.m到您的工作文件夹。如果在复制文件时更改了文件名,请在函数行到相同的名称。

  2. 修改设置方法初始化s函数的属性。对于这个例子:

    • 设置运行时对象的NumInputPorts而且NumOutputPorts属性1为了初始化一个输入端口和一个输出端口。

    • 调用运行时对象的SetPreCompInpPortInfoToDynamic而且SetPreCompOutPortInfoToDynamic方法,用于指示输入和输出端口从模型继承已编译的属性(维度、数据类型、复杂性和采样模式)。

    • 设置DirectFeedthrough属性的InputPort为了表明输入端口没有直接馈通。保留模板文件副本中设置的所有其他输入和输出端口属性的默认值。设置的值DatatypeID,复杂性属性将覆盖使用SetPreCompInpPortInfoToDynamic而且SetPreCompOutPortInfoToDynamic方法。

    • 设置运行时对象的NumDialogPrms财产1来初始化一个s函数对话框参数。

    • 通过设置运行时对象的值,指定s函数具有继承的采样时间SampleTimes财产[1 0]

    • 调用运行时对象的RegBlockMethod方法来注册下面在这个s函数中使用的四个回调方法。

      • PostPropagationSetup

      • InitializeConditions

      • 输出

      • 更新

      从模板文件副本中删除任何其他已注册的回调方法。在对RegBlockMethod,第一个输入参数为s函数API方法的名称,第二个输入参数为MATLAB s函数中相关局部函数的函数句柄。

    以下设置方法从msfcn_unit_delay.m执行前面的步骤列表:

    注册一个对话框参数块。NumDialogPrms = 1;输入输出端口块的寄存器号。NumInputPorts = 1;块。NumOutputPorts = 1;将功能端口属性动态地%%继承。block.SetPreCompInpPortInfoToDynamic;block.SetPreCompOutPortInfoToDynamic;硬编码某些端口属性block.InputPort(1)。尺寸= 1;block.InputPort(1)。DirectFeedthrough= false; block.OutputPort(1).Dimensions = 1; %% Set block sample time to [0.1 0] block.SampleTimes = [0.1 0]; %% Register methods block.RegBlockMethod('PostPropagationSetup',@DoPostPropSetup); block.RegBlockMethod('InitializeConditions',@InitConditions); block.RegBlockMethod('Outputs', @Output); block.RegBlockMethod('Update', @Update);

    如果s -函数需要连续状态,则初始化中连续状态的数目设置方法使用运行时对象的NumContStates财产。中不初始化离散状态设置方法。

  3. 中的离散状态初始化PostPropagationSetup方法。二级MATLAB s函数将离散状态信息存储在DWork向量中。默认的PostPropagationSetup方法对于本例来说就足够了。

    以下PostPropagationSetup方法从msfcn_unit_delay.m,名叫DoPostPropSetup,用名称初始化一个DWork向量x0

    %%安装Dwork块。NumDworks = 1;block.Dwork(1)。Name = 'x0';block.Dwork(1)。维= 1; block.Dwork(1).DatatypeID = 0; block.Dwork(1).Complexity = 'Real'; block.Dwork(1).UsedAsDiscState = true;

    如果s函数使用额外的DWork向量,请在PostPropagationSetup方法(参见在二级MATLAB s函数中使用DWork向量).

  4. 中的离散状态和连续状态或其他DWork向量的值初始化InitializeConditions开始回调方法。使用开始在模拟开始时初始化一次的值的回调方法。使用InitializeConditions方法,用于在重新启用包含s函数的已启用子系统时需要重新初始化的值。

    对于本例,使用InitializeConditions方法将离散状态的初始条件设置为s函数的dialog参数的值。例如,InitializeConditions方法msfcn_unit_delay.m是:

    函数InitConditions(block) %%初始化Dwork块。Data = block.DialogPrm(1).Data;

    对于具有连续状态的s函数,使用ContStates运行时对象方法初始化连续状态数据。例如:

    block.ContStates.Data(1) = 1.0;
  5. 计算s函数的输出输出回调方法。对于本例,将输出设置为存储在DWork向量中的离散状态的当前值。

    输出方法msfcn_unit_delay.m是:

    function输出(block) block. outputport(1)。Data = block.Dwork(1).Data;
  6. 对于具有连续状态的s函数,计算式中的状态导数衍生品回调方法。运行时对象将派生数据存储在其衍生品财产。例如,下面一行将第一个状态导数设置为第一个输入信号的值。

    block.Derivatives.Data(1) = block.InputPort(1).Data;

    此示例没有使用连续状态,因此没有实现衍生品回调方法。

  7. 中的任何离散状态更新回调方法。对于本例,将离散状态的值设置为第一个输入信号的当前值。

    更新方法msfcn_unit_delay.m是:

    function Update(block) block. dwork(1)。数据= block.InputPort(1).Data;
  8. 中执行任何清理,例如清除变量或内存终止方法。与C MEX s -函数不同,Level-2 MATLAB s -函数不需要有终止方法。

有关其他回调方法的信息,请参见二级MATLAB s函数回调方法.有关运行时对象属性的列表,请参阅的参考页万博1manbetx仿真软件。MSFcnRunTimeBlock父类万博1manbetx仿真软件。RunTimeBlock

实例化一个二级MATLAB s函数

要在模型中使用二级MATLAB s函数,请复制的实例二级MATLAB s函数块到模型中。打开块的块参数对话框,并输入实现s函数的MATLAB文件的名称功能名称字段。如果s函数使用任何其他参数,请在“块参数”对话框中以逗号分隔的列表形式输入参数值参数字段。

可变大小信号的运算

以下是对二级MATLAB s函数模板的修改(msfuntmpl_basic.m)和允许您使用可变大小信号的附加操作。

function setup(block) %注册输出端口block. outputport(1)的属性。维度模式= '变量';块。RegBlockMethod (SetInputPortDimensionsMode, @SetInputDimsMode);注册依赖规则,根据%输入端口b和c块更新输出端口a的当前输出大小。AddOutputDimsDependencyRules(a, [b c], @setOutputVarDims);%配置输出端口b与输入端口a块具有相同的尺寸。配置DWork a在输入大小改变时重置其大小。block.DWorkRequireResetForSignalSize(真正的);SetInputDimsMode(block, port, dm) %设置维度模式block. inputport (port)。DimensionsMode = dm;block.OutputPort(港口)。DimensionsMode = dm;function setOutputVarDims(block, opIdx, inputIdx) %设置输出的当前(运行时)维度outDimsAfterReset = block. inputport (inputIdx(1)).CurrentDimensions; block.OutputPort(opIdx).CurrentDimensions = outDimsAfterReset;

从二级MATLAB s函数生成代码

为包含二级MATLAB s函数的模型生成代码需要您提供相应的目标语言编译器(TLC)文件。您不需要TLC文件来加速包含二级MATLAB s函数的模型。的万博1manbetx仿真软件加速器™软件以解释模式运行二级MATLAB s函数。但是,如果M-file s函数在模型引用中,则M-file s函数不能在加速模式下工作。有关为MATLAB s函数编写TLC文件的详细信息,请参见内联S-Functions(万博1manbetx仿真软件编码器)而且内联MATLAB文件s -函数(万博1manbetx仿真软件编码器)

MATLAB s函数示例

Level-2 MATLAB s -函数示例提供了一组说明Level-2 MATLAB s -函数使用的自文档模型。输入sfundemos在MATLAB命令提示符下查看示例。

MATLAB功能的局限性

  • 二级MATLAB s函数不支持过零检测。万博1manbetx

  • 不能从二级MATLAB s函数触发函数调用子系统。

另请参阅

|||

相关的话题