// // File: PmsmSimUt.cpp // // Code generated for Simulink model 'PmsmSimUt'. // // Model version : 1.18 // Simulink Coder version : 9.4 (R2020b) 29-Jul-2020 // C/C++ source code generated on : Tue Aug 1 23:42:37 2023 // // Target selection: ert.tlc // Embedded hardware selection: Intel->x86-64 (Windows64) // Code generation objectives: Unspecified // Validation result: Not run // #include "PmsmSimUt.h" #include "PmsmSimUt_private.h" void PmsmSimUtModelClass::PmsmSimUt_reset() { // Outputs for Atomic SubSystem: '/Initialize Function' // StateWriter: '/State Writer' incorporates: // Constant: '/Constant4' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c = PmsmSimUt_P.Params.Flux; // End of Outputs for SubSystem: '/Initialize Function' } real_T rt_modd_snf(real_T u0, real_T u1) { real_T q; real_T y; boolean_T yEq; y = u0; if (u1 == 0.0) { if (u0 == 0.0) { y = u1; } } else if (rtIsNaN(u0) || rtIsNaN(u1) || rtIsInf(u0)) { y = (rtNaN); } else if (u0 == 0.0) { y = 0.0 / u1; } else if (rtIsInf(u1)) { if ((u1 < 0.0) != (u0 < 0.0)) { y = u1; } } else { y = std::fmod(u0, u1); yEq = (y == 0.0); if ((!yEq) && (u1 > std::floor(u1))) { q = std::abs(u0 / u1); yEq = !(std::abs(q - std::floor(q + 0.5)) > DBL_EPSILON * q); } if (yEq) { y = u1 * 0.0; } else { if ((u0 < 0.0) != (u1 < 0.0)) { y += u1; } } } return y; } // Model step function 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; real_T rtb_Gain2_k; real_T rtb_Mod; real_T rtb_Relay2; real_T rtb_Switch_h; real_T rtb_Switch_idx_0; real_T rtb_Switch_idx_1; real_T rtb_a; real_T rtb_id; real_T rtb_iq; int32_T i; uint8_T rtb_Compare; // Math: '/Mod' incorporates: // Constant: '/Constant' // DiscreteIntegrator: '/Discrete-Time Integrator' rtb_Mod = rt_modd_snf(PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE, PmsmSimUt_P.Constant_Value); // Fcn: '/iq' incorporates: // Constant: '/Constant3' // DiscreteIntegrator: '/Discrete-Time Integrator1' rtb_iq = PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE / PmsmSimUt_P.Params.Lq; // Fcn: '/id' incorporates: // Constant: '/Constant1' // Constant: '/Constant2' // DiscreteIntegrator: '/Discrete-Time Integrator' rtb_id = (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c - PmsmSimUt_P.Params.Flux) / PmsmSimUt_P.Params.Ld; // Outputs for Enabled SubSystem: '/Subsystem - pi//2 delay' incorporates: // EnablePort: '/Enable' // Outputs for Enabled SubSystem: '/Subsystem1' incorporates: // EnablePort: '/Enable' // Fcn: '/Fcn' incorporates: // Fcn: '/Fcn' // Fcn: '/Fcn1' // Fcn: '/Fcn' rtb_Add2_tmp_tmp = std::sin(rtb_Mod); rtb_Add2_tmp_tmp_0 = std::cos(rtb_Mod); // End of Outputs for SubSystem: '/Subsystem1' // End of Outputs for SubSystem: '/Subsystem - pi//2 delay' rtb_Add2 = rtb_Add2_tmp_tmp_0 * rtb_id - rtb_Add2_tmp_tmp * rtb_iq; // Fcn: '/Fcn1' incorporates: // Fcn: '/Fcn' rtb_a = rtb_Add2_tmp_tmp * rtb_id + rtb_Add2_tmp_tmp_0 * rtb_iq; // Gain: '/K1' incorporates: // Constant: '/Constant' rtb_Gain1_i = PmsmSimUt_P.K1_Gain * PmsmSimUt_P.Constant_Value_e; // Fcn: '/a' rtb_Gain2_k = rtb_Add2 + rtb_Gain1_i; // Fcn: '/b' rtb_Fcn1 = (-0.5 * rtb_Add2 + 0.8660254037844386 * rtb_a) + rtb_Gain1_i; // Fcn: '/c' rtb_Add2 = (-0.5 * rtb_Add2 - 0.8660254037844386 * rtb_a) + rtb_Gain1_i; // Outport: '/Out' incorporates: // Gain: '/K2' 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_Add2; // Switch: '/Switch2' incorporates: // Inport: '/ObsIn' if (PmsmSimUt_U.ObsIn.Enable > PmsmSimUt_P.Switch2_Threshold) { rtb_Fcn1 = PmsmSimUt_U.ObsIn.Theta; } else { rtb_Fcn1 = rtb_Mod; } // End of Switch: '/Switch2' // Gain: '/Gain' incorporates: // DiscreteIntegrator: '/Discrete-Time Integrator' // DiscreteIntegrator: '/Discrete-Time Integrator1' // Fcn: '/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: '/Subsystem' incorporates: // EnablePort: '/Enable' // Constant: '/Constant2' if (PmsmSimUt_P.Params.SpdCtrl > 0.0) { // DiscreteIntegrator: '/Discrete-Time Integrator1' PmsmSimUt_B.DiscreteTimeIntegrator1 = PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTAT_d; // Update for DiscreteIntegrator: '/Discrete-Time Integrator1' incorporates: // Constant: '/Constant1' // Gain: '/Gain' // Gain: '/Gain1' // Inport: '/CtrlIn' // Product: '/Divide' // Sum: '/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: '/Subsystem' // Switch: '/Switch' incorporates: // Constant: '/Constant2' // Constant: '/Constant4' // Gain: '/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: '/Switch' // Gain: '/Gain1' rtb_Gain1_i = PmsmSimUt_P.Params.Pn * rtb_Gain2_k; // Switch: '/Switch3' incorporates: // Inport: '/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: '/Switch3' // RelationalOperator: '/Compare' incorporates: // Constant: '/Constant' // Constant: '/Constant' rtb_Compare = (PmsmSimUt_P.AlphaBetaZerotodq0_Alignment == PmsmSimUt_P.CompareToConstant_const); // Sum: '/Add' incorporates: // Inport: '/ObsIn' rtb_Add2 = PmsmSimUt_U.ObsIn.Theta - rtb_Mod; // Outputs for Enabled SubSystem: '/Subsystem1' incorporates: // EnablePort: '/Enable' if (rtb_Compare > 0) { // Fcn: '/Fcn' incorporates: // Fcn: '/Fcn1' rtb_Add1 = std::sin(rtb_Add2); rtb_Switch_h = std::cos(rtb_Add2); // Fcn: '/Fcn' PmsmSimUt_B.Fcn_g = rtb_id * rtb_Switch_h + rtb_iq * rtb_Add1; // Fcn: '/Fcn1' PmsmSimUt_B.Fcn1_e = -rtb_id * rtb_Add1 + rtb_iq * rtb_Switch_h; } // End of Outputs for SubSystem: '/Subsystem1' // Outputs for Enabled SubSystem: '/Subsystem - pi//2 delay' incorporates: // EnablePort: '/Enable' // RelationalOperator: '/Compare' incorporates: // Constant: '/Constant' // Constant: '/Constant' if (PmsmSimUt_P.AlphaBetaZerotodq0_Alignment == PmsmSimUt_P.CompareToConstant1_const) { // Fcn: '/Fcn' PmsmSimUt_B.Fcn_b = rtb_id * std::sin(rtb_Add2) - rtb_iq * std::cos(rtb_Add2); // Fcn: '/Fcn1' PmsmSimUt_B.Fcn1_n = rtb_id * std::cos(rtb_Add2) + rtb_iq * std::sin (rtb_Add2); } // End of RelationalOperator: '/Compare' // End of Outputs for SubSystem: '/Subsystem - pi//2 delay' // Switch: '/Switch' if (rtb_Compare != 0) { rtb_Switch_idx_0 = PmsmSimUt_B.Fcn_g; rtb_Switch_idx_1 = PmsmSimUt_B.Fcn1_e; } else { rtb_Switch_idx_0 = PmsmSimUt_B.Fcn_b; rtb_Switch_idx_1 = PmsmSimUt_B.Fcn1_n; } // End of Switch: '/Switch' // Switch: '/Switch5' incorporates: // Inport: '/ObsIn' if (PmsmSimUt_U.ObsIn.Enable > PmsmSimUt_P.Switch5_Threshold) { rtb_Add2 = rtb_Switch_idx_1; } else { rtb_Add2 = rtb_iq; } // End of Switch: '/Switch5' // Switch: '/Switch4' incorporates: // Inport: '/ObsIn' if (PmsmSimUt_U.ObsIn.Enable > PmsmSimUt_P.Switch4_Threshold) { rtb_Add1 = rtb_Switch_idx_0; } else { rtb_Add1 = rtb_id; } // End of Switch: '/Switch4' // ManualSwitch: '/Manual Switch1' incorporates: // Constant: '/Constant5' // Constant: '/Constant6' if (PmsmSimUt_P.ManualSwitch1_CurrentSetting == 1) { rtb_Switch_idx_0 = PmsmSimUt_P.Constant5_Value; } else { rtb_Switch_idx_0 = PmsmSimUt_P.Constant6_Value; } // End of ManualSwitch: '/Manual Switch1' // Product: '/Product' incorporates: // Constant: '/Constant1' // Constant: '/Constant2' // Product: '/Product2' // Product: '/Product3' // Sum: '/Sum' rtb_Switch_idx_1 = (rtb_Add1 * PmsmSimUt_P.Params.Ld + PmsmSimUt_P.Params.Flux) * rtb_a * rtb_Switch_idx_0; // Sum: '/Add1' incorporates: // Inport: '/CtrlIn' rtb_Add1 = PmsmSimUt_U.CtrlIn.IdCmd - rtb_Add1; // Switch: '/Switch1' incorporates: // Constant: '/Constant3' // Gain: '/Gain1' // Inport: '/ICtrlIn' // Product: '/Product' // Product: '/Product1' // Sum: '/Sum1' if (PmsmSimUt_U.ICtrlIn.Enable > PmsmSimUt_P.Switch1_Threshold) { rtb_Switch_idx_0 = PmsmSimUt_U.ICtrlIn.UdCtrl; } else { // Sum: '/Sum6' incorporates: // DiscreteIntegrator: '/Discrete-Time Integrator' // Gain: '/Kp4' rtb_Relay2 = PmsmSimUt_P.Params.CKpd * rtb_Add1 + PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j; // Saturate: '/Saturation2' if (rtb_Relay2 > PmsmSimUt_P.Saturation2_UpperSat_o) { rtb_Relay2 = PmsmSimUt_P.Saturation2_UpperSat_o; } else { if (rtb_Relay2 < PmsmSimUt_P.Saturation2_LowerSat_o) { rtb_Relay2 = PmsmSimUt_P.Saturation2_LowerSat_o; } } // End of Saturate: '/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: '/Switch1' // Outputs for Enabled SubSystem: '/Subsystem' incorporates: // EnablePort: '/Enable' // Logic: '/AND' incorporates: // Constant: '/Constant1' // Constant: '/Constant3' // Logic: '/NOT' if ((!(PmsmSimUt_P.Params.CustomSpdCtrl != 0.0)) && (PmsmSimUt_P.Params.SpdCtrl != 0.0)) { PmsmSimUt_DW.Subsystem_MODE = true; // Saturate: '/Saturation2' incorporates: // Memory: '/Memory' if (PmsmSimUt_DW.Memory_PreviousInput > PmsmSimUt_P.Saturation2_UpperSat_p) { rtb_Switch_h = PmsmSimUt_P.Saturation2_UpperSat_p; } else if (PmsmSimUt_DW.Memory_PreviousInput < PmsmSimUt_P.Saturation2_LowerSat_f) { rtb_Switch_h = PmsmSimUt_P.Saturation2_LowerSat_f; } else { rtb_Switch_h = PmsmSimUt_DW.Memory_PreviousInput; } // End of Saturate: '/Saturation2' // Sum: '/Add4' incorporates: // Gain: '/Gain1' rtb_Relay2 = rtb_Switch_h - 9.5492965855137211 / PmsmSimUt_P.Params.Pn * rtb_a; // DiscreteIntegrator: '/Discrete-Time Integrator' PmsmSimUt_B.DiscreteTimeIntegrator = PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n; // Sum: '/Sum6' incorporates: // Gain: '/Kp4' PmsmSimUt_B.Iq_ref = PmsmSimUt_P.Params.SKp * rtb_Relay2 + PmsmSimUt_B.DiscreteTimeIntegrator; // Saturate: '/Saturation2' if (PmsmSimUt_B.Iq_ref > PmsmSimUt_P.Saturation2_UpperSat) { // Sum: '/Sum6' incorporates: // Saturate: '/Saturation2' PmsmSimUt_B.Iq_ref = PmsmSimUt_P.Saturation2_UpperSat; } else { if (PmsmSimUt_B.Iq_ref < PmsmSimUt_P.Saturation2_LowerSat) { // Sum: '/Sum6' incorporates: // Saturate: '/Saturation2' PmsmSimUt_B.Iq_ref = PmsmSimUt_P.Saturation2_LowerSat; } } // End of Saturate: '/Saturation2' // Update for DiscreteIntegrator: '/Discrete-Time Integrator' incorporates: // Gain: '/Gain' // Gain: '/Kp5' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n += PmsmSimUt_P.Params.SKi * rtb_Relay2 * PmsmSimUt_P.Params.Ts * PmsmSimUt_P.DiscreteTimeIntegrator_gainval; if (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n >= PmsmSimUt_P.DiscreteTimeIntegrator_UpperSat) { PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n = PmsmSimUt_P.DiscreteTimeIntegrator_UpperSat; } else { if (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n <= PmsmSimUt_P.DiscreteTimeIntegrator_LowerSat) { PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n = PmsmSimUt_P.DiscreteTimeIntegrator_LowerSat; } } // End of Update for DiscreteIntegrator: '/Discrete-Time Integrator' // Switch: '/Switch' rtb_Switch_h = PmsmSimUt_B.Iq_ref; } else { if (PmsmSimUt_DW.Subsystem_MODE) { // Disable for DiscreteIntegrator: '/Discrete-Time Integrator' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n = PmsmSimUt_B.DiscreteTimeIntegrator; PmsmSimUt_DW.Subsystem_MODE = false; } // Switch: '/Switch' incorporates: // Inport: '/CtrlIn' rtb_Switch_h = PmsmSimUt_U.CtrlIn.IqCmd; } // End of Logic: '/AND' // End of Outputs for SubSystem: '/Subsystem' // Sum: '/Add2' rtb_Add2 = rtb_Switch_h - rtb_Add2; // Switch: '/Switch6' incorporates: // Inport: '/ICtrlIn' // Sum: '/Sum' if (PmsmSimUt_U.ICtrlIn.Enable > PmsmSimUt_P.Switch6_Threshold) { rtb_a = PmsmSimUt_U.ICtrlIn.UqCtrl; } else { // Sum: '/Sum6' incorporates: // DiscreteIntegrator: '/Discrete-Time Integrator' // Gain: '/Kp4' rtb_Relay2 = PmsmSimUt_P.Params.CKpq * rtb_Add2 + PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g; // Saturate: '/Saturation2' if (rtb_Relay2 > PmsmSimUt_P.Saturation2_UpperSat_b) { rtb_Relay2 = PmsmSimUt_P.Saturation2_UpperSat_b; } else { if (rtb_Relay2 < PmsmSimUt_P.Saturation2_LowerSat_j) { rtb_Relay2 = PmsmSimUt_P.Saturation2_LowerSat_j; } } // End of Saturate: '/Saturation2' rtb_a = rtb_Switch_idx_1 + rtb_Relay2; } // End of Switch: '/Switch6' // Fcn: '/Fcn' incorporates: // Fcn: '/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: '/Fcn1' rtb_Fcn1 = rtb_Relay2 * rtb_Switch_idx_0 + rtb_Fcn1 * rtb_a; // Gain: '/K1' incorporates: // Constant: '/Constant' rtb_Switch_idx_0 = PmsmSimUt_P.K1_Gain_j * PmsmSimUt_P.Constant_Value_p; // Fcn: '/a' rtb_a = rtb_Switch_idx_1 + rtb_Switch_idx_0; // Fcn: '/b' rtb_Relay2 = (-0.5 * rtb_Switch_idx_1 + 0.8660254037844386 * rtb_Fcn1) + rtb_Switch_idx_0; // Fcn: '/c' rtb_Switch_idx_1 = (-0.5 * rtb_Switch_idx_1 - 0.8660254037844386 * rtb_Fcn1) + rtb_Switch_idx_0; // Gain: '/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: '/Gain1' incorporates: // Gain: '/Gain3' 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: '/Compare' incorporates: // Constant: '/Constant' // Constant: '/Constant' rtb_Compare = (PmsmSimUt_P.AlphaBetaZerotodq0_Alignment_e == PmsmSimUt_P.CompareToConstant_const_a); // Outputs for Enabled SubSystem: '/Subsystem1' incorporates: // EnablePort: '/Enable' if (rtb_Compare > 0) { // Fcn: '/Fcn' PmsmSimUt_B.Fcn = rtb_Gain1_c[0] * rtb_Add2_tmp_tmp_0 + rtb_Gain1_c[1] * rtb_Add2_tmp_tmp; // Fcn: '/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: '/Subsystem1' // Outputs for Enabled SubSystem: '/Subsystem - pi//2 delay' incorporates: // EnablePort: '/Enable' // RelationalOperator: '/Compare' incorporates: // Constant: '/Constant' // Constant: '/Constant' if (PmsmSimUt_P.AlphaBetaZerotodq0_Alignment_e == PmsmSimUt_P.CompareToConstant1_const_o) { // Fcn: '/Fcn' PmsmSimUt_B.Fcn_a = rtb_Gain1_c[0] * rtb_Add2_tmp_tmp - rtb_Gain1_c[1] * rtb_Add2_tmp_tmp_0; // Fcn: '/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: '/Compare' // End of Outputs for SubSystem: '/Subsystem - pi//2 delay' // Switch: '/Switch' if (rtb_Compare != 0) { rtb_Switch_idx_0 = PmsmSimUt_B.Fcn; rtb_Switch_idx_1 = PmsmSimUt_B.Fcn1; } else { rtb_Switch_idx_0 = PmsmSimUt_B.Fcn_a; rtb_Switch_idx_1 = PmsmSimUt_B.Fcn1_p; } // End of Switch: '/Switch' // Outport: '/Out' incorporates: // BusCreator: '/Bus Creator' // DiscreteIntegrator: '/Discrete-Time Integrator' // DiscreteIntegrator: '/Discrete-Time Integrator1' // Gain: '/Gain2' // Inport: '/CtrlIn' // SignalConversion generated from: '/Bus Creator' PmsmSimUt_Y.Out.WmRpm = PmsmSimUt_P.Gain2_Gain * rtb_Gain2_k; 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; PmsmSimUt_Y.Out.Te = rtb_Gain; PmsmSimUt_Y.Out.Theta = rtb_Mod; PmsmSimUt_Y.Out.We = rtb_Gain1_i; PmsmSimUt_Y.Out.FluxDq[0] = PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c; PmsmSimUt_Y.Out.FluxDq[1] = PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE; PmsmSimUt_Y.Out.IdRef = PmsmSimUt_U.CtrlIn.IdCmd; PmsmSimUt_Y.Out.IqRef = rtb_Switch_h; // Gain: '/Gain1' incorporates: // Constant: '/Constant' // DiscreteIntegrator: '/Discrete-Time Integrator1' // Fcn: '/d(Flux_d)//dt' rtb_Mod = ((rtb_Switch_idx_0 - PmsmSimUt_P.Params.R * rtb_id) + rtb_Gain1_i * PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE) * PmsmSimUt_P.Params.Ts; // Sum: '/Sum' incorporates: // Inport: '/CtrlIn' // Memory: '/Memory' rtb_Relay2 = PmsmSimUt_U.CtrlIn.WmRpm - PmsmSimUt_DW.Memory_PreviousInput; // DeadZone: '/Dead Zone' if (rtb_Relay2 > PmsmSimUt_P.DeadZone_End) { rtb_Relay2 -= PmsmSimUt_P.DeadZone_End; } else if (rtb_Relay2 >= PmsmSimUt_P.DeadZone_Start) { rtb_Relay2 = 0.0; } else { rtb_Relay2 -= PmsmSimUt_P.DeadZone_Start; } // End of DeadZone: '/Dead Zone' // Relay: '/Relay1' PmsmSimUt_DW.Relay1_Mode = ((rtb_Relay2 >= PmsmSimUt_P.Relay1_OnVal) || ((!(rtb_Relay2 <= PmsmSimUt_P.Relay1_OffVal)) && PmsmSimUt_DW.Relay1_Mode)); // Relay: '/Relay2' PmsmSimUt_DW.Relay2_Mode = ((rtb_Relay2 >= PmsmSimUt_P.Relay2_OnVal) || ((!(rtb_Relay2 <= PmsmSimUt_P.Relay2_OffVal)) && PmsmSimUt_DW.Relay2_Mode)); // Update for DiscreteIntegrator: '/Discrete-Time Integrator' incorporates: // Gain: '/Gain' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE += PmsmSimUt_P.Params.Ts * rtb_Gain1_i * PmsmSimUt_P.DiscreteTimeIntegrator_gainva_p; // Update for DiscreteIntegrator: '/Discrete-Time Integrator1' incorporates: // Constant: '/Constant' // DiscreteIntegrator: '/Discrete-Time Integrator' // Fcn: '/d(Flux_q)//dt' // Gain: '/Gain2' 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: '/Discrete-Time Integrator' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c += PmsmSimUt_P.DiscreteTimeIntegrator_gainv_pq * rtb_Mod; // Update for DiscreteIntegrator: '/Discrete-Time Integrator' incorporates: // Gain: '/Gain' // Gain: '/Kp5' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j += PmsmSimUt_P.Params.CKid * rtb_Add1 * PmsmSimUt_P.Params.Ts * PmsmSimUt_P.DiscreteTimeIntegrator_gainva_b; if (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j >= PmsmSimUt_P.DiscreteTimeIntegrator_UpperS_b) { PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j = PmsmSimUt_P.DiscreteTimeIntegrator_UpperS_b; } else { if (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j <= PmsmSimUt_P.DiscreteTimeIntegrator_LowerS_l) { PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j = PmsmSimUt_P.DiscreteTimeIntegrator_LowerS_l; } } // End of Update for DiscreteIntegrator: '/Discrete-Time Integrator' // Relay: '/Relay1' if (PmsmSimUt_DW.Relay1_Mode) { rtb_Switch_h = PmsmSimUt_P.Relay1_YOn; } else { rtb_Switch_h = PmsmSimUt_P.Relay1_YOff; } // Relay: '/Relay2' if (PmsmSimUt_DW.Relay2_Mode) { rtb_iq = PmsmSimUt_P.Relay2_YOn; } else { rtb_iq = PmsmSimUt_P.Relay2_YOff; } // Update for Memory: '/Memory' incorporates: // Gain: '/Gain' // Sum: '/Add' // Sum: '/Sum1' PmsmSimUt_DW.Memory_PreviousInput += (rtb_Switch_h + rtb_iq) * PmsmSimUt_P.Params.Ts; // Update for DiscreteIntegrator: '/Discrete-Time Integrator' incorporates: // Gain: '/Gain' // Gain: '/Kp5' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g += PmsmSimUt_P.Params.CKiq * rtb_Add2 * PmsmSimUt_P.Params.Ts * PmsmSimUt_P.DiscreteTimeIntegrator_gainva_c; if (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g >= PmsmSimUt_P.DiscreteTimeIntegrator_UpperS_k) { PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g = PmsmSimUt_P.DiscreteTimeIntegrator_UpperS_k; } else { if (PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g <= PmsmSimUt_P.DiscreteTimeIntegrator_LowerS_a) { PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g = PmsmSimUt_P.DiscreteTimeIntegrator_LowerS_a; } } // End of Update for DiscreteIntegrator: '/Discrete-Time Integrator' } // Model initialize function void PmsmSimUtModelClass::initialize() { // Registration code // initialize non-finites rt_InitInfAndNaN(sizeof(real_T)); // InitializeConditions for DiscreteIntegrator: '/Discrete-Time Integrator' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE = PmsmSimUt_P.DiscreteTimeIntegrator_IC; // InitializeConditions for DiscreteIntegrator: '/Discrete-Time Integrator1' PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTATE = PmsmSimUt_P.DiscreteTimeIntegrator1_IC_a; // InitializeConditions for DiscreteIntegrator: '/Discrete-Time Integrator' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_c = PmsmSimUt_P.Params.Flux; // InitializeConditions for DiscreteIntegrator: '/Discrete-Time Integrator' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_j = PmsmSimUt_P.Subsystem1_Init; // InitializeConditions for Memory: '/Memory' PmsmSimUt_DW.Memory_PreviousInput = PmsmSimUt_P.Memory_InitialCondition; // InitializeConditions for DiscreteIntegrator: '/Discrete-Time Integrator' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_g = PmsmSimUt_P.Subsystem_Init_c; // SystemInitialize for Enabled SubSystem: '/Subsystem' // InitializeConditions for DiscreteIntegrator: '/Discrete-Time Integrator1' PmsmSimUt_DW.DiscreteTimeIntegrator1_DSTAT_d = PmsmSimUt_P.DiscreteTimeIntegrator1_IC; // SystemInitialize for DiscreteIntegrator: '/Discrete-Time Integrator1' incorporates: // Outport: '/Wm' PmsmSimUt_B.DiscreteTimeIntegrator1 = PmsmSimUt_P.Wm_Y0; // End of SystemInitialize for SubSystem: '/Subsystem' // SystemInitialize for Enabled SubSystem: '/Subsystem1' // SystemInitialize for Fcn: '/Fcn' incorporates: // Outport: '/dq' PmsmSimUt_B.Fcn_g = PmsmSimUt_P.dq_Y0_e[0]; // SystemInitialize for Fcn: '/Fcn1' incorporates: // Outport: '/dq' PmsmSimUt_B.Fcn1_e = PmsmSimUt_P.dq_Y0_e[1]; // End of SystemInitialize for SubSystem: '/Subsystem1' // SystemInitialize for Enabled SubSystem: '/Subsystem - pi//2 delay' // SystemInitialize for Fcn: '/Fcn' incorporates: // Outport: '/dq' PmsmSimUt_B.Fcn_b = PmsmSimUt_P.dq_Y0[0]; // SystemInitialize for Fcn: '/Fcn1' incorporates: // Outport: '/dq' PmsmSimUt_B.Fcn1_n = PmsmSimUt_P.dq_Y0[1]; // End of SystemInitialize for SubSystem: '/Subsystem - pi//2 delay' // SystemInitialize for Enabled SubSystem: '/Subsystem' // InitializeConditions for DiscreteIntegrator: '/Discrete-Time Integrator' PmsmSimUt_DW.DiscreteTimeIntegrator_DSTATE_n = PmsmSimUt_P.Subsystem_Init; // SystemInitialize for Sum: '/Sum6' incorporates: // Outport: '/Iq_ref' // Saturate: '/Saturation2' PmsmSimUt_B.Iq_ref = PmsmSimUt_P.Iq_ref_Y0; // End of SystemInitialize for SubSystem: '/Subsystem' // SystemInitialize for Enabled SubSystem: '/Subsystem1' // SystemInitialize for Fcn: '/Fcn' incorporates: // Outport: '/dq' PmsmSimUt_B.Fcn = PmsmSimUt_P.dq_Y0_f[0]; // SystemInitialize for Fcn: '/Fcn1' incorporates: // Outport: '/dq' PmsmSimUt_B.Fcn1 = PmsmSimUt_P.dq_Y0_f[1]; // End of SystemInitialize for SubSystem: '/Subsystem1' // SystemInitialize for Enabled SubSystem: '/Subsystem - pi//2 delay' // SystemInitialize for Fcn: '/Fcn' incorporates: // Outport: '/dq' PmsmSimUt_B.Fcn_a = PmsmSimUt_P.dq_Y0_l[0]; // SystemInitialize for Fcn: '/Fcn1' incorporates: // Outport: '/dq' PmsmSimUt_B.Fcn1_p = PmsmSimUt_P.dq_Y0_l[1]; // End of SystemInitialize for SubSystem: '/Subsystem - pi//2 delay' } // Model terminate function void PmsmSimUtModelClass::terminate() { // (no terminate code required) } // Constructor PmsmSimUtModelClass::PmsmSimUtModelClass() : PmsmSimUt_U(), PmsmSimUt_Y(), PmsmSimUt_B(), PmsmSimUt_DW(), PmsmSimUt_M() { // Currently there is no constructor body generated. } // Destructor PmsmSimUtModelClass::~PmsmSimUtModelClass() { // Currently there is no destructor body generated. } // Real-Time Model get method PmsmSimUtModelClass::RT_MODEL_PmsmSimUt_T * PmsmSimUtModelClass::getRTM() { return (&PmsmSimUt_M); } // // File trailer for generated code. // // [EOF] //