Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
 Аватар для kirpo
0 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 86

ПО для РЛС

09.03.2016, 11:49. Показов 10818. Ответов 153

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Задача состоит в следующем: тема диплома: "Автоматизация настройки радиолокационных станций контроля надводной обстановки". Так как внедриться в ПО РЛС не представляется возможным, хочу написать симулятор или эмулятор, если так можно выразиться, интерфейса РЛС КНО. Хочу сделать это на Delphi. Собственно проблема состоит в реализации самого интерфейса (типа антенна крутится, цели появляются, присутствуют шумы и т. д.).

Заранее спасибо за помощь любого характера!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.03.2016, 11:49
Ответы с готовыми решениями:

Создать программно-математический комплекс для осуществления имитации обнаружения цели посредством РЛС
Летит самолет по известному закону. Предположительный закон движения цели прямолинейно равномерный. Для перехвата цели с аэродрома движется...

Задача РЛС
Доброго времени суток. Буду признателен, если кто-нибудь поможет с данной задачей или направит в правильное русло для поиска ее решения: ...

Моделирование РЛС
Здравствуйте. Есть задача смоделировать РЛС. Вопрос такой: с помошью какого тулбокса это будет проще всего сделать?

153
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.04.2016, 13:25
Студворк — интернет-сервис помощи студентам
Delphi
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
unit uMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
type
  TForm13 = class(TForm)
    PaintBox1: TPaintBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
   Center: TPoint;
   Radius: Integer;
   D: Double;
   Angle: Integer;
   Map: TBitmap;
   Buffer: TBitmap;
  public
  end;
 
var
  Form13: TForm13;
 
implementation
 
{$R *.dfm}
 
procedure TForm13.FormCreate(Sender: TObject);
begin
 Map := TBitmap.Create;
 Map.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Map.bmp');
 Buffer := TBitmap.Create;
 Buffer.Width := Map.Width;
 Buffer.Height := Map.Height;
 Center := Point(PaintBox1.Width shr 1, PaintBox1.Height shr 1);
 Radius := Center.X-1;
 D := Pi/180;
 Angle := 360;
 Timer1.Enabled := True;
end;
 
procedure TForm13.Timer1Timer(Sender: TObject);
Var
   Marker: TPoint;
   R: Integer;
begin
 Buffer.Canvas.Draw(0, 0, Map);
 Inc(Angle);
 if Angle > 360 then Angle := 0;
 for R := 0 to Radius
 do begin
    Marker.X := Round(Center.X + R * Sin(Angle * D));
    Marker.Y := Round(Center.Y - R * Cos(Angle * D));
    if Map.Canvas.Pixels[Marker.X, Marker.Y] <> clWhite
    then Buffer.Canvas.Pixels[Marker.X, Marker.Y] := clRed
    else Buffer.Canvas.Pixels[Marker.X, Marker.Y] := clMedGray;
    end;
 PaintBox1.Canvas.Draw(0,0, Buffer);
end;
 
end.
0
 Аватар для kirpo
0 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 86
03.04.2016, 14:25  [ТС]
Пытливый, а каким образом Вы пытались добавить объекты к этой обстановке? Вы представляете на основе чего в РЛС рисуется обстановка?
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.04.2016, 15:19
Это не столь важно. Нужен был просто перемещающийся по карте объект, который бы попадая под луч вызывал ответную реакцию. А делал я его вот как:
Delphi
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
unit uMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
type
  TObj = record
   Position: TPoint;
   Direct: record DX,DY: Integer; end;
   StepCount: Integer;
  end;
 
  TForm13 = class(TForm)
    PaintBox1: TPaintBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
   Center: TPoint;
   Radius: Integer;
   D: Double;
   Angle: Integer;
   Map: TBitmap;
   Buffer: TBitmap;
  public
   Obj: Array[1..3] of TObj;
  end;
 
var
  Form13: TForm13;
 
implementation
 
{$R *.dfm}
 
procedure TForm13.FormCreate(Sender: TObject);
var
  i: Integer;
