Clear Filters
Clear Filters

请问使用 Simulink 中的 S-Function 如何实现以下代码的功能 (VCO) ?(How can I implement the following code (VCO) using S-Function in Simulink?)

4 views (last 30 days)
以上用 Matlab 语言写的大概的逻辑;请问如何用 S-Function 实现该功能(Voltage Controlled Osillator);关键点是变步长;不知道什么原因,我用 S-Function 写的代码总是报错;我写的 S-Function 代码,如下:
// The above approximate logic written in Matlab language; please ask how to implement the function (Voltage Controlled Osillator) with S-Function; the key point is to change the step size; I don't know what the reason is, the code I write with S-Function always reports an error; the S-Function code I wrote, is as follows:
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
%=============================================================================
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [-2 0]; % -2 means vriable step for simulating (Mr. Luo)
simStateCompliance = 'UnknownSimState';
%=============================================================================
function sys=mdlDerivatives(t,x,u)
sys = [];
%=============================================================================
function sys=mdlUpdate(t,x,u)
sys = [];
%=============================================================================
function sys=mdlOutputs(t,x,u)
sys = ~sys;
%=============================================================================
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;
%=============================================================================
function sys=mdlTerminate(t,x,u)
sys = [];

Accepted Answer

Luo Gang
Luo Gang on 10 Mar 2023
我已经解决了这个问题;
问题有两点:
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 = [];

More Answers (0)

Categories

Find more on Block and Blockset Authoring in Help Center and File Exchange

Products


Release

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!