matlab中s-function函数编写

img

img


请问大家,我在将s-function的名称改为Newton_ILC之后,电机确认之后,出现第二张图片,这是为什么呢?知道的麻烦告诉我下!非常感谢

回答:通过参考资料中的段落0和段落1可知,在S-Function函数编写时,可以通过修改S-Function name来修改函数名称,且只需要修改这个参数即可。因此,将函数名称由默认的“Untitled”改为“Newton_ILC”的方法是在S-Function属性窗口中将S-Function name从“Untitled”修改为“Newton_ILC”即可。根据提供的信息和错误提示,可能是在修改后没有正确保存导致的错误,请确保更改后及时保存代码。此外,如果编写的S-Function函数本身存在其他语法错误,则也可能会导致类似的错误提示。如果不确定错误原因,可以尝试检查其他语法错误,并按照参考资料中的段落2和段落4使用S-Function Builder或在Simulink中添加S-Function来进行编写。以下是一个可能的示例代码,用于将S-Function name修改为“Newton_ILC”:

function Newton_ILC(block)
  setup(block);

% ----------------------------------------------------------------------

function setup(block)
  % Register number of input and output ports
  block.NumInputPorts  = 1;
  block.NumOutputPorts = 1;

  % Set up functional port properties to dynamically
  % inherited.
  block.SetPreCompInpPortInfoToDynamic;
  block.SetPreCompOutPortInfoToDynamic;

  % Override input port properties
  block.InputPort(1).Dimensions  = 1;
  block.InputPort(1).DatatypeID  = 0;  % double
  block.InputPort(1).Complexity  = 'Real';
  block.InputPort(1).DirectFeedthrough = true;

  % Override output port properties
  block.OutputPort(1).Dimensions  = 1;
  block.OutputPort(1).DatatypeID  = 0; % double
  block.OutputPort(1).Complexity  = 'Real';

  % Register parameters
  block.NumDialogPrms     = 0;

  % Register sample times
  %  [0 offset]            : Continuous sample time
  %  [positive_num offset] : Discrete sample time
  %
  %  [-1, 0]               : Inherited sample time
  %  [-2, 0]               : Variable sample time
  block.SampleTimes = [0 0];

  % Specify the block simStateCompliance. The allowed values are:
  %    'UnknownSimState', < The default setting; warn and assume DefaultSimState
  %    'DefaultSimState', < Same sim state as a built-in block
  %    'HasNoSimState',   < No sim state
  %    'CustomSimState',  < Has GetSimState and SetSimState methods
  %    'DisallowSimState' < Error out when saving or restoring the model sim state
  block.SimStateCompliance = 'DefaultSimState';

  % Register methods
  block.RegBlockMethod('Outputs', @Outputs);  
  block.RegBlockMethod('Terminate', @Terminate);    

% ----------------------------------------------------------------------
function Outputs(block)
  f_in = block.InputPort(1).Data;

  % Newton Iteration
  if (abs(f_in)>0.001)
      f_out = f_in - (sin(f_in)-0.5*cos(f_in))/(cos(f_in)+0.5*sin(f_in));
  else
      f_out = 0.001;
  end
  % set output
  block.OutputPort(1).Data = f_out;

function Terminate(~)
  % Terminate function
  disp('Terminating the block');