Olá! Somos a equipa do simulador Soyuz TMA, um programa que simula o voo orbital da nave Soyuz e da Estação Espacial Internacional, encontro e atracação da nave espacial com a ISS, bem como desacoplamento e descida. Tudo isso é simulado tanto no modo automático (ou seja, sob o controle dos modelos de equipamentos de bordo do Sistema de Controle de Movimento) e nos modos de voo manual, que são idênticos em sua composição algorítmica e lógica aos usados a bordo da espaçonave Soyuz TMA.
" " C++ Builder 6. , VS - , , " " , , (Qt, VS).
- , , , .
- " ". , , . , . , , , , . .
:
:
(Jxx, Jyy, Jzz, Jxy, Jyz, Jzx) - . , .
( ).
.
:
.
J2000.
:
( ).
(, , ).
(Wx, Wy, Wz).
:
( ).
.
.
.
.
:
, -, , , , .
- , . , TSaveDialog TOpenDialog. ini (TIniFile), . .
( , ) .
, .
//
struct{
//// ////
TDateTime nu_day; // 2 /
//// ////
double vec_j2000_mks[3]; // 8 .. J2000 (X, Y, Z)
double vel_j2000_mks[3]; // 11 .. J2000 (X, Y, Z)
double Q_mks[4]; // 14 0 1 2
double w_j2000_mks[3]; // 18 J2000 (Wx Wy Wz)
double vec_mks_PC[3]; // 21 .. (X, Y, Z)
double m_mk; // 24
double mi_mks[3][3]; // 25 (Jxx, Jxy, Jxz...)
//// ////
double vec_j2000_tk[3]; // 34 .. J2000 (X, Y, Z)
double vel_j2000_tk[3]; // 37 .. J2000 (X, Y, Z) 0 1 2 3
double Q_tk[4]; // 40 J2000 (Qs, Qx, Qy, Qz)
double w_j2000_tk[3]; // 44 J2000 (Wx Wy Wz)
double vec_tk_TPK[3]; // 47 .. / (X, Y, Z)
double m_tk; // 50
double mi_tk[3][3]; // 51 (Jxx, Jxy, Jxz...)
//// M I S C ////
double vec_solar[3]; // 60 J2000 J2000 (ex, ey, ez)
unsigned long r_st_mks; // 63
unsigned long n_su_4_dk; // 64 , (, )
unsigned long nu_otor_switch_styk_dk; // 65 № , ( )
double tk_top_zap; // 66 ( +)
double mks_top_zap; // 67 ( +)
unsigned long pr_doking; // 68
unsigned long nr_sudn; // 69
} NU_temp;
//
static bool USO_Booled[20][16]; // ( _ .. 3.7)
(. . - ISBN 5-7038-2178-9), ( SoyCOM) , .
SGP4, ( TLE - ).
() UI , "" -
"-16". ().
, .
: () 15- ( + / -), "" - . . :
/ ( 16- ).
( ).
.
/ .
, , .
, - , "" ( 246), (1-1) ( , () ). 20.
C++ Builder 6 Visual Studio (, MFC + OpenGL ) (***_form.cpp) , /. :
, ON, brvi_on = true;
void __fastcall TIrBrForm::brvi_on_btnClick(TObject *Sender)
{
brvi_on=true; //
Panel1->Color=clLime; //
}
- , , , , . . - , №228
|
|
|
14 |
|
15 |
|
17 |
|
18 |
"0" |
30 |
"1" |
31 |
|
|
|
24 |
|
25 |
|
27 |
|
28 |
|
04 |
|
05 |
TPanel, Caption. - . "1":
void __fastcall TIrBrForm::brvi_btn_1Click(TObject *Sender)
{
if(brvi_on){
USO_BitType[16][3] = 0111;
if(i1->Caption=="")
i1->Caption="1";
else if(i2->Caption=="")
i2->Caption="1";
else if(i3->Caption=="")
i3->Caption="1";
else if(i4->Caption=="")
i4->Caption="1";
else if(i5->Caption=="")
i5->Caption="1";
else if(i6->Caption=="")
i6->Caption="1";
else if(i7->Caption=="")
i7->Caption="1";
else if(i8->Caption=="")
i8->Caption="1";
else if(i9->Caption=="")
i9->Caption="1";
else if(i10->Caption=="")
i10->Caption="1";
else if(i11->Caption=="")
i11->Caption="1";
else if(i12->Caption=="")
i12->Caption="1";
else if(i13->Caption=="")
i13->Caption="1";
else if(i14->Caption=="")
i14->Caption="1";
else {}
}
}
, for, . . , "", , "".
, :
void __fastcall TIrBrForm::isp_btnClick(TObject *Sender)
{
if(brvi_on) { //
if(i1->Caption==""&&i2->Caption==""){ // ,
i1->Caption=="A"; //
i2->Caption=="A";
JPS(3,is_irvi,is_operator,"",""); //
} else { // ( 1 2 )
AnsiString brvi_msg = i1->Caption+i2->Caption+i3->Caption+i4->Caption+ //
i5->Caption+i6->Caption+i7->Caption+i8->Caption+i9->Caption+i10->Caption+
i11->Caption+i12->Caption+i13->Caption+i14->Caption+i15->Caption;
JPS(1,is_operator,is_irvi,brvi_msg,"");
Timer1->Enabled=true; //
//
i1->Caption="";
i2->Caption="";
i3->Caption="";
i4->Caption="";
i5->Caption="";
i6->Caption="";
i7->Caption="";
i8->Caption="";
i9->Caption="";
i10->Caption="";
i11->Caption="";
i12->Caption="";
i13->Caption="";
i14->Caption="";
i15->Caption="";
irvi_string = brvi_msg; //
ChekIrvi(irvi_string); }} else //
JPS(3,is_miu,is_operator,cmd_brvi_error,""); //
}
, AnsiString irvi_string. ChekIrvi :
void ChekIrvi (AnsiString irvi_str){
if(irvi_str.IsEmpty())JPS(3,is_miu,is_operator," !",""); else {
irvi_type.mode = StrToInt(irvi_str.SubString(1,2)); // ""
switch (irvi_type.mode) { //
case 00: /* - 1 - 4 */ break;
case 04: /* 10- */ break;
case 05: /* 8- */ break;
case 10: /* */ break; // Arg addr RUS AUS data?
case 11: /* 1- */ break;
case 12: /* 2- */ break;
case 14: /* 10- */ // 14,
if((irvi_str.SubString(3,5)).IsEmpty())JPS(3,is_miu,is_operator," !",""); else {
irvi_type.addr = StrToInt(irvi_str.SubString(3,5)); //
if(CorrectAddr(irvi_type.addr)) { // , ,
if((irvi_str.SubString(8,7)).IsEmpty())JPS(3,is_miu,is_operator," !",""); else {
irvi_type.value = StrToInt(irvi_str.SubString(8,7)); //
ArgonMemoryType[irvi_type.addr] = irvi_type.value; //
SetItvi(irvi_type.mode,irvi_type.addr,ArgonMemoryType[irvi_type.addr], irvi_type.z ); //
JPS(4,is_argon,is_irvi," "+ // ( )
IntToStr(irvi_type.value)+" "+IntToStr(irvi_type.addr),"");}}
else { // ,
irvi_err = true;
JPS(3,is_argon,is_operator,arg_addr_error,""); } } // 16
break;
case 15: /* 8- */ break;
case 17: /* 10- */ break;
case 18: /* 8- */
// irvi_type.addr = StrToInt(irvi_str.SubString(3,5)); //
// if(CorrectAddr(irvi_type.addr)) { // , ,
//irvi_type.value = StrToInt(irvi_str.SubString(8,7)); //
// ArgonMemoryType[irvi_type.addr] = irvi_type.value; //
//SetItvi(irvi_type.mode,(irvi_type.addr)+1,ArgonMemoryType[irvi_type.addr], irvi_type.z ); //
//mode18act=true;
break;
case 21: /* 1- */ break;
case 22: /* 2- */ break;
case 24: /* 10- */ // 24,
irvi_type.addr = StrToInt(irvi_str.SubString(3,5)); //
if(CorrectAddr(irvi_type.addr)) { // , ,
SetItvi(irvi_type.mode,irvi_type.addr,ArgonMemoryType[irvi_type.addr], irvi_type.z ); } //
else { // ,
irvi_err = true;
JPS(3,is_argon,is_operator,arg_addr_error,""); } // 16
break;
case 25: /* 8- */ break;
case 27: /* 10- */ break;
case 28: /* 8- */break;
case 30: /* - */
irvi_type.addr = StrToInt(irvi_str.SubString(3,5)); //
if(CorrectAddr(irvi_type.addr)) { // , ,
irvi_type.value = StrToInt(irvi_str.SubString(8,7)); //
mode_30(irvi_type.addr,irvi_type.value); } //
else { // ,
irvi_err = true;
JPS(3,is_argon,is_operator,arg_addr_error,""); } // 16
break;
case 31: /* - */
irvi_type.addr = StrToInt(irvi_str.SubString(3,5)); //
if(CorrectAddr(irvi_type.addr)) { // , ,
irvi_type.value = StrToInt(irvi_str.SubString(8,7)); //
mode_31(irvi_type.addr,irvi_type.value); } //
else { // ,
irvi_err = true;
JPS(3,is_argon,is_operator,arg_addr_error,""); } // 16
break;
case 40: /* */ break;
case 41: /* */ break;
case 42: /* */ break;
case 43: /* */ break;
case 44: /* */ break;
case 45: /* */ break;
case 46: /* */ break;
case 48: /* */
break;
default: irvi_err = true; // ( )
JPS(3,is_argon,is_irvi,"",""); //
JPS(3,is_miu,is_operator," !","");
irvi_type.addr = StrToInt(irvi_str.SubString(3,5));
irvi_type.value = StrToInt(irvi_str.SubString(8,7));
break;
} } }
/ , . , :
(, , .) .
"-16", " 16", :
( ), ( , .. 2 - UDP), , (.. 2 3) . . TLabel , .
( ) ( ).
, , - . "-" . - , , . :
, , - №219 ( № 5.19, № 5.1)
.. . , . - () , (), , . , , "", "7". , , "" .
, , :
, - , , () . , 11 " 4" 15 " 15" 13 " 8".
.
static bool KSP_Booled[16][9];
, , true, . 7 " " KSP_Booled[0][6]=true;
, KSP_Booled[0][6]=1 , , , " ", :
// , 7
...
if (KSP_Let[0]){ //
KSP_Booled[0][6]=true; // 7 -
JPS(1,is_operator,is_miu,is_ksp,"7"); } else //
...
// uso_model.cpp USO_work
...
if(KSP_Booled[0][6]) { // A 7
KSP_Booled[0][6] = false;
// 95
USO_Booled[0][3]=true;
kdu_sdd = false;
}
...
// -
...
if(USO_Booled[0][3]){ // KSP A7
A7_LABEL->Color=clLime;
A7_LABEL->Font->Color=clBlack; } else {
A7_LABEL->Color=clGreen;
A7_LABEL->Font->Color=clYellow; }
...
Assim, implementamos a lógica padrão de trabalho com PCB e USO, é claro, se há pessoas que entendem a USO da espaçonave Soyuz que encontraram um erro em nossa interpretação da lógica de trabalho com PCB, corrija-nos, porque não temos materiais sobre USO e construímos essa lógica estudando o trabalho dos modelos do InPU e o manual para trabalhar com o sistema Neptune-ME.
Acho que são muitas informações para um post, então descreverei o restante dos formatos no próximo post.