Browse Source

feat:增加pwrlim单元测试,修复MBD电机参数生成立即数bug

CN\guohui27 2 years ago
parent
commit
9a8d5b4031

+ 8 - 0
User project/2.MotorDrive/Include/brake.h

@@ -20,6 +20,10 @@ WLBDM_M4_SR_201809071-new FSM1.1, by mz, create this file;
 *************************************************************************/
 #ifndef BRAKE_H
 #define BRAKE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
 /************************************************************************
  Compiler Directives (N/A)
 *************************************************************************/
@@ -128,6 +132,10 @@ BRAKE_EXT void cvb_voBrakeInit(void);
 /************************************************************************
  Flag Define (N/A)
 *************************************************************************/
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
 #endif
 /************************************************************************
  Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.

+ 1 - 1
User project/2.MotorDrive/Source/packed

@@ -1 +1 @@
-Subproject commit 31ea0d9cb25aef4602413c9e8deb40d634ddecb4
+Subproject commit 5db4fa0b12ca132566622a2c03e42759fd233596

+ 309 - 291
unit_test/motor_sim/PmsmSimUt.cpp

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)
@@ -15,6 +15,17 @@
 #include "PmsmSimUt.h"
 #include "PmsmSimUt_private.h"
 
+void PmsmSimUtModelClass::PmsmSimUt_reset()
+{
+  // Outputs for Atomic SubSystem: '<Root>/Initialize Function'
+  // StateWriter: '<S2>/State Writer' incorporates:
+  //   Constant: '<S2>/Constant4'
+
+  PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c = PmsmSimUt_P.Params.Flux;
+
+  // End of Outputs for SubSystem: '<Root>/Initialize Function'
+}
+
 real_T rt_modd_snf(real_T u0, real_T u1)
 {
   real_T q;
@@ -59,6 +70,8 @@ void PmsmSimUtModelClass::step()
   real_T rtb_Gain1_c[3];
   real_T rtb_Add1;
   real_T rtb_Add2;
+  real_T rtb_Add2_tmp_tmp;
+  real_T rtb_Add2_tmp_tmp_0;
   real_T rtb_Fcn1;
   real_T rtb_Gain;
   real_T rtb_Gain1_i;
@@ -69,77 +82,75 @@ void PmsmSimUtModelClass::step()
   real_T rtb_Switch_idx_0;
   real_T rtb_Switch_idx_1;
   real_T rtb_a;
-  real_T rtb_a_tmp_tmp;
-  real_T rtb_a_tmp_tmp_0;
   real_T rtb_id;
   real_T rtb_iq;
   int32_T i;
   uint8_T rtb_Compare;
 
-  // Math: '<S17>/Mod' incorporates:
-  //   Constant: '<S17>/Constant'
-  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator'
+  // Math: '<S18>/Mod' incorporates:
+  //   Constant: '<S18>/Constant'
+  //   DiscreteIntegrator: '<S18>/Discrete-Time Integrator'
 
   rtb_Mod = rt_modd_snf(PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE,
                         PmsmSimUt_P.Constant_Value);
 
-  // Fcn: '<S16>/id' incorporates:
-  //   Constant: '<S16>/Constant1'
-  //   Constant: '<S16>/Constant2'
-  //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator'
-
-  rtb_id = (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c -
-            PmsmSimUt_P.Params.Flux) / PmsmSimUt_P.Params.Ld;
-
-  // Fcn: '<S16>/iq' incorporates:
-  //   Constant: '<S16>/Constant3'
-  //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator1'
+  // Fcn: '<S17>/iq' incorporates:
+  //   Constant: '<S17>/Constant3'
+  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator1'
 
   rtb_iq = PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE / PmsmSimUt_P.Params.Lq;
 
-  // Outputs for Enabled SubSystem: '<S20>/Subsystem - pi//2 delay' incorporates:
-  //   EnablePort: '<S24>/Enable'
+  // Fcn: '<S17>/id' incorporates:
+  //   Constant: '<S17>/Constant1'
+  //   Constant: '<S17>/Constant2'
+  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator'
 
-  // Outputs for Enabled SubSystem: '<S20>/Subsystem1' incorporates:
+  rtb_id = (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c -
+            PmsmSimUt_P.Params.Flux) / PmsmSimUt_P.Params.Ld;
+
+  // Outputs for Enabled SubSystem: '<S21>/Subsystem - pi//2 delay' incorporates:
   //   EnablePort: '<S25>/Enable'
 
-  // Fcn: '<S28>/Fcn' incorporates:
-  //   Fcn: '<S24>/Fcn'
-  //   Fcn: '<S24>/Fcn1'
+  // Outputs for Enabled SubSystem: '<S21>/Subsystem1' incorporates:
+  //   EnablePort: '<S26>/Enable'
+
+  // Fcn: '<S29>/Fcn' incorporates:
   //   Fcn: '<S25>/Fcn'
+  //   Fcn: '<S25>/Fcn1'
+  //   Fcn: '<S26>/Fcn'
 
-  rtb_a_tmp_tmp = std::sin(rtb_Mod);
-  rtb_a_tmp_tmp_0 = std::cos(rtb_Mod);
+  rtb_Add2_tmp_tmp = std::sin(rtb_Mod);
+  rtb_Add2_tmp_tmp_0 = std::cos(rtb_Mod);
 
-  // End of Outputs for SubSystem: '<S20>/Subsystem1'
-  // End of Outputs for SubSystem: '<S20>/Subsystem - pi//2 delay'
-  rtb_a = rtb_a_tmp_tmp_0 * rtb_id - rtb_a_tmp_tmp * rtb_iq;
+  // End of Outputs for SubSystem: '<S21>/Subsystem1'
+  // End of Outputs for SubSystem: '<S21>/Subsystem - pi//2 delay'
+  rtb_Add2 = rtb_Add2_tmp_tmp_0 * rtb_id - rtb_Add2_tmp_tmp * rtb_iq;
 
-  // Fcn: '<S28>/Fcn1' incorporates:
-  //   Fcn: '<S28>/Fcn'
+  // Fcn: '<S29>/Fcn1' incorporates:
+  //   Fcn: '<S29>/Fcn'
 
-  rtb_Gain1_i = rtb_a_tmp_tmp * rtb_id + rtb_a_tmp_tmp_0 * rtb_iq;
+  rtb_a = rtb_Add2_tmp_tmp * rtb_id + rtb_Add2_tmp_tmp_0 * rtb_iq;
 
-  // Gain: '<S29>/K1' incorporates:
-  //   Constant: '<S9>/Constant'
+  // Gain: '<S30>/K1' incorporates:
+  //   Constant: '<S10>/Constant'
 
-  rtb_Gain2_k = PmsmSimUt_P.K1_Gain * PmsmSimUt_P.Constant_Value_e;
+  rtb_Gain1_i = PmsmSimUt_P.K1_Gain * PmsmSimUt_P.Constant_Value_e;
 
-  // Fcn: '<S29>/a'
-  rtb_Add2 = rtb_a + rtb_Gain2_k;
+  // Fcn: '<S30>/a'
+  rtb_Gain2_k = rtb_Add2 + rtb_Gain1_i;
 
-  // Fcn: '<S29>/b'
-  rtb_Fcn1 = (-0.5 * rtb_a + 0.8660254037844386 * rtb_Gain1_i) + rtb_Gain2_k;
+  // Fcn: '<S30>/b'
+  rtb_Fcn1 = (-0.5 * rtb_Add2 + 0.8660254037844386 * rtb_a) + rtb_Gain1_i;
 
-  // Fcn: '<S29>/c'
-  rtb_a = (-0.5 * rtb_a - 0.8660254037844386 * rtb_Gain1_i) + rtb_Gain2_k;
+  // Fcn: '<S30>/c'
+  rtb_Add2 = (-0.5 * rtb_Add2 - 0.8660254037844386 * rtb_a) + rtb_Gain1_i;
 
   // Outport: '<Root>/Out' incorporates:
-  //   Gain: '<S29>/K2'
+  //   Gain: '<S30>/K2'
 
-  PmsmSimUt_Y.Out.Iabc[0] = PmsmSimUt_P.K2_Gain * rtb_Add2;
+  PmsmSimUt_Y.Out.Iabc[0] = PmsmSimUt_P.K2_Gain * rtb_Gain2_k;
   PmsmSimUt_Y.Out.Iabc[1] = PmsmSimUt_P.K2_Gain * rtb_Fcn1;
-  PmsmSimUt_Y.Out.Iabc[2] = PmsmSimUt_P.K2_Gain * rtb_a;
+  PmsmSimUt_Y.Out.Iabc[2] = PmsmSimUt_P.K2_Gain * rtb_Add2;
 
   // Switch: '<Root>/Switch2' incorporates:
   //   Inport: '<Root>/ObsIn'
@@ -152,8 +163,69 @@ void PmsmSimUtModelClass::step()
 
   // End of Switch: '<Root>/Switch2'
 
-  // RelationalOperator: '<S10>/Compare' incorporates:
-  //   Constant: '<S10>/Constant'
+  // Gain: '<S17>/Gain' incorporates:
+  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator'
+  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator1'
+  //   Fcn: '<S17>/Te//p=(3//2)*(Flux_d*iq-Flux_q*id)'
+
+  rtb_Gain = (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c * rtb_iq -
+              PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE * rtb_id) * 1.5 *
+    PmsmSimUt_P.Params.Pn;
+
+  // Outputs for Enabled SubSystem: '<S18>/Subsystem' incorporates:
+  //   EnablePort: '<S19>/Enable'
+
+  // Constant: '<Root>/Constant2'
+  if (PmsmSimUt_P.Params.SpdCtrl > 0.0) {
+    // DiscreteIntegrator: '<S19>/Discrete-Time Integrator1'
+    PmsmSimUt_B.DiscreteTimeIntegrator1 =
+      PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTAT_d;
+
+    // Update for DiscreteIntegrator: '<S19>/Discrete-Time Integrator1' incorporates:
+    //   Constant: '<S19>/Constant1'
+    //   Gain: '<S19>/Gain'
+    //   Gain: '<S19>/Gain1'
+    //   Inport: '<Root>/CtrlIn'
+    //   Product: '<S19>/Divide'
+    //   Sum: '<S19>/Sum'
+
+    PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTAT_d += ((rtb_Gain -
+      PmsmSimUt_P.Params.B * PmsmSimUt_B.DiscreteTimeIntegrator1) -
+      PmsmSimUt_U.CtrlIn.Tm) / PmsmSimUt_P.Params.Jm * PmsmSimUt_P.Params.Ts *
+      PmsmSimUt_P.DiscreteTimeIntegrator1_gainval;
+  }
+
+  // End of Outputs for SubSystem: '<S18>/Subsystem'
+
+  // Switch: '<S18>/Switch' incorporates:
+  //   Constant: '<Root>/Constant2'
+  //   Constant: '<Root>/Constant4'
+  //   Gain: '<S18>/Gain3'
+
+  if (PmsmSimUt_P.Params.SpdCtrl > PmsmSimUt_P.Switch_Threshold) {
+    rtb_Gain2_k = PmsmSimUt_B.DiscreteTimeIntegrator1;
+  } else {
+    rtb_Gain2_k = PmsmSimUt_P.Gain3_Gain * PmsmSimUt_P.Params.SpdRpm;
+  }
+
+  // End of Switch: '<S18>/Switch'
+
+  // Gain: '<S18>/Gain1'
+  rtb_Gain1_i = PmsmSimUt_P.Params.Pn * rtb_Gain2_k;
+
+  // Switch: '<Root>/Switch3' incorporates:
+  //   Inport: '<Root>/ObsIn'
+
+  if (PmsmSimUt_U.ObsIn.Enable > PmsmSimUt_P.Switch3_Threshold) {
+    rtb_a = PmsmSimUt_U.ObsIn.We;
+  } else {
+    rtb_a = rtb_Gain1_i;
+  }
+
+  // End of Switch: '<Root>/Switch3'
+
+  // RelationalOperator: '<S11>/Compare' incorporates:
+  //   Constant: '<S11>/Constant'
   //   Constant: '<S1>/Constant'
 
   rtb_Compare = (PmsmSimUt_P.AlphaBetaZerotodq0_Alignment ==
@@ -165,42 +237,42 @@ void PmsmSimUtModelClass::step()
   rtb_Add2 = PmsmSimUt_U.ObsIn.Theta - rtb_Mod;
 
   // Outputs for Enabled SubSystem: '<S1>/Subsystem1' incorporates:
-  //   EnablePort: '<S13>/Enable'
+  //   EnablePort: '<S14>/Enable'
 
   if (rtb_Compare > 0) {
-    // Fcn: '<S13>/Fcn' incorporates:
-    //   Fcn: '<S13>/Fcn1'
+    // Fcn: '<S14>/Fcn' incorporates:
+    //   Fcn: '<S14>/Fcn1'
 
-    rtb_Gain1_i = std::sin(rtb_Add2);
-    rtb_Add1 = std::cos(rtb_Add2);
+    rtb_Add1 = std::sin(rtb_Add2);
+    rtb_Switch_h = std::cos(rtb_Add2);
 
-    // Fcn: '<S13>/Fcn'
-    PmsmSimUt_B.Fcn_g = rtb_id * rtb_Add1 + rtb_iq * rtb_Gain1_i;
+    // Fcn: '<S14>/Fcn'
+    PmsmSimUt_B.Fcn_g = rtb_id * rtb_Switch_h + rtb_iq * rtb_Add1;
 
-    // Fcn: '<S13>/Fcn1'
-    PmsmSimUt_B.Fcn1_e = -rtb_id * rtb_Gain1_i + rtb_iq * rtb_Add1;
+    // Fcn: '<S14>/Fcn1'
+    PmsmSimUt_B.Fcn1_e = -rtb_id * rtb_Add1 + rtb_iq * rtb_Switch_h;
   }
 
   // End of Outputs for SubSystem: '<S1>/Subsystem1'
 
   // Outputs for Enabled SubSystem: '<S1>/Subsystem - pi//2 delay' incorporates:
-  //   EnablePort: '<S12>/Enable'
+  //   EnablePort: '<S13>/Enable'
 
-  // RelationalOperator: '<S11>/Compare' incorporates:
-  //   Constant: '<S11>/Constant'
+  // RelationalOperator: '<S12>/Compare' incorporates:
+  //   Constant: '<S12>/Constant'
   //   Constant: '<S1>/Constant'
 
   if (PmsmSimUt_P.AlphaBetaZerotodq0_Alignment ==
       PmsmSimUt_P.CompareToConstant1_const) {
-    // Fcn: '<S12>/Fcn'
+    // Fcn: '<S13>/Fcn'
     PmsmSimUt_B.Fcn_b = rtb_id * std::sin(rtb_Add2) - rtb_iq * std::cos(rtb_Add2);
 
-    // Fcn: '<S12>/Fcn1'
+    // Fcn: '<S13>/Fcn1'
     PmsmSimUt_B.Fcn1_n = rtb_id * std::cos(rtb_Add2) + rtb_iq * std::sin
       (rtb_Add2);
   }
 
-  // End of RelationalOperator: '<S11>/Compare'
+  // End of RelationalOperator: '<S12>/Compare'
   // End of Outputs for SubSystem: '<S1>/Subsystem - pi//2 delay'
 
   // Switch: '<S1>/Switch'
@@ -225,67 +297,6 @@ void PmsmSimUtModelClass::step()
 
   // End of Switch: '<Root>/Switch5'
 
-  // Gain: '<S16>/Gain' incorporates:
-  //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator'
-  //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator1'
-  //   Fcn: '<S16>/Te//p=(3//2)*(Flux_d*iq-Flux_q*id)'
-
-  rtb_Gain = (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c * rtb_iq -
-              PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE * rtb_id) * 1.5 *
-    PmsmSimUt_P.Params.Pn;
-
-  // Outputs for Enabled SubSystem: '<S17>/Subsystem' incorporates:
-  //   EnablePort: '<S18>/Enable'
-
-  // Constant: '<Root>/Constant2'
-  if (PmsmSimUt_P.Params.SpdCtrl > 0.0) {
-    // DiscreteIntegrator: '<S18>/Discrete-Time Integrator1'
-    PmsmSimUt_B.DiscreteTimeIntegrator1 =
-      PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTAT_d;
-
-    // Update for DiscreteIntegrator: '<S18>/Discrete-Time Integrator1' incorporates:
-    //   Constant: '<S18>/Constant1'
-    //   Gain: '<S18>/Gain'
-    //   Gain: '<S18>/Gain1'
-    //   Inport: '<Root>/CtrlIn'
-    //   Product: '<S18>/Divide'
-    //   Sum: '<S18>/Sum'
-
-    PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTAT_d += ((rtb_Gain -
-      PmsmSimUt_P.Params.B * PmsmSimUt_B.DiscreteTimeIntegrator1) -
-      PmsmSimUt_U.CtrlIn.Tm) / PmsmSimUt_P.Params.Jm * PmsmSimUt_P.Params.Ts *
-      PmsmSimUt_P.DiscreteTimeIntegrator1_gainval;
-  }
-
-  // End of Outputs for SubSystem: '<S17>/Subsystem'
-
-  // Switch: '<S17>/Switch' incorporates:
-  //   Constant: '<Root>/Constant2'
-  //   Constant: '<Root>/Constant4'
-  //   Gain: '<S17>/Gain3'
-
-  if (PmsmSimUt_P.Params.SpdCtrl > PmsmSimUt_P.Switch_Threshold) {
-    rtb_Gain2_k = PmsmSimUt_B.DiscreteTimeIntegrator1;
-  } else {
-    rtb_Gain2_k = PmsmSimUt_P.Gain3_Gain * PmsmSimUt_P.Params.SpdRpm;
-  }
-
-  // End of Switch: '<S17>/Switch'
-
-  // Gain: '<S17>/Gain1'
-  rtb_Gain1_i = PmsmSimUt_P.Params.Pn * rtb_Gain2_k;
-
-  // Switch: '<Root>/Switch3' incorporates:
-  //   Inport: '<Root>/ObsIn'
-
-  if (PmsmSimUt_U.ObsIn.Enable > PmsmSimUt_P.Switch3_Threshold) {
-    rtb_a = PmsmSimUt_U.ObsIn.We;
-  } else {
-    rtb_a = rtb_Gain1_i;
-  }
-
-  // End of Switch: '<Root>/Switch3'
-
   // Switch: '<Root>/Switch4' incorporates:
   //   Inport: '<Root>/ObsIn'
 
@@ -309,10 +320,15 @@ void PmsmSimUtModelClass::step()
 
   // End of ManualSwitch: '<Root>/Manual Switch1'
 
-  // Product: '<S5>/Product' incorporates:
-  //   Fcn: '<S5>/Fcn'
+  // Product: '<S6>/Product' incorporates:
+  //   Constant: '<S6>/Constant1'
+  //   Constant: '<S6>/Constant2'
+  //   Product: '<S6>/Product2'
+  //   Product: '<S6>/Product3'
+  //   Sum: '<S6>/Sum'
 
-  rtb_Switch_idx_1 = (8.1e-5 * rtb_Add1 + 0.0789) * rtb_a * rtb_Switch_idx_0;
+  rtb_Switch_idx_1 = (rtb_Add1 * PmsmSimUt_P.Params.Ld + PmsmSimUt_P.Params.Flux)
+    * rtb_a * rtb_Switch_idx_0;
 
   // Sum: '<Root>/Add1' incorporates:
   //   Inport: '<Root>/CtrlIn'
@@ -320,22 +336,24 @@ void PmsmSimUtModelClass::step()
   rtb_Add1 = PmsmSimUt_U.CtrlIn.IdCmd - rtb_Add1;
 
   // Switch: '<Root>/Switch1' incorporates:
-  //   Fcn: '<S5>/Fcn1'
+  //   Constant: '<S6>/Constant3'
+  //   Gain: '<S6>/Gain1'
   //   Inport: '<Root>/ICtrlIn'
-  //   Product: '<S5>/Product'
+  //   Product: '<S6>/Product'
+  //   Product: '<S6>/Product1'
   //   Sum: '<Root>/Sum1'
 
   if (PmsmSimUt_U.ICtrlIn.Enable > PmsmSimUt_P.Switch1_Threshold) {
     rtb_Switch_idx_0 = PmsmSimUt_U.ICtrlIn.UdCtrl;
   } else {
-    // Sum: '<S15>/Sum6' incorporates:
-    //   DiscreteIntegrator: '<S15>/Discrete-Time Integrator'
-    //   Gain: '<S15>/Kp4'
+    // Sum: '<S16>/Sum6' incorporates:
+    //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator'
+    //   Gain: '<S16>/Kp4'
 
     rtb_Relay2 = PmsmSimUt_P.Params.CKpd * rtb_Add1 +
       PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j;
 
-    // Saturate: '<S15>/Saturation2'
+    // Saturate: '<S16>/Saturation2'
     if (rtb_Relay2 > PmsmSimUt_P.Saturation2_UpperSat_o) {
       rtb_Relay2 = PmsmSimUt_P.Saturation2_UpperSat_o;
     } else {
@@ -344,15 +362,15 @@ void PmsmSimUtModelClass::step()
       }
     }
 
-    // End of Saturate: '<S15>/Saturation2'
-    rtb_Switch_idx_0 = -rtb_a * 8.1e-5 * rtb_Add2 * rtb_Switch_idx_0 +
-      rtb_Relay2;
+    // End of Saturate: '<S16>/Saturation2'
+    rtb_Switch_idx_0 = PmsmSimUt_P.Gain1_Gain * rtb_a * rtb_Add2 *
+      PmsmSimUt_P.Params.Lq * rtb_Switch_idx_0 + rtb_Relay2;
   }
 
   // End of Switch: '<Root>/Switch1'
 
   // Outputs for Enabled SubSystem: '<Root>/Subsystem' incorporates:
-  //   EnablePort: '<S4>/Enable'
+  //   EnablePort: '<S5>/Enable'
 
   // Logic: '<Root>/AND' incorporates:
   //   Constant: '<Root>/Constant1'
@@ -364,7 +382,7 @@ void PmsmSimUtModelClass::step()
     PmsmSimUt_DW.Subsystem_MODE = true;
 
     // Saturate: '<Root>/Saturation2' incorporates:
-    //   Memory: '<S6>/Memory'
+    //   Memory: '<S7>/Memory'
 
     if (PmsmSimUt_DW.Memory_PreviousInput > PmsmSimUt_P.Saturation2_UpperSat_p)
     {
@@ -378,42 +396,42 @@ void PmsmSimUtModelClass::step()
 
     // End of Saturate: '<Root>/Saturation2'
 
-    // Sum: '<S4>/Add4' incorporates:
+    // Sum: '<S5>/Add4' incorporates:
     //   Gain: '<Root>/Gain1'
 
     rtb_Relay2 = rtb_Switch_h - 9.5492965855137211 / PmsmSimUt_P.Params.Pn *
       rtb_a;
 
-    // DiscreteIntegrator: '<S19>/Discrete-Time Integrator'
+    // DiscreteIntegrator: '<S20>/Discrete-Time Integrator'
     PmsmSimUt_B.DiscreteTimeIntegrator =
       PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n;
 
-    // Sum: '<S19>/Sum6' incorporates:
-    //   Gain: '<S19>/Kp4'
+    // Sum: '<S20>/Sum6' incorporates:
+    //   Gain: '<S20>/Kp4'
 
     PmsmSimUt_B.Iq_ref = PmsmSimUt_P.Params.SKp * rtb_Relay2 +
       PmsmSimUt_B.DiscreteTimeIntegrator;
 
-    // Saturate: '<S19>/Saturation2'
+    // Saturate: '<S20>/Saturation2'
     if (PmsmSimUt_B.Iq_ref > PmsmSimUt_P.Saturation2_UpperSat) {
-      // Sum: '<S19>/Sum6' incorporates:
-      //   Saturate: '<S19>/Saturation2'
+      // Sum: '<S20>/Sum6' incorporates:
+      //   Saturate: '<S20>/Saturation2'
 
       PmsmSimUt_B.Iq_ref = PmsmSimUt_P.Saturation2_UpperSat;
     } else {
       if (PmsmSimUt_B.Iq_ref < PmsmSimUt_P.Saturation2_LowerSat) {
-        // Sum: '<S19>/Sum6' incorporates:
-        //   Saturate: '<S19>/Saturation2'
+        // Sum: '<S20>/Sum6' incorporates:
+        //   Saturate: '<S20>/Saturation2'
 
         PmsmSimUt_B.Iq_ref = PmsmSimUt_P.Saturation2_LowerSat;
       }
     }
 
-    // End of Saturate: '<S19>/Saturation2'
+    // End of Saturate: '<S20>/Saturation2'
 
-    // Update for DiscreteIntegrator: '<S19>/Discrete-Time Integrator' incorporates:
-    //   Gain: '<S19>/Gain'
-    //   Gain: '<S19>/Kp5'
+    // Update for DiscreteIntegrator: '<S20>/Discrete-Time Integrator' incorporates:
+    //   Gain: '<S20>/Gain'
+    //   Gain: '<S20>/Kp5'
 
     PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n += PmsmSimUt_P.Params.SKi *
       rtb_Relay2 * PmsmSimUt_P.Params.Ts *
@@ -430,13 +448,13 @@ void PmsmSimUtModelClass::step()
       }
     }
 
-    // End of Update for DiscreteIntegrator: '<S19>/Discrete-Time Integrator'
+    // End of Update for DiscreteIntegrator: '<S20>/Discrete-Time Integrator'
 
     // Switch: '<Root>/Switch'
     rtb_Switch_h = PmsmSimUt_B.Iq_ref;
   } else {
     if (PmsmSimUt_DW.Subsystem_MODE) {
-      // Disable for DiscreteIntegrator: '<S19>/Discrete-Time Integrator'
+      // Disable for DiscreteIntegrator: '<S20>/Discrete-Time Integrator'
       PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n =
         PmsmSimUt_B.DiscreteTimeIntegrator;
       PmsmSimUt_DW.Subsystem_MODE = false;
@@ -461,14 +479,14 @@ void PmsmSimUtModelClass::step()
   if (PmsmSimUt_U.ICtrlIn.Enable > PmsmSimUt_P.Switch6_Threshold) {
     rtb_a = PmsmSimUt_U.ICtrlIn.UqCtrl;
   } else {
-    // Sum: '<S14>/Sum6' incorporates:
-    //   DiscreteIntegrator: '<S14>/Discrete-Time Integrator'
-    //   Gain: '<S14>/Kp4'
+    // Sum: '<S15>/Sum6' incorporates:
+    //   DiscreteIntegrator: '<S15>/Discrete-Time Integrator'
+    //   Gain: '<S15>/Kp4'
 
     rtb_Relay2 = PmsmSimUt_P.Params.CKpq * rtb_Add2 +
       PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g;
 
-    // Saturate: '<S14>/Saturation2'
+    // Saturate: '<S15>/Saturation2'
     if (rtb_Relay2 > PmsmSimUt_P.Saturation2_UpperSat_b) {
       rtb_Relay2 = PmsmSimUt_P.Saturation2_UpperSat_b;
     } else {
@@ -477,95 +495,95 @@ void PmsmSimUtModelClass::step()
       }
     }
 
-    // End of Saturate: '<S14>/Saturation2'
+    // End of Saturate: '<S15>/Saturation2'
     rtb_a = rtb_Switch_idx_1 + rtb_Relay2;
   }
 
   // End of Switch: '<Root>/Switch6'
 
-  // Fcn: '<S26>/Fcn' incorporates:
-  //   Fcn: '<S26>/Fcn1'
+  // Fcn: '<S27>/Fcn' incorporates:
+  //   Fcn: '<S27>/Fcn1'
 
   rtb_Relay2 = std::sin(rtb_Fcn1);
   rtb_Fcn1 = std::cos(rtb_Fcn1);
   rtb_Switch_idx_1 = rtb_Fcn1 * rtb_Switch_idx_0 - rtb_Relay2 * rtb_a;
 
-  // Fcn: '<S26>/Fcn1'
+  // Fcn: '<S27>/Fcn1'
   rtb_Fcn1 = rtb_Relay2 * rtb_Switch_idx_0 + rtb_Fcn1 * rtb_a;
 
-  // Gain: '<S27>/K1' incorporates:
-  //   Constant: '<S8>/Constant'
+  // Gain: '<S28>/K1' incorporates:
+  //   Constant: '<S9>/Constant'
 
   rtb_Switch_idx_0 = PmsmSimUt_P.K1_Gain_j * PmsmSimUt_P.Constant_Value_p;
 
-  // Fcn: '<S27>/a'
+  // Fcn: '<S28>/a'
   rtb_a = rtb_Switch_idx_1 + rtb_Switch_idx_0;
 
-  // Fcn: '<S27>/b'
+  // Fcn: '<S28>/b'
   rtb_Relay2 = (-0.5 * rtb_Switch_idx_1 + 0.8660254037844386 * rtb_Fcn1) +
     rtb_Switch_idx_0;
 
-  // Fcn: '<S27>/c'
+  // Fcn: '<S28>/c'
   rtb_Switch_idx_1 = (-0.5 * rtb_Switch_idx_1 - 0.8660254037844386 * rtb_Fcn1) +
     rtb_Switch_idx_0;
 
-  // Gain: '<S27>/K2'
-  rtb_Fcn1 = PmsmSimUt_P.K2_Gain_b * rtb_a;
-  rtb_a = PmsmSimUt_P.K2_Gain_b * rtb_Relay2;
+  // Gain: '<S28>/K2'
+  rtb_a *= PmsmSimUt_P.K2_Gain_b;
+  rtb_Fcn1 = PmsmSimUt_P.K2_Gain_b * rtb_Relay2;
   rtb_Relay2 = PmsmSimUt_P.K2_Gain_b * rtb_Switch_idx_1;
   for (i = 0; i < 3; i++) {
-    // Gain: '<S21>/Gain1' incorporates:
-    //   Gain: '<S21>/Gain3'
+    // Gain: '<S22>/Gain1' incorporates:
+    //   Gain: '<S22>/Gain3'
 
-    rtb_Gain1_c[i] = PmsmSimUt_P.Gain1_Gain * (PmsmSimUt_P.Gain3_Gain_j[i + 6] *
-      rtb_Relay2 + (PmsmSimUt_P.Gain3_Gain_j[i + 3] * rtb_a +
-                    PmsmSimUt_P.Gain3_Gain_j[i] * rtb_Fcn1));
+    rtb_Gain1_c[i] = PmsmSimUt_P.Gain1_Gain_e * (PmsmSimUt_P.Gain3_Gain_j[i + 6]
+      * rtb_Relay2 + (PmsmSimUt_P.Gain3_Gain_j[i + 3] * rtb_Fcn1 +
+                      PmsmSimUt_P.Gain3_Gain_j[i] * rtb_a));
   }
 
-  // RelationalOperator: '<S22>/Compare' incorporates:
-  //   Constant: '<S20>/Constant'
-  //   Constant: '<S22>/Constant'
+  // RelationalOperator: '<S23>/Compare' incorporates:
+  //   Constant: '<S21>/Constant'
+  //   Constant: '<S23>/Constant'
 
   rtb_Compare = (PmsmSimUt_P.AlphaBetaZerotodq0_Alignment_e ==
                  PmsmSimUt_P.CompareToConstant_const_a);
 
-  // Outputs for Enabled SubSystem: '<S20>/Subsystem1' incorporates:
-  //   EnablePort: '<S25>/Enable'
+  // Outputs for Enabled SubSystem: '<S21>/Subsystem1' incorporates:
+  //   EnablePort: '<S26>/Enable'
 
   if (rtb_Compare > 0) {
-    // Fcn: '<S25>/Fcn'
-    PmsmSimUt_B.Fcn = rtb_Gain1_c[0] * rtb_a_tmp_tmp_0 + rtb_Gain1_c[1] *
-      rtb_a_tmp_tmp;
+    // Fcn: '<S26>/Fcn'
+    PmsmSimUt_B.Fcn = rtb_Gain1_c[0] * rtb_Add2_tmp_tmp_0 + rtb_Gain1_c[1] *
+      rtb_Add2_tmp_tmp;
 
-    // Fcn: '<S25>/Fcn1'
-    PmsmSimUt_B.Fcn1 = -rtb_Gain1_c[0] * rtb_a_tmp_tmp + rtb_Gain1_c[1] *
-      rtb_a_tmp_tmp_0;
+    // Fcn: '<S26>/Fcn1'
+    PmsmSimUt_B.Fcn1 = -rtb_Gain1_c[0] * rtb_Add2_tmp_tmp + rtb_Gain1_c[1] *
+      rtb_Add2_tmp_tmp_0;
   }
 
-  // End of Outputs for SubSystem: '<S20>/Subsystem1'
+  // End of Outputs for SubSystem: '<S21>/Subsystem1'
 
-  // Outputs for Enabled SubSystem: '<S20>/Subsystem - pi//2 delay' incorporates:
-  //   EnablePort: '<S24>/Enable'
+  // Outputs for Enabled SubSystem: '<S21>/Subsystem - pi//2 delay' incorporates:
+  //   EnablePort: '<S25>/Enable'
 
-  // RelationalOperator: '<S23>/Compare' incorporates:
-  //   Constant: '<S20>/Constant'
-  //   Constant: '<S23>/Constant'
+  // RelationalOperator: '<S24>/Compare' incorporates:
+  //   Constant: '<S21>/Constant'
+  //   Constant: '<S24>/Constant'
 
   if (PmsmSimUt_P.AlphaBetaZerotodq0_Alignment_e ==
       PmsmSimUt_P.CompareToConstant1_const_o) {
-    // Fcn: '<S24>/Fcn'
-    PmsmSimUt_B.Fcn_a = rtb_Gain1_c[0] * rtb_a_tmp_tmp - rtb_Gain1_c[1] *
-      rtb_a_tmp_tmp_0;
+    // Fcn: '<S25>/Fcn'
+    PmsmSimUt_B.Fcn_a = rtb_Gain1_c[0] * rtb_Add2_tmp_tmp - rtb_Gain1_c[1] *
+      rtb_Add2_tmp_tmp_0;
 
-    // Fcn: '<S24>/Fcn1'
-    PmsmSimUt_B.Fcn1_p = rtb_Gain1_c[0] * rtb_a_tmp_tmp_0 + rtb_Gain1_c[1] *
-      rtb_a_tmp_tmp;
+    // Fcn: '<S25>/Fcn1'
+    PmsmSimUt_B.Fcn1_p = rtb_Gain1_c[0] * rtb_Add2_tmp_tmp_0 + rtb_Gain1_c[1] *
+      rtb_Add2_tmp_tmp;
   }
 
-  // End of RelationalOperator: '<S23>/Compare'
-  // End of Outputs for SubSystem: '<S20>/Subsystem - pi//2 delay'
+  // End of RelationalOperator: '<S24>/Compare'
+  // End of Outputs for SubSystem: '<S21>/Subsystem - pi//2 delay'
 
-  // Switch: '<S20>/Switch'
+  // Switch: '<S21>/Switch'
   if (rtb_Compare != 0) {
     rtb_Switch_idx_0 = PmsmSimUt_B.Fcn;
     rtb_Switch_idx_1 = PmsmSimUt_B.Fcn1;
@@ -574,19 +592,19 @@ void PmsmSimUtModelClass::step()
     rtb_Switch_idx_1 = PmsmSimUt_B.Fcn1_p;
   }
 
-  // End of Switch: '<S20>/Switch'
+  // End of Switch: '<S21>/Switch'
 
   // Outport: '<Root>/Out' incorporates:
   //   BusCreator: '<Root>/Bus Creator'
-  //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator'
-  //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator1'
-  //   Gain: '<S17>/Gain2'
+  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator'
+  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator1'
+  //   Gain: '<S18>/Gain2'
   //   Inport: '<Root>/CtrlIn'
   //   SignalConversion generated from: '<Root>/Bus Creator'
 
   PmsmSimUt_Y.Out.WmRpm = PmsmSimUt_P.Gain2_Gain * rtb_Gain2_k;
-  PmsmSimUt_Y.Out.Uabc[0] = rtb_Fcn1;
-  PmsmSimUt_Y.Out.Uabc[1] = rtb_a;
+  PmsmSimUt_Y.Out.Uabc[0] = rtb_a;
+  PmsmSimUt_Y.Out.Uabc[1] = rtb_Fcn1;
   PmsmSimUt_Y.Out.Uabc[2] = rtb_Relay2;
   PmsmSimUt_Y.Out.Idq[0] = rtb_id;
   PmsmSimUt_Y.Out.Idq[1] = rtb_iq;
@@ -598,22 +616,22 @@ void PmsmSimUtModelClass::step()
   PmsmSimUt_Y.Out.IdRef = PmsmSimUt_U.CtrlIn.IdCmd;
   PmsmSimUt_Y.Out.IqRef = rtb_Switch_h;
 
-  // Gain: '<S16>/Gain2' incorporates:
-  //   Constant: '<S16>/Constant'
-  //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator'
-  //   Fcn: '<S16>/d(Flux_q)//dt'
+  // Gain: '<S17>/Gain1' incorporates:
+  //   Constant: '<S17>/Constant'
+  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator1'
+  //   Fcn: '<S17>/d(Flux_d)//dt'
 
-  rtb_Mod = ((rtb_Switch_idx_1 - PmsmSimUt_P.Params.R * rtb_iq) - rtb_Gain1_i *
-             PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c) *
+  rtb_Mod = ((rtb_Switch_idx_0 - PmsmSimUt_P.Params.R * rtb_id) + rtb_Gain1_i *
+             PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE) *
     PmsmSimUt_P.Params.Ts;
 
-  // Sum: '<S6>/Sum' incorporates:
+  // Sum: '<S7>/Sum' incorporates:
   //   Inport: '<Root>/CtrlIn'
-  //   Memory: '<S6>/Memory'
+  //   Memory: '<S7>/Memory'
 
   rtb_Relay2 = PmsmSimUt_U.CtrlIn.WmRpm - PmsmSimUt_DW.Memory_PreviousInput;
 
-  // DeadZone: '<S6>/Dead Zone'
+  // DeadZone: '<S7>/Dead Zone'
   if (rtb_Relay2 > PmsmSimUt_P.DeadZone_End) {
     rtb_Relay2 -= PmsmSimUt_P.DeadZone_End;
   } else if (rtb_Relay2 >= PmsmSimUt_P.DeadZone_Start) {
@@ -622,40 +640,40 @@ void PmsmSimUtModelClass::step()
     rtb_Relay2 -= PmsmSimUt_P.DeadZone_Start;
   }
 
-  // End of DeadZone: '<S6>/Dead Zone'
+  // End of DeadZone: '<S7>/Dead Zone'
 
-  // Relay: '<S6>/Relay1'
+  // Relay: '<S7>/Relay1'
   PmsmSimUt_DW.Relay1_Mode = ((rtb_Relay2 >= PmsmSimUt_P.Relay1_OnVal) ||
     ((!(rtb_Relay2 <= PmsmSimUt_P.Relay1_OffVal)) && PmsmSimUt_DW.Relay1_Mode));
 
-  // Relay: '<S6>/Relay2'
+  // Relay: '<S7>/Relay2'
   PmsmSimUt_DW.Relay2_Mode = ((rtb_Relay2 >= PmsmSimUt_P.Relay2_OnVal) ||
     ((!(rtb_Relay2 <= PmsmSimUt_P.Relay2_OffVal)) && PmsmSimUt_DW.Relay2_Mode));
 
-  // Update for DiscreteIntegrator: '<S17>/Discrete-Time Integrator' incorporates:
-  //   Gain: '<S17>/Gain'
+  // Update for DiscreteIntegrator: '<S18>/Discrete-Time Integrator' incorporates:
+  //   Gain: '<S18>/Gain'
 
   PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE += PmsmSimUt_P.Params.Ts *
     rtb_Gain1_i * PmsmSimUt_P.DiscreteTimeIntegrator_gainva_p;
 
-  // Update for DiscreteIntegrator: '<S16>/Discrete-Time Integrator' incorporates:
-  //   Constant: '<S16>/Constant'
-  //   DiscreteIntegrator: '<S16>/Discrete-Time Integrator1'
-  //   Fcn: '<S16>/d(Flux_d)//dt'
-  //   Gain: '<S16>/Gain1'
+  // Update for DiscreteIntegrator: '<S17>/Discrete-Time Integrator1' incorporates:
+  //   Constant: '<S17>/Constant'
+  //   DiscreteIntegrator: '<S17>/Discrete-Time Integrator'
+  //   Fcn: '<S17>/d(Flux_q)//dt'
+  //   Gain: '<S17>/Gain2'
 
-  PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c += ((rtb_Switch_idx_0 -
-    PmsmSimUt_P.Params.R * rtb_id) + rtb_Gain1_i *
-    PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE) * PmsmSimUt_P.Params.Ts *
-    PmsmSimUt_P.DiscreteTimeIntegrator_gainv_pq;
+  PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE += ((rtb_Switch_idx_1 -
+    PmsmSimUt_P.Params.R * rtb_iq) - rtb_Gain1_i *
+    PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c) * PmsmSimUt_P.Params.Ts *
+    PmsmSimUt_P.DiscreteTimeIntegrator1_gainv_b;
 
-  // Update for DiscreteIntegrator: '<S16>/Discrete-Time Integrator1'
-  PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE +=
-    PmsmSimUt_P.DiscreteTimeIntegrator1_gainv_b * rtb_Mod;
+  // Update for DiscreteIntegrator: '<S17>/Discrete-Time Integrator'
+  PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c +=
+    PmsmSimUt_P.DiscreteTimeIntegrator_gainv_pq * rtb_Mod;
 
-  // Update for DiscreteIntegrator: '<S15>/Discrete-Time Integrator' incorporates:
-  //   Gain: '<S15>/Gain'
-  //   Gain: '<S15>/Kp5'
+  // Update for DiscreteIntegrator: '<S16>/Discrete-Time Integrator' incorporates:
+  //   Gain: '<S16>/Gain'
+  //   Gain: '<S16>/Kp5'
 
   PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j += PmsmSimUt_P.Params.CKid *
     rtb_Add1 * PmsmSimUt_P.Params.Ts *
@@ -672,33 +690,33 @@ void PmsmSimUtModelClass::step()
     }
   }
 
-  // End of Update for DiscreteIntegrator: '<S15>/Discrete-Time Integrator'
+  // End of Update for DiscreteIntegrator: '<S16>/Discrete-Time Integrator'
 
-  // Relay: '<S6>/Relay1'
+  // Relay: '<S7>/Relay1'
   if (PmsmSimUt_DW.Relay1_Mode) {
     rtb_Switch_h = PmsmSimUt_P.Relay1_YOn;
   } else {
     rtb_Switch_h = PmsmSimUt_P.Relay1_YOff;
   }
 
-  // Relay: '<S6>/Relay2'
+  // Relay: '<S7>/Relay2'
   if (PmsmSimUt_DW.Relay2_Mode) {
-    rtb_id = PmsmSimUt_P.Relay2_YOn;
+    rtb_iq = PmsmSimUt_P.Relay2_YOn;
   } else {
-    rtb_id = PmsmSimUt_P.Relay2_YOff;
+    rtb_iq = PmsmSimUt_P.Relay2_YOff;
   }
 
-  // Update for Memory: '<S6>/Memory' incorporates:
-  //   Gain: '<S6>/Gain'
-  //   Sum: '<S6>/Add'
-  //   Sum: '<S6>/Sum1'
+  // Update for Memory: '<S7>/Memory' incorporates:
+  //   Gain: '<S7>/Gain'
+  //   Sum: '<S7>/Add'
+  //   Sum: '<S7>/Sum1'
 
-  PmsmSimUt_DW.Memory_PreviousInput += (rtb_Switch_h + rtb_id) *
+  PmsmSimUt_DW.Memory_PreviousInput += (rtb_Switch_h + rtb_iq) *
     PmsmSimUt_P.Params.Ts;
 
-  // Update for DiscreteIntegrator: '<S14>/Discrete-Time Integrator' incorporates:
-  //   Gain: '<S14>/Gain'
-  //   Gain: '<S14>/Kp5'
+  // Update for DiscreteIntegrator: '<S15>/Discrete-Time Integrator' incorporates:
+  //   Gain: '<S15>/Gain'
+  //   Gain: '<S15>/Kp5'
 
   PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g += PmsmSimUt_P.Params.CKiq *
     rtb_Add2 * PmsmSimUt_P.Params.Ts *
@@ -715,7 +733,7 @@ void PmsmSimUtModelClass::step()
     }
   }
 
-  // End of Update for DiscreteIntegrator: '<S14>/Discrete-Time Integrator'
+  // End of Update for DiscreteIntegrator: '<S15>/Discrete-Time Integrator'
 }
 
 // Model initialize function
@@ -726,101 +744,101 @@ void PmsmSimUtModelClass::initialize()
   // initialize non-finites
   rt_InitInfAndNaN(sizeof(real_T));
 
-  // InitializeConditions for DiscreteIntegrator: '<S17>/Discrete-Time Integrator' 
+  // InitializeConditions for DiscreteIntegrator: '<S18>/Discrete-Time Integrator' 
   PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE =
     PmsmSimUt_P.DiscreteTimeIntegrator_IC;
 
-  // InitializeConditions for DiscreteIntegrator: '<S16>/Discrete-Time Integrator' 
-  PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c = PmsmSimUt_P.Params.Flux;
-
-  // InitializeConditions for DiscreteIntegrator: '<S16>/Discrete-Time Integrator1' 
+  // InitializeConditions for DiscreteIntegrator: '<S17>/Discrete-Time Integrator1' 
   PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE =
     PmsmSimUt_P.DiscreteTimeIntegrator1_IC_a;
 
-  // InitializeConditions for DiscreteIntegrator: '<S15>/Discrete-Time Integrator' 
+  // InitializeConditions for DiscreteIntegrator: '<S17>/Discrete-Time Integrator' 
+  PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c = PmsmSimUt_P.Params.Flux;
+
+  // InitializeConditions for DiscreteIntegrator: '<S16>/Discrete-Time Integrator' 
   PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j = PmsmSimUt_P.Subsystem1_Init;
 
-  // InitializeConditions for Memory: '<S6>/Memory'
+  // InitializeConditions for Memory: '<S7>/Memory'
   PmsmSimUt_DW.Memory_PreviousInput = PmsmSimUt_P.Memory_InitialCondition;
 
-  // InitializeConditions for DiscreteIntegrator: '<S14>/Discrete-Time Integrator' 
+  // InitializeConditions for DiscreteIntegrator: '<S15>/Discrete-Time Integrator' 
   PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g = PmsmSimUt_P.Subsystem_Init_c;
 
+  // SystemInitialize for Enabled SubSystem: '<S18>/Subsystem'
+  // InitializeConditions for DiscreteIntegrator: '<S19>/Discrete-Time Integrator1' 
+  PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTAT_d =
+    PmsmSimUt_P.DiscreteTimeIntegrator1_IC;
+
+  // SystemInitialize for DiscreteIntegrator: '<S19>/Discrete-Time Integrator1' incorporates:
+  //   Outport: '<S19>/Wm'
+
+  PmsmSimUt_B.DiscreteTimeIntegrator1 = PmsmSimUt_P.Wm_Y0;
+
+  // End of SystemInitialize for SubSystem: '<S18>/Subsystem'
+
   // SystemInitialize for Enabled SubSystem: '<S1>/Subsystem1'
-  // SystemInitialize for Fcn: '<S13>/Fcn' incorporates:
-  //   Outport: '<S13>/dq'
+  // SystemInitialize for Fcn: '<S14>/Fcn' incorporates:
+  //   Outport: '<S14>/dq'
 
   PmsmSimUt_B.Fcn_g = PmsmSimUt_P.dq_Y0_e[0];
 
-  // SystemInitialize for Fcn: '<S13>/Fcn1' incorporates:
-  //   Outport: '<S13>/dq'
+  // SystemInitialize for Fcn: '<S14>/Fcn1' incorporates:
+  //   Outport: '<S14>/dq'
 
   PmsmSimUt_B.Fcn1_e = PmsmSimUt_P.dq_Y0_e[1];
 
   // End of SystemInitialize for SubSystem: '<S1>/Subsystem1'
 
   // SystemInitialize for Enabled SubSystem: '<S1>/Subsystem - pi//2 delay'
-  // SystemInitialize for Fcn: '<S12>/Fcn' incorporates:
-  //   Outport: '<S12>/dq'
+  // SystemInitialize for Fcn: '<S13>/Fcn' incorporates:
+  //   Outport: '<S13>/dq'
 
   PmsmSimUt_B.Fcn_b = PmsmSimUt_P.dq_Y0[0];
 
-  // SystemInitialize for Fcn: '<S12>/Fcn1' incorporates:
-  //   Outport: '<S12>/dq'
+  // SystemInitialize for Fcn: '<S13>/Fcn1' incorporates:
+  //   Outport: '<S13>/dq'
 
   PmsmSimUt_B.Fcn1_n = PmsmSimUt_P.dq_Y0[1];
 
   // End of SystemInitialize for SubSystem: '<S1>/Subsystem - pi//2 delay'
 
-  // SystemInitialize for Enabled SubSystem: '<S17>/Subsystem'
-  // InitializeConditions for DiscreteIntegrator: '<S18>/Discrete-Time Integrator1' 
-  PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTAT_d =
-    PmsmSimUt_P.DiscreteTimeIntegrator1_IC;
-
-  // SystemInitialize for DiscreteIntegrator: '<S18>/Discrete-Time Integrator1' incorporates:
-  //   Outport: '<S18>/Wm'
-
-  PmsmSimUt_B.DiscreteTimeIntegrator1 = PmsmSimUt_P.Wm_Y0;
-
-  // End of SystemInitialize for SubSystem: '<S17>/Subsystem'
-
   // SystemInitialize for Enabled SubSystem: '<Root>/Subsystem'
-  // InitializeConditions for DiscreteIntegrator: '<S19>/Discrete-Time Integrator' 
+  // InitializeConditions for DiscreteIntegrator: '<S20>/Discrete-Time Integrator' 
   PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n = PmsmSimUt_P.Subsystem_Init;
 
-  // SystemInitialize for Sum: '<S19>/Sum6' incorporates:
-  //   Outport: '<S4>/Iq_ref'
-  //   Saturate: '<S19>/Saturation2'
+  // SystemInitialize for Sum: '<S20>/Sum6' incorporates:
+  //   Outport: '<S5>/Iq_ref'
+  //   Saturate: '<S20>/Saturation2'
 
   PmsmSimUt_B.Iq_ref = PmsmSimUt_P.Iq_ref_Y0;
 
   // End of SystemInitialize for SubSystem: '<Root>/Subsystem'
 
-  // SystemInitialize for Enabled SubSystem: '<S20>/Subsystem1'
-  // SystemInitialize for Fcn: '<S25>/Fcn' incorporates:
-  //   Outport: '<S25>/dq'
+  // SystemInitialize for Enabled SubSystem: '<S21>/Subsystem1'
+  // SystemInitialize for Fcn: '<S26>/Fcn' incorporates:
+  //   Outport: '<S26>/dq'
 
   PmsmSimUt_B.Fcn = PmsmSimUt_P.dq_Y0_f[0];
 
-  // SystemInitialize for Fcn: '<S25>/Fcn1' incorporates:
-  //   Outport: '<S25>/dq'
+  // SystemInitialize for Fcn: '<S26>/Fcn1' incorporates:
+  //   Outport: '<S26>/dq'
 
   PmsmSimUt_B.Fcn1 = PmsmSimUt_P.dq_Y0_f[1];
 
-  // End of SystemInitialize for SubSystem: '<S20>/Subsystem1'
+  // End of SystemInitialize for SubSystem: '<S21>/Subsystem1'
 
-  // SystemInitialize for Enabled SubSystem: '<S20>/Subsystem - pi//2 delay'
-  // SystemInitialize for Fcn: '<S24>/Fcn' incorporates:
-  //   Outport: '<S24>/dq'
+  // SystemInitialize for Enabled SubSystem: '<S21>/Subsystem - pi//2 delay'
+  // SystemInitialize for Fcn: '<S25>/Fcn' incorporates:
+  //   Outport: '<S25>/dq'
 
   PmsmSimUt_B.Fcn_a = PmsmSimUt_P.dq_Y0_l[0];
 
-  // SystemInitialize for Fcn: '<S24>/Fcn1' incorporates:
-  //   Outport: '<S24>/dq'
+  // SystemInitialize for Fcn: '<S25>/Fcn1' incorporates:
+  //   Outport: '<S25>/dq'
 
   PmsmSimUt_B.Fcn1_p = PmsmSimUt_P.dq_Y0_l[1];
 
-  // End of SystemInitialize for SubSystem: '<S20>/Subsystem - pi//2 delay'
+  // End of SystemInitialize for SubSystem: '<S21>/Subsystem - pi//2 delay'
 }
 
 // Model terminate function

+ 145 - 135
unit_test/motor_sim/PmsmSimUt.h

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)
@@ -36,31 +36,31 @@ class PmsmSimUtModelClass {
  public:
   // Block signals (default storage)
   typedef struct {
-    real_T Fcn;                        // '<S25>/Fcn'
-    real_T Fcn1;                       // '<S25>/Fcn1'
-    real_T Fcn_a;                      // '<S24>/Fcn'
-    real_T Fcn1_p;                     // '<S24>/Fcn1'
-    real_T DiscreteTimeIntegrator;     // '<S19>/Discrete-Time Integrator'
-    real_T Iq_ref;                     // '<S19>/Saturation2'
-    real_T DiscreteTimeIntegrator1;    // '<S18>/Discrete-Time Integrator1'
-    real_T Fcn_g;                      // '<S13>/Fcn'
-    real_T Fcn1_e;                     // '<S13>/Fcn1'
-    real_T Fcn_b;                      // '<S12>/Fcn'
-    real_T Fcn1_n;                     // '<S12>/Fcn1'
+    real_T Fcn;                        // '<S26>/Fcn'
+    real_T Fcn1;                       // '<S26>/Fcn1'
+    real_T Fcn_a;                      // '<S25>/Fcn'
+    real_T Fcn1_p;                     // '<S25>/Fcn1'
+    real_T DiscreteTimeIntegrator;     // '<S20>/Discrete-Time Integrator'
+    real_T Iq_ref;                     // '<S20>/Saturation2'
+    real_T DiscreteTimeIntegrator1;    // '<S19>/Discrete-Time Integrator1'
+    real_T Fcn_g;                      // '<S14>/Fcn'
+    real_T Fcn1_e;                     // '<S14>/Fcn1'
+    real_T Fcn_b;                      // '<S13>/Fcn'
+    real_T Fcn1_n;                     // '<S13>/Fcn1'
   } B_PmsmSimUt_T;
 
   // Block states (default storage) for system '<Root>'
   typedef struct {
-    real_T DiscreteTimeIntegrator_DSTATE;// '<S17>/Discrete-Time Integrator'
-    real_T DiscreteTimeIntegrator_DSTATE_c;// '<S16>/Discrete-Time Integrator'
-    real_T DiscreteTimeIntegrator1_DSTATE;// '<S16>/Discrete-Time Integrator1'
-    real_T DiscreteTimeIntegrator_DSTATE_j;// '<S15>/Discrete-Time Integrator'
-    real_T DiscreteTimeIntegrator_DSTATE_g;// '<S14>/Discrete-Time Integrator'
-    real_T DiscreteTimeIntegrator_DSTATE_n;// '<S19>/Discrete-Time Integrator'
-    real_T DiscreteTimeIntegrator1_DSTAT_d;// '<S18>/Discrete-Time Integrator1'
-    real_T Memory_PreviousInput;       // '<S6>/Memory'
-    boolean_T Relay1_Mode;             // '<S6>/Relay1'
-    boolean_T Relay2_Mode;             // '<S6>/Relay2'
+    real_T DiscreteTimeIntegrator_DSTATE;// '<S18>/Discrete-Time Integrator'
+    real_T DiscreteTimeIntegrator1_DSTATE;// '<S17>/Discrete-Time Integrator1'
+    real_T DiscreteTimeIntegrator_DSTATE_c;// '<S17>/Discrete-Time Integrator'
+    real_T DiscreteTimeIntegrator_DSTATE_j;// '<S16>/Discrete-Time Integrator'
+    real_T DiscreteTimeIntegrator_DSTATE_g;// '<S15>/Discrete-Time Integrator'
+    real_T DiscreteTimeIntegrator_DSTATE_n;// '<S20>/Discrete-Time Integrator'
+    real_T DiscreteTimeIntegrator1_DSTAT_d;// '<S19>/Discrete-Time Integrator1'
+    real_T Memory_PreviousInput;       // '<S7>/Memory'
+    boolean_T Relay1_Mode;             // '<S7>/Relay1'
+    boolean_T Relay2_Mode;             // '<S7>/Relay2'
     boolean_T Subsystem_MODE;          // '<Root>/Subsystem'
   } DW_PmsmSimUt_T;
 
@@ -85,29 +85,33 @@ class PmsmSimUtModelClass {
                                             //    '<Root>/Constant3'
                                             //    '<Root>/Constant4'
                                             //    '<Root>/Gain1'
-                                            //    '<S6>/Gain'
-                                            //    '<S14>/Gain'
-                                            //    '<S14>/Kp4'
-                                            //    '<S14>/Kp5'
+                                            //    '<S2>/Constant4'
+                                            //    '<S6>/Constant1'
+                                            //    '<S6>/Constant2'
+                                            //    '<S6>/Constant3'
+                                            //    '<S7>/Gain'
                                             //    '<S15>/Gain'
                                             //    '<S15>/Kp4'
                                             //    '<S15>/Kp5'
-                                            //    '<S16>/Constant'
-                                            //    '<S16>/Constant1'
-                                            //    '<S16>/Constant2'
-                                            //    '<S16>/Constant3'
-                                            //    '<S16>/Discrete-Time Integrator'
                                             //    '<S16>/Gain'
-                                            //    '<S16>/Gain1'
-                                            //    '<S16>/Gain2'
+                                            //    '<S16>/Kp4'
+                                            //    '<S16>/Kp5'
+                                            //    '<S17>/Constant'
+                                            //    '<S17>/Constant1'
+                                            //    '<S17>/Constant2'
+                                            //    '<S17>/Constant3'
+                                            //    '<S17>/Discrete-Time Integrator'
                                             //    '<S17>/Gain'
                                             //    '<S17>/Gain1'
-                                            //    '<S19>/Gain'
-                                            //    '<S19>/Kp4'
-                                            //    '<S19>/Kp5'
-                                            //    '<S18>/Constant1'
+                                            //    '<S17>/Gain2'
                                             //    '<S18>/Gain'
                                             //    '<S18>/Gain1'
+                                            //    '<S20>/Gain'
+                                            //    '<S20>/Kp4'
+                                            //    '<S20>/Kp5'
+                                            //    '<S19>/Constant1'
+                                            //    '<S19>/Gain'
+                                            //    '<S19>/Gain1'
 
     real_T AlphaBetaZerotodq0_Alignment;
                                  // Mask Parameter: AlphaBetaZerotodq0_Alignment
@@ -115,68 +119,68 @@ class PmsmSimUtModelClass {
 
     real_T AlphaBetaZerotodq0_Alignment_e;
                                // Mask Parameter: AlphaBetaZerotodq0_Alignment_e
-                                  //  Referenced by: '<S20>/Constant'
+                                  //  Referenced by: '<S21>/Constant'
 
     real_T Subsystem_Init;             // Mask Parameter: Subsystem_Init
-                                          //  Referenced by: '<S19>/Discrete-Time Integrator'
+                                          //  Referenced by: '<S20>/Discrete-Time Integrator'
 
     real_T Subsystem1_Init;            // Mask Parameter: Subsystem1_Init
-                                          //  Referenced by: '<S15>/Discrete-Time Integrator'
+                                          //  Referenced by: '<S16>/Discrete-Time Integrator'
 
     real_T Subsystem_Init_c;           // Mask Parameter: Subsystem_Init_c
-                                          //  Referenced by: '<S14>/Discrete-Time Integrator'
+                                          //  Referenced by: '<S15>/Discrete-Time Integrator'
 
     real_T CompareToConstant_const;   // Mask Parameter: CompareToConstant_const
-                                         //  Referenced by: '<S10>/Constant'
+                                         //  Referenced by: '<S11>/Constant'
 
     real_T CompareToConstant1_const; // Mask Parameter: CompareToConstant1_const
-                                        //  Referenced by: '<S11>/Constant'
+                                        //  Referenced by: '<S12>/Constant'
 
     real_T CompareToConstant_const_a;
                                     // Mask Parameter: CompareToConstant_const_a
-                                       //  Referenced by: '<S22>/Constant'
+                                       //  Referenced by: '<S23>/Constant'
 
     real_T CompareToConstant1_const_o;
                                    // Mask Parameter: CompareToConstant1_const_o
-                                      //  Referenced by: '<S23>/Constant'
+                                      //  Referenced by: '<S24>/Constant'
 
     real_T dq_Y0[2];                   // Expression: [0,0]
-                                          //  Referenced by: '<S12>/dq'
+                                          //  Referenced by: '<S13>/dq'
 
     real_T dq_Y0_e[2];                 // Expression: [0,0]
-                                          //  Referenced by: '<S13>/dq'
+                                          //  Referenced by: '<S14>/dq'
 
     real_T Wm_Y0;                      // Computed Parameter: Wm_Y0
-                                          //  Referenced by: '<S18>/Wm'
+                                          //  Referenced by: '<S19>/Wm'
 
     real_T DiscreteTimeIntegrator1_gainval;
                           // Computed Parameter: DiscreteTimeIntegrator1_gainval
-                             //  Referenced by: '<S18>/Discrete-Time Integrator1'
+                             //  Referenced by: '<S19>/Discrete-Time Integrator1'
 
     real_T DiscreteTimeIntegrator1_IC; // Expression: 0
-                                          //  Referenced by: '<S18>/Discrete-Time Integrator1'
+                                          //  Referenced by: '<S19>/Discrete-Time Integrator1'
 
     real_T Gain3_Gain;                 // Expression: pi/30
-                                          //  Referenced by: '<S17>/Gain3'
+                                          //  Referenced by: '<S18>/Gain3'
 
     real_T Iq_ref_Y0;                  // Computed Parameter: Iq_ref_Y0
-                                          //  Referenced by: '<S4>/Iq_ref'
+                                          //  Referenced by: '<S5>/Iq_ref'
 
     real_T DiscreteTimeIntegrator_gainval;
                            // Computed Parameter: DiscreteTimeIntegrator_gainval
-                              //  Referenced by: '<S19>/Discrete-Time Integrator'
+                              //  Referenced by: '<S20>/Discrete-Time Integrator'
 
     real_T DiscreteTimeIntegrator_UpperSat;// Expression: Limits(1)
-                                              //  Referenced by: '<S19>/Discrete-Time Integrator'
+                                              //  Referenced by: '<S20>/Discrete-Time Integrator'
 
     real_T DiscreteTimeIntegrator_LowerSat;// Expression: Limits(2)
-                                              //  Referenced by: '<S19>/Discrete-Time Integrator'
+                                              //  Referenced by: '<S20>/Discrete-Time Integrator'
 
     real_T Saturation2_UpperSat;       // Expression: Limits(1)
-                                          //  Referenced by: '<S19>/Saturation2'
+                                          //  Referenced by: '<S20>/Saturation2'
 
     real_T Saturation2_LowerSat;       // Expression: Limits(2)
-                                          //  Referenced by: '<S19>/Saturation2'
+                                          //  Referenced by: '<S20>/Saturation2'
 
     real_T Constant5_Value;            // Expression: 0
                                           //  Referenced by: '<Root>/Constant5'
@@ -185,83 +189,86 @@ class PmsmSimUtModelClass {
                                           //  Referenced by: '<Root>/Constant6'
 
     real_T Saturation2_UpperSat_o;     // Expression: Limits(1)
-                                          //  Referenced by: '<S15>/Saturation2'
+                                          //  Referenced by: '<S16>/Saturation2'
 
     real_T Saturation2_LowerSat_o;     // Expression: Limits(2)
-                                          //  Referenced by: '<S15>/Saturation2'
+                                          //  Referenced by: '<S16>/Saturation2'
 
     real_T Saturation2_UpperSat_b;     // Expression: Limits(1)
-                                          //  Referenced by: '<S14>/Saturation2'
+                                          //  Referenced by: '<S15>/Saturation2'
 
     real_T Saturation2_LowerSat_j;     // Expression: Limits(2)
-                                          //  Referenced by: '<S14>/Saturation2'
+                                          //  Referenced by: '<S15>/Saturation2'
 
     real_T dq_Y0_l[2];                 // Expression: [0,0]
-                                          //  Referenced by: '<S24>/dq'
+                                          //  Referenced by: '<S25>/dq'
 
     real_T dq_Y0_f[2];                 // Expression: [0,0]
-                                          //  Referenced by: '<S25>/dq'
+                                          //  Referenced by: '<S26>/dq'
 
     real_T DiscreteTimeIntegrator_gainva_p;
                           // Computed Parameter: DiscreteTimeIntegrator_gainva_p
-                             //  Referenced by: '<S17>/Discrete-Time Integrator'
+                             //  Referenced by: '<S18>/Discrete-Time Integrator'
 
     real_T DiscreteTimeIntegrator_IC;  // Expression: 0
-                                          //  Referenced by: '<S17>/Discrete-Time Integrator'
+                                          //  Referenced by: '<S18>/Discrete-Time Integrator'
 
     real_T Constant_Value;             // Expression: 2*pi
-                                          //  Referenced by: '<S17>/Constant'
-
-    real_T DiscreteTimeIntegrator_gainv_pq;
-                          // Computed Parameter: DiscreteTimeIntegrator_gainv_pq
-                             //  Referenced by: '<S16>/Discrete-Time Integrator'
+                                          //  Referenced by: '<S18>/Constant'
 
     real_T DiscreteTimeIntegrator1_gainv_b;
                           // Computed Parameter: DiscreteTimeIntegrator1_gainv_b
-                             //  Referenced by: '<S16>/Discrete-Time Integrator1'
+                             //  Referenced by: '<S17>/Discrete-Time Integrator1'
 
     real_T DiscreteTimeIntegrator1_IC_a;// Expression: 0
-                                           //  Referenced by: '<S16>/Discrete-Time Integrator1'
+                                           //  Referenced by: '<S17>/Discrete-Time Integrator1'
+
+    real_T DiscreteTimeIntegrator_gainv_pq;
+                          // Computed Parameter: DiscreteTimeIntegrator_gainv_pq
+                             //  Referenced by: '<S17>/Discrete-Time Integrator'
 
     real_T Constant_Value_e;           // Expression: 0
-                                          //  Referenced by: '<S9>/Constant'
+                                          //  Referenced by: '<S10>/Constant'
 
     real_T K1_Gain;                    // Expression: K1
-                                          //  Referenced by: '<S29>/K1'
+                                          //  Referenced by: '<S30>/K1'
 
     real_T K2_Gain;                    // Expression: K2
-                                          //  Referenced by: '<S29>/K2'
+                                          //  Referenced by: '<S30>/K2'
 
     real_T Switch2_Threshold;          // Expression: 0
                                           //  Referenced by: '<Root>/Switch2'
 
-    real_T Switch5_Threshold;          // Expression: 0
-                                          //  Referenced by: '<Root>/Switch5'
-
     real_T Switch_Threshold;           // Expression: 0
-                                          //  Referenced by: '<S17>/Switch'
+                                          //  Referenced by: '<S18>/Switch'
 
     real_T Switch3_Threshold;          // Expression: 0
                                           //  Referenced by: '<Root>/Switch3'
 
+    real_T Gain1_Gain;                 // Expression: -1
+                                          //  Referenced by: '<S6>/Gain1'
+
+    real_T Switch5_Threshold;          // Expression: 0
+                                          //  Referenced by: '<Root>/Switch5'
+
     real_T Switch4_Threshold;          // Expression: 0
                                           //  Referenced by: '<Root>/Switch4'
 
     real_T DiscreteTimeIntegrator_gainva_b;
                           // Computed Parameter: DiscreteTimeIntegrator_gainva_b
-                             //  Referenced by: '<S15>/Discrete-Time Integrator'
+                             //  Referenced by: '<S16>/Discrete-Time Integrator'
 
     real_T DiscreteTimeIntegrator_UpperS_b;// Expression: Limits(1)
-                                              //  Referenced by: '<S15>/Discrete-Time Integrator'
+                                              //  Referenced by: '<S16>/Discrete-Time Integrator'
 
     real_T DiscreteTimeIntegrator_LowerS_l;// Expression: Limits(2)
-                                              //  Referenced by: '<S15>/Discrete-Time Integrator'
+                                              //  Referenced by: '<S16>/Discrete-Time Integrator'
 
     real_T Switch1_Threshold;          // Expression: 0
                                           //  Referenced by: '<Root>/Switch1'
 
     real_T Memory_InitialCondition;    // Expression: 0
-                                          //  Referenced by: '<S6>/Memory'
+                                          //  Referenced by: '<S7>/Memory'
 
     real_T Saturation2_UpperSat_p;     // Expression: 10000
                                           //  Referenced by: '<Root>/Saturation2'
@@ -271,65 +278,65 @@ class PmsmSimUtModelClass {
 
     real_T DiscreteTimeIntegrator_gainva_c;
                           // Computed Parameter: DiscreteTimeIntegrator_gainva_c
-                             //  Referenced by: '<S14>/Discrete-Time Integrator'
+                             //  Referenced by: '<S15>/Discrete-Time Integrator'
 
     real_T DiscreteTimeIntegrator_UpperS_k;// Expression: Limits(1)
-                                              //  Referenced by: '<S14>/Discrete-Time Integrator'
+                                              //  Referenced by: '<S15>/Discrete-Time Integrator'
 
     real_T DiscreteTimeIntegrator_LowerS_a;// Expression: Limits(2)
-                                              //  Referenced by: '<S14>/Discrete-Time Integrator'
+                                              //  Referenced by: '<S15>/Discrete-Time Integrator'
 
     real_T Switch6_Threshold;          // Expression: 0
                                           //  Referenced by: '<Root>/Switch6'
 
     real_T Constant_Value_p;           // Expression: 0
-                                          //  Referenced by: '<S8>/Constant'
+                                          //  Referenced by: '<S9>/Constant'
 
     real_T K1_Gain_j;                  // Expression: K1
-                                          //  Referenced by: '<S27>/K1'
+                                          //  Referenced by: '<S28>/K1'
 
     real_T K2_Gain_b;                  // Expression: K2
-                                          //  Referenced by: '<S27>/K2'
+                                          //  Referenced by: '<S28>/K2'
 
     real_T Gain3_Gain_j[9];
     // Expression: [ 1   -1/2   -1/2; 0   sqrt(3)/2   -sqrt(3)/2; 1/2  1/2  1/2 ]
-       //  Referenced by: '<S21>/Gain3'
+       //  Referenced by: '<S22>/Gain3'
 
-    real_T Gain1_Gain;                 // Expression: 2/3
-                                          //  Referenced by: '<S21>/Gain1'
+    real_T Gain1_Gain_e;               // Expression: 2/3
+                                          //  Referenced by: '<S22>/Gain1'
 
     real_T Gain2_Gain;                 // Expression: 30/pi
-                                          //  Referenced by: '<S17>/Gain2'
+                                          //  Referenced by: '<S18>/Gain2'
 
     real_T DeadZone_Start;             // Expression: -0.01
-                                          //  Referenced by: '<S6>/Dead Zone'
+                                          //  Referenced by: '<S7>/Dead Zone'
 
     real_T DeadZone_End;               // Expression: 0.01
-                                          //  Referenced by: '<S6>/Dead Zone'
+                                          //  Referenced by: '<S7>/Dead Zone'
 
     real_T Relay1_OnVal;               // Expression: 0.1
-                                          //  Referenced by: '<S6>/Relay1'
+                                          //  Referenced by: '<S7>/Relay1'
 
     real_T Relay1_OffVal;              // Expression: 0
-                                          //  Referenced by: '<S6>/Relay1'
+                                          //  Referenced by: '<S7>/Relay1'
 
     real_T Relay1_YOn;                 // Expression: 1000
-                                          //  Referenced by: '<S6>/Relay1'
+                                          //  Referenced by: '<S7>/Relay1'
 
     real_T Relay1_YOff;                // Expression: 0
-                                          //  Referenced by: '<S6>/Relay1'
+                                          //  Referenced by: '<S7>/Relay1'
 
     real_T Relay2_OnVal;               // Expression: 0
-                                          //  Referenced by: '<S6>/Relay2'
+                                          //  Referenced by: '<S7>/Relay2'
 
     real_T Relay2_OffVal;              // Expression: -0.1
-                                          //  Referenced by: '<S6>/Relay2'
+                                          //  Referenced by: '<S7>/Relay2'
 
     real_T Relay2_YOn;                 // Expression: 0
-                                          //  Referenced by: '<S6>/Relay2'
+                                          //  Referenced by: '<S7>/Relay2'
 
     real_T Relay2_YOff;                // Expression: -1000
-                                          //  Referenced by: '<S6>/Relay2'
+                                          //  Referenced by: '<S7>/Relay2'
 
     uint8_T ManualSwitch1_CurrentSetting;
                              // Computed Parameter: ManualSwitch1_CurrentSetting
@@ -354,6 +361,9 @@ class PmsmSimUtModelClass {
   // model initialize function
   void initialize();
 
+  // model event function
+  void PmsmSimUt_reset();
+
   // model step function
   void step();
 
@@ -413,15 +423,14 @@ class PmsmSimUtModelClass {
 //  These blocks were eliminated from the model due to optimizations:
 //
 //  Block '<Root>/Constant' : Unused code path elimination
-//  Block '<S16>/Scope' : Unused code path elimination
-//  Block '<S16>/Scope1' : Unused code path elimination
 //  Block '<S17>/Scope' : Unused code path elimination
+//  Block '<S17>/Scope1' : Unused code path elimination
+//  Block '<S18>/Scope' : Unused code path elimination
 //  Block '<Root>/Scope' : Unused code path elimination
 //  Block '<Root>/Scope1' : Unused code path elimination
 //  Block '<Root>/Scope3' : Unused code path elimination
 //  Block '<Root>/Scope4' : Unused code path elimination
 //  Block '<Root>/Scope5' : Unused code path elimination
-//  Block '<S5>/Scope' : Unused code path elimination
 
 
 //-
@@ -440,34 +449,35 @@ class PmsmSimUtModelClass {
 //
 //  '<Root>' : 'PmsmSimUt'
 //  '<S1>'   : 'PmsmSimUt/Alpha-Beta-Zero to dq0'
-//  '<S2>'   : 'PmsmSimUt/PI Controller'
-//  '<S3>'   : 'PmsmSimUt/PM_Motor in dq frame '
-//  '<S4>'   : 'PmsmSimUt/Subsystem'
-//  '<S5>'   : 'PmsmSimUt/Subsystem1'
-//  '<S6>'   : 'PmsmSimUt/Subsystem2'
-//  '<S7>'   : 'PmsmSimUt/abc to dq0'
-//  '<S8>'   : 'PmsmSimUt/dq to abc'
-//  '<S9>'   : 'PmsmSimUt/dq to abc1'
-//  '<S10>'  : 'PmsmSimUt/Alpha-Beta-Zero to dq0/Compare To Constant'
-//  '<S11>'  : 'PmsmSimUt/Alpha-Beta-Zero to dq0/Compare To Constant1'
-//  '<S12>'  : 'PmsmSimUt/Alpha-Beta-Zero to dq0/Subsystem - pi//2 delay'
-//  '<S13>'  : 'PmsmSimUt/Alpha-Beta-Zero to dq0/Subsystem1'
-//  '<S14>'  : 'PmsmSimUt/PI Controller/Subsystem'
-//  '<S15>'  : 'PmsmSimUt/PI Controller/Subsystem1'
-//  '<S16>'  : 'PmsmSimUt/PM_Motor in dq frame /Electrical Modelling'
-//  '<S17>'  : 'PmsmSimUt/PM_Motor in dq frame /Mechanical Modelling'
-//  '<S18>'  : 'PmsmSimUt/PM_Motor in dq frame /Mechanical Modelling/Subsystem'
-//  '<S19>'  : 'PmsmSimUt/Subsystem/Subsystem'
-//  '<S20>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0'
-//  '<S21>'  : 'PmsmSimUt/abc to dq0/abc to Alpha-Beta-Zero'
-//  '<S22>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0/Compare To Constant'
-//  '<S23>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0/Compare To Constant1'
-//  '<S24>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0/Subsystem - pi//2 delay'
-//  '<S25>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0/Subsystem1'
-//  '<S26>'  : 'PmsmSimUt/dq to abc/An_Park'
-//  '<S27>'  : 'PmsmSimUt/dq to abc/Inverse Clarke Transform2'
-//  '<S28>'  : 'PmsmSimUt/dq to abc1/An_Park'
-//  '<S29>'  : 'PmsmSimUt/dq to abc1/Inverse Clarke Transform2'
+//  '<S2>'   : 'PmsmSimUt/Initialize Function'
+//  '<S3>'   : 'PmsmSimUt/PI Controller'
+//  '<S4>'   : 'PmsmSimUt/PM_Motor in dq frame '
+//  '<S5>'   : 'PmsmSimUt/Subsystem'
+//  '<S6>'   : 'PmsmSimUt/Subsystem1'
+//  '<S7>'   : 'PmsmSimUt/Subsystem2'
+//  '<S8>'   : 'PmsmSimUt/abc to dq0'
+//  '<S9>'   : 'PmsmSimUt/dq to abc'
+//  '<S10>'  : 'PmsmSimUt/dq to abc1'
+//  '<S11>'  : 'PmsmSimUt/Alpha-Beta-Zero to dq0/Compare To Constant'
+//  '<S12>'  : 'PmsmSimUt/Alpha-Beta-Zero to dq0/Compare To Constant1'
+//  '<S13>'  : 'PmsmSimUt/Alpha-Beta-Zero to dq0/Subsystem - pi//2 delay'
+//  '<S14>'  : 'PmsmSimUt/Alpha-Beta-Zero to dq0/Subsystem1'
+//  '<S15>'  : 'PmsmSimUt/PI Controller/Subsystem'
+//  '<S16>'  : 'PmsmSimUt/PI Controller/Subsystem1'
+//  '<S17>'  : 'PmsmSimUt/PM_Motor in dq frame /Electrical Modelling'
+//  '<S18>'  : 'PmsmSimUt/PM_Motor in dq frame /Mechanical Modelling'
+//  '<S19>'  : 'PmsmSimUt/PM_Motor in dq frame /Mechanical Modelling/Subsystem'
+//  '<S20>'  : 'PmsmSimUt/Subsystem/Subsystem'
+//  '<S21>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0'
+//  '<S22>'  : 'PmsmSimUt/abc to dq0/abc to Alpha-Beta-Zero'
+//  '<S23>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0/Compare To Constant'
+//  '<S24>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0/Compare To Constant1'
+//  '<S25>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0/Subsystem - pi//2 delay'
+//  '<S26>'  : 'PmsmSimUt/abc to dq0/Alpha-Beta-Zero to dq0/Subsystem1'
+//  '<S27>'  : 'PmsmSimUt/dq to abc/An_Park'
+//  '<S28>'  : 'PmsmSimUt/dq to abc/Inverse Clarke Transform2'
+//  '<S29>'  : 'PmsmSimUt/dq to abc1/An_Park'
+//  '<S30>'  : 'PmsmSimUt/dq to abc1/Inverse Clarke Transform2'
 
 #endif                                 // RTW_HEADER_PmsmSimUt_h_
 

+ 91 - 82
unit_test/motor_sim/PmsmSimUt_data.cpp

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)
@@ -24,29 +24,33 @@ PmsmSimUtModelClass::P_PmsmSimUt_T PmsmSimUtModelClass::PmsmSimUt_P = {
   //    '<Root>/Constant3'
   //    '<Root>/Constant4'
   //    '<Root>/Gain1'
-  //    '<S6>/Gain'
-  //    '<S14>/Gain'
-  //    '<S14>/Kp4'
-  //    '<S14>/Kp5'
+  //    '<S2>/Constant4'
+  //    '<S6>/Constant1'
+  //    '<S6>/Constant2'
+  //    '<S6>/Constant3'
+  //    '<S7>/Gain'
   //    '<S15>/Gain'
   //    '<S15>/Kp4'
   //    '<S15>/Kp5'
-  //    '<S16>/Constant'
-  //    '<S16>/Constant1'
-  //    '<S16>/Constant2'
-  //    '<S16>/Constant3'
-  //    '<S16>/Discrete-Time Integrator'
   //    '<S16>/Gain'
-  //    '<S16>/Gain1'
-  //    '<S16>/Gain2'
+  //    '<S16>/Kp4'
+  //    '<S16>/Kp5'
+  //    '<S17>/Constant'
+  //    '<S17>/Constant1'
+  //    '<S17>/Constant2'
+  //    '<S17>/Constant3'
+  //    '<S17>/Discrete-Time Integrator'
   //    '<S17>/Gain'
   //    '<S17>/Gain1'
-  //    '<S19>/Gain'
-  //    '<S19>/Kp4'
-  //    '<S19>/Kp5'
-  //    '<S18>/Constant1'
+  //    '<S17>/Gain2'
   //    '<S18>/Gain'
   //    '<S18>/Gain1'
+  //    '<S20>/Gain'
+  //    '<S20>/Kp4'
+  //    '<S20>/Kp5'
+  //    '<S19>/Constant1'
+  //    '<S19>/Gain'
+  //    '<S19>/Gain1'
 
   {
     0.0001,
@@ -74,102 +78,102 @@ PmsmSimUtModelClass::P_PmsmSimUt_T PmsmSimUtModelClass::PmsmSimUt_P = {
   1.0,
 
   // Mask Parameter: AlphaBetaZerotodq0_Alignment_e
-  //  Referenced by: '<S20>/Constant'
+  //  Referenced by: '<S21>/Constant'
 
   1.0,
 
   // Mask Parameter: Subsystem_Init
-  //  Referenced by: '<S19>/Discrete-Time Integrator'
+  //  Referenced by: '<S20>/Discrete-Time Integrator'
 
   0.0,
 
   // Mask Parameter: Subsystem1_Init
-  //  Referenced by: '<S15>/Discrete-Time Integrator'
+  //  Referenced by: '<S16>/Discrete-Time Integrator'
 
   0.0,
 
   // Mask Parameter: Subsystem_Init_c
-  //  Referenced by: '<S14>/Discrete-Time Integrator'
+  //  Referenced by: '<S15>/Discrete-Time Integrator'
 
   0.0,
 
   // Mask Parameter: CompareToConstant_const
-  //  Referenced by: '<S10>/Constant'
+  //  Referenced by: '<S11>/Constant'
 
   1.0,
 
   // Mask Parameter: CompareToConstant1_const
-  //  Referenced by: '<S11>/Constant'
+  //  Referenced by: '<S12>/Constant'
 
   2.0,
 
   // Mask Parameter: CompareToConstant_const_a
-  //  Referenced by: '<S22>/Constant'
+  //  Referenced by: '<S23>/Constant'
 
   1.0,
 
   // Mask Parameter: CompareToConstant1_const_o
-  //  Referenced by: '<S23>/Constant'
+  //  Referenced by: '<S24>/Constant'
 
   2.0,
 
   // Expression: [0,0]
-  //  Referenced by: '<S12>/dq'
+  //  Referenced by: '<S13>/dq'
 
   { 0.0, 0.0 },
 
   // Expression: [0,0]
-  //  Referenced by: '<S13>/dq'
+  //  Referenced by: '<S14>/dq'
 
   { 0.0, 0.0 },
 
   // Computed Parameter: Wm_Y0
-  //  Referenced by: '<S18>/Wm'
+  //  Referenced by: '<S19>/Wm'
 
   0.0,
 
   // Computed Parameter: DiscreteTimeIntegrator1_gainval
-  //  Referenced by: '<S18>/Discrete-Time Integrator1'
+  //  Referenced by: '<S19>/Discrete-Time Integrator1'
 
   1.0,
 
   // Expression: 0
-  //  Referenced by: '<S18>/Discrete-Time Integrator1'
+  //  Referenced by: '<S19>/Discrete-Time Integrator1'
 
   0.0,
 
   // Expression: pi/30
-  //  Referenced by: '<S17>/Gain3'
+  //  Referenced by: '<S18>/Gain3'
 
   0.10471975511965977,
 
   // Computed Parameter: Iq_ref_Y0
-  //  Referenced by: '<S4>/Iq_ref'
+  //  Referenced by: '<S5>/Iq_ref'
 
   0.0,
 
   // Computed Parameter: DiscreteTimeIntegrator_gainval
-  //  Referenced by: '<S19>/Discrete-Time Integrator'
+  //  Referenced by: '<S20>/Discrete-Time Integrator'
 
   1.0,
 
   // Expression: Limits(1)
-  //  Referenced by: '<S19>/Discrete-Time Integrator'
+  //  Referenced by: '<S20>/Discrete-Time Integrator'
 
   500.0,
 
   // Expression: Limits(2)
-  //  Referenced by: '<S19>/Discrete-Time Integrator'
+  //  Referenced by: '<S20>/Discrete-Time Integrator'
 
   -500.0,
 
   // Expression: Limits(1)
-  //  Referenced by: '<S19>/Saturation2'
+  //  Referenced by: '<S20>/Saturation2'
 
   500.0,
 
   // Expression: Limits(2)
-  //  Referenced by: '<S19>/Saturation2'
+  //  Referenced by: '<S20>/Saturation2'
 
   -500.0,
 
@@ -184,77 +188,77 @@ PmsmSimUtModelClass::P_PmsmSimUt_T PmsmSimUtModelClass::PmsmSimUt_P = {
   1.0,
 
   // Expression: Limits(1)
-  //  Referenced by: '<S15>/Saturation2'
+  //  Referenced by: '<S16>/Saturation2'
 
   10000.0,
 
   // Expression: Limits(2)
-  //  Referenced by: '<S15>/Saturation2'
+  //  Referenced by: '<S16>/Saturation2'
 
   -10000.0,
 
   // Expression: Limits(1)
-  //  Referenced by: '<S14>/Saturation2'
+  //  Referenced by: '<S15>/Saturation2'
 
   10000.0,
 
   // Expression: Limits(2)
-  //  Referenced by: '<S14>/Saturation2'
+  //  Referenced by: '<S15>/Saturation2'
 
   -10000.0,
 
   // Expression: [0,0]
-  //  Referenced by: '<S24>/dq'
+  //  Referenced by: '<S25>/dq'
 
   { 0.0, 0.0 },
 
   // Expression: [0,0]
-  //  Referenced by: '<S25>/dq'
+  //  Referenced by: '<S26>/dq'
 
   { 0.0, 0.0 },
 
   // Computed Parameter: DiscreteTimeIntegrator_gainva_p
-  //  Referenced by: '<S17>/Discrete-Time Integrator'
+  //  Referenced by: '<S18>/Discrete-Time Integrator'
 
   1.0,
 
   // Expression: 0
-  //  Referenced by: '<S17>/Discrete-Time Integrator'
+  //  Referenced by: '<S18>/Discrete-Time Integrator'
 
   0.0,
 
   // Expression: 2*pi
-  //  Referenced by: '<S17>/Constant'
+  //  Referenced by: '<S18>/Constant'
 
   6.2831853071795862,
 
-  // Computed Parameter: DiscreteTimeIntegrator_gainv_pq
-  //  Referenced by: '<S16>/Discrete-Time Integrator'
-
-  1.0,
-
   // Computed Parameter: DiscreteTimeIntegrator1_gainv_b
-  //  Referenced by: '<S16>/Discrete-Time Integrator1'
+  //  Referenced by: '<S17>/Discrete-Time Integrator1'
 
   1.0,
 
   // Expression: 0
-  //  Referenced by: '<S16>/Discrete-Time Integrator1'
+  //  Referenced by: '<S17>/Discrete-Time Integrator1'
 
   0.0,
 
+  // Computed Parameter: DiscreteTimeIntegrator_gainv_pq
+  //  Referenced by: '<S17>/Discrete-Time Integrator'
+
+  1.0,
+
   // Expression: 0
-  //  Referenced by: '<S9>/Constant'
+  //  Referenced by: '<S10>/Constant'
 
   0.0,
 
   // Expression: K1
-  //  Referenced by: '<S29>/K1'
+  //  Referenced by: '<S30>/K1'
 
   1.0,
 
   // Expression: K2
-  //  Referenced by: '<S29>/K2'
+  //  Referenced by: '<S30>/K2'
 
   1.0,
 
@@ -264,17 +268,22 @@ PmsmSimUtModelClass::P_PmsmSimUt_T PmsmSimUtModelClass::PmsmSimUt_P = {
   0.0,
 
   // Expression: 0
-  //  Referenced by: '<Root>/Switch5'
+  //  Referenced by: '<S18>/Switch'
 
   0.0,
 
   // Expression: 0
-  //  Referenced by: '<S17>/Switch'
+  //  Referenced by: '<Root>/Switch3'
 
   0.0,
 
+  // Expression: -1
+  //  Referenced by: '<S6>/Gain1'
+
+  -1.0,
+
   // Expression: 0
-  //  Referenced by: '<Root>/Switch3'
+  //  Referenced by: '<Root>/Switch5'
 
   0.0,
 
@@ -284,17 +293,17 @@ PmsmSimUtModelClass::P_PmsmSimUt_T PmsmSimUtModelClass::PmsmSimUt_P = {
   0.0,
 
   // Computed Parameter: DiscreteTimeIntegrator_gainva_b
-  //  Referenced by: '<S15>/Discrete-Time Integrator'
+  //  Referenced by: '<S16>/Discrete-Time Integrator'
 
   1.0,
 
   // Expression: Limits(1)
-  //  Referenced by: '<S15>/Discrete-Time Integrator'
+  //  Referenced by: '<S16>/Discrete-Time Integrator'
 
   10000.0,
 
   // Expression: Limits(2)
-  //  Referenced by: '<S15>/Discrete-Time Integrator'
+  //  Referenced by: '<S16>/Discrete-Time Integrator'
 
   -10000.0,
 
@@ -304,7 +313,7 @@ PmsmSimUtModelClass::P_PmsmSimUt_T PmsmSimUtModelClass::PmsmSimUt_P = {
   0.0,
 
   // Expression: 0
-  //  Referenced by: '<S6>/Memory'
+  //  Referenced by: '<S7>/Memory'
 
   0.0,
 
@@ -319,17 +328,17 @@ PmsmSimUtModelClass::P_PmsmSimUt_T PmsmSimUtModelClass::PmsmSimUt_P = {
   -10000.0,
 
   // Computed Parameter: DiscreteTimeIntegrator_gainva_c
-  //  Referenced by: '<S14>/Discrete-Time Integrator'
+  //  Referenced by: '<S15>/Discrete-Time Integrator'
 
   1.0,
 
   // Expression: Limits(1)
-  //  Referenced by: '<S14>/Discrete-Time Integrator'
+  //  Referenced by: '<S15>/Discrete-Time Integrator'
 
   10000.0,
 
   // Expression: Limits(2)
-  //  Referenced by: '<S14>/Discrete-Time Integrator'
+  //  Referenced by: '<S15>/Discrete-Time Integrator'
 
   -10000.0,
 
@@ -339,83 +348,83 @@ PmsmSimUtModelClass::P_PmsmSimUt_T PmsmSimUtModelClass::PmsmSimUt_P = {
   0.0,
 
   // Expression: 0
-  //  Referenced by: '<S8>/Constant'
+  //  Referenced by: '<S9>/Constant'
 
   0.0,
 
   // Expression: K1
-  //  Referenced by: '<S27>/K1'
+  //  Referenced by: '<S28>/K1'
 
   1.0,
 
   // Expression: K2
-  //  Referenced by: '<S27>/K2'
+  //  Referenced by: '<S28>/K2'
 
   1.0,
 
   // Expression: [ 1   -1/2   -1/2; 0   sqrt(3)/2   -sqrt(3)/2; 1/2  1/2  1/2 ]
-  //  Referenced by: '<S21>/Gain3'
+  //  Referenced by: '<S22>/Gain3'
 
   { 1.0, 0.0, 0.5, -0.5, 0.8660254037844386, 0.5, -0.5, -0.8660254037844386, 0.5
   },
 
   // Expression: 2/3
-  //  Referenced by: '<S21>/Gain1'
+  //  Referenced by: '<S22>/Gain1'
 
   0.66666666666666663,
 
   // Expression: 30/pi
-  //  Referenced by: '<S17>/Gain2'
+  //  Referenced by: '<S18>/Gain2'
 
   9.5492965855137211,
 
   // Expression: -0.01
-  //  Referenced by: '<S6>/Dead Zone'
+  //  Referenced by: '<S7>/Dead Zone'
 
   -0.01,
 
   // Expression: 0.01
-  //  Referenced by: '<S6>/Dead Zone'
+  //  Referenced by: '<S7>/Dead Zone'
 
   0.01,
 
   // Expression: 0.1
-  //  Referenced by: '<S6>/Relay1'
+  //  Referenced by: '<S7>/Relay1'
 
   0.1,
 
   // Expression: 0
-  //  Referenced by: '<S6>/Relay1'
+  //  Referenced by: '<S7>/Relay1'
 
   0.0,
 
   // Expression: 1000
-  //  Referenced by: '<S6>/Relay1'
+  //  Referenced by: '<S7>/Relay1'
 
   1000.0,
 
   // Expression: 0
-  //  Referenced by: '<S6>/Relay1'
+  //  Referenced by: '<S7>/Relay1'
 
   0.0,
 
   // Expression: 0
-  //  Referenced by: '<S6>/Relay2'
+  //  Referenced by: '<S7>/Relay2'
 
   0.0,
 
   // Expression: -0.1
-  //  Referenced by: '<S6>/Relay2'
+  //  Referenced by: '<S7>/Relay2'
 
   -0.1,
 
   // Expression: 0
-  //  Referenced by: '<S6>/Relay2'
+  //  Referenced by: '<S7>/Relay2'
 
   0.0,
 
   // Expression: -1000
-  //  Referenced by: '<S6>/Relay2'
+  //  Referenced by: '<S7>/Relay2'
 
   -1000.0,
 

+ 2 - 2
unit_test/motor_sim/PmsmSimUt_private.h

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 2 - 2
unit_test/motor_sim/PmsmSimUt_types.h

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 2 - 2
unit_test/motor_sim/ert_main.cpp

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

BIN
unit_test/motor_sim/model/PmsmSimUt.slx


+ 2 - 2
unit_test/motor_sim/rtGetInf.cpp

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 2 - 2
unit_test/motor_sim/rtGetInf.h

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 2 - 2
unit_test/motor_sim/rtGetNaN.cpp

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 2 - 2
unit_test/motor_sim/rtGetNaN.h

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 2 - 2
unit_test/motor_sim/rt_nonfinite.cpp

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 2 - 2
unit_test/motor_sim/rt_nonfinite.h

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 2 - 2
unit_test/motor_sim/rtwtypes.h

@@ -3,9 +3,9 @@
 //
 // Code generated for Simulink model 'PmsmSimUt'.
 //
-// Model version                  : 1.15
+// Model version                  : 1.18
 // Simulink Coder version         : 9.4 (R2020b) 29-Jul-2020
-// C/C++ source code generated on : Fri Jul 28 01:40:47 2023
+// C/C++ source code generated on : Tue Aug  1 23:42:37 2023
 //
 // Target selection: ert.tlc
 // Embedded hardware selection: Intel->x86-64 (Windows64)

+ 174 - 0
unit_test/test_pwrlim.cpp

@@ -0,0 +1,174 @@
+#include "gtest/gtest.h"
+#include <cmath>
+#include <gtest/gtest.h>
+#include <stdint.h>
+#include <tuple>
+#include "scope.h"
+#include "test_user.h"
+#include "PmsmSimUt.h"
+#include "motor_sim_helper.h"
+
+class PwrLimTest : public testing::Test
+{
+protected:
+    PmsmSimUtModelClass *sys1;
+    McStatus      McStatus1;
+    McPuBase      McPuBase1;
+
+    virtual void SetUp() override
+    {
+        sys1 = new PmsmSimUtModelClass();
+        sys1->initialize();
+        MotorSimHelper::RestoreDefaultParam(sys1);
+        sys1->PmsmSimUt_P.Params.Ts      = 1.0 / FTBC_HZ;
+        sys1->PmsmSimUt_P.Params.SpdCtrl = 1;
+        sys1->PmsmSimUt_P.Params.B       = 0;
+        sys1->PmsmSimUt_P.Params.Jm      = M_JD * 1e-7;
+        sys1->PmsmSimUt_P.Params.Pn      = M_POLE_PAIRS;
+        sys1->PmsmSimUt_P.Params.R       = M_RS_OHM * 1e-5;
+        sys1->PmsmSimUt_P.Params.Ld      = M_LD_NOLOAD_MH * 1e-8;
+        sys1->PmsmSimUt_P.Params.Lq      = M_LQ_NOLOAD_MH * 1e-8;
+        sys1->PmsmSimUt_P.Params.Flux    = M_FLUX_WB * 1e-6;
+
+        sys1->PmsmSimUt_P.Params.SKp  = (sys1->PmsmSimUt_P.Params.Jm * 20 * 2 * 3.14 / sys1->PmsmSimUt_P.Params.Flux) / 30 * 3.14;
+        sys1->PmsmSimUt_P.Params.SKi  = 20 * 2 * 3.14 * sys1->PmsmSimUt_P.Params.SKp;
+        sys1->PmsmSimUt_P.Params.CKpd = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.Ld;
+        sys1->PmsmSimUt_P.Params.CKid = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.R;
+        sys1->PmsmSimUt_P.Params.CKpq = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.Lq;
+        sys1->PmsmSimUt_P.Params.CKiq = (300 * 2 * 3.14) * sys1->PmsmSimUt_P.Params.R;
+
+        sys1->PmsmSimUt_reset();
+
+        McPuBaseIn puBaseIn = {
+            .Pairsb = MOTOR_PAIRS,
+            .UbVt   = VBASE,
+            .IbAp   = IBASE,
+            .FbHz   = FBASE,
+        };
+        McPuBaseInit(&McPuBase1, &puBaseIn);
+
+        McStatusInit(&McStatus1, &McPuBase1);
+
+        CodeParaInit();
+        pwr_voPwrLimInit();
+        asr_voSpdPIInit();
+    }
+
+    virtual void TearDown() override
+    {
+        sys1->terminate();
+        delete sys1;
+
+        pwr_voPwrLimInit();
+        asr_voSpdPIInit();
+    }
+};
+
+class PwrLimTest1 : public PwrLimTest, public testing::WithParamInterface<double>
+{};
+
+TEST_P(PwrLimTest1, BandCal)
+{
+
+}
+
+INSTANTIATE_TEST_SUITE_P(DiffBand, PwrLimTest1, testing::Values(20, 50, 100));
+
+class PwrLimTest2 : public PwrLimTest, public testing::WithParamInterface<int>
+{};
+
+TEST_P(PwrLimTest2, PwrLim)
+{
+    /* Coef Cal */
+    pwr_stPwrLimCofIn.swPwrLimW = cp_stControlPara.swPwrLimitValWt; 
+    pwr_stPwrLimCofIn.uwPwrErrW = cp_stControlPara.swPwrLimitErrWt; 
+    pwr_stPwrLimCofIn.swIqMaxAp = cp_stMotorPara.swIpeakMaxA;       
+    pwr_stPwrLimCofIn.uwIBaseAp = IBASE;                            
+    pwr_stPwrLimCofIn.uwUbVt = VBASE;                               
+    pwr_stPwrLimCofIn.uwPwrLimPIKp = cp_stControlPara.swPwrLimitKpPu;
+    pwr_stPwrLimCofIn.uwPwrLimPIKi = cp_stControlPara.swPwrLimitKiPu;
+    pwr_stPwrLimCofIn.uwPwrLimSTARTCe = cp_stControlPara.swAlmPwrLimitStartTempVal;
+    pwr_stPwrLimCofIn.uwPwrLimENDCe = cp_stControlPara.swAlmOverHeatCeVal;
+    pwr_voPwrLimCof(&pwr_stPwrLimCofIn, &pwr_stPwrLimCof);
+
+    mth_voLPFilterCoef((1000000 / cp_stControlPara.swPwrLimitLPFFre), FTBC_HZ, &scm_stMotoPwrInLpf.uwKx);
+
+    asr_stSpdPICoefIn.uwUbVt = VBASE;
+    asr_stSpdPICoefIn.uwIbAp = IBASE;
+    asr_stSpdPICoefIn.uwFbHz = FBASE;
+    asr_stSpdPICoefIn.uwFTbsHz = FTBS_HZ;
+    asr_stSpdPICoefIn.uwPairs = cp_stMotorPara.swMotrPolePairs;
+    asr_stSpdPICoefIn.uwMtJm = cp_stMotorPara.swJD;
+    asr_stSpdPICoefIn.uwMtFlxWb = cp_stMotorPara.swFluxWb;
+    asr_stSpdPICoefIn.uwMcoef = cp_stControlPara.swAsrPIM;
+    asr_stSpdPICoefIn.uwWvcHz = cp_stControlPara.swAsrPIBandwidth;
+    asr_stSpdPICoefIn.uwRatioJm = cp_stControlPara.swAsrSpdInerRate;
+    asr_voSpdPICoef(&asr_stSpdPICoefIn, &asr_stSpdPICoef);
+
+    /* Custom Spd Ctrl */
+    sys1->PmsmSimUt_P.Params.CustomSpdCtrl  = 1;
+    int16_t spdRefRpm = 3000;
+
+    for (int i = 0; i < 10 / sys1->PmsmSimUt_P.Params.Ts; i++)
+    {
+        /* Speed Ref */
+        // spdRefRpm += 1;
+        // if(spdRefRpm > 3000)
+        // {
+        //     spdRefRpm = 3000;
+        // }
+        int16_t spdRefPu = ((int32_t)spdRefRpm << 15) / McStatus1.Base->uwVbRpm;
+
+        /* Motor Load Torque */
+        // sys1->PmsmSimUt_U.CtrlIn.Tm += 0.001;
+        // if(sys1->PmsmSimUt_U.CtrlIn.Tm > 2)
+        // {
+        //     sys1->PmsmSimUt_U.CtrlIn.Tm = 2;
+        // }
+
+        sys1->PmsmSimUt_U.CtrlIn.Tm = 2;
+
+        /* Pu Value to Named Value */
+        MotorSimHelper::SetModelICmdPu(sys1, 0, asr_stSpdPIOut.swIqRefPu, McStatus1.Base);
+
+        /* Motor Control */
+        sys1->step();
+
+        /* Named Value to Pu Value */
+        MotorSimHelper::TransitModelOutput(sys1, &McStatus1);
+
+        /* Power Cal */
+        double ualpha = 0.6667 * (sys1->PmsmSimUt_Y.Out.Uabc[0] - 0.5 * sys1->PmsmSimUt_Y.Out.Uabc[1] - 0.5 * sys1->PmsmSimUt_Y.Out.Uabc[2]);
+        double ubeta  = 0.57735 * (sys1->PmsmSimUt_Y.Out.Uabc[1] - sys1->PmsmSimUt_Y.Out.Uabc[2]);
+        double ud = ualpha * cos(sys1->PmsmSimUt_Y.Out.Theta) + ubeta * sin(sys1->PmsmSimUt_Y.Out.Theta);
+        double uq = -ualpha * sin(sys1->PmsmSimUt_Y.Out.Theta) + ubeta * cos(sys1->PmsmSimUt_Y.Out.Theta);
+        double udPu = ud * 10 * 16384 / VBASE;
+        double uqPu = uq * 10 * 16384 / VBASE;
+
+        //int16_t power1 = ((int32_t)McStatus1.Pu.swIalpha * McStatus1.Pu.swUalpha + (int32_t)McStatus1.Pu.swIbeta * McStatus1.Pu.swUbeta) >> 13; // Q15
+        int16_t power = ((int32_t)udPu * McStatus1.Pu.swId + (int32_t)uqPu * McStatus1.Pu.swIq) >> 13; // Q15
+        mth_voLPFilter(power, &scm_stMotoPwrInLpf);
+
+        /* Power Limit Control */
+        pwr_stPwrLimIn.swMotorPwrPu = scm_stMotoPwrInLpf.slY.sw.hi; 
+        pwr_stPwrLimIn.swIqrefPu = asr_stSpdPIOut.swIqRefPu;                   
+        pwr_stPwrLimIn.PCBTemp = GetParam(); //adc_stUpOut.PCBTemp;
+        pwr_voPwrLim2(&pwr_stPwrLimIn, &pwr_stPwrLimCof, &pwr_stPwrLimOut2); // Q14
+
+        /* Speed Control */
+        if(i % (FTBC_HZ / FTBS_HZ) == 0)
+        {
+            asr_stSpdPIIn.swSpdRefPu = spdRefPu;            
+            asr_stSpdPIIn.swSpdFdbPu = McStatus1.Pu.swElecOmega; 
+            asr_stSpdPIIn.swIqMaxPu = abs(pwr_stPwrLimOut2.swIqLimPu);
+            asr_stSpdPIIn.swIqMinPu = -abs(pwr_stPwrLimOut2.swIqLimPu);
+            asr_voSpdPI(&asr_stSpdPIIn, &asr_stSpdPICoef, &asr_stSpdPIOut);
+        }
+
+        UdpScope::Send(0, pwr_stPwrLimOut2.swMotorPwrLimitActualPu, power, pwr_stPwrLimOut2.swIqLimPu, asr_stSpdPIOut.swIqRefPu, spdRefPu,  McStatus1.Pu.swElecOmega);
+    }
+
+    EXPECT_NEAR(pwr_stPwrLimOut2.swMotorPwrLimitActualPu, scm_stMotoPwrInLpf.slY.sw.hi, 2);
+}
+
+INSTANTIATE_TEST_SUITE_P(DiffTemp, PwrLimTest2, ::testing::Values(20, 90, 150));

+ 1 - 0
unit_test/test_user.h

@@ -6,6 +6,7 @@
 #include "torqobs.h"
 #include "pwrlim.h"
 #include "asr.h"
+#include "brake.h"
 
 
 #include "glbcof.h"