s-function error

Hello, I have problem with my s-function
The errors are:
Error in 'Hexacopter_1/S-Function' while executing MATLAB S-function 'Trial_2', flag = 3 (output), at time 0.0.
Attempted to access x(2); index out of bounds because numel(x)=1.
And this is my s-function:
function [sys,x0,str,ts] = Trial_2(t,x,u,flag,xini,m,l,Ix,Iy,Iz,IR,g,omegaD)
% The following outlines the general structure of an S-function.
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes(xini);
case 1,
sys=mdlDerivatives(t,x,u,m,l,Ix,Iy,Iz,IR,g,omegaD);
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,
sys=mdlTerminate(t,x,u);
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts]=mdlInitializeSizes(xini)
sizes = simsizes;
sizes.NumContStates = 12; %x(1) bis x(12)
sizes.NumDiscStates = 0;
sizes.NumOutputs = 12; %x,y,z,roll,pitch and yaw
sizes.NumInputs = 4; %u(1),u(2),u(3) und u(4)
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
%
% initialize the initial conditions
x0 = xini;
%
% str is always an empty matrix
%
str = [];
%
% initialize the array of sample times
%
ts = [0 0];
% end mdlInitializeSizes
%
%=============================================================================
% mdlDerivatives
% Return the derivatives for the continuous states.
%=============================================================================
%
function sys=mdlDerivatives(t,x,u,m,l,Ix,Iy,Iz,IR,g,omegaD)
%____State variables__%
x=x(1);
xdot=x(2);
y=x(3);
ydot=x(4);
z=x(5);
zdot=x(6);
roll=x(7);
rolldot=x(8);
pitch=x(9);
pitchdot=x(10);
yaw=x(11);
yawdot=x(12);
dxdt=[xdot,
(cos(roll)*sin(pitch)*cos(yaw)+sin(roll)*sin(yaw))*u(1)/m,
ydot,
(cos(roll)*sin(pitch)*sin(yaw)-sin(roll)*cos(yaw))*u(1)/m,
zdot,
-g+((cos(roll))*cos(pitch)*u(1)/m),
rolldot,
(yawdot*pitchdot*(Iy-Iz)/Ix)-(IR/Ix*pitchdot*omegaD)+(l/Ix*u(2)),
pitchdot,(yawdot*rolldot*(Iz-Ix)/Iy)+(IR/Iy*rolldot*omegaD)+(l/Iy*u(3)),
yawdot,
pitchdot*rolldot*(Ix-Iy)/Iz+(l/Iz*u(4))];
sys =dxdt;
% end mdlDerivatives
%
%=============================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=============================================================================
%
function sys=mdlUpdate(t,x,u)
sys = [];
% end mdlUpdate
%
%=============================================================================
% mdlOutputs
% Return the block outputs.
%=============================================================================
%
function sys=mdlOutputs(t,x,u)
x=x(1);
xdot=x(2);
y=x(3);
ydot=x(4);
z=x(5);
zdot=x(6);
roll=x(7);
rolldot=x(8);
pitch=x(9);
pitchdot=x(10);
yaw=x(11);
yawdot=x(12);
sys = [x xdot y ydot z zdot roll rolldot pitch pitchdot yaw yawdot];
% end mdlOutputs
%
%=============================================================================
% 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)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
% end mdlGetTimeOfNextVarHit
%
%=============================================================================
% mdlTerminate
% Perform any end of simulation tasks.
%=============================================================================
%
function sys=mdlTerminate(t,x,u)
sys = [];
% end mdlTerminate
And this is the m-file for my parameters:
m=2.5;
l=0.5;
Ix=0.17;
Iy=0.17;
Iz=0.3;
IR=1;
b=1;
d=1;
omegaD=1;
g=9.8;
xini=[0 0 0 0 0 0 0.1745 0 0.1745 0 0.1745 0];
I have programmed with s-function twice for pendulum model and Gnatry crane model but i have no problem with it. Could you please help me with my problem. TQ

 Accepted Answer

In both mdlDerivatives and mdlOutputs, you have these lines:
x = x(1);
xdot = x(2);
The first line overwrites the "x" that you receive from the engine, so even if "x" were a vector, you are effectively overwriting it with a single element with:
x = x(1);
Which is causing the statement "x(2)" to error out.

1 Comment

Norazuwa
Norazuwa on 6 Jun 2012
Thank you so much Kaustubha!Your answer is very helpful ;) I was so careless.

Sign in to comment.

More Answers (0)

Categories

Find more on Simulink Coder in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!