begin
 Map := TBitmap.Create;
 Map.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Map.bmp');
 Buffer := TBitmap.Create;
 Buffer.Width := Map.Width;
 Buffer.Height := Map.Height;
 Center := Point(PaintBox1.Width shr 1, PaintBox1.Height shr 1);
 Radius := Center.X-1;
 D := Pi/180;
 Angle := 360;
 for i := Low(Obj) to High(Obj) do Obj[i].Position := Center;
 Timer1.Enabled := True;
end;
 
procedure TForm13.Timer1Timer(Sender: TObject);
Var
   Marker: TPoint;
   R: Integer;
   i: Integer;
begin
 Buffer.Canvas.Draw(0, 0, Map);
 
 for i := Low(Obj) to High(Obj)
 do begin
    if Obj[i].StepCount = 0
    then begin
         Obj[i].StepCount := Random(10);
         Obj[i].Direct.DX := -1 + Random(3);
         Obj[i].Direct.DY := -1 + Random(3);
         end;
    Obj[i].Position.X := Obj[i].Position.X + Obj[i].Direct.DX;
    Obj[i].Position.Y := Obj[i].Position.Y + Obj[i].Direct.DY;
    Dec(Obj[i].StepCount);
    Buffer.Canvas.Pixels[Obj[i].Position.X, Obj[i].Position.Y] := clBlue;
    end;
 
 Inc(Angle);
 if Angle > 360 then Angle := 0;
 for R := 0 to Radius
 do begin
    Marker.X := Round(Center.X + R * Sin(Angle * D));
    Marker.Y := Round(Center.Y - R * Cos(Angle * D));
    if Map.Canvas.Pixels[Marker.X, Marker.Y] <> clWhite
    then Buffer.Canvas.Pixels[Marker.X, Marker.Y] := clRed
    else Buffer.Canvas.Pixels[Marker.X, Marker.Y] := clMedGray;
    end;
 PaintBox1.Canvas.Draw(0,0, Buffer);
end;
 
end.
У меня тут создается 3 объекта, которые начинают двигаться от центра радара. И первое время они правильно ведут себя, а потом вдруг разбегаются в разные стороны

Добавлено через 6 минут
Забавно, что если количество их увеличить до перелетного стада голов этак в 200, часть из них оседает навечно, а все остальные улетают в разные стороны.

Добавлено через 20 минут
Вот добавил обнаружение объекта:
Delphi
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
32
33
34
35
36
37
38
procedure TForm13.Timer1Timer(Sender: TObject);
Var
   Marker: TPoint;
   R: Integer;
   i: Integer;
begin
 Buffer.Canvas.Draw(0, 0, Map);
 Randomize;
 for i := Low(Obj) to High(Obj)
 do begin
    if Obj[i].StepCount = 0
    then begin
         Obj[i].StepCount := Random(10);
         Obj[i].Direct.DX := -1 + Random(3);
         Obj[i].Direct.DY := -1 + Random(3);
         end;
    Obj[i].Position.X := Obj[i].Position.X + Obj[i].Direct.DX;
    Obj[i].Position.Y := Obj[i].Position.Y + Obj[i].Direct.DY;
    Dec(Obj[i].StepCount);
    Buffer.Canvas.Pixels[Obj[i].Position.X, Obj[i].Position.Y] := clBlue;
    end;
 
 Inc(Angle);
 if Angle > 360 then Angle := 0;
 for R := 0 to Radius
 do begin
    Marker.X := Round(Center.X + R * Sin(Angle * D));
    Marker.Y := Round(Center.Y - R * Cos(Angle * D));
 
    if Buffer.Canvas.Pixels[Marker.X, Marker.Y] = clBlue
    then Memo1.Lines.Add(Format('%d:%d',[Marker.X,Marker.Y]));
 
    if Map.Canvas.Pixels[Marker.X, Marker.Y] <> clWhite
    then Buffer.Canvas.Pixels[Marker.X, Marker.Y] := clRed
    else Buffer.Canvas.Pixels[Marker.X, Marker.Y] := clMedGray;
    end;
 PaintBox1.Canvas.Draw(0,0, Buffer);
