четверг, 15 августа 2013 г.

Расчет зон радиовидимости для искусственного спутника Земли (ИСЗ)

    Прежде чем рассказать про выполнение данной задачи, приведу немного теории. Зона радиовидимости - это геометрическое место точек на поверхности Земли, попадающих в круг, ограниченный на сфере заданным расстоянием до подспутниковой точки.
    Время связи наземной станции с ИСЗ ограничено временем нахождения ИСЗ в зоне ее радиовидимости (рис. 1). Эта зона определяется длиной дуги АБ, которая зависит от высоты орбиты спутника и минимального угла возвышения антенны наземной станции следящей за ИСЗ в период нахождения его в зоне радиовидимости. Началом зоны видимости считается превышение значения угла места, минимального значения угла начала зоны видимости, которое зависит от высоты наблюдателя над поверхностью Земного эллипсоида.

Зону радиовидимости можно охарактеризовать следующими событиями:
  • время входа в зону;
  • время достижения какого-либо параметра;
  • время выхода из зоны.
Во время каждого события вычисляются следующие величины:
  • дальность между ИСЗ и станцией (в топографической системе координат);
  • азимут;
  • угол места;
  • угол Солнце–КА–НИП, характеризующий фазу освещенности;
  • широта и долгота подспутниковой точки;
  • высота ИСЗ;
  • номер витка и номер суточного витка.
     Параметры относительного положения КА и НИП в ТЦСК, связанной с НИП (дальность, азимут, угол места) считаются по следующим формулам:
дальность:

угол места:
азимут:


где:
XspCr, YspCr , ZspCr - координаты и скорости космического аппарата в гринвичской системе координат;
XgrSt, YgrSt , ZgrSt  - координаты и скорости измерительного пункта в гринвичской системе координат (скорости НИП в ГСК обычно равны 0);
   Расчет условий наблюдения ИСС с наземных средств слежения производится на основе моделирования параметров движения КА и контроля входа в зону видимости каждого из заданных НИП, прохождения параметра и выхода из зоны видимости.
Программная реализация:

понедельник, 5 августа 2013 г.

Подключение и работа с БД oracle из Visual Studio

    На этот раз моя задача состояла в том, чтобы написать программу, которая могла бы по запросу извлекать вектор-состояния из базы данных Oracle.
    Скажу сразу, у нас такая задача уже была, но настроена она была под 8-й и 10-й oracle клиенты, и работала с другой базой данных по другой технологии.
    Итак, задача: необходимо получить данные с сервера, на котором установлена СУБД Oracle(версию, честно сказать, не узнавал), используя версию клиента 10 и более, а затем произвести с ними некоторые манипуляции.
    Казалось бы, нет ничего проще, подключаемся к БД, пишем запрос и получаем результат. Однако на практике все может оказаться сложнее. Так как Oracle в отличие от SQL Server автоматически не интегрируется с Visual Studio,придется это делать вручную.
Как обычно решений у этой задачи несколько, но начало у всех одинаково - необходимо установить клиент oracle, благо клиент 10-й версии у меня уже был, и настроить в нем доступ к базе данных. Для этого необходимо найти файл с названием «C:\...\oracle\product\10.2.0\client_1\Network\Admin\tnsnames.ora». И заполнить его согласно образцу:
DEBRIS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.?.???)(PORT = ???))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = debris)
    )
  )

Тут debris – это имя БД. После этого начинаются различия.

понедельник, 24 июня 2013 г.

Database scan with Entity Framework (part 1 monothread)

При работе над одним проектом возникла задача асинхронного сканирования базы данных на предмет появления новых записей с последующей их обработкой. В качестве поставщика данных решено было использовать ORM Entity Framework 5.0, который активно продвигается в Microsoft. Далее рассмотрим основные подходы к использованию EF.
В EF для решения тех или иных задач используется три подхода:
  • Database first;
  • Model first;
  • Code first;
Так как у нас в проекте уже была база данных, написанная на SQL Server, был использован подход Database first. В кратце напомню его суть: по уже готовой базе данных EF строит модель классов, которые содержат ту же логику привязки данных, что и таблицы в базе данных, также создается контекст доступа к ним (класс-наследник от DbSet). Например, у нас есть таблица Engines:

CREATE TABLE Spacecrafts.Engine
 (
 ID_Engine int NULL CONSTRAINT UQ_ID_ENG UNIQUE,
 NameEngine nvarchar(50) NULL,
 Trust real NOT NULL,
 SpecificImpulse real NOT NULL,
 FuelAmount int NULL,
 MaxTimeOfWorking real NULL,
 TypeOfEngine nvarchar(50) NULL,
 Comment nvarchar(150) NULL
 )  ON [PRIMARY]
GO
для которой EF создает класс Engine с соответствующими свойствами:
public class SomeClass 
 public partial class Engine
    {
        public Engine()
        {
            this.SpacecraftCharacteristics = new HashSet();
        }
    
        public int ID_Engine { get; set; }
        public string NameEngine { get; set; }
        public float Trust { get; set; }
        public float SpecificImpulse { get; set; }
        public Nullable FuelAmount { get; set; }
        public Nullable MaxTimeOfWorking { get; set; }
        public string TypeOfEngine { get; set; }
        public string Comment { get; set; }
    
        public virtual ICollection SpacecraftCharacteristics { get; set; }
    }
Далее перейдем к непосредственной работе с этим классом: