Files
motor_params/Inu_im_1wnd_3lvl/Inu/controller.c

666 lines
15 KiB
C

/**************************************************************************
Description: Ïðîãðàììà ìîäåëèðóåò ðàáîòó ïðîöåññîðà - îñóùåñòâëÿåò
âûçîâ ôóíêöèé init28335, detcoeff, isr.
Òàêæå ìîäåëèðóåò ðàçëè÷íûå ïåðèôåðèéíûå óñòðîéñòâà ïðîöåññîðà
TMS320F28335/TMS320F28379D (ADC, PWM, QEP è ò.ä.).
Àâòîð: Óëèòîâñêèé Ä.È.
Äàòà ïîñëåäíåãî îáíîâëåíèÿ: 2021.11.08
**************************************************************************/
#include "simstruc.h"
#include "wrapper_inu.h"
#include "def.h"
#include "controller.h"
extern void init28335(void);
extern void detcoeff(void);
extern void isr(void);
extern void input_param(unsigned short num, unsigned short val);
void controller(SimStruct *S, const real_T *u, real_T *xD, real_T *rW, int_T *iW) {
// ÂÕÎÄÛ (begin)
nn = 0;
// àíàëîãîâûå âåëè÷èíû
udc1_ml = u[nn++];//Â
ia1_ml = u[nn++];//À
ib1_ml = u[nn++];//À
ic1_ml = u[nn++];//À
wm_ml = u[nn++];//ðàä/ñ
// óïðàâëåíèå (íàïðèìåð, ñ ÂÓ)
mst.faultReset = (unsigned short)u[nn++];
mst.start = (unsigned short)u[nn++];
mst.pzMode = (unsigned short)u[nn++];
mst.wmZz = u[nn++];//o.e. (îò N_BAZ)
mst.pmZz = u[nn++]*(P_NOM/S_BAZ);//o.e. (îò S_BAZ)
mst.wmLim = u[nn++];//o.e. (îò N_BAZ)
mst.pmLim = u[nn++]*(P_NOM/S_BAZ);//o.e. (îò S_BAZ)
mst.pIncrMaxTy = u[nn++]*TY*DECIM_PSI_WM_PM*(P_NOM/S_BAZ);//o.e. (îò S_BAZ)
mst.pDecrMaxTy = u[nn++]*TY*DECIM_PSI_WM_PM*(P_NOM/S_BAZ);//o.e. (îò S_BAZ)
iref = u[nn++];//î.å.
// ïàðàìåòðû (íàïðèìåð, ñ ÏÓ)
paramNo = FIRST_WRITE_PAR_NUM;
paramNew[paramNo++] = (unsigned short)u[nn++];
paramNew[paramNo++] = (unsigned short)u[nn++];
// ÂÕÎÄÛ (end)
//wm_ml = wm_ml_0*wm_err;//óãëîâàÿ ñêîðîñòü ñ ó÷åòîì ïîãðåøíîñòè
// îáðàáàòûâàåì ïàðàìåòðû S-Function êàæäûé ðàç, êîãäà îíè èçìåíèëèñü
if ( iW[0] == 1 ) {
iW[0] = 0;
kkk = 0;
for ( lll = 0; lll < NPARAMS; lll++ ) {
// îïðåäåëÿåì êîë-âî ýëåìåíòîâ â ïàðàìåòðå
dimen = mxGetNumberOfElements(ssGetSFcnParam(S,lll));
// îáðàáàòûâàåì ïàðàìåòð â çàâèñèìîñòè îò åãî ðàçìåðà
if ( dimen > LEN_PARAM_MATR*2 ) {
ssSetErrorStatus(S,"Â ïàðàìåòðå-ìàññèâå ñëèøêîì ìíîãî ýëåìåíòîâ");
return;
}
else if ( dimen > 1 ) {
// çàïîìèíàåì êîë-âî ýëåìåíòîâ ïàðàìåòðà-ìàòðèöû
paramMatrDimen = dimen;
// çàïîìèíàåì çíà÷åíèÿ ýëåìåíòîâ ïàðàìåòðà-ìàòðèöû
for ( mmm = 0; mmm < dimen; mmm++ )
paramMatr[mmm] = mxGetPr(ssGetSFcnParam(S,lll))[mmm];
}
else {
// çàïîìèíàåì çíà÷åíèÿ ïàðàìåòðîâ-ñêàëÿðîâ
paramScal[kkk++] = mxGetPr(ssGetSFcnParam(S,lll))[0];
}
}
// ÏÀÐÀÌÅÒÐÛ (begin)
nn = 0;
dt = paramScal[nn++];//øàã äèñêðåòèçàöèè (âñåãäà äîëæåí ïåðåäàâàòüñÿ â S-function ïîñëåäíèì!)
// ÏÀÐÀÌÅÒÐÛ (end)
} //if ( iW[0] == 1 )
// êîå-÷òî âûïîëíÿåì îäèí ðàç ïðè çàïóñêå ìîäåëè
if ( iW[1] == 1 ) {
iW[1] = 0;
// èíèöèàëèçàöèÿ ïðîöåññîðà
init28335();
// èìèòàöèÿ ñ÷èòûâàíèÿ ïàðàìåòðîâ èç EEPROM
// ... ïàðàìåòðû èç ìîäåëè (ñì. áëîê "Parameters")
for ( j = FIRST_WRITE_PAR_NUM; j < paramNo; j++ ) {
param[j] = paramNew[j];
}
// ... ïàðàìåòðû èç ôàéëà
param[180] = 930;//rf.PsiZ, %*10 îò PSI_BAZ
param[200] = 2048;//offset.Ia1, åä. ÀÖÏ
param[201] = 2048;//offset.Ib1, åä. ÀÖÏ
param[202] = 2048;//offset.Ic1, åä. ÀÖÏ
param[203] = 2048;//offset.Udc1, åä. ÀÖÏ
param[206] = 2048;//offset.Ia2, åä. ÀÖÏ
param[207] = 2048;//offset.Ib2, åä. ÀÖÏ
param[208] = 2048;//offset.Ic2, åä. ÀÖÏ
param[209] = 2048;//offset.Udc2, åä. ÀÖÏ
param[210] = 100;//cc.Kp, %
param[211] = 100;//cc.Ki, %
param[212] = 100;//cf.Kp, %
param[213] = 100;//cf.Ki, %
param[214] = 100;//csp.Kp, %
param[215] = 100;//csp.Ki, %
param[220] = 99;//protect.IacMax, % îò IAC_SENS_MAX
param[221] = 130;//protect.UdcMax, % îò U_NOM
param[222] = 110;//IzLim, % îò I_BAZ (ä.á. áîëüøå cf.IdLim)
param[223] = 105;//cf.IdLim, % îò I_BAZ (ä.á. ìåíüøå IzLim)
param[224] = 105;//csp.IqLim, % îò I_BAZ
param[225] = 97;//protect.UdcMin, % îò U_NOM
param[226] = 115;//protect.WmMax, % îò N_NOM
param[228] = 103;//rf.WmNomPsi, % îò N_NOM
param[229] = 97;//rf.YlimPsi, % îò Y_LIM
param[231] = 300;//protect.TudcMin, ìñ
param[233] = 1000;//protect.TwmMax, ìñ
param[244] = 26000;//rs.WlimIncr, ìñ
param[245] = 2000;//csp.IlimIncr, ìñ
param[248] = 6000;//rp.PlimIncr, ìñ
param[269] = 9964;//9700;//KmeCorr, %*100
param[285] = 10;//Kudc, ìñ*10
param[286] = 700;//Kwm, ìñ*10
param[288] = 250;//rs.Kwmz, ìñ
param[289] = 50;//rf.Kpsiz, ìñ
param[290] = 40;//Kme, ìñ
param[292] = 80;//rp.Kpmz, ìñ
param[303] = (unsigned short)(19200.);//sgmPar.Rs, ìêÎì
param[304] = (unsigned short)(19364.);//sgmPar.Lls, ìêÃí*10
param[305] = (unsigned short)(8500.);//sgmPar.Rr, ìêÎì
param[306] = (unsigned short)(10212.);//sgmPar.Llr, ìêÃí*10
param[307] = (unsigned short)(35810.);//sgmPar.Lm, ìêÃí
// èíèöèàëèçàöèÿ ïðîãðàììû
detcoeff();
// äëÿ ìîäåëèðîâàíèÿ òàéìåðîâ
T1Pr = (double)EPwm1Regs.TBPRD;
T2Pr = (double)EPwm2Regs.TBPRD;
T3Pr = (double)EPwm3Regs.TBPRD;
T4Pr = (double)EPwm4Regs.TBPRD;
T5Pr = (double)EPwm5Regs.TBPRD;
T6Pr = (double)EPwm6Regs.TBPRD;
t1cntAux = (double)EPwm1Regs.TBCTR;
t2cntAux = (double)EPwm2Regs.TBCTR;
t3cntAux = (double)EPwm3Regs.TBCTR;
t4cntAux = (double)EPwm4Regs.TBCTR;
t5cntAux = (double)EPwm5Regs.TBCTR;
t6cntAux = (double)EPwm6Regs.TBCTR;
// ... ïðèðàùåíèå ñ÷¸ò÷èêîâ òàéìåðîâ çà øàã äèñêðåòèçàöèè
TxCntPlus = FTBCLK*dt;
// äëÿ ìîäåëèðîâàíèÿ eQEP
Qposmax = (double)EQep2Regs.QPOSMAX;
qposcnt = 1.;//(double)EQep2Regs.QPOSCNT;
// äëÿ ìîäåëèðîâàíèÿ ÀÖÏ
// (íà ñ÷¸ò 1e-6 ñì. SetupAdc(), õîòÿ òàì ñêîðåå íå 1.0 ìêñ, à 0.8 ìêñ)
Tadc = (int)(1e-6/dt);
// ... íà âñÿêèé ñëó÷àé
if ( Tadc < 1 )
Tadc = 1;
tAdc = 0;
// ... ÷òîáû ÀÖÏ æäàë çàïóñêà
nAdc = 10;
// äëÿ ìîäåëèðîâàíèÿ Dead-Band Unit
CntDt = (int)(DT/dt);
stateDt1 = stateDt2 = stateDt3 = stateDt4 = stateDt5 = stateDt6 = 1;
cntDt1 = cntDt2 = cntDt3 = cntDt4 = cntDt5 = cntDt6 = 0;
// äëÿ çàùèò
DI_24V_SOURCE_FAULT = 0;
// äëÿ âûâîäà
inuWork = 0;
ivc.psi = 0;
rf.psiZ = 0;
rs.wmZ = 0;
csp.wmLimZi = 0;
pm = 0;
rp.pmZ = 0;
csp.pmLimZi = 0;
id1 = 0;
iq1 = 0;
idZ = 0;
iqZ = 0;
cf.idP = 0;
cf.idFF = 0;
cf.idI = 0;
csp.iqP = 0;
csp.iqFF = 0;
csp.iqI = 0;
cc.yd1 = 0;
cc.yq1 = 0;
cc.y1 = 0;
} //if ( iW[1] == 1 )
// Ìîäåëèðóåì Time-Base Submodule, Counter-Compare Submodule è
// Event-Trigger Submodule
// ePWM1 (up-down-count mode)
// -------------------------
t1cntAuxPrev = t1cntAux;
t1cntAux += TxCntPlus;
if ( t1cntAux > T1Pr ) {
t1cntAux -= T1Pr*2.;
// active CMPA load from shadow when TBCTR == TBPRD
cmp1A = (double)EPwm1Regs.CMPA.half.CMPA;
// çàïóñê ÀÖÏ
tAdc = Tadc;
nAdc = 0;
}
if ( (t1cntAuxPrev < 0) && (t1cntAux >= 0) ) {
// active CMPA load from shadow when TBCTR == 0
cmp1A = (double)EPwm1Regs.CMPA.half.CMPA;
// çàïóñê ÀÖÏ
tAdc = Tadc;
nAdc = 0;
}
t1cnt = fabs(t1cntAux);
// ePWM2 (up-down-count mode)
// -------------------------
t2cntAuxPrev = t2cntAux;
t2cntAux += TxCntPlus;
if ( t2cntAux > T2Pr ) {
t2cntAux -= T2Pr*2.;
// active CMPA load from shadow when TBCTR == TBPRD
cmp2A = (double)EPwm2Regs.CMPA.half.CMPA;
}
if ( (t2cntAuxPrev < 0) && (t2cntAux >= 0) ) {
// active CMPA load from shadow when TBCTR == 0
cmp2A = (double)EPwm2Regs.CMPA.half.CMPA;
}
t2cnt = fabs(t2cntAux);
// ePWM3 (up-down-count mode)
// -------------------------
t3cntAuxPrev = t3cntAux;
t3cntAux += TxCntPlus;
if ( t3cntAux > T3Pr ) {
t3cntAux -= T3Pr*2.;
// active CMPA load from shadow when TBCTR == TBPRD
cmp3A = (double)EPwm3Regs.CMPA.half.CMPA;
}
if ( (t3cntAuxPrev < 0) && (t3cntAux >= 0) ) {
// active CMPA load from shadow when TBCTR == 0
cmp3A = (double)EPwm3Regs.CMPA.half.CMPA;
}
t3cnt = fabs(t3cntAux);
// ePWM4 (up-down-count mode)
// -------------------------
t4cntAuxPrev = t4cntAux;
t4cntAux += TxCntPlus;
if ( t4cntAux > T4Pr ) {
t4cntAux -= T4Pr*2.;
// active CMPA load from shadow when TBCTR == TBPRD
cmp4A = (double)EPwm4Regs.CMPA.half.CMPA;
}
if ( (t4cntAuxPrev < 0) && (t4cntAux >= 0) ) {
// active CMPA load from shadow when TBCTR == 0
cmp4A = (double)EPwm4Regs.CMPA.half.CMPA;
}
t4cnt = fabs(t4cntAux);
// ePWM5 (up-down-count mode)
// -------------------------
t5cntAuxPrev = t5cntAux;
t5cntAux += TxCntPlus;
if ( t5cntAux > T5Pr ) {
t5cntAux -= T5Pr*2.;
// active CMPA load from shadow when TBCTR == TBPRD
cmp5A = (double)EPwm5Regs.CMPA.half.CMPA;
}
if ( (t5cntAuxPrev < 0) && (t5cntAux >= 0) ) {
// active CMPA load from shadow when TBCTR == 0
cmp5A = (double)EPwm5Regs.CMPA.half.CMPA;
}
t5cnt = fabs(t5cntAux);
// ePWM6 (up-down-count mode)
// -------------------------
t6cntAuxPrev = t6cntAux;
t6cntAux += TxCntPlus;
if ( t6cntAux > T6Pr ) {
t6cntAux -= T6Pr*2.;
// active CMPA load from shadow when TBCTR == TBPRD
cmp6A = (double)EPwm6Regs.CMPA.half.CMPA;
}
if ( (t6cntAuxPrev < 0) && (t6cntAux >= 0) ) {
// active CMPA load from shadow when TBCTR == 0
cmp6A = (double)EPwm6Regs.CMPA.half.CMPA;
}
t6cnt = fabs(t6cntAux);
// Ìîäåëèðóåì ðàáîòó ñ÷¸ò÷èêà â eQEP
qposcnt += wm_ml/PI2*NOP*4.*dt;
if ( qposcnt >= (Qposmax + 1.) )
qposcnt -= (Qposmax + 1.);
else if ( qposcnt < 0 )
qposcnt += (Qposmax + 1.);
EQep2Regs.QPOSCNT = (short)qposcnt;
/* Ìîäåëèðóåì ïðåîáðàçîâàíèÿ èçìåðÿåìûõ âåëè÷èí äàò÷èêàìè,
îïåðàöèîííèêàìè è ÀÖÏ (ñ ïîìîùüþ nAdc ó÷èòûâàåì ñäâèã ïî âðåìåíè
ìåæäó ÀÖÏ ðàçíûõ ñèãíàëîâ) */
if ( tAdc < Tadc ) {
tAdc++;
}
else {
tAdc = 1;
nAdc++;
switch ( nAdc ) {
case 5:
// Udc1
if ( udc1_ml > UDC_SENS_MAX )
udc1_ml = UDC_SENS_MAX;
else if ( udc1_ml < -UDC_SENS_MAX )
udc1_ml = -UDC_SENS_MAX;
AdcMirror.ADCRESULT0 =
(unsigned short)(udc1_ml/UDC_SENS_MAX*2048. + (float)offset.Udc1);
// Ic1
if ( ic1_ml > IAC_SENS_MAX )
ic1_ml = IAC_SENS_MAX;
else if ( ic1_ml < -IAC_SENS_MAX )
ic1_ml = -IAC_SENS_MAX;
AdcMirror.ADCRESULT2 =
(unsigned short)(ic1_ml/IAC_SENS_MAX*2048. + (float)offset.Ic1);
break;
case 6:
// Ia1
if ( ia1_ml > IAC_SENS_MAX )
ia1_ml = IAC_SENS_MAX;
else if ( ia1_ml < -IAC_SENS_MAX )
ia1_ml = -IAC_SENS_MAX;
AdcMirror.ADCRESULT4 =
(unsigned short)(ia1_ml/IAC_SENS_MAX*2048. + (float)offset.Ia1);
// Ib1
if ( ib1_ml > IAC_SENS_MAX )
ib1_ml = IAC_SENS_MAX;
else if ( ib1_ml < -IAC_SENS_MAX )
ib1_ml = -IAC_SENS_MAX;
AdcMirror.ADCRESULT6 =
(unsigned short)(ib1_ml/IAC_SENS_MAX*2048. + (float)offset.Ib1);
break;
case 7:
// êàê áû ñ ÏÓ
for ( j = FIRST_WRITE_PAR_NUM; j < paramNo; j++ ) {
if ( paramNew[j] != param[j] ) {
input_param((short)j, paramNew[j]);
break;
}
}
// ïîñëå çàâåðøåíèÿ ñåðèè ÀÖÏ âûçûâàåì isr()
isr();
break;
} //switch ( nAdc )
} //tAdc
// Ìîäåëèðóåì Action-Qualifier Submodule
// ... ePWM1
if ( cmp1A > t1cnt ) {
ci1A = 1;
ci1B = 0;
}
else if ( cmp1A < t1cnt ) {
ci1A = 0;
ci1B = 1;
}
// ... ePWM2
if ( cmp2A < t2cnt ) {
ci2A = 1;
ci2B = 0;
}
else if ( cmp2A > t2cnt ) {
ci2A = 0;
ci2B = 1;
}
// ... ePWM3
if ( cmp3A > t3cnt ) {
ci3A = 1;
ci3B = 0;
}
else if ( cmp3A < t3cnt ) {
ci3A = 0;
ci3B = 1;
}
// ... ePWM4
if ( cmp4A < t4cnt ) {
ci4A = 1;
ci4B = 0;
}
else if ( cmp4A > t4cnt ) {
ci4A = 0;
ci4B = 1;
}
// ... ePWM5
if ( cmp5A > t5cnt ) {
ci5A = 1;
ci5B = 0;
}
else if ( cmp5A < t5cnt ) {
ci5A = 0;
ci5B = 1;
}
// ... ePWM6
if ( cmp6A < t6cnt ) {
ci6A = 1;
ci6B = 0;
}
else if ( cmp6A > t6cnt ) {
ci6A = 0;
ci6B = 1;
}
// Ìîäåëèðóåì Dead-Band Submodule
// ... ePWM1
if ( stateDt1 == 1 ) {
ci1A_DT = ci1A;
ci1B_DT = 0;
if ( ci1A == 1 )
cntDt1 = CntDt;
if ( cntDt1 > 0 )
cntDt1--;
else
stateDt1 = 2;
}
else if ( stateDt1 == 2 ) {
ci1A_DT = 0;
ci1B_DT = ci1B;
if ( ci1B == 1 )
cntDt1 = CntDt;
if ( cntDt1 > 0 )
cntDt1--;
else
stateDt1 = 1;
}
// ... ePWM2
if ( stateDt2 == 1 ) {
ci2A_DT = ci2A;
ci2B_DT = 0;
if ( ci2A == 1 )
cntDt2 = CntDt;
if ( cntDt2 > 0 )
cntDt2--;
else
stateDt2 = 2;
}
else if ( stateDt2 == 2 ) {
ci2A_DT = 0;
ci2B_DT = ci2B;
if ( ci2B == 1 )
cntDt2 = CntDt;
if ( cntDt2 > 0 )
cntDt2--;
else
stateDt2 = 1;
}
// ... ePWM3
if ( stateDt3 == 1 ) {
ci3A_DT = ci3A;
ci3B_DT = 0;
if ( ci3A == 1 )
cntDt3 = CntDt;
if ( cntDt3 > 0 )
cntDt3--;
else
stateDt3 = 2;
}
else if ( stateDt3 == 2 ) {
ci3A_DT = 0;
ci3B_DT = ci3B;
if ( ci3B == 1 )
cntDt3 = CntDt;
if ( cntDt3 > 0 )
cntDt3--;
else
stateDt3 = 1;
}
// ... ePWM4
if ( stateDt4 == 1 ) {
ci4A_DT = ci4A;
ci4B_DT = 0;
if ( ci4A == 1 )
cntDt4 = CntDt;
if ( cntDt4 > 0 )
cntDt4--;
else
stateDt4 = 2;
}
else if ( stateDt4 == 2 ) {
ci4A_DT = 0;
ci4B_DT = ci4B;
if ( ci4B == 1 )
cntDt4 = CntDt;
if ( cntDt4 > 0 )
cntDt4--;
else
stateDt4 = 1;
}
// ... ePWM5
if ( stateDt5 == 1 ) {
ci5A_DT = ci5A;
ci5B_DT = 0;
if ( ci5A == 1 )
cntDt5 = CntDt;
if ( cntDt5 > 0 )
cntDt5--;
else
stateDt5 = 2;
}
else if ( stateDt5 == 2 ) {
ci5A_DT = 0;
ci5B_DT = ci5B;
if ( ci5B == 1 )
cntDt5 = CntDt;
if ( cntDt5 > 0 )
cntDt5--;
else
stateDt5 = 1;
}
// ... ePWM6
if ( stateDt6 == 1 ) {
ci6A_DT = ci6A;
ci6B_DT = 0;
if ( ci6A == 1 )
cntDt6 = CntDt;
if ( cntDt6 > 0 )
cntDt6--;
else
stateDt6 = 2;
}
else if ( stateDt6 == 2 ) {
ci6A_DT = 0;
ci6B_DT = ci6B;
if ( ci6B == 1 )
cntDt6 = CntDt;
if ( cntDt6 > 0 )
cntDt6--;
else
stateDt6 = 1;
}
// Ìîäåëèðóåì Trip-Zone Submodule
// ... clear flag for one-shot trip latch
if ( EPwm1Regs.TZCLR.all == 0x0004 ) {
EPwm1Regs.TZCLR.all = 0x0000;
EPwm1Regs.TZFRC.all = 0x0000;
}
if ( EPwm2Regs.TZCLR.all == 0x0004 ) {
EPwm2Regs.TZCLR.all = 0x0000;
EPwm2Regs.TZFRC.all = 0x0000;
}
if ( EPwm3Regs.TZCLR.all == 0x0004 ) {
EPwm3Regs.TZCLR.all = 0x0000;
EPwm3Regs.TZFRC.all = 0x0000;
}
if ( EPwm4Regs.TZCLR.all == 0x0004 ) {
EPwm4Regs.TZCLR.all = 0x0000;
EPwm4Regs.TZFRC.all = 0x0000;
}
if ( EPwm5Regs.TZCLR.all == 0x0004 ) {
EPwm5Regs.TZCLR.all = 0x0000;
EPwm5Regs.TZFRC.all = 0x0000;
}
if ( EPwm6Regs.TZCLR.all == 0x0004 ) {
EPwm6Regs.TZCLR.all = 0x0000;
EPwm6Regs.TZFRC.all = 0x0000;
}
// ... forces a one-shot trip event
if ( EPwm1Regs.TZFRC.all == 0x0004 )
ci1A_DT = ci1B_DT = 0;
if ( EPwm2Regs.TZFRC.all == 0x0004 )
ci2A_DT = ci2B_DT = 0;
if ( EPwm3Regs.TZFRC.all == 0x0004 )
ci3A_DT = ci3B_DT = 0;
if ( EPwm4Regs.TZFRC.all == 0x0004 )
ci4A_DT = ci4B_DT = 0;
if ( EPwm5Regs.TZFRC.all == 0x0004 )
ci5A_DT = ci5B_DT = 0;
if ( EPwm6Regs.TZFRC.all == 0x0004 )
ci6A_DT = ci6B_DT = 0;
// ÂÛÕÎÄÛ (begin)
nn = 0;
// Óïðàâëåíèå
// ... INU1
xD[nn++] = ci1A_DT;
xD[nn++] = ci2A_DT;
xD[nn++] = ci1B_DT;
xD[nn++] = ci2B_DT;
xD[nn++] = ci3A_DT;
xD[nn++] = ci4A_DT;
xD[nn++] = ci3B_DT;
xD[nn++] = ci4B_DT;
xD[nn++] = ci5A_DT;
xD[nn++] = ci6A_DT;
xD[nn++] = ci5B_DT;
xD[nn++] = ci6B_DT;
// Òîëüêî äëÿ ïðîñìîòðà
xD[nn++] = state;
xD[nn++] = faultNo;
xD[nn++] = mst.start;
xD[nn++] = inuWork;
xD[nn++] = mst.pzMode;
xD[nn++] = psi;
xD[nn++] = rf.psiZ;
xD[nn++] = wm;
xD[nn++] = rs.wmZ;
xD[nn++] = csp.wmLimZi;
xD[nn++] = pm*S_BAZ/P_NOM;
xD[nn++] = rp.pmZ*S_BAZ/P_NOM;
xD[nn++] = csp.pmLimZi*S_BAZ/P_NOM;
xD[nn++] = id1;
xD[nn++] = iq1;
xD[nn++] = idZ;
xD[nn++] = iqZ;
xD[nn++] = me*M_BAZ/M_NOM;
xD[nn++] = sqrt(idZ*idZ + iqZ*iqZ);
xD[nn++] = IzLim;
xD[nn++] = sqrt(cc.yd1*cc.yd1 + cc.yq1*cc.yq1);
xD[nn++] = Y_LIM;
xD[nn++] = theta_out;
// ÂÛÕÎÄÛ (end)
} //void controller(SimStruct ...