end;
0
 Аватар для kirpo
0 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 86
03.04.2016, 15:47  [ТС]
Пытливый, ой, учитывая мой опыт программирования, мне сложно сразу разобраться в таком количестве кода
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.04.2016, 15:54
А вы просто заменяйте в моем исходном проекте старые процедуры на те что я публикую.
Вот нашел в чем косяк с объектами. Теперь они нормально тусуются.
Финальный проектик.
Вложения
Тип файла: rar Radar.rar (15.3 Кб, 21 просмотров)
0
 Аватар для kirpo
0 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 86
03.04.2016, 16:11  [ТС]
Пытливый, что-то он у меня не компилируется

Добавлено через 3 минуты
А всё, получилось

Интересная задумка, только вот как-нибудь бы заставить их на "море" тусоваться, а не на суше
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.04.2016, 16:16
В принципе можно, но пока это просто этакая проверка работы радара Ему то по сути до лампочки, надводный это объект или не очень.
0
 Аватар для kirpo
0 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 86
03.04.2016, 16:17  [ТС]
Пытливый, ну да я так и понял.

Вы прочли л/с?
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
03.04.2016, 17:33
Цитата Сообщение от Пытливый Посмотреть сообщение
В принципе можно, но пока это просто этакая проверка работы радара
Разве что игрушечного. Не реально в игрушках они именно так и делаются.
Цитата Сообщение от Пытливый Посмотреть сообщение
Ему то по сути до лампочки, надводный это объект или не очень.
Только с одной очень существенной разницей. Реальная РЛС дает не векторные координаты объектов, а массив с полярными координатами (по одной размерности дистанция по другой азимут), в котором в значении пикселя интенсивность отражения.
0
 Аватар для kirpo
0 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 86
03.04.2016, 18:20  [ТС]
Вот немножко допилил "РЛСку".

При запуске массив заполняется случ. числами до 10.
Если в Гриде наделать областей со значениями сильно превышающими 10, то можно задать цели, которые появятся в Image справа при отрисовке (только надо не забыть нажать кнопку "Ввести данные в массив")
Вложения
Тип файла: rar RLS.rar (205.3 Кб, 15 просмотров)
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.04.2016, 21:09
Включите DblBuffer для формы и таймер до 1 уменьшите.
0
 Аватар для kirpo
0 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 86
03.04.2016, 22:08  [ТС]
Пытливый, DblBuffer, как я понял, чтобы TImage не мерцал? Как его включить?
Зачем уменьшать таймер?
0
 Аватар для kirpo
0 / 0 / 0
Регистрация: 09.03.2016
Сообщений: 86
03.04.2016, 22:12  [ТС]
Доделал ещё регулировку порога и автоустановку порога:
Вложения
Тип файла: rar RLS.rar (212.0 Кб, 22 просмотров)
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
03.04.2016, 22:47
Зачем таймеру такая задержка? Смысл? А свойство DoubleBuffered у формы есть, она и мерцать не будет и пошустрее рисоваться будет.
0
192 / 128 / 52
Регистрация: 19.01.2010
Сообщений: 518
03.04.2016, 23:28
Почитал тему по-диагонали. У меня такие мысли: приложуха многопоточная, каждый эмулятор в своем потоке. Но лучше наврено 3 разных проги под каждый эмулятор, общалку по udp протоколу организовать(хотя гемора будет много с форматом пакетов, разбиением пакетов, сборкой пакетов, потерей пакетов). Начать с эмулятора передачика, как я понимаю он задаст обстановку и сгенерит отраженный от объекта сигнал в виде массива умп, массив передается в обработчик, в нем из умп выделяется полезный сигнал амплитyдным накоплением, делается сжатие сигнала и считается порог от него. Что выше порога - цель, там 3 точки получатся с известными амплитудами и дистанциями. Вот эту инфу уже в приемник и рисовать, по амплитуде можно задать градиент (от синего до красного цвета) - видео готово. Синхронизация азимута напрямую из передачика в приемник, минуя обработчик. Без многопотока тут не обойтись, даже в рамках одного эмулятора. Как-то так)
0
 Аватар для batonn
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 7
04.04.2016, 14:32
Будет мерцать все равно. Рисуй в PaintBox'e или на промежуточном битмапе. Но через битмап ты не выведешь с нужной скоростью. Я сам подобное делал http://batonnsoft.96.lt/video.php
Вставил в твой код PaintBox - ничего не мерцает.

