-
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.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] 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ОПЕРАТОР УСЛОВИЯ
Синтаксис:
Код: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 }
Код:' # 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]. После чего указанные преобразования будут выполняться относительно указанной точки.
Область действия оператора определяется текущей областью видимости. При этом оператор воздействует на все определенные точки от начала указанной области до самого оператора.
Например:
Код: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 через пробел перечисляем параметры для передачи:
Код: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.
|
Социальные закладки