Форум программистов, компьютерный форум, киберфорум
Dima_control
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Костыли и грабли или как мы делали симулятор - ч.3

Запись от Dima_control размещена 09.12.2020 в 22:04

Прошло довольно много времени с начала разработки симулятора и мы сделали довольно большой скачок, но все равно вопросов больше чем ответов. Но даже так полученный опыт бесценен и сейчас я расскажу чего мы добились.
Мы немного отошли от стратегии, что разработали в начале этого года, т.к. посчитали, что разработка 3-х мерной графики и работа с openGL - последнее дело, которым мы займемся, когда уже уже основная оболочка симулятора будет готова.
Сейчас мы занимаемся разработкой моделей бортовых систем, их отладкой, а так же самым сложным элементом симулятора - моделью движения - математическим описанием возмущенного движения космического аппарата Союз-ТМА и Международной Космической Станции, которая будет генерировать возмущения на датчики угловой скорости, модель акселерометра и др. датчики СУД.

Для отладки мы разработали оконное приложение в среде C++ Builder 6.0. Скажу сразу что довольно хорошей идеей стало то что мы в первую очередь решили разработать журнал протоколирования событий. Это форма с ListBox в который через процедуру
C++
1
void JPS(int tm, AnsiString Inst,AnsiString Pol,AnsiString Cmd,AnsiString zn)
мы посылаем строку состоящую из:
- номера события - генерируется автоматически
- времени локального (Ткомпьютера)
- времени модельного (бортового) - т.е. времени в симуляторе
- источника команды - переменная Inst
- получателя команды - переменная Pol
- Наименование (расшифровка) команды, ее описание или краткое наименование - переменная Cmd
- Значение команды (если таковое имеется) - переменная Zn
Таким образом мы можем отслеживать все процессы, происходящие в симуляторе, их длительность и др. необходимую информацию. Журнал вообще вещь классная и мы его теперь будем практиковать постоянно, в релизе я думаю мы сделаем журнал в консоли как во всех играх по нажатию тильды.
Функция журнала выглядит следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void JPS(int tm, AnsiString Inst,AnsiString Pol,AnsiString Cmd,AnsiString zn){
// Что бы ровно отображался номер
AnsiString zero;
if (JouLogForm->JouLB->Count<10){ 
zero = "000"; } else
if (JouLogForm->JouLB->Count<100){
zero = "00"; } else
if (JouLogForm->JouLB->Count<1000){
zero = "0"; } else
zero = "";
      JouLogForm->JouLB->Items->AddObject(zero+   // Нули перед номером
                      JouLogForm->JouLB->Count+   // Номер
  "  ["+Now().FormatString("hh.mm.ss.zzz")+"]"+   // Local Time (PC)
                                          "  "+   // Разделитель между Lt и Ot
+"["+OnboardModelTime.FormatString("hh.nn.ss.zzz")+"]"+   // Onboard (model) time from BUM
 
                                         "   "+   // Разделитель между Ot и Inst
                                          Inst+   // Источник команды
 
                                           Pol+   // Получатель команды (пункт назначения)
                                        // "   "+   // Разделитель между Pol и Cmd
                                           Cmd+   // Наименование (расшифровка) команды, ее описание или краткое наименование
                                         //"   "+   // Разделитель между Cmd и zn
                                            zn    // Значение команды (булево, integer, double)
                             ,   (TObject*)tm);   // tm - Подсветка команды
JouLogForm->JouLB->Perform(WM_VSCROLL,
                SB_LINEDOWN,0);                   // Что бы всегда была перемотка вниз
}
Конечно если есть предложения по ее модификации будем рады))).
Следующее что мы сделали - разработка форм отладки моделей бортовых систем. Т.к. в оригинальном коде многих систем (написанном на асме) есть много заковырок довольно сложных, то мы решили переписать логику работы бортовых систем с нуля. В качестве примера - ПРВИ - пульт ручного ввода информации, это прибор, с цифровой клавиатурой и дополнительными функциональными клавишами, который космонавты используют, для того, что бы из памяти Бортового Цифрового Вычислительного Комплекса "Аргон-16" вывести значение ячейки памяти на экран или же записать в эту ячейку значение, а так же для загрузки управляющий программ из памяти БЦВК. Прибор не сложный и мы его решили разработать в первую очередь, как один из основных приборов для работы комплекса. Была разработана форма, которая представлена ниже:
Нажмите на изображение для увеличения
Название: ПРВИ.png
Просмотров: 221
Размер:	7.9 Кб
ID:	6622
и вот этот же прибор на ренальном изделии:
Нажмите на изображение для увеличения
Название: ПРВИ222.png
Просмотров: 245
Размер:	486.3 Кб
ID:	6621
Логика прибора проста - включается питание прибора, оператор вводит последовательность цифр (номер режима, адрес ячейки памяти и значение этой ячейки памяти), после чего выдает команду "ИСП" на исполнение введенного значения, оно декодируется и посылается через ЦАП в БЦВК, где обрабатывается и БЦВК возвращает результат: оператору (в виде значения на индикаторы) и в Центр Управления Полётами (ЦУП-М) в виде массива квитанций (в симуляторе - отправка таких же квитанций по UDP). Скоро добавим возможность обработки ввода клавиш с клавиатуры, пока что только ввод выдачей виртуальных цифровых клавиш. Имеется кнопка "ГАШ", удаляющая последний введенный символ, клавиша "СБР" очищающая индикаторы. Другие клавиши думаю понятны.
Представляю скриншот ПРВИ во время работы:
Нажмите на изображение для увеличения
Название: ПРВИ_работа.png
Просмотров: 213
Размер:	8.6 Кб
ID:	6623
В данном случае мы режимом 14 (одиночный ввод десятичных чисел) в ячейку по под адресом 41 (импульс V1) записываем значение 32. Индикатор И8 необходимо заполнять цифрой "0", такое правило работы с прибором. После нажатия кнопки "ИСП" происходят следующие действия: формируется строка (AnsiString) состоящая из всех индикаторов, т.е. "1400041032", которая посылается в модель вычислителя Аргон-16, где проверяется на достоверность ввода (корректность режима/адреса/значения) и при true результате происходит логическая обработка строки, результат вычислений так же превращается в строку и выводится обратно на индикаторы. Временная задержка разработчиками космического корабля Союз-ТМА (11Ф732) была выставлена равной 500 мс, для удобства восприятия информации, что бы и реализовали в симуляторе.
Так же все действия оператора логируются в журнал:
Нажмите на изображение для увеличения
Название: Журнал_работа_ПРВИ.png
Просмотров: 169
Размер:	8.3 Кб
ID:	6624
и на форму отладки БЦВК Аргон-16 (которая является прототипом формы Комплексного Моделирующего Стенда РКК Энергия):
Нажмите на изображение для увеличения
Название: отладка_а16.png
Просмотров: 227
Размер:	21.8 Кб
ID:	6625
Теперь пару слов про код, он конечно получился говнокод, но со временем мы его модернизируем и сделаем конфеткой.
В первую очередь мы создали огромное количество признаков (логических состояний - bool) - в.т.ч. и для работы ПРВИ, а именно признак включенного состояния прибора - brvi_on, который отслеживается в первую очередь при выдаче клавиши "ИСП" на пульте, т.е. если питания нет - мы ничего не делаем, но посылаем ошибку в журнал:
C++
1
2
3
4
5
6
7
void __fastcall TIrBrForm::isp_btnClick(TObject *Sender)
{
if(brvi_on) { // Если БРВИ вкл
      // код....
} else 
JPS(3,is_miu,is_operator,cmd_brvi_error,"");
}
Этот признак выставляется в true при выдаче команды "Включение БРВИ" виртуальной клавишей "ON" на пульте. В качестве индикации состояния пульта мы добавили индикатор (в реальности - светодиод) - TPanel у которой color меняется на lime при поданном питании и на gray при снятом.
При введённом признаке brvi_on идут следующие процедуры:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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; // Присваиваем глобальной переменной текущее значение ИРВИ
Итак я описал вам типовой формат отображения модели бортовой системы. По такому же принципу (форма + header + срр что бы потом перенести только их (что бы код не зависел от билдера)) построены все остальные бортовые системы.
Наша основная задача - написать логику автоматической работы БЦВК Аргон-16, что бы он сам управлял всеми бортовыми системами и производить всесторонний контроль действий БЦВК - как с стороны "ЦУП-М", так и с стороны оператора (отладочные форматы имеющиеся на космическом корабле) и Наземный Комплекс Управления (НКУ).

В итоговую версию симулятора мы перенесем часть кода, поэтому стараемся писать так, что бы код можно было без лишних проблем импортировать в VisualStudio. В следующей статье я попробую описать подробно остальные форматы моделей бортовых систем, а так же математические модели атмосферы и движения, которые являются основными для начальной работы симулятора, пока у нас имеется только модель взаимно сближающихся объектов (ТК+МКС), не учитывающая притяжение Земли, Луны и др. возмущения.
Показов 2441 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru