我是靠谱客的博主 单身春天,最近开发中收集的这篇文章主要介绍Matlab/Simulink Level-2 MATLAB S-Function 的翻译模板,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
Level-2 MATLAB S-Function 的模板翻译
一级 MATLAB S-Function 仅支持双精度数据类型。
二级 MATLAB S-Function 支持 Simulink 支持的所有数据类型。可实现多输入多输出。
由于网上关于Level-2 MATLAB S-Function的内容太少,因此本人将msfuntmpl.m文件翻译了一下,方便进行配置使用,在此分享出来,欢迎交流~
系统自带的msfuntmpl.m文件可在命令行窗口输入以下内容打开,建议复制出来,不要在它上面直接编辑
edit([matlabroot,'/toolbox/simulink/blocks/msfuntmpl.m'])
不过实际使用效果实在不好,仿真特别慢,还不如自己写matlab fcn函数来的快,踩坑了,不推荐
function msf_tmpl(block)
% MSFUNTMPL 一个MATLAB S-function的模板
% MATLAB的function,与S-function的名称相同;
% 用你的S-function的名称替换'msf_tmpl';
%
% 设置方法用于设置S-function的基本属性如端口、参数等;
% 不要添加任何其他对function主体的调用;
%
setup(block);
% 函数结束
% 函数:设置===================================================
% 摘要;
% 设置S-functionblock的基本特征,如:;
% - 输入端口
% - 输出端口
% - 对话框参数
% - 选项
% 是否必须: 是
% C MEX对应:mdlInitializeSizes
function setup(block)
% 登记端口的数量;
block.NumInputPorts = 1; % 输入端口数
block.NumOutputPorts = 1; % 输出端口数
% 设置端口属性为继承或动态;
block.SetPreCompInpPortInfoToDynamic;
block.SetPreCompOutPortInfoToDynamic;
% 覆盖输入端口属性;
block.InputPort(1).Dimensions = [1 3]; % 数据维度
block.InputPort(1).DatatypeID = 0; % double 数据类型
block.InputPort(1).Complexity = 'Real';
block.InputPort(1).DirectFeedthrough = false;
% 覆盖输出端口属性;
block.OutputPort(1).Dimensions = [4 1]; % 数据维度
block.OutputPort(1).DatatypeID = 0; % double 数据类型
block.OutputPort(1).Complexity = 'Real';
%%%% 端口数据类型,可以端口ID指定,也可以直接指定数据类型名
% inherited: -1 int16: 4
% double: 0 unit16: 5
% single: 1 int32: 6
% int8: 2 unit32: 7
% unit8: 3 boolean或定点类型: 8
% 登记对话框参数;
block.NumDialogPrms = 3;
block.DialogPrmsTunable = {'Tunable', 'Nontunable', 'SimOnlyTunable'};
% 设置连续状态数量;
block.NumContStates = 1;
% 登记采样时间;
% [0 offset] : 连续采样时间
% [positive_num offset] : 离散采样时间
%
% [-1, 0] : 继承的采样时间
% [-2, 0] : 可变的采样时间
block.SampleTimes = [0 0];
% -----------------------------------------------------------------
% 选择
% -----------------------------------------------------------------
% 指定加速器是否应该使用TLC或回调到MATLAB文件
block.SetAccelRunOnTLC(false);
% 指定block的操作点合规性;该block的操作点在包含模型的操作点保存/恢复期间使用)
% 允许的值是:
% 'Default' : 与内置block的操作点相同;
% 'UseEmpty';block操作点中没有要保存/恢复的数据
% 'Custom' : 拥有操作点保存/恢复的自定义方法
% (见下文GetOperatingPoint/SetOperatingPoint);
% 'Disallow';在保存或恢复block操作点时出错;
block.OperatingPointCompliance = 'Default';
% -----------------------------------------------------------------
% MATLAB的S-function使用一个内部注册表,用于所有的的 block 方法;
% 你应该注册所有相关的方法(可选和必需),如下图所示;
% 你可以选择为这些方法取任何合适的名字,并实现这些方法,作为同一文件中的本地function;
% -----------------------------------------------------------------
% -----------------------------------------------------------------
% 注册更新图示/编译过程中调用的方法;
% -----------------------------------------------------------------
%
% CheckParameters:
% 功能: 调用该function是为了允许验证block对话框参数;
% 你有责任在设置方法的开始部分明确地调用这个方法。
% C MEX 对应:mdlCheckParameters
%
block.RegBlockMethod('CheckParameters', @CheckPrms);
% SetInputPortSamplingMode:
% 功能:检查并设置输入和输出端口属性,并指定端口是在基于样本还是基于帧模式下运行
% C MEX对应:mdlSetInputPortFrameData;
%(将一个端口设置为基于帧的端口,需要DSP系统工具箱);
%
block.RegBlockMethod('SetInputPortSamplingMode', @SetInpPortFrameData);
% SetInputPortDimensions:
% 功能:检查并设置输入和可选的输出端口尺寸(维度)。
% C MEX 对应程序:mdlSetInputPortDimensionInfo
%
block.RegBlockMethod('SetInputPortDimensions', @SetInpPortDims);
% SetOutputPortDimensions:
% 功能:检查并设置输出和可选的输入端口尺寸(维度)。
% C MEX对应:mdlSetOutputPortDimensionInfo
block.RegBlockMethod('SetOutputPortDimensions', @SetOutPortDims);
% SetInputPortDatatype:
% 功能:检查和设置输入和可选的输出端口数据类型
% C MEX对应:mdlSetInputPortDataType
block.RegBlockMethod('SetInputPortDataType', @SetInpPortDataType);
% SetOutputPortDatatype:
% 功能:检查并设置输出和可选的输入端口数据类型
% C MEX对应:mdlSetOutputPortDataType
block.RegBlockMethod('SetOutputPortDataType', @SetOutPortDataType);
% SetInputPortComplexSignal:
% 功能:检查和设置输入和可选的输出的端口复杂度属性;
% C MEX对应:mdlSetInputPortComplexSignal
block.RegBlockMethod('SetInputPortComplexSignal', @SetInpPortComplexSig) ;
% SetOutputPortComplexSignal;
% 功能:检查和设置输出和可选的输入的端口复杂度属性;
% C MEX对应:mdlSetOutputPortComplexSignal
block.RegBlockMethod('SetOutputPortComplexSignal', @SetOutPortComplexSig);
% PostPropagationSetup:
% 功能:设置工作区和状态变量。您还可以在此处注册运行时方法。
% C MEX对应:mdlSetWorkWidths
block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup);
% -----------------------------------------------------------------
% 在运行时调用的注册方法
% -----------------------------------------------------------------
% ProcessParameters:
% 功能:调用允许更新运行时参数;
% C MEX对应:mdlProcessParameters
block.RegBlockMethod('ProcessParameters', @ProcessPrms);
% InitializeConditions:
% 功能:调用以初始化状态量和工作区值。
% C MEX对应:mdlInitializeConditions
block.RegBlockMethod('InitializeConditions', @InitializeConditions);
% Start:
% 功能:调用以初始化状态量和工作区值。
% C MEX对应:mdlStart
block.RegBlockMethod('Start', @Start);
% Outputs:
% 功能:在仿真步骤中调用,生成block的输出。
% C MEX对应:mdlOutputs
block.RegBlockMethod('Outputs', @Outputs);
% Update:
% 功能:在仿真步骤期间调用,以更新离散状态。
% C MEX对应:mdlUpdate
block.RegBlockMethod('Update', @Update);
% Derivatives:
% 功能 : 在仿真步骤期间调用,以更新连续状态的导数。
% C MEX 对应:mdlDerivatives
block.RegBlockMethod('Derivatives', @Derivatives);
% Projection:
% 功能:在仿真步骤期间调用,以更新预测值。
% C MEX对应:mdlProjections
block.RegBlockMethod('Projection', @Projection);
% SimStatusChange:
% 功能:当仿真进入暂停模式或离开暂停模式时调用。
% C MEX对应:mdlSimStatusChange
block.RegBlockMethod('SimStatusChange', @SimStatusChange);
% Terminate:
% 功能:在模拟结束时调用,进行清理;
% C MEX对应:mdlTerminate
block.RegBlockMethod('Terminate', @Terminate);
% GetOperatingPoint:
% 功能:返回block的工作点;
% C MEX对应:mdlGetOperatingPoint
block.RegBlockMethod('GetOperatingPoint', @GetOperatingPoint);
% SetOperatingPoint:
% 功能:使用给定的值设置block的工作点数据。
% C MEX对应:mdlSetOperatingPoint
block.RegBlockMethod('SetOperatingPoint', @SetOperatingPoint);
% -----------------------------------------------------------------
% 注册在代码生成过程中调用的方法;
% -----------------------------------------------------------------
% WriteRTW:
% 功能:将特定信息写入model.rtw文件;
% C MEX对应:mdlRTW
block.RegBlockMethod('WriteRTW', @WriteRTW);
% 函数结束
% -------------------------------------------------------------------
% 下面的局部函数用于说明如何实现上面列出的各种块方法。
% -------------------------------------------------------------------
function CheckPrms(block)
a = block.DialogPrm(1).Data;
if ~isa(a, 'double')
me = MSLException(block.BlockHandle, message('Simulink:blocks:invalidParameter'));
throw(me);
end
% 函数结束
function ProcessPrms(block)
block.AutoUpdateRuntimePrms;
% 函数结束
function SetInpPortFrameData(block, idx, fd)
block.InputPort(idx).SamplingMode = fd;
block.OutputPort(1).SamplingMode = fd;
% 函数结束
function SetInpPortDims(block, idx, di)
block.InputPort(idx).Dimensions = di;
block.OutputPort(1).Dimensions = di;
% 函数结束
function SetOutPortDims(block, idx, di)
block.OutputPort(idx).Dimensions = di;
block.InputPort(1).Dimensions = di;
% 函数结束
function SetInpPortDataType(block, idx, dt)
block.InputPort(idx).DataTypeID = dt;
block.OutputPort(1).DataTypeID = dt;
% 函数结束
function SetOutPortDataType(block, idx, dt)
block.OutputPort(idx).DataTypeID = dt;
block.InputPort(1).DataTypeID = dt;
% 函数结束
function SetInpPortComplexSig(block, idx, c)
block.InputPort(idx).Complexity = c;
block.OutputPort(1).Complexity = c;
% 函数结束
function SetOutPortComplexSig(block, idx, c)
block.OutputPort(idx).Complexity = c;
block.InputPort(1).Complexity = c;
% 函数结束
function DoPostPropSetup(block)
block.NumDworks = 2;
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;
block.Dwork(2).Name = 'numPause';
block.Dwork(2).Dimensions = 1;
block.Dwork(2).DatatypeID = 7; % uint32
block.Dwork(2).Complexity = 'Real'; % real
block.Dwork(2).UsedAsDiscState = true;
% 将所有可调参数注册为运行时参数。
block.AutoRegRuntimePrms;
% 函数结束
function InitializeConditions(block)
block.ContStates.Data = 1;
% 函数结束
function Start(block)
block.Dwork(1).Data = 0;
block.Dwork(2).Data = uint32(1);
% 函数结束
function WriteRTW(block)
block.WriteRTWParam('matrix', 'M', [1 2; 3 4]);
block.WriteRTWParam('string', 'Mode', 'Auto');
% 函数结束
function Outputs(block)
block.OutputPort(1).Data = block.Dwork(1).Data + block.InputPort(1).Data;
% 函数结束
function Update(block)
block.Dwork(1).Data = block.InputPort(1).Data;
% 函数结束
function Derivatives(block)
block.Derivatives.Data = 2*block.ContStates.Data;
% 函数结束
function Projection(block)
states = block.ContStates.Data;
block.ContStates.Data = states+eps;
% 函数结束
function SimStatusChange(block, s)
block.Dwork(2).Data = block.Dwork(2).Data+1;
if s == 0
disp('暂停仿真.');
elseif s == 1
disp('继续仿真.');
end
% 函数结束
function Terminate(block)
disp(['用句柄终止block' num2str(block.BlockHandle) '.']);
% 函数结束
function operPointData = GetOperatingPoint(block)
% 将Dwork数据打包作为该block的全部操作点
operPointData = block.Dwork(1).Data;
% 函数结束
function SetOperatingPoint(block, operPointData)
% 该block的操作点是Dwork数据(该方法通常执行方法GetOperatingPoint的逆向操作)。
block.Dwork(1).Data = operPointData;
% 函数结束
Matlab官方介绍
Level-2 Matlab S-Function
Write Level-2 MATLAB S-Functions
最后
以上就是单身春天为你收集整理的Matlab/Simulink Level-2 MATLAB S-Function 的翻译模板的全部内容,希望文章能够帮你解决Matlab/Simulink Level-2 MATLAB S-Function 的翻译模板所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复