软件运行编写好的脚本。
更多关于脚本的介绍可以参考:
HFSS-Help-Contents-Scripting一节,或者点击链接下载
chm或
pdf帮助文件:
https://pan.baidu.com/s/1ht4zhBI
Introduction to VBScript
HFSS uses the Microsoft® Visual Basic® Scripting Edition
(VBScript) scripting language to record macros. VBScript is based
on the Microsoft Visual Basic programming language.
Using scripts is a fast, effective way to accomplish tasks
you want to repeat. When you execute a script, the commands in the
script are performed.
You can write a script using any text editor or you can
record a script from within the HFSS interface. After recording the
script from within HFSS, you can then modify it if necessary using
a text editor.
Although HFSS records scripts in VBScript format, it can also
execute scripts in
JavaScript
TMformat. If you are running a
script from a command prompt, the script can be written in any
language that provides the Microsoft COM methods. The HFSS
scripting documentation refers to VBScript format only.
This chapter provides an overview of key VBScript components.
For more details about VBScript, please see the
Recommended VBScript References section at the
end of this chapter.
——
HFSS Scripting Guide
2.一个最简单的
HFSS脚本
使用
HFSS记录造作到脚本的功能,生成一个最简单的
HFSS脚本文件,具体操作是新建一个
Design
project,选择绘制圆形工具,在
HFSS新建一个圆形
sheet,脚本如下:

在一些特定的场景,事先编写脚本让
HFSS执行相关操作,是非常高效和准确的,可以节省大量的重复性造作;不仅如此,在有些情况下,由于建模过于复杂或者模型变量需要通过第三方优化算法相互调用,那么只能使用编写脚本的方法才能完成。
在这个最简单的脚本中,可以看到即使是新建一个圆面的操作,需要的脚本也是比较多和复杂的,如果手动一行行敲入这些脚本代码,一方面过于冗长难免出现各种错误,另一方面也无法实现提高效率的初衷。
好在前辈们给出了一些简便的方法,可以将重复性的操作变成可以调用的函数,将需要指定的相关参数作为输入,通过相关编程语言自动完成
vbs脚本文件。这些操作可以通过
MATLAB或者
Python完成,本文介绍的
HFSS-MATLAB
API就是通过
MATLAB编写一套可调用的程序库,通过编写
MATLAB代码来生成所需的
vbs脚本。
HFSS脚本:
HFSS-MATLAB API
如前所述,使用
MATLAB编写程序是生成脚本的一个可行的方法,早在
2004年,名为
Vijay
Ramasami
(rvc@ku.edu)的前辈发布了(据我所知)一套基于MATLAB的HFSS-MATLAB
API,已经实现了通过编写MATLAB程序来生成vbs脚本,之后再通过HFSS菜单栏tool-run
script,选择所生成的vbs脚本文件执行。
根据我所下载到的版本,
Yueliang(yue_liang423@163.com)对该API也有贡献(2008年)。然而,上述API实现功能还不够,并且不支持参数化。毕竟时过境迁,HFSS的版本也迭代到了2018,HFSS本身的功能也十分复杂,个人难以开发一个完整脚本接口。但是,HFSS每一步的操作均可以记录到脚本中,你可以将你的操作记录下来然后程序化。
在笔者的工作学习过程中,从发现这个
API之后,就一直在使用这套
API,因为工作的原因需要建模或者联合仿真一些诸如阵列、波导缝隙以及一些特殊类型天线。我在使用中对下载得到的
API做了较大的改动,主要有以下几个方面:
1.
添加定义参数、修改参数;
2.
修改
3dModeler中常见模型建模的函数,使其支持参数化建模;
3.
添加了一些功能。
API结构
3dmodeler中是关于建模的函数,例如建立矩形、圆柱体,以及复制、旋转、布尔加减等等有关
HFSS模型的操作函数。
API的使用
下面以
3dmodeler为例,选择一些函数介绍使用方法。
hfssSphere: Creates the VB
Script necessary to create a sphere in HFSS.
函数如下:

