s-function error ,flag = 3 (output), at time 0.0.
    11 views (last 30 days)
  
       Show older comments
    
Hello, I have problem with my s-function
    Error in 'Celanovic_3niv2/Nearest three vectors/S-Function' while executing MATLAB S-function 'Celanovic', flag = 3 (output), at time 0.0.
And this is my s-function:
   function [sys,x0,str,ts] = Celanovic(t,x,u,flag)
    %Este comentario saldra en matlab cuando le demos a help
    %VSI_2L_hysteresis_v0. Lo normal es poner aqui una explicacion de lo que
    %hace este bloque
    switch flag,
      %%%%%%%%%%%%%%%%%%
      % Initialization %
      %%%%%%%%%%%%%%%%%%
      % Initialize the states, sample times, and state ordering strings.
      case 0
        [sys,x0,str,ts]=mdlInitializeSizes;
      %%%%%%%%%%%
      % Outputs %
      %%%%%%%%%%%   
      % Return the outputs of the S-function block.
      case 3
        sys=mdlOutputs(t,x,u);
      %%%%%%%%%%%%%%%%%%%
      % Unhandled flags %
      %%%%%%%%%%%%%%%%%%%
      % There are no termination tasks (flag=9) to be handled.
      % Also, there are no continuous or discrete states,
      % so flags 1,2, and 4 are not used, so return an emptyu
      % matrix 
      case { 1, 2, 4, 9 }
        sys=[];
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      % Unexpected flags (error handling)%
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      % Return an error message for unhandled flag values.
      otherwise
        error(['Unhandled flag = ',num2str(flag)]);
    end
    % end timestwo
    %
    %=============================================================================
    % mdlInitializeSizes
    % Return the sizes, initial conditions, and sample times for the S-function.
    %=============================================================================
    %
    function [sys,x0,str,ts] = mdlInitializeSizes()
    sizes = simsizes;
    sizes.NumContStates  = 0;
    sizes.NumDiscStates  = 0;
    sizes.NumOutputs     = 12;  %%%DEFINIR AQUI EL NUMERO DE SALIDAS DEL BLOQUE
    sizes.NumInputs      = 2;  %%%DEFINIR AQUI EL NUMERO DE ENTRADAS DEL BLOQUE
    sizes.DirFeedthrough = 1;   % has direct feedthrough
    sizes.NumSampleTimes = 1;
    %global tm;
    sys = simsizes(sizes);
    str = [];
    x0  = [];
    ts  = [-1 0];   % inherited sample time
    %ts  = [tm 0];   % inherited sample time
    % end mdlInitializeSizes
    %
    %=============================================================================
    % mdlOutputs
    % Return the output vector for the S-function
    %=============================================================================
    %
    function sys = mdlOutputs(t,x,u)
    %Aqui se muestrean los valores de las señales de entrada
    Vrefg=u(1);
    Vrefh=u(2);
    Vsw1=0;
    Vsw=0;
    Ts=200;
    Vdc=120;
    Vrefgmax=sqrt(2)*2*Vdc*cos(pi/6);
    R1=0;
    R2=0;
    R3=0;
    global V1g
    global V1h
    global V2g
    global V2h
    global V3g
    global V3h
    global d1
    global d2
    global d3
    global contador 
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%Aqui hay que escribir la rutina de control de corriente por histéresis
       if (contador>=Ts)
        contador=0;    
        %#Determinacion vectores mas cercanos    
        Vul=[ceil(Vrefg); floor(Vrefh)];
        Vlu=[floor(Vrefg); ceil(Vrefh)];
        Vuu=[ceil(Vrefg); ceil(Vrefh)];
        Vll=[floor(Vrefg); floor(Vrefh)];
        %Calculo tercera tension y tiempos de disparo
        if Vrefg+Vrefh-(Vul(1,:)+Vul(2,:))>0
            V3=Vuu;
            dul=-(Vrefh-Vuu(2,:));
            dlu=-(Vrefg-Vuu(1,:));
            duu=1-dul-dlu;
            d3=duu;
            else
            V3=Vll;
            dul=Vrefg-Vll(1,:);
            dlu=Vrefh-Vll(2,:);
            dll=1-dul-dlu;  
            d3=dll;
        end
        V1g=Vul(1,:)
        V1h=Vul(2,:)
        V2g=Vlu(1,:)
        V2h=Vlu(2,:)
        V3g=V3(1,:)
        V3h=V3(2,:)
        d1=dul
        d2=dlu
        d3
            %Calculo estados inverter a travès de las tensiones V1,V2,V3
        g=V1g;
        h=V1h;
        k=0:1:2; 
        Vsw1=[k; k-g; k-g-h]';
        logicalArray = ~(Vsw1 >= 0 & Vsw1 <= 2);
        rowsToKeep = sum(logicalArray, 2) == 0;
        Vsw2 = Vsw1(rowsToKeep,:);
        Vsw=Vsw2(1,:);
        R1=Vsw(:,1);
        R2=Vsw(:,2);
        R3=Vsw(:,3);
    else
        contador=contador+1;
        if contador>(d1+d2)*Ts 
            g=V3g;
            h=V3h;
            k=0:1:2; 
            Vsw1=[k; k-g; k-g-h]';
            logicalArray = ~(Vsw1 >= 0 & Vsw1 <= 2);
            rowsToKeep = sum(logicalArray, 2) == 0;
            Vsw2 = Vsw1(rowsToKeep,:);
            Vsw=Vsw2(1,:)  
            R1=Vsw(:,1);
            R2=Vsw(:,2);
            R3=Vsw(:,3);
        elseif contador>d1*Ts
                g=V2g;
                h=V2h;
                k=0:1:2; 
                Vsw1=[k; k-g; k-g-h]';
                logicalArray = ~(Vsw1 >= 0 & Vsw1 <= 2);
                rowsToKeep = sum(logicalArray, 2) == 0;
                Vsw2 = Vsw1(rowsToKeep,:);
                Vsw=Vsw2(1,:)      
                R1=Vsw(:,1);
                R2=Vsw(:,2);
                R3=Vsw(:,3);
            else
                g=V1g;
                h=V1h;
                k=0:1:2; 
                Vsw1=[k; k-g; k-g-h]';
                logicalArray = ~(Vsw1 >= 0 & Vsw1 <= 2);
                rowsToKeep = sum(logicalArray, 2) == 0;
                Vsw2 = Vsw1(rowsToKeep,:);
                Vsw=Vsw2(1,:)
                R1=Vsw(:,1);
                R2=Vsw(:,2);
                R3=Vsw(:,3); 
            end
        end  
        %#Disparo IGBT 
    if R1==0
               Igbt1=0;  
               Igbt2=0;           
               Igbt3=1;  
               Igbt4=1;
    elseif R1==1
               Igbt1=0; 
               Igbt2=1;
               Igbt3=1;
               Igbt4=0; 
    elseif R1==2
               Igbt1=1;
               Igbt2=1;
               Igbt3=0;  
               Igbt4=0;
    end
    if R2==0
               Igbt5=0;
               Igbt6=0;   
               Igbt7=1;
               Igbt8=1;
    elseif R2==1
               Igbt5=0;
               Igbt6=1;
               Igbt7=1;
               Igbt8=0;
        elseif R2==2
               Igbt5=1;
               Igbt6=1;
               Igbt7=0;
               Igbt8=0;
    end
    if R3==0
               Igbt9=0;
               Igbt10=0;
               Igbt11=1;
               Igbt12=1;
    elseif R3==1
               Igbt9=0;
               Igbt10=1;
               Igbt11=1;
               Igbt12=0;
    elseif R3==2
               Igbt9=1;
               Igbt10=1;
               Igbt11=0;
               Igbt12=0;
    end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % En el vector sal se guardan los valores de salida que serán los disparos
    % de los transistores y aquellas variables auxiliares que nos interese
    % visualizar en simulink
    sal(1)=Igbt1;
    sal(2)=Igbt2;
    sal(3)=Igbt3;
    sal(4)=Igbt4;
    sal(5)=Igbt5;
    sal(6)=Igbt6;
    sal(7)=Igbt7;
    sal(8)=Igbt8;
    sal(9)=Igbt9;
    sal(10)=Igbt10;
    sal(11)=Igbt11;
    sal(12)=Igbt12;
    sys = sal;
    % end mdlOutputs
Could you please help me with my problem.
1 Comment
  Kaustubha Govind
    
      
 on 27 Jun 2014
				You didn't specify the error message, but I would recommend setting breakpoints in your code to understand the issue better.
Answers (1)
  Thomas Apelt
 on 11 Mar 2015
        I had a similar error:
 An error occurred while running the simulation and the simulation was terminated
Error in 'circ1_2015/Ball Mill/Product Calculation/Product S-Func (tph by size)' while executing MATLAB S-function 'BM_Prod_2015', flag = 3 (output), at time 0.0.
Data points in complex number format are not supported. Use REAL and IMAG to extract the real and imaginary components. Component: Simulink | Category: Block error
--------------
I'm still trouble shooting it. The S-function code and model file were originally Matlab 11. Upgrade was completed successfully with all checks green and good to go. It still could be an upgrade issue...
1 Comment
See Also
Categories
				Find more on Switches and Breakers 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!


