写在前面的话
时隔两周,我又回来啦!这次主要带来一个在软件学习过程中的一个额外收获,就是基于Matlab创建天线阵的方法。其实HFSS自带的3D模型创建已经可以满足日常使用所需,但是在一些特殊结构(比如满足某个函数的天线阵列)的创建中,建模的操作会变得无比繁琐。这时候就不得不提到HFSS的脚本文件vbs了。我们可以使用Matlab丰富的库函数来帮助我们生成vbs文件,然后在HFSS中将模型快速的建立。
有关的资料和视频链接
这边推荐一下B站up主shygeyang的视频,我也是从这里面了解到这个的:
MATLAB,HFSS, API表面阵列的设计: link.
视频中提到的吴迪(无敌?)大佬的文件:link.
视频中up主的演示文件:link
关于脚本文件vbs
VBScript 是 Microsoft Visual Basic Script Edition 的缩写,是微软公司可视化 BASIC的脚本版。而VBS是VBScript的简写。是基于 Visual Basic 的脚本语言设计的。换言之, Microsoft Visual Basic 是微软公司,推出的一套可视化编程工具, 语法基于 Basic 模式。在此环境下,脚本语言, 不编译成二进制文件, 直接由宿主解释源代码并执行, 在此条件下所写的程序不是直接编译成.exe 格式可执行文件,而是直接给用户发送信息到.vbs 的源程序, 用户能直接执行,而不需了解其中很多繁杂的环节。也就是说,它可以实现各种各样的任务自动化,可以使我们从重复琐碎的工作中解脱出来,极大的提高工作效率,节省大量的时间和精力。(这段是我复制的,O(∩_∩)O哈哈~)
在这里而言,我们只要知道可以通过编写vbs文件来实现天线的快速创建就可以了,而Matlab就是我们可以快速创建vbs文件的工具。实际上Python也可以的,而HFSS也可以直接读取py格式的脚本文件。只是对我而言还是Matlab更加熟悉一些,这就看个人的喜好了。
脚本文件的简单展示
打开可爱的海飞丝,左键单击工具栏tools->record script to file,选择好存储路径,文件类型为vbs。之后软件就开始记录你的操作了,这边我们创建一个贴片Patch:
然后单击tools->stop script recording,操作的记录就停止了。当然可以选择更为复杂的操作,这边只为演示。这边可以把原来的图形删掉。此时在保存的路径下,会出现一个比较复古的图标:
这时双击它,软件会创建一个一模一样的贴片。此时如果用记事本打开脚本文件:
这边可以简单分析一下,创建一个贴片的步骤可以分为四步(实际上是三步)。其中第一段是vbs文件的申明,这个可以不用管。第二段算是接口的申明?(这个我不太懂)。第三段是我一开始画的贴片,而第四段是修改参数的脚本。其实对计算机而言,第四段就不是必须的了。
创建阵列
我学习这个的根本目的在于,在可以预见的将来,我会面对不少天线阵的建模。虽然主从边界条件很方便,但是还是有很多它无法顾及的地方,比如边缘效应,还有一些非周期的天线阵。
使用Matlab的函数的注意事项
啊,这边就是调用啊,你甚至不太用懂函数是怎么运作的,只要知道输入和输出就好……而且吴迪大佬的函数名都很直接的,只要HFSS建模的操作会用基本不存在使用障碍。,就是使用之前注意一下HFSS版本会不会有冲突——毕竟海飞丝的换代还是挺频繁的,有时候脚本文件的一些命名也会发生改变,这边2018,2019版本的HFSS基本都可以运行。
还有就是吴迪的工程下有很多文件夹,这边只要使用3dmodeler,analysis和boundary三个文件夹下的就可以了。还有就是这些函数其实不能完整的覆盖所有建模的工作,比如有一些边界条件(RLC什么的)是没有的,喜欢的大兄弟可以自己写写,懂了之后其实相对还是比较简单的。
建模的目标
就拿我手头上的一个仿真工作来说吧,基本目标就是这个玩意,基本单元并不复杂,具体细节在’‘Circuit-based nonlinear metasurface absorbers for high power surface currents’'这篇文章中可以看到。因为要在超表面上添加电路元件,所以每一个电路元件要留两个集总端口,而光是一个单元就有两个电阻,两个电容还有一个二极管!更不要说其他的一些相减操作了。其实这个仿真后续还涉及到路的仿真,我现在还在琢磨,再过段时间可以抽空写一写心得。
编程的简单介绍
可以创建文件:
fileName = ['absorb_surface',num2str(N),'_',num2str(fc),'G_',num2str(arraynum)];
tmpScriptFile = ['路径'.vbs'];
Matlab中也可以添加HFSS的变量,使用’hfssaddVar’
hfssaddVar(fid, 'f0', f, []);
这边编程的时候可以使用相对坐标系:这边给出一部分代码吧
for n=1:N
for m=1:M
i=N*(m-1)+n;
%%%%add local CS
CSName = ['CS', num2str(i)];
Origin = {['(',num2str(m),' -(M+1)/2)*p'],['((N+1)/2-',num2str(n),')*p'],'0'};
XAxisVec = [1 0 0 ];
YAxisVec = {0, 1, 0};
hfssCreateRelativeCS(fid, CSName, Origin,XAxisVec, YAxisVec, units);
hfssSetWCS(fid, CSName);
%%%%%%%Array of metasrface(square loop)
squarebig{i} = ['squarebig_',num2str(i)];
Start_squareloop = {'-te/2','-te/2','h'};
hfssRectangle(fid, squarebig{i}, 'Z', Start_squareloop, 'te', 'te', units);
squaremedium{i} = ['squaremedium',num2str(i)];
Start_squareloop1 = {'-tc/2','-tc/2','h'};
hfssRectangle(fid, squaremedium{i}, 'Z', Start_squareloop1, 'tc', 'tc', units);
hfssSubtract(fid, squarebig{i}, squaremedium{i});
cut_square{1,1}= squarebig{i};
PEbig{i}=['PEbig_',num2str(i)];
hfssAssignPE(fid, PEbig{i},cut_square, false);
…………………………
hfssSetWCS(fid, 'Global');
end
end
集总端口创建,不过这个函数好像不接受相对坐标系,必须使用原本的坐标系计算起点和终点的坐标。
hfssAssignLumpedPort(fid, Port1{i}, squareport1{i}, [-20+(m-1)*p, 36-(n-1)*p, h],……
[-20+(m-1)*p, 36-(n-1)*p-port_l, h], Units, 50, 0);
大概就是这些吧,其实我没有写完,有一些设置编程反而麻烦了。
这个就是大概的样子了,gif还挺好做的,原以为要折腾一会儿。
结论
这个就没什么好结论了吧,就是蛮方便的,O(∩_∩)O哈哈~。此外文章中的文件就不上传了,我是个代码苦手,不是很喜欢编程,文件也没写注释,就不脏了大家的眼了,之前的链接里面的实例是可以运行的,可以去github上下载,还不要积分。