我是靠谱客的博主 单身春天,最近开发中收集的这篇文章主要介绍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'])

对应的Simulink模块

不过实际使用效果实在不好,仿真特别慢,还不如自己写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 的翻译模板所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部