function AsmLevel2(block)
% Simulation Asynchronmaschine
%   Version vom 15.3.2015

%   Dialogboxparameter:
%       
%     1  Statorwiderstand            R1
%     2  bezogener Rotorwiderstand   R2
%     3  Rotorstreuinduktivität      L2
%     4  Statorstreuinduktivität     L1
%     5  Hauptinduktivität           Lh
%     6  Polpaarzahl                 zp
%     7  Trägheitsmoment             J
%
%   Input:
%
%      1 Spannung U1alpha            U1a
%      2 Spannung U1beta             U1b
%      3 Lastmoment                  Mg
%       
%   Output:
%
%      1 Strom I1alpha               I1a
%      2 Strom I1beta                I1b
%      3 Winkelgeschwindigkeit       Ohm
%      4 Fluss Psi1alpha             Psa
%      5 Fluss Psi1beta              Psb


  setup(block);
  
%endfunction

function setup(block)
  
  %% Register number of dialog parameters   
  block.NumDialogPrms = 7;

  %% Register number of input and output ports
  block.NumInputPorts  = 3;
  block.NumOutputPorts = 4;

  %% Setup functional port properties to dynamically
  %% inherited.
  block.SetPreCompInpPortInfoToDynamic;
  block.SetPreCompOutPortInfoToDynamic;
 
  block.InputPort(1).Dimensions        = 1;
  block.InputPort(1).DirectFeedthrough = false;
  
  block.InputPort(2).Dimensions        = 1;
  block.InputPort(2).DirectFeedthrough = false;
  
  block.InputPort(3).Dimensions        = 1;
  block.InputPort(3).DirectFeedthrough = false;
  
  
  block.OutputPort(1).Dimensions       = 1;
  block.OutputPort(2).Dimensions       = 1;
  block.OutputPort(3).Dimensions       = 1;
  block.OutputPort(4).Dimensions       = 1;
  
  %% Set block sample time to continuous
  block.SampleTimes = [0 0];
  
  %% Setup Dwork
  block.NumContStates = 5;

  %% Set the block simStateCompliance to default (i.e., same as a built-in block)
  block.SimStateCompliance = 'DefaultSimState';

  %% Register methods
  block.RegBlockMethod('InitializeConditions',    @InitConditions);  
  block.RegBlockMethod('Outputs',                 @Output);  
  block.RegBlockMethod('Derivatives',             @Derivative);  
  block.RegBlockMethod('SetInputPortSamplingMode',@SetInputPortSamplingMode);
  block.RegBlockMethod('SetInputPortDimensions',  @SetInpPortDims);
%endfunction

function SetInputPortSamplingMode(block, idx, fd)
 block.InputPort(idx).SamplingMode = fd;
 
 block.OutputPort(1).SamplingMode = fd;
 block.OutputPort(2).SamplingMode = fd;
 block.OutputPort(3).SamplingMode = fd;
 block.OutputPort(4).SamplingMode = fd;

function SetInpPortDims(block, idx, di)
  block.InputPort(idx).Dimensions = di;

function InitConditions(block)

  %% Initialize Dwork
  block.ContStates.Data(1) = 0;
  block.ContStates.Data(2) = 0;
  block.ContStates.Data(3) = 0;
  block.ContStates.Data(4) = 0;
  block.ContStates.Data(5) = 0;
%endfunction

function Output(block)
% Die Ausgänge übernehmen die im Block Derivative berechneten Integrale
  block.OutputPort(1).Data = block.ContStates.Data(1);
  block.OutputPort(2).Data = block.ContStates.Data(2); 
  block.OutputPort(3).Data = block.ContStates.Data(5);
  block.OutputPort(4).Data = 3/2*2*0.16775/0.01296*(block.ContStates.Data(3)*block.ContStates.Data(2)-block.ContStates.Data(4)*block.ContStates.Data(1));
  
%endfunction

function Derivative(block)

     u(1) =  block.InputPort(1).Data;
     u(2) =  block.InputPort(2).Data;
     u(3)  = block.InputPort(3).Data;
     
     R1  = 1.05;        %block.DialogPrm(1).Data;
     R2  = 1.314;       %block.DialogPrm(2).Data;
     L2  = 0.01296;     %block.DialogPrm(3).Data;
     L1  = 0.00799;     %block.DialogPrm(4).Data;
     Lm  = 0.16775;     %block.DialogPrm(5).Data;
     zp  = 2;           %block.DialogPrm(6).Data;
     J   = 0.024;       %block.DialogPrm(7).Data;
     
     x(1) = block.ContStates.Data(1);
     x(2) = block.ContStates.Data(2);
     x(3) = block.ContStates.Data(3);
     x(4) = block.ContStates.Data(4);
     x(5) = block.ContStates.Data(5);
     
     sigma = 1-((Lm*Lm)/(L1*L2));
     T1  = L1/R1;
     T2  = L2/R2;
     
     % Die 5 Differentialgleichungen:
     block.Derivatives.Data(1) = -(1/(T1*sigma)+(1-sigma)/(sigma*T2))*x(1)+(1-sigma)/(sigma*T2*Lm)*x(3)+(1-sigma)/(sigma*Lm)*x(5)*x(4)+1/(L1*sigma)*u(1);
     block.Derivatives.Data(2) = -(1/(T1*sigma)+(1-sigma)/(sigma*T2))*x(2)-(1-sigma)/(sigma*Lm)*x(5)*x(3)+(1-sigma)/(T2*sigma*Lm)*x(4)+1/(L1*sigma)*u(2);
     block.Derivatives.Data(3) = Lm/T2*x(1) - 1/T2*x(3) - x(5)*x(4);
     block.Derivatives.Data(4) = Lm/T2*x(2) + x(5)*x(3) - 1/T2*x(4);
     block.Derivatives.Data(5) = 3/2*zp/J*Lm/L2*(x(3)*x(2)-x(4)*x(1))-u(3)/J;
     
     
     
     
     %endfunction

