2级的MATLAB®S-function API允许您使用MATLAB语言创建具有多个输入和输出端口的自定义块,并能够处理由Simulink产生的任何类型的信号金宝app®模型,包括任何数据类型的矩阵和帧信号。MATLAB的二级s函数API与用于创建C MEX s函数的API紧密对应。创建C MEX s -函数的许多文档也适用于2级MATLAB s -函数。为了避免重复,本节重点关注提供编写2级MATLAB s函数的特定信息。
一个二级MATLAB s函数是定义一个实例的属性和行为的MATLAB函数2级MATLAB函数块,在Simulink模型中引用MATLAB函数。金宝appMATLAB函数本身包含一组回调方法(参见MATLAB二级s函数回调方法),由Simulink金宝app引擎在更新或模拟模型时调用。回调方法执行初始化和计算s函数定义的块的输出的实际工作。
为了方便执行这些任务,引擎将一个运行时对象作为参数传递给回调方法。运行时对象有效地充当了S-Function块的MATLAB代理,允许回调方法在仿真或模型更新期间设置和访问块属性。
当Simulink金宝app引擎调用Level-2 MATLAB s函数回调方法时,它将传递金宝app仿真软件。MSFcnRunTimeBlock
类作为参数添加到方法。这个实例,被称为S-Function块的运行时对象,为2级MATLAB S-Function回调方法提供与SimStruct
结构为C MEX s -函数回调方法服务。该对象使该方法能够提供和获取关于块端口、参数、状态和工作向量的各种元素的信息。该方法通过获取或设置块运行时对象的属性或调用方法来实现这一点。请参阅文档金宝app仿真软件。MSFcnRunTimeBlock
类以获取有关获取和设置运行时对象属性以及调用运行时对象方法的信息。
运行时对象不支持MATLAB稀疏矩阵。金宝app例如,如果变量块
是一个运行时对象,下面这一行在MATLAB二级s函数中会产生一个错误:
block.Outport(1)。Data = speye (10);
在哪里speye
命令形成一个稀疏单位矩阵。
请注意
除了MATLAB S-functions之外,其他MATLAB程序可以使用运行时对象来获取被仿真模型中的MATLAB s -函数的信息。看到在模拟过程中访问块数据在使用仿真软件金宝app为更多的信息。
使用MATLAB二级s函数模板msfuntmpl_basic.m
以便在创建新的MATLAB二级s函数方面取得领先。该模板包含由MATLAB二级s函数API定义的所需回调方法的骨架实现。要编写更复杂的s函数,请使用带注释的模板msfuntmpl.m
.
要创建MATLAB s函数,请复制模板并根据需要编辑该副本,以反映所创建的s函数的期望行为。下面两部分描述MATLAB代码模板的内容。一节编写二级MATLAB s函数的例子描述如何编写一个二级MATLAB s函数,模型单位延迟。
2级MATLAB s函数API定义了构成2级MATLAB s函数的回调方法的签名和通用目的。s函数本身提供了这些回调方法的实现。实现依次决定块属性(例如,端口、参数和状态)和行为(例如,块输出作为时间的函数和块输入、状态和参数)。通过创建带有一组适当回调方法的s -函数,您可以定义满足应用程序特定需求的块类型。
MATLAB二级s函数必须包含以下回调方法:
一个设置
函数初始化基本s函数特征
一个输出
函数来计算s函数的输出
您的s函数可以包含其他方法,这取决于s函数定义的块的需求。MATLAB二级s函数API定义的方法通常对应于C MEX s函数API定义的类似命名方法。有关在模拟过程中何时调用这些方法的信息,请参见流程视图在金宝app与C - s -函数的Simulink引擎交互.
下表列出了所有2级MATLAB s函数回调方法和它们在C MEX中的对应方法。
设置
方法身体的设置
方法初始化相应的MATLAB二级s -函数块的实例。在这方面设置
方法类似于mdlInitializeSizes
和mdlInitializeSampleTimes
由C MEX s -函数实现的回调方法。的设置
方法执行以下任务:
初始化块的输入和输出端口的数量。
设置这些端口的属性,如维度、数据类型、复杂性和示例时间。
指定块样本时间。看到指定样品时间在使用仿真软件金宝app有关如何指定有效的示例时间的详细信息。
设置s功能对话框参数的数量。
通过将MATLAB s函数中的局部函数句柄传递给RegBlockMethod
函数块的运行时对象的方法。有关以下内容,请参阅文档金宝app仿真软件。MSFcnRunTimeBlock
查阅有关使用的资料RegBlockMethod
方法。
下面的步骤说明如何编写一个简单的MATLAB二级s函数。如果适用,这些步骤包括s函数示例中的示例msfcn_unit_delay.m
在模型中使用msfcndemo_sfundsc2
.所有代码行都使用变量名块
用于s函数运行时对象。
复制MATLAB二级s函数模板msfuntmpl_basic.m
到您的工作文件夹。如果在复制文件时更改了文件名,请更改函数
行到相同的名字。
修改设置
方法初始化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
财产。不初始化离散状态在设置
方法。
的初始化离散状态PostPropagationSetup
方法。MATLAB的二级s函数将离散状态信息存储在DWork向量中。默认的PostPropagationSetup
方法就足够了。
以下PostPropagationSetup
方法从msfcn_unit_delay.m
,名叫DoPostPropSetup
,初始化一个带有名称的DWork向量x0
.
函数DoPostPropSetup(块)%%安装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向量的使用).
的初始化离散状态和连续状态或其他DWork向量的值InitializeConditions
或开始
回调方法。使用开始
在模拟开始时初始化一次的值的回调方法。使用InitializeConditions
方法获取在重新启用包含S-function的已启用子系统时需要重新初始化的值。
在本例中,使用InitializeConditions
方法将离散状态的初始条件设为s函数对话参数的值。例如,InitializeConditions
方法msfcn_unit_delay.m
是:
初始化Dwork block.Dwork(1)。Data = block.DialogPrm (1) . Data;
对于状态连续的s函数,用ContStates
运行时对象方法初始化连续状态数据。例如:
block.ContStates.Data (1) = 1.0;
的s函数的输出输出
回调方法。对于本例,将输出设置为存储在DWork向量中的离散状态的当前值。
的输出
方法msfcn_unit_delay.m
是:
函数输出(块)block.OutputPort(1)。Data = block.Dwork (1) . Data;
对于状态连续的s函数,计算状态导数衍生品
回调方法。运行时对象在其中存储派生数据衍生品
财产。例如,下一行将第一个状态导数设置为第一个输入信号的值。
block.Derivatives.Data (1) = block.InputPort (1) . data;
此示例没有使用连续状态,因此没有实现衍生品
回调方法。
更新中的任何离散状态更新
回调方法。对于本例,将离散状态的值设置为第一个输入信号的当前值。
的更新
方法msfcn_unit_delay.m
是:
函数更新(块)block.Dwork(1)。Data = block.InputPort (1) . Data;
属性中的任何清除操作,例如清除变量或内存终止
方法。与C MEX s -函数不同,2级MATLAB s -函数不需要具有终止
方法。
有关其他回调方法的信息,请参见MATLAB二级s函数回调方法.有关运行时对象属性的列表,请参阅参考页金宝app仿真软件。MSFcnRunTimeBlock
父类金宝app仿真软件。RunTimeBlock
.
要在模型中使用MATLAB二级s函数,请复制2级MATLAB函数块到模型中。打开块的块参数对话框,并将实现s函数的MATLAB文件的名称输入功能名称字段。如果您的s函数使用任何其他参数,请在“块参数”对话框中以逗号分隔的列表形式输入参数值参数字段。
以下是对MATLAB二级s -函数模板(msfuntmpl_basic.m
)以及允许使用可变大小信号的其他操作。
注册输出端口块的属性。outputport(1)。DimensionsMode =“变量”;块。RegBlockMethod (SetInputPortDimensionsMode, @SetInputDimsMode);注册依赖规则,根据%输入端口b和c块更新输出端口a的当前输出大小。AddOutputDimsDependencyRules(a, [b c], @ setoutputvardimms);%配置输出端口b与输入端口a块具有相同的尺寸。%配置DWork a,当输入大小改变时重置其大小。block.DWorkRequireResetForSignalSize(真正的);settinputdimsmode (block, port, dm) %设置维度模式block. inputport (port)。DimensionsMode = dm;block.OutputPort(港口)。DimensionsMode = dm;设置输出的当前(运行时)维度outDimsAfterReset = block. inputport (inputIdx(1)).CurrentDimensions; block.OutputPort(opIdx).CurrentDimensions = outDimsAfterReset;
为包含二级MATLAB s函数的模型生成代码需要提供相应的目标语言编译器(TLC)文件。你不需要TLC文件来加速一个包含二级MATLAB s函数的模型。的金宝app仿真软件加速器™软件以解释模式运行二级MATLAB s函数。但是,如果M-file S-function在模型引用中,则M-file S-functions在加速模式下不工作。有关为MATLAB s -函数编写TLC文件的更多信息,请参见内联S-Functions(金宝app仿真软件编码器)和内联MATLAB文件s -函数(金宝app仿真软件编码器).
2级MATLAB s函数示例提供了一组自记录模型,说明了2级MATLAB s函数的使用。输入sfundemos
在MATLAB命令提示符中查看示例。
MATLAB二级s函数不支持过零检测。金宝app
你不能从二级MATLAB s函数触发函数调用子系统。