Filter löschen
Filter löschen

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

2 Ansichten (letzte 30 Tage)
以上用 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 = [];

Akzeptierte Antwort

Luo Gang
Luo Gang am 10 Mär. 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 = [];

Weitere Antworten (0)

Produkte


Version

R2022b

Community Treasure Hunt

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

Start Hunting!