Simulink交互式仿真(6) 联系客服

发布时间 : 星期一 文章Simulink交互式仿真(6)更新完毕开始阅读

%%(3)若模块对输入口某些属性有特别要求,则进行必要的重定义;否则,以下省略。 %% 以下指令及其赋值仅是示例,用户应据需要改写。 block.InputPort(1).Dimensions = 1; block.InputPort(1).DatatypeID = 0; % double block.InputPort(1).Complexity = 'Real'; block.InputPort(1).DirectFeedthrough = true; %% true有直通通路;false则无。

%%(4)若模块对输出口某些属性有特别要求,则进行必要的重定义;否则,以下省略。 %% 以下指令及其赋值仅是示例,用户应据需要改写。 block.OutputPort(1).Dimensions = 1; block.OutputPort(1).DatatypeID = 0; % double block.OutputPort(1).Complexity = 'Real'; %%(5)指定S函数模块的对话窗参数数目

%% 以下赋值仅是示例,用户应据需要改写。 block.NumDialogPrms = 0;

%%(6)指定采样时间,可取格式:

%% [0 offset],连续采样时间;[positive_num offset] ,离散采样时间; %% [-1, 0] ,继承采样时间;[-2, 0],可变采样时间 %% 以下赋值仅是示例,用户应据需要改写。

block.SampleTimes = [0 0]; %%表示无偏移的连续采样 %%(7)指定仿真状态的保存和创建方法,可取选项:

%% 'UnknownSimState',先给出警告,然后采用默认设置;

%% 'DefaultSimState',采用内建模块的方法保存和重建连续状态、工作向量等 %% 'HasNoSimState', 没有仿真状态要处理(如中模块不带输出口) %% 'CustomSimState',通告Simulink有 GetSimState 和 SetSimState 方法实施 %% 'DisallowSimState' ,不允许保存和重建,若保存和重建则报错

block.SimStateCompliance = 'DefaultSimState'; %%通常使用该指令及赋值。 %%(8)下面列出了块方法的最常用回调名(即单引号内的字符),它们是不可更改的。 %% 函数句柄(即@及其后的字符)可以由用户自己命名 ,但必须与子函数名一致。 %% 对于那些不需要的回调方法,用户应整行加以删除。

block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup); %% 设置Dwork向量的数目及其属性;仅含连续状态的S函数,不需要此回调。 block.RegBlockMethod('InitializeConditions', @InitializeConditions); %% 若仿真开始前及仿真过程中需要多次初始化,则使用该回调.

%% 该回调对连续状态ContStates和/或Dwork向量赋初始值、配置内存等。 block.RegBlockMethod('Start', @Start); %% 若仅在仿真开始前需要初始化,则使用该回调。 block.RegBlockMethod('Outputs', @Outputs); % Required %% 任何S函数都必需该回调。该回调计算S函数的输出,并存放于输出信号数组。 block.RegBlockMethod('Update', @Update); %% 若S函数有离散状态,或无直通通路,则需要该回调。 block.RegBlockMethod('Derivatives', @Derivatives); %% 若有连续状态,则需要该回调。

block.RegBlockMethod('Terminate', @Terminate); %% 二级M码S函数不必使用此回调。 %end setup

%%==== 后向传递设置:S函数含离散状态,或无直通通路时写该子函数。 function DoPostPropSetup(block)

%% 以下指令及其赋值仅是示例,用户应据需要改写。 block.NumDworks = 1;

13

block.Dwork(1).Name = 'x1'; block.Dwork(1).Dimensions = 1;

block.Dwork(1).DatatypeID = 0; % double block.Dwork(1).Complexity = 'Real'; % real block.Dwork(1).UsedAsDiscState = true; %end DoPostPropSetup

%%==== 初始化条件:当S函数需多次初始化时,才写该子函数 function InitializeConditions(block) %%(以下填写适当指令)

%end InitializeConditions

%%==== 启动:当S函数仅需初始化一次,则应编写该子函数 function Start(block)

%% 以下指令行,仅是示例,用户应据需要编写。 block.Dwork(1).Data = 0; %endfunction

%%==== 输出:任何S函数都必有该子函数 function Outputs(block)

%% 以下指令行,仅是示例,用户应据需要编写。

block.OutputPort(1).Data = block.Dwork(1).Data + block.InputPort(1).Data; %end Outputs

%%==== 更新:若S函数有离散状态,或无直通通路,则需要编写此子函数。 function Update(block)

%% 以下指令行,仅是示例,用户应据需要编写。 block.Dwork(1).Data = block.InputPort(1).Data; %end Update

%%==== 导数计算:连续时间状态更新 function Derivatives(block) %% 以下填写适当指令 %end Derivatives

%%==== 终止:对C MEX S函数必需,但对二级M码S函数则不必。 function Terminate(block)

%end Terminate

3 二级M码S函数模块设计示例

【例8.9-1】为图8.9-3所示单摆设计一个M码S函数模块,并进而利用该模块构建一个在“周期方波力”作用下,单摆的摆动块图模型。该模块以外力Fm为输入,摆角?为输出,等效摩擦系数、等效重力系数以及摆的初始条件都以S函数模块的对话窗参数出现。

14

图 8.9-3 单摆示意图

(1) (3)

function exm080901_simpend(block)

% exm080901_simpend is a M-file S-function rewritten from template msfuntmpl_basic.m. %

% Produced by zzy.

% The setup method is used to set up the basic attributes. setup(block);

% end simpendzzy2 function setup(block)

% (1)Register number of input and output ports block.NumInputPorts = 1; block.NumOutputPorts = 1; % (2)Setup port properties to dynamically inherited block.SetPreCompInpPortInfoToDynamic; block.SetPreCompOutPortInfoToDynamic; % (5)Register parameters block.NumDialogPrms = 3; % Set up the continuous states block.NumContStates = 2; % (6)Set block to Continuous sample time block.SampleTimes = [0 0]; % (7)Set the block simStateCompliance to default block.SimStateCompliance = 'DefaultSimState'; % (8)Use an internal registry for block methods. block.RegBlockMethod('Start', @Start); block.RegBlockMethod('Outputs', @Outputs); block.RegBlockMethod('Derivatives', @Derivatives); % end setup

function Start(block)

block.ContStates.Data = block.DialogPrm(3).data; % end Start

15

function Outputs(block)

block.OutputPort(1).Data =block.ContStates.Data(2); % end Outputs

function Derivatives(block)

dampzzy=block.DialogPrm(1).Data; gravzzy=block.DialogPrm(2).Data; x=block.ContStates.Data; u=block.InputPort(1).Data;

block.Derivatives.Data(1)=-dampzzy*x(1)-gravzzy*sin(x(2))+u;

block.Derivatives.Data(2)=x(1); % end Derivatives

(3)

图8.9-4 M码S函数模块的对话窗

(4)

图 8.9-5 利用S函数模块构造的块图模型

(5)

16