Добавлено через 1 час 1 минуту
И еще, скажу что идеологически неверно связывать в таймере обработку и вывод на экран.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Timer1Timer(Sender: TObject);
var
  da:Integer;
  x,y,az_rad_az:Double;
begin
  if az=1024 then az:=0
  else begin
      for da := 0 to 3199 do
    begin
      az_rad_az := az_rad_ed * az;
      x := x0 + (da * (Sin(az_rad_az)));
      y := y0 - (da * (Cos(az_rad_az)));
      //Image1.Canvas.Pixels[Round(x), Round(y)] := ColCalc(table, az + 1, da + 1);
      PaintBox1.Canvas.Pixels[Round(x), Round(y)] := ColCalc(table, az + 1, da + 1);
    end;
  az:=az+1;
  end;
 
end;
При скоростях надводных объектов это может и не так страшно, но для воздушных целей будет заметно отставание обстановки от реальности. События таймера будут ставиться в общую очередь сообщений. Обстановку нужно обрабатывать в отдельном потоке. А таймер хорош для вывода. Он не даст упасть программе.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
04.04.2016, 15:25
таймер при этом должен на время рисования ставить семафор, что данные читаются, поэтому поток, который их собирается сейчас писать, должен подождать...
0
 Аватар для batonn
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 7
04.04.2016, 15:32
ИМХО Вот так и возникнет отставание. От таймера наоборот нужно отвязаться, что и есть в действительности. Движение целей независимо от нашей РЛС. Попробуй использовать мультимедийный таймер для обработки движения. Он там сам засемафорит что нужно.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
04.04.2016, 15:45
чоо?
рисование всяко должно базироваться на каких-то данных
и также всяко оно занимает время, в течение которого данные не должны меняться.
в это время параллельным потоком можно читать, создавать, запоминать данные, но только не в то место, где работает чтение.

мультимедийный таймер просто чаще срабатывает, но чаще рисования ему срабатывать и не нужно ))
отлично подойдет и событие Application.OnIdle
0
 Аватар для batonn
0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 7
04.04.2016, 15:52
Цитата Сообщение от krapotkin Посмотреть сообщение
чоо?
рисование всяко должно базироваться на каких-то данных
и также всяко оно занимает время, в течение которого данные не должны меняться.
в это время параллельным потоком можно читать, создавать, запоминать данные, но только не в то место, где работает чтение.
мультимедийный таймер просто чаще срабатывает, но чаще рисования ему срабатывать и не нужно ))
отлично подойдет и событие Application.OnIdle
Ну не просто чаще - попробуй в нем рисовать, я пробовал.
Частота повторения РЛС это по крайней мере сотни герц, так что нужно срабатывать чаще.
ОнАйдл не подойдет. Первично движение целей, рисование - ВТОРИЧНО.
Все проверено на практике.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2016, 15:52

РЛС складов УПП
ковырял RLS для упп везде вродебы все работает, за исключением разграничения справочника складов. ставлю в группе ограничение только на...

Модель сигнала многофункциональной РЛС
Необходимо создать модель сигнала многофункциональной РЛС а Матлаб с возможностью выделения огибающей (вейвлет анализ)!!! Помогите...

Индикатор кругового обзора РЛС
Помогите пожалуйста разработать программную модель индикатора кругового обзора РЛС для следующих исходных данных: -разметка ИКО в...

Отображение круговой развёртки РЛС
Здравствуйте! Мне необходима программа, которая имитирует отображение круговой развёртки радиолокационной станции об окружающей обстановке,...

Модель сигнала многофункциональной РЛС
Необходимо создать модель сигнала многофункциональной РЛС с возможностью выделения огибающей (использовать вейвлеты) Очень нужно, помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru