我已经解决了这个问题;
问题有两点:
1,“sizes.DirFeedthrough = 0;”应该修改为“sizes.DirFeedthrough = 1;”
2,“sys = ~sys;”用法不正确;因此我用了一个中间离散状态变量。
更正后的代码如下:
function [sys,x0,str,ts,simStateCompliance] = voltageControlledOsillator(t,x,u,flag,v1,v2,f1,f2)
switch flag,
  % Initialization
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
  % Derivatives
  case 1,
    sys=mdlDerivatives(t,x,u);
  % Update
  case 2,
    sys=mdlUpdate(t,x,u);
  % Outputs
  case 3,
    sys=mdlOutputs(t,x,u);
  % GetTimeOfNextVarHit
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u,v1,v2,f1,f2);
  % Terminate
  case 9,
    sys=mdlTerminate(t,x,u);
  % Unexpected flags
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 1;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed
sys = simsizes(sizes);
x0  = 0;
str = [];
ts  = [-2 0];  % -2 means vriable step for simulating (Mr. Luo)
simStateCompliance = 'UnknownSimState';
%=============================================================================
% mdlDerivatives
% Return the derivatives for the continuous states.
%=============================================================================
function sys=mdlDerivatives(t,x,u)
sys = [];
%=============================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=============================================================================
function sys=mdlUpdate(t,x,u)
sys = 1-x;
%=============================================================================
% mdlOutputs
% Return the block outputs.
%=============================================================================
function sys=mdlOutputs(t,x,u)
sys = x;
%=============================================================================
% mdlGetTimeOfNextVarHit
% Return the time of the next hit for this block.  Note that the result is
% absolute time.  Note that this function is only used when you specify a
% variable discrete-time sample time [-2 0] in the sample time array in
% mdlInitializeSizes.
%=============================================================================
function sys=mdlGetTimeOfNextVarHit(t,x,u,v1,v2,f1,f2)
fs = (u-v1)*(f1-f2)/(v1-v2) + f1;
sampleTime = 1/fs/2;
sys = t + sampleTime;
%=============================================================================
% mdlTerminate
% Perform any end of simulation tasks.
%=============================================================================
function sys=mdlTerminate(t,x,u)
sys = [];

