-
16.08.2019, 00:21 #1
ANT Язык описания антенн
ОБОСНОВАНИЕ
Язык описания антенн ANT призван закрыть соответствующую нишу при моделировании проволочных антенн. Конечно, в большинстве случаев можно вполне обойтись существующими способами представления, такими как *.MAA, *.NEC и др. Но при моделировании сложных антенн состоящих из множества однотипных элементов давно просится язык позволяющий описывать антенны и манипулировать их геометрией. Конечно, можно сгенерировать антенну любой сложности на традиционном языке программирования, таком как C, C++, C# .. Есть масса графических средств на эту же тему. ANT это некоторая альтернатива между графикой, низкоуровневым кодированием (*.MAA, *.NEC) или прямым программированием на традиционных языках (С, С++, ..). Его преимущества: 1) Читаемость-наглядность; 2) Отсутствие тавтологий. 3) Свободный стиль изложения. 4) Комбинируемость элементов.
СКАЧАТЬ >>> ANT2.ZIP <<< СКАЧАТЬПоследний раз редактировалось Redoutable; 16.08.2019 в 15:51.
-
16.08.2019, 00:24 #2ЗАПУСК КОМПИЛЯТОРАКод:
ant.exe --help Usage: ant.exe fname.ant [parms] [options] fname.ant: имя вх.файла parms: параметры для главной функции ant (p0, p1, ...) options: -b --BOM добавить в начало вых.файла Byte Order Mark; -c --com= уровень передачи комментариев: {0-без комментариев, 1-однострочный, 2-многострочный}; -d --dec= кодовая страница для вх.файла 65001(UTF-8) - по умолчанию; -e --enc= кодовая страница для вых.файла 65001 - по умолчанию; -f --fmt= формат выходного файла {maa/nec}; -h --help данный хэлп; -o --out= имя вых.файла (или по умолчанию будет "имя вх.файла" + ".nec/.maa").
-
16.08.2019, 00:28 #3HELLO ANT!
Создаем файл с именем hello.ant так:
или так:Код:ant() { <[1,2,3][4,5,6][7,8,9]> }
Запускаем компиляцию и смотрим результат:Код:ant() { < [1,2,3] [4,5,6] [7,8,9] > }
ANT оперирует такой категорией как ТОЧКА, которая обозначается квадратными скобками так: [x,y,z]. Другая категория языка - ПРОВОД состоящий из последовательности точек заключенных в < скобки >. В приведенном выше примере hello.ant провод задан 3-мя точками. Остальные значения такие как радиус провода и сегментация определяются по умолчанию. Но при необходимости могут быть переопределены в любой момент:Код:ant.exe hello.ant --fmt=nec ' # S X0 Y0 Z0 X1 Y1 Z1 R GW 1 53 1 2 3 4 5 6 0.001 GW 2 53 4 5 6 7 8 9 0.001 ant.exe hello.ant --fmt=maa *** X1 Y1 Z1 X2 Y2 Z2 R S 1, 2, 3, 4, 5, 6, 0.001, 53 4, 5, 6, 7, 8, 9, 0.001, 53
Разделять операторы точками с запятой ( ; ) совершенно не обязательно. Они используются исключительно для повышения читаемости кода. Особенно это может быть полезно когда операторы расположены в одну строчку.Код:ANT () { RADIUS = 0.001; SEGMENT = 0.2; ... }Последний раз редактировалось Redoutable; 16.08.2019 в 01:18.
-
16.08.2019, 00:30 #4КОММЕНТАРИИ
В любое место (между лексемами) могут быть вставлены комментарии:
# Однострочный комментарий начинается с символа #-диез и продолжается до конца строки "\r\n".
/*
МНОГО-
СТРОЧНЫЙ КОММЕНТАРИЙ
обозначается так
*/
-
16.08.2019, 00:33 #5ПЕРЕМЕННЫЕ/ТОЧКИ
В ANT любая переменная или константа это вектор [x,y,z]. Даже если она выглядит как скаляр (например: A = 1) это все равно вектор (предполагает: A = [1,1,1]). Она определяется с момента его первого вхождения в левой части оператора присваивания (как в Бейсике). Любая переменная это есть точка с 3-мя координатами. Значение переменной/точке присваивается векторным или скалярным выражением:
Максимальная длина имени не ограничена. При назначении имен переменным возможно использование символов национального алфавита:Код:T1 = [1,2,3] # вектор T2 = 1 # скаляр (эквивалентно T2 = [1,1,1]) ALFA = [1+2,3,4] # итого: ALFA = [3,3,4] BETA = [1,2,3] + 4 * 5 # эквивалентно BETA = [1,2,3] + [4,4,4] * [5,5,5] = [1+4*5,2+4*5,3+4*5] = [21,22,23]
Верхний и нижний регистры не различаются:Код:ДЛИНА_ПРОВОДА = 15
А теперь рассмотрим более практический пример:Код:Длина_Провода = 15 # эквивалентно: ДЛИНА_ПРОВОДА = 15
Получаем:Код:# Вертикальный крест с приподнятыми концами на ножке ANT() { H = 10 # высота D = 1 # отступ GND = [0,0,0] # земля CROSS = [0,0,H] # верхняя точка пересечения < GND CROSS > # ножка <[-D,0,H+1] CROSS [+D,0,H+1]> # вдоль <[0,-D,H+1] CROSS [0,+D,H+1]> # и поперек }
Код:' # S X0 Y0 Z0 X1 Y1 Z1 R GW 1 101 0 0 0 0 0 10 0.001 ' ножка GW 2 15 -1 0 11 0 0 10 0.001 ' вдоль GW 3 15 0 0 10 1 0 11 0.001 GW 4 15 0 -1 11 0 0 10 0.001 ' поперек GW 5 15 0 0 10 0 1 11 0.001
Последний раз редактировалось Redoutable; 16.08.2019 в 12:43.
-
16.08.2019, 00:36 #6ОБЛАСТЬ ВИДИМОСТИ ПЕРЕМЕННЫХ
Область видимости обозначается { фигурными скобками } и определяет видимость переменных. Переменная определенная во внутренней области невидима во внешней.
Код:ANT() { A = 1 { B = 2 C = A + B } D = A * B # Ошибка! Переменная B невидима на этом уровне! }Последний раз редактировалось Redoutable; 16.08.2019 в 01:21.
-
16.08.2019, 00:37 #7ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ
В ANT имеется механизм ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ, синтаксис которого следующий:
Такой механизм принят, в основном для локального переопределения радиуса провода и сегментации.Код:ANT() { A = 1 < A 0 > # получим <[1,1,1][0,0,0]> { $ A = 2 # символ $ определяет локальную переменную, а старую загоняет в стек. < A 0 > # получим <[2,2,2][0,0,0]> } { < A 0 > # получим <[1,1,1][0,0,0]> } < A 0 > # получим <[1,1,1][0,0,0]> }
Код:ANT() { RADIUS = 0.001 < 0 1 > # здесь радиус провода 0.001 { $ RADIUS = 0.002 < 2 3 > # здесь радиус провода 0.002 } < 4 5 > # здесь снова радиус провода 0.001 }Последний раз редактировалось Redoutable; 16.08.2019 в 01:43.
-
16.08.2019, 00:39 #8ОПРЕДЕЛЕНИЕ ИСТОЧНИКОВ И НАГРУЗОК
Источники задаются оператором SOURCE (позиция, амплитуда, фаза) примерно так:
Здесь источник включен в отрезок определяемый точкой [1,2,3] и точкой [4,5,6] в позиции = 0.5 (ровно по-середине), амплитуда = 1V, фаза = 0° Если надо задать позицию источника ближе к началу отрезка указываем значение ближе к 0.0, к концу отрезка - ближе к 1.0Код:<[1,2,3] SOURCE (0.5,1,0) [4,5,6] .. >
Нагрузки задаются оператором LOAD (позиция, R, jX) следующим образом:
При желании в любой межточечный промежуток можно поместить сколько угодно источников и нагрузок:Код:<[1,2,3] LOAD (0.25,1,2) [4,5,6] .. >
Код:<[1,2,3] LOAD (0.25,1,2) SOURCE (0.5,1,0) LOAD (0.75,1,2) .. [4,5,6] .. >
Последний раз редактировалось Redoutable; 16.08.2019 в 00:59.
-
16.08.2019, 00:41 #9ОПЕРАТОР ПОВТОРА
Синтаксис:
Пример:Код:REPEAT (exp) # Где exp - выражение определяющее сколько раз повторить цикл { ... }
Получим:Код:ANT () { I = 0 REPEAT (1+1) { J = 10 REPEAT (3) { < I J > J = J + 1 } I = I + 1 } }
Код:# S X0 Y0 Z0 X1 Y1 Z1 R GW 1 173 0 0 0 10 10 10 0.001 GW 2 191 0 0 0 11 11 11 0.001 GW 3 209 0 0 0 12 12 12 0.001 GW 4 157 1 1 1 10 10 10 0.001 GW 5 173 1 1 1 11 11 11 0.001 GW 6 191 1 1 1 12 12 12 0.001
Последний раз редактировалось Redoutable; 16.08.2019 в 00:58.
-
16.08.2019, 00:44 #10ОПЕРАТОР УСЛОВИЯ
Синтаксис:
Здесь такая особенность. В then-ветке и else-ветке видимость переменных не изменяется. Это сделано для того чтобы операторы преобразования координат внутри веток могли оперировать внешним окружением. При необходимости создать локальную область видимости внутри THEN/ELSE используйте {}-скобки.Код:IF условие THEN then-ветка [ELSE else-ветка] FI
Пример:
Получим:Код:ANT() { IF 1 << 2 THEN <999 1> ELSE <999 (-1)> FI IF 1 >> 2 THEN <999 2> ELSE <999 (-2)> FI IF true THEN <999 5> <999 6> FI }
В конструкции IF допустимы следующие операторы сравнения:Код:' # S X0 Y0 Z0 X1 Y1 Z1 R GW 1 17287 999 999 999 1 1 1 0.001 GW 2 15415 999 999 999 -2 -2 -2 0.001 GW 3 17217 999 999 999 5 5 5 0.001 GW 4 17217 999 999 999 6 6 6 0.001
- == Равно
- <> Не равно
- << Больше (сделаны двойными чтобы не путать с <..> скобками)
- >> Меньше
- <= Больше или равно
- >= Меньше или равно
и операторы исчисления логики:
- NOT инверсия
- AND конъюнкция
- OR дизъюнкция
- XOR исключающее или
Приоритетность операторов традиционная: 1) Сначала скобки; 2) Затем унарный (+,-); 3) Далее арифметические; 4) Инверсия; 5) Конъюнкция; 6) и наконец Дизъюнкция-Исключающее ИЛИ.
Да. Арифметика псевдо-векторная, типа: [1,2,3] + [4,5,6] = [1+4, 2+5, 3+6]. Почему псевдо? Потому что умножение и деление выполняются по тому же принципу: [1,2,3] * [4,5,6] = [1*4, 2*5, 3*6].Последний раз редактировалось Redoutable; 16.08.2019 в 01:25.
-
16.08.2019, 00:48 #11ОПЕРАТОРЫ ГРУППОВОГО ПРЕОБРАЗОВАНИЯ КООРДИНАТ
В ANT встроены следующие операторы группового преобразования координат:
- MOVE (dx, dy, dz) - смещение на указанную величину: [x, y, z] + [dx, dy, dz] = [x + dx, y + dy, z + dz]
- SCALE (mx, my, mz) - умножение на указанную величину: [x, y, z] * [mx, my, mz] = [x * mx, y * my, z * mz]
- ROTATE (ax, by, cz) - поворот вокруг оси OX на угол ax, потом поворот вокруг оси OY на угол by, потом поворот вокруг оси OZ на угол cz (крен, тангаж, рысканье).
- ROTATE ([vx, vy, vz], a) - поворот вокруг заданного вектора [vx, vy, vz] на угол a (Квантернион).
Операторы SCALE и ROTATE по умолчанию выполняются относительно начала координат. Однако, возможно переопределить системную переменную CENTER = [x,y,z]. После чего указанные преобразования будут выполняться относительно указанной точки.
Область действия оператора определяется текущей областью видимости. При этом оператор воздействует на все определенные точки от начала указанной области до самого оператора.
Например:
Здесь оператор MOVE (dx,dy,dz) воздействует на провода < t3 t4 .. > и < t5 t6 .. > Провод < t1 t2 .. > и < t9 t10 .. > находятся вне области видимости. Провод < t7 t8 .. > тоже, т.к. к моменту исполнения оператора еще не определен. Оператор SCALE (1,1,-1) воздействует на все провода кроме < t9 t10 .. >.Код:ANT() { < t1 t2 .. > { ### начало локальной области видимости < t3 t4 .. > < t5 t6 .. > MOVE (dx,dy,dz) # действует на < t3 t4 .. > и < t5 t6 .. > < t7 t8 .. > } ### конец локальной области видимости SCALE (1,1,-1) # действует на всех кроме < t9 t10 .. > < t9 t10 .. > }
-
16.08.2019, 00:49 #12ВСТРОЕННЫЕ ФУНКЦИИ
- Функции одного аргумента: ABS, ACOS, ASIN, ATAN, CEIL, COS, EXP, FLOOR, LOG, LOG10, ROUND, SIN, SQR, TAN.
- Функции 2-х аргументов: POW, MOD.
- Функции с переменным числом аргументов: MAX, MIN.
-
16.08.2019, 00:51 #13ПРЕДОПРЕДЕЛЕННЫЕ ПЕРЕМЕННЫЕ
Во всех режимах действуют:
- CENTER = [0, 0, 0] Центр относительно которого выполняются операции ROTATE и SCALE.
- FREQUENCY = [1, 0, 0] Частота, Шаг частоты, Число шагов для NEC [MHz].
- GROUND = [0, 0, 0] Тип земли, Диэлектрическая проницаемость, Проводимость.
- SEGMENT = [0.1, 0.1, 0.1] Длина сегмента [в метрах].
- RADIUS = [0.001, 0.001, 0.001] Радиус провода [в метрах].
- PI = [3.14.., 3.14.., 3.14..] Математическая константа.
В режиме --fmt=MAA также действуют:
- MAA_DM1DM2SC = [800,80,2] DM1 - if (Seg == -1) Lw / DM2 .. Lw / DM1 от середины к краям //Seg == -2 только с начала //Seg == -3 только с конца; DM2 - if (Seg == 0) Lseg = Lw / DM2; SC - множитель уплотнения (1..64)
- MAA_ECHM = [2, 0, 0] EC - с какого расстояния от края провода начнется уплотнение 1.001-сразу с середины .. 3.0-без уплотнения; H - Высота [в метрах]; M = {0 .. 6} Материал [Пункт меню в MMANA].
- MAA_RjX = [0, 0, 0] Сопротивление нагрузки R, jX
- MAA_AzEl = [0, 0, 0] Азимут, Элевация
Все эти переменные могут быть в любой момент переопределены. Даже PI.Последний раз редактировалось Redoutable; 16.08.2019 в 01:04.
-
16.08.2019, 00:53 #14ПЕРЕДАЧА ВНЕШНИХ ПАРАМЕТРОВ
В ANT-е реализован следующий механизм передачи параметров компилятору:
Запускаем компилятор где после исходного fname.ant через пробел перечисляем параметры для передачи:
В самом fname.ant в функции ant() делаем заголовок cо списком параметров:Код:ant.exe fname.ant 1 2 3 ...
Также, возможно определение значений по умолчанию.Код:ANT (P1, P2, P3) { < [P1, 2 + P2, 3 * P3] [4,5,6] .. > # и далее используем полученные значения }
В этом случае если в списке параметров отсутствуют соответствующие значения, они принимаются по умолчанию. Если значение по умолчанию не задано, оно принимается равным нулю.Код:ANT (F = 15, D = 1) { LW = 300 / F # длина волны D ... # - плечо вибратора ... }
- ant.exe fname.ant 111 222 # F=111; D=222
- ant.exe fname.ant 333 # F=333; D=1
- ant.exe fname.ant # F=15; D=1
Последний раз редактировалось Redoutable; 16.08.2019 в 01:48.
-
16.08.2019, 00:54 #15
ЧИТАТЬ С НИЗУ-ВВЕРХ
Последний раз редактировалось Redoutable; 16.08.2019 в 01:33.
|
|

32Спасибо
URL обратной ссылки
Подробнее про обратные ссылки












Ответить с цитированием

Социальные закладки