其中
fid是
matlab新建并编辑的
vbs文件
ID,可以通过
fopen命令产生,代表处于编辑中的文件,如下:

可以直接调用,如下:

生成的
vbs脚本如下:

这一段就是生成一个球体所需要的所有脚本,
SphereParametters段说明了球体的尺寸和位置参数,
Attributes说明球体的一些通用属性,如:名字、颜色、透明度、坐标系以及材料,
SolveInside是
HFSS中一个选项,
ture表明在该球体内求解。
这个函数未做过修改,是由原作者
Vijay Ramasami
(rvc@ku.edu)贡献,如果你熟悉matlab语言,你一定非常容易理解。在上面建立球体的过程中,所有的参数都是固定的,如果希望定义一个参变量R1
=
10mm,并将R1作为半径,在新建球体时使用,是不行的。
3.3
参数化
为了参数化建模,添加了两个关键函数:
hfssaddVar(fid,VarName,Vaule,Units)
hfssChangeVar(fid,VarName,Vaule,Units)
分别实现新建变量和修改已有变量。请注意:这里编写的函数并没有检查变量名命名规则,如果使用不恰当的变量名,在编译生成vbs文件时不会报错,但是HFSS执行脚本是会编译出错,例如不能建立与系统内变量重复的名字等。
函数hfssaddVar如下:
做一些简要说明:
输入变量包括文件
ID(
fid)、新建的变量名(
VarName)、变量值(
Vaule)以及单位。这里的变量名是字符变量,变量值可以是数字,也可以是事先在
MATLAB里面定义的变量,这两种情况都是建立一个变量并赋给指定数值;变量值也可以是一个字符串,前提是
HFSS对于
project中以及事先定义好的变量名,也就是新建一个变量等于某个以及存在的变量。如果输入单位
Units为空
[],则意味着无单位变量。
在初始版本的
api中并不支持这种参数化,所有的建立模型函数的输入都是针对数值或者数组类型的输入。在添加了参数化的函数之后,还有对应的修改建模的函数,使其支持参数化,主要是修改输入变量类型,在函数内判断输入是数字还是代表变量名的字符,相应的以
%f或者
%s写入
vbs脚本中。
以建一个盒子为例:
这个函数是根据原有
hfssBox修改的,修改之前输入变量是数值或者数值组成的数组。
修改如下:
首先判断输入变量如
Start(
Box的起始点位置)是否是
cell变量,如果不是强制变为
cell;
以此判断
Start变量中每一个值的类型,如果是数字则按照原有格式在
vbs语句中写入:
fprintf(fid,''XPosition:=','%f%s',
_', Start{1,1}, Units);
如果是字符型变量,则意味着输入为一个变量,此时按照下面个是写入
vbs文件:
fprintf(fid,''XPosition:=','%s',
_',Start{1,1});
以此类推,可以在脚本中定义变量,并在建模时使用变量。所需要的仅仅是按照这种格式简单修改各个函数,使其支持
cell输入,并添加判别输入量是数值还是字符串。
3.4
一个完整的脚本
上面介绍了函数的使用,一个完整的脚本还需要以固定格式的开头片段,所以在编写程序时还需要一个相对比较固定的开始。
下面以建立一个圆喇叭天线为例说明如何通过编写
MATLAB程序生成对应
vbs脚本,完成天线建模、端口设置、添加空气盒子和边界、添加求解等。
该示例的
MATLAB完整程序如下,
m程序源文件和
vbs文件可通过链接下载:
https://pan.baidu.com/s/1smo7Rit
Contents
- Design Variables
- Waveguide
- Horn
- Unit waveguide and horn
- WavePort
- Air box
- fclose
the Conical_Horn antenna
%Insert HFSS design
clear
all; false = 0; true = 1; tmpPrjFile =
'd:\temp\Conical_Horn.hfss'; tmpDataFile =
'd:\temp\tmpData.m'; tmpScriptFile =
'd:\temp\Conical_Horn.vbs';
% HFSS Executable
Path.hfssExePath =
''C:\Program
Files\AnsysEM\HFSS15.0\Win64\hfss.exe''; fid =
fopen(
'D:\temp\Conical_Horn_18GHz.vbs',
'wt');
% 'wt'表示以文本模式打开文件,可写,覆盖原有内容%
创建一个新的工程并插入一个新的设计hfssNewProject(fid); hfssInsertDesign(fid,
'Conical_Horn');
Design Variables
f = 18;
%GHZ
hfssaddVar(fid,
'f0',f,[]) f1 = 14; f2 = 22; lambda_in
=
'1in*300/f0 /25.4';
%英寸为单位的波长Units =
'in'; Waveguide_R = 0.33; Waveguide_L = 0.66; Horn_R =
0.92; Horn_L = 1.31; Wall_T = 0.013;
hfssaddVar(fid,
'lambda_in',lambda_in,[])
hfssaddVar(fid,
'Waveguide_R',Waveguide_R,Units)
hfssaddVar(fid,
'Waveguide_L',Waveguide_L,Units)
hfssaddVar(fid,
'Horn_R',Horn_R,Units)
hfssaddVar(fid,
'Horn_L',Horn_L,Units)
hfssaddVar(fid,
'Wall_T',Wall_T,Units)
Waveguide
Name_1 =
'Waveguide_in'
; Center = [0 0 0]; Axis =
'Z'; Radius =
'Waveguide_R'; Height =
'Waveguide_L';
hfssCylinder(fid, Name_1, Axis, Center, Radius, Height, Units)
Name_2 =
'Waveguide'; Radius =
'Waveguide_R +
Wall_T'; hfssCylinder(fid, Name_2, Axis, Center, Radius,
Height, Units) hfssSubtract(fid, Name_2, Name_1)
Horn
Name_1 =
'Horn_in'
; Center = {0, 0,
'Waveguide_L'}; Axis =
'Z'; Radius =
'Waveguide_R';
hfssCircle(fid, Name_1, Axis, Center, Radius, Units) Name_2 =
'Horn_In_up'; Center = {0, 0,
'Waveguide_L +
Horn_L'}; Axis =
'Z'; Radius =
'Horn_R'; hfssCircle(fid, Name_2, Axis, Center,
Radius, Units) hfssConnect(fid, {Name_1,
Name_2})
%Name_1 =
'Horn'; Center = {0, 0,
'Waveguide_L'}; Axis =
'Z'; Radius =
'Waveguide_R + Wall_T'; hfssCircle(fid, Name_1, Axis,
Center, Radius, Units) Name_2 =
'Horn_up'; Center =
{0, 0,
'Waveguide_L + Horn_L'}; Axis =
'Z'; Radius =
'Horn_R + Wall_T';
hfssCircle(fid, Name_2, Axis, Center, Radius, Units)
hfssConnect(fid, {Name_1, Name_2}) hfssSubtract(fid,
'Horn',
'Horn_in')
Unit waveguide and horn
hfssUnite(fid,
'Horn'
,
'Waveguide') hfssAssignMaterial(fid,
'Horn',
'pec')
WavePort
Name =
'port'
; Center = [0 0 0]; Axis =
'Z'; Radius =
'Waveguide_R'; hfssCircle(fid, Name, Axis, Center,
Radius, Units) hfssAssignWavePort(fid,
'port1', Name,
1, false, [0,0,0], [0,0,0], Units);
Air box
Start_airbox = {
'-lambda_in-Horn_R'
;
'-lambda_in-Horn_R'; 0}; Size_airbox =
{
'lambda_in*2 + Horn_R*2',
'lambda_in*2 +
Horn_R*2',
'lambda_in*2 + Waveguide_L +
Horn_L'}; hfssBox(fid,
'AirBox', Start_airbox,
Size_airbox,Units);
添加辐射边界条件
hfssAssignRadiation(fid,
'Radiation'
,
'Airbox');
%
设置远场球坐标系hfssFarFieldSphere(fid,
'EHPlane',
-180, 180, 1, 0, 90, 90);
hfssFarFieldSphere(fid,
'3D',0,180,1,0,360,1);
%
求解计算hfssInsertSolution(fid,
'solve', f);
hfssSolveSetup(fid,
'solve');
%sweephfssInterpolatingSweep(fid,
'sweep1',
'solve', f1, f2);
fclose
fclose(fid); disp(
'Sctrip Completed'
)
Sctrip Completed
Published with MATLAB® R2015a
打开
HFSS,通过
tool-run
script选择生成的
vbs脚本,运行后可以在
HFSS中看到结果:
4.
一些应用举例
4.1
波导缝隙天线及其阵列
波导缝隙天线是一种经典的天线类型,在矩形波导管的宽边或者窄边沿着纵向有规律的布置缝隙,可以实现良好的辐射特性。缝隙的参数包括缝隙长度、宽度以及偏移量,通过一定的方法可以计算出来的缝隙参数可以实现尖削的电流分布,从而实现诸如泰勒加权来降低旁瓣。更多波导缝隙的相关知识可以查阅相关资料和硕博论文。
波导缝隙天线一般来说,缝隙数量相对较多,波导缝隙的参数计算用编程来计算也相对方便。所以,通过
matlab编写程序计算每个缝隙参数,再通过脚本直接建立模型相对较为方便,程序化之后也方便快速设计不同规模和频段的应用。
作为示例,设计一个泰勒加权的波导缝隙天线,并排组阵形成平面,其中旁瓣抑制
30dB,单根波导上延宽边开
32条缝隙。下面的程序将缝隙参数计算和建模放在一起,注释应该较为详细,请参阅。
Contents
§ initial design
of Slot waveguide
§
Waveguide
§
Slot
§
Waveport
§ add Local
CS
§
array
§
编辑馈电导出增益曲线
§ fclose
关闭文件句柄
%Slot Antenna Array With Wall Type2
clear
all;
%R220(WR42)
a = 10.668;
b = 5.328;
Units =
'mm';
fc = 20; %GHz
C = 3e8;
lambda_m = C/(fc*1e9); %in
mm
lambda = lambda_m*1e3;
N = 32; %slot
number
Wall_T = 1;
%array params
array.num = 8;
array.d = 0;
array.rotate_deg = 0;
disp('Sctrip
Runing')
false = 0;
true = 1;
fileName =
['SlotArray2_',num2str(fc),'G_',num2str(N),'S_',num2str(array.num),'N'];
tmpPrjFile =
['d:\temp\',fileName,'.hfss'];
tmpDataFile =
'd:\temp\tmpData.m';
tmpScriptFile =
['d:\temp\',fileName,'.vbs'];
% HFSS Executable Path.
hfssExePath = ''C:\Program
Files\AnsysEM\HFSS15.0\Win64\hfss.exe'';
fid = fopen(tmpScriptFile,
'wt');
%
'wt'表示以文本模式打开文件,可写,覆盖原有内容
%
创建一个新的工程并插入一个新的设计
hfssNewProject(fid);
hfssInsertDesign(fid, fileName);
initial design of Slotwaveguide
%g(1:N) = 1/N;
lambda_g_m = lambda_m/sqrt(1 -
(lambda_m/(2*a*1e-3))^2);
lambda_g = lambda_g_m*1e3;
L = lambda_g*(N/2+1);
SLL = 30;
%泰勒分布中旁瓣抑制指标
nbar = Taylor_nbar(SLL);
%此处使用了自编Taylor_nbar函数
------
4.2
不等齿深波纹喇叭的建模
理论基础
波纹喇叭具有高增益低副瓣的特点,通过不同形式的喇叭内壁和不等深度的波纹可以实现极低的副瓣电平,详细可以参见文献:
Granet,
C and James, Graeme L., “ Design of corrugated horns: a
primer,”IEEE Antennas and Propagation Magazine, vol. 47, 2005, pp.
76-84.
波纹喇叭的一个设计实例可以参见文献:
Design of a 94 GHz Compact Corrugated Horn
with Ultra-Low Sidelobe.
然而,在对不等齿深波纹喇叭的建模仿真中,是比较困难的,主要表现在:
1.
绘制基于不同方程曲线的喇叭内壁;
2.
大量的不等深度的波纹;
3.
如何实现优化喇叭尺寸时,波纹数量随之一起变化。
以参考文献为例,如图
;
其齿深的变化如图:
喇叭的内壁:
上图是基于正切曲线方程:
常见的内壁曲线有:
对于齿深,不同曲线的不同部位有着不同的选择,文献给出的一个设计参考如下:
建模步骤
一般而言,通过
HFSS的界面操作实现上述几点,十分繁琐,工程量巨大。下面介绍如何通过
HFSS脚本接口来完成不等齿深波纹喇叭的建模。
不等齿深的波纹喇叭建模主要分为以下几个
步骤
:
1.
内壁
先绘制内壁曲线,在将其延
y轴按壁厚复制,将连个曲线连接成平面,将平面绕
Z轴成体;
2.
齿
本文采用绘制出一个个齿对应的圆柱体,将喇叭减去圆柱得到一个个槽。其关键在于不同位置的齿深度不同,也就是对应的圆柱体半径不同,在曲线变化剧烈的部分为了模式变换,此处的齿深度与直线段还不同。
在
MATLAB里面通过循环语句,生成脚本绘制上述圆柱。
3.
喇叭尺寸的变化
在
HFSS中,建立的任何物体,其数量不能改变。例如,复制某个物体,即使在
API中可以将复制的数量参数化,可是一旦通过
HFSS执行之后,物体的个数是不会变化的。
为了实现对喇叭尺寸的优化,折中的办法是生成远远超过所需数量的齿,将喇叭与所有的齿相减,那么相当于不同高度的喇叭中,齿的数量也随之改变。
更复杂的需求是在喇叭口径处在放置一个与内壁曲线相切的一个直线内壁的喇叭,其齿深也随着内径变化。现在问题是如何在两个喇叭的分界面将其刚好连接起来,这里解决办法是将喇叭的高度
L参数设置为齿数与齿周期的乘积,如果需要优化齿数,会产生小数个齿数,这里只需要将
L=int(N)*P即可,其中
P分别是:
程序
该不等齿深波纹喇叭的模型可通过脚本建立,源文件如下:
Contents
§
CreateEquationCurve
1
§
CreateEquationCurve
2
§ tooth
part1
§ tooth
part2
§ tooth
part3
§
fclose
%Corrugated Horn part script
clc
clear
disp('Sctrip
Runing')
false = 0;
true = 1;
fileName = ['Corrugated
HornPart'];
tmpPrjFile =
['D:\temp\',fileName,'.hfss'];
tmpDataFile =
'D:\temp\tmpData.m';
tmpScriptFile =
['D:\temp\',fileName,'.vbs'];
% HFSS Executable Path.
hfssExePath = ''C:\Program
Files\AnsysEM\HFSS15.0\Win64\hfss.exe'';
fid = fopen(tmpScriptFile,
'wt');
%
'wt'表示以文本模式打开文件,可写,覆盖原有内容
%
创建一个新的工程并插入一个新的设计
hfssNewProject(fid);
hfssInsertDesign(fid, fileName);
Units =
'mm';
% a1 = 11.94;
% a2 = 69.3;
K = 10;
----
模型截图
4.3在天线阵列中的应用
在天线阵列中,使用脚本的优势主要在于:
1.
将单元按照特定的需求排布;
2.
对端口数量较多的天线阵列,通过脚本完成
Edit
Source设置不同的幅度和相位组合;
3.
自动批量导出所需的结果,包括图、
csv格式数据等;
4.
通过
MATLAB调用
HFSS仿真,自动导出联合优化;
下面以用
MATLAB编写程序建立一个三维的立体阵为例说明,因为可能不便具体分享,这里不提供代码。
采用三层立体阵结构,顶层采用平面结构,整个阵列类似半球体。为了实现大角度波束覆盖,将天线与顶层之间倾斜一定角度,使得其法向方向指向侧边;另外,为了是波束变化平滑,不至于出现在侧边与顶层夹角处出现凹坑,在侧边排布两圈不同倾角的单元,以实现波束平缓变化。
建模过程主要为分析几何关系,分别添加几个关键的坐标系,并建立起各个变量之间的关系。
在建模之后,需要导出每个阵元在阵列中的方向图,以便后续分析,批量导出的程序提供如下:
Contents
§
head
§
模型参数
§ Edit Source
and export data
§
fclose
%Array 3D Edit sourece and export rE(ang_deg) for each
unit
head
clc
clear
disp('Sctrip
Runing')
false = 0;
true = 1;
fileName =
['3DArray'];
tmpPrjFile =
[pwd,fileName,'.aedt'];
tmpDataFile =
'd:\temp\tmpData.m';
tmpScriptFile =
[pwd,fileName,'Report.vbs'];
DesignName =
'1';
% HFSS Executable Path.
hfssExePath = ''C:\Program
Files\AnsysEM\HFSS15.0\Win64\hfss.exe'';
fid = fopen(tmpScriptFile,
'wt');
%
'wt'表示以文本模式打开文件,可写,覆盖原有内容
hfssOpenProject(fid, tmpPrjFile,DesignName);
模型参数
fc = 8.3;
array.num = 31;
Edit Source and export data
path =
[pwd,'/CSV/'];
mkdir(path);
Phase = zeros(array.num, 1);
SourceName = cell(array.num, 1);
for i = 1:array.num
SourceName{i,1} =
[num2str(i)];
end
hfssSetWCS(fid,
'Global')
for i = 1:array.num
Mag = zeros(array.num,
1);
Mag(i) = 1;
hfssEditSources(fid, array.num,
SourceName, Mag, Phase);
fileName_Path = [path,
['rE(ang_deg)_',num2str(i)],'.csv'];
hfssCreateReportFF(fid,
1,['rE_',num2str(i)], {},
'Infinite
Sphere2','rERHCP','ang_deg',fc);
hfssExportToFile(fid,
['rE_',num2str(i)],
fileName_Path)
hfssCreate3DGainReport(fid,
['3D_',num2str(i)], {},
'Infinite Sphere2',
fc);
fileName_Path = [path,
['3D_',num2str(i)],'.csv'];
hfssExportToFile(fid,
['3D_',num2str(i)],
fileName_Path)
end
fclose
fclose(fid);
disp(tmpScriptFile)
disp('Sctrip
Completed')Published
with MATLAB® R2015a
5.致谢
首先对
HFSS MATLAB API的作者
Vijay Ramasami
(rvc@ku.edu)表示感谢,对Yueliang
(yue_liang423@163.com)的相关贡献表示感谢。
其次对工作以来,对我予以帮助的同事表示感谢,特别是:周祝明、费冬亮,感谢周让我了解到有这么高效的脚本接口存在,感谢费在一起工作时提供的帮助和建议。
最后也十分感谢工作的单位和相关领导,如果没有相关项目需求,我想我也不会去学习和修改这一套
API。
本文除已说明和致谢外,均为原创,未经本人同意,严禁擅自发表,包括但不限于微信、微博公共号或网站和论坛。如有需求请与本人联系。
相关资源已经上传至
Github,地址为:
https://github.com/WoodyBuendia/HFSS-MATLAB-API.git
吴 迪
woodybuendia@gmail.com
tinywoody@126.com
20180226 于上海