目录
背景
步骤
Matlab控制语句
actxserver
invoke
CST的VBA对象及方法
Project
Plot1D
ASCIIExport
Matlab代码
阅读本文,你可能解决什么?
如何自动批量导出CST仿真的S参数数据?
Matlab如何调用CST的VBA对象?Matlab如何设置VBA对象的方法?
阅读本文,你可能收获什么?
Matlab控制CST的逻辑
Matlab编写的自动导出S参数的类代码
在进行频率选择表面(Frequency Selective Surface,FSS)、超表面等的仿真设计时,通常需仿真得到无限大周期阵列的散射参数(通常简称S参数)。 CST 中 unite cell 的周期边界条件,除了可以方便仿真沿 x 、 y 正交方向矩形周期排列的结构(图1),也可支持非正交(周期平移方向之间的夹角≠90°)结构,如正六边形排列的蜂窝结构,其构造的结构对称性更好,性能稳定。
图1 CST自带的FSS圆环谐振器(FSS Ring Resonator)
如图2所示,S 参数涉及的维度如下:
极化:主极化分量:TE ←TE / TM ←TM ;交叉极化分量: TM ← TE / TE ← TM
端口:S21:2端口出射与1端口入射的电场比值 , S11:1端口出射与1端口入射的电场比值
角度:入射电磁波的θ和φ角
频率:入射电磁波的频率
图2 主极化TE的S21曲线
如图3所示,CST 中单个窗口可同时显示多个入射角度下 S 参数随频率的变化,极化和端口维度组合得到8组S参数,每组数据需单独导出、命名、保存,费时费力。
图3 CST仿真的S参数
CST 内嵌宏文件,其使用 VBA 语言编写,通过编写对应的代码,可实现一定的自动导出功能,但有一定的学习成本。 Matlab 是理工科学生常用的一款编程软件,可方便进行数据的批量处理,通过下文的学习,也可很方便的与 CST 交互,实现自动化混合仿真。
以 CST 仿真的 S 参数导出为例, Matlab 可控制 CST 自动导出所有的数据,当然也可批量导出多个 CST 文件的 S 参数数据,摒弃单调的重复操作。更重要的是,在掌握其背后的控制逻辑后,可以用 Matlab 开发更高级的控制脚本,通过混合仿真,将二者的功能发挥到极致。
以 CST 仿真数据自动导出为例, Matlab 与 CST 的交互主要涉及:
控制语句: Matlab 与外部软件接口的通信
VBA对象及方法: CST 内部模块及属性
借助 CST 自带的帮助文档,可快速查询 CST 支持访问的控件及其属性信息。
创建一个本地 OLE 自动化服务器,获取CST接口的句柄;
打开CST文件;
选中CST界面中仿真的S曲线;
在标题栏【1D Plot】界面,设置【Plot Type】,包括:'Linear','dB','Phase','Real'等,约定导出数据的形式,如幅度值是按dB还是按线性值导出;
打开【Post-Processing】界面的【Import / Export】选项,按【Export】的【Plot Data (ASCII)...】格式,导出、保存数据。
以上步骤涉及Matlab的控制语句和CST的VBA对象设置,简介如下。
步骤1~2)涉及CST组件对象服务器创建,获取CST接口,用以打开CST工程。
创建组件对象模型(Component Object Model, COM)服务器,返回服务器默认接口的句柄。查询Matlab帮助文档,其语法如下:
语法
c = actxserver(progid);
创建一个本地 OLE 自动化服务器,其中progid是与 OLE 兼容的 COM 服务器的编程标识符(ProgID)。此函数返回服务器的默认接口的句柄。
示例
com_cst = actxserver('CSTStudio.application');
创建一个CSTStudio服务器,返回CST的默认接口句柄。
调用 COM 对象或接口上的方法或显示方法。查询Matlab帮助文档,其语法如下:
语法
S = invoke(c,methodName,value);
调用methodName指定的方法并在结构体数组中返回输出值(如果有)。该方法确定返回值的数据类型。
如果此方法返回 COM 接口,则invoke函数将返回一个新的 MATLAB COM 对象来表示该接口。
示例
mws = invoke(com_cst,'OpenFile', name_cst);
调用CST接口打开文件的方法(OpenFile),打开变量name_cst名称的CST文件。
CST控件及属性查询见其帮助文档。可以先点击CST界面最上方标题栏的【File】,然后在界面左侧找到【Help】,在点击中间栏上方的【Help Contents】进入到CST Studio Suite Help的网页版帮助文档。如下图所以,依次单击【Automation and Scripting】—【Visual Basic (VBA)】—【3D Simulation VBA】—【VBA Objects】—【VBA Objects Overview】,打开CST的VBA对象的界面,见图4。
图4 CST的VBA对象
步骤3~)5涉及CST中的VBA对象有:Global中的【Project】,Plot中的【Plot1D】,Import / Export中的【ASCIIExport】。每个VBA对象具体需设置的方法(Methods)介绍如下:
如下图5.a,选中CST界面某条S曲线仿真结果,对应图5.b中VBA对象需使用的方法为'SelectTreeItem'。
代码如下:
SelectTreeItem = invoke(mws,'SelectTreeItem','1D Results\S-Parameters\SZmax(1),Zmax(1)');
图5.a CST界面选中的S曲线
图5.b VBA Objects-Global-Project-Results Plotting
如下图6.a,CST界面对选中的S曲线设置画图类型,对应图6.b中VBA对象需使用的方法为'PlotView'。
代码如下:
plot1D = invoke(mws, 'Plot1D');%
invoke(plot1D, 'PlotView', 'magnitudedb');
图6.a CST界面选中曲线的类型
图6.b VBA Objects-Plot-Plot 1D
如下图7.a,CST界面导出数据的操作,对应图7.b和7.c中VBA对象需使用的方法为'Reset','FileName' 和'Execute'。
代码如下:
ASCIIExport = invoke(mws,'ASCIIExport');
invoke(ASCIIExport,'Reset');
invoke(ASCIIExport,'FileName','TE_S11_Am.txt');
invoke(ASCIIExport,'Execute');
图7.a CST界面导出数据操作
图7.b VBA Objects-Import/Export-ASCIIExport-FileName
图7c VBA Objects-Import/Export-ASCIIExport-Execute
为了方便代码维护,可自定义CST导出数据的类,方便后续增加导出数据的种类,如导出CST的远场、RCS仿真数据等。
ClassCSTExport.m
classdef ClassCSTExport < handle
properties
filepath;% CST文件目录+文件名
savepath;% 数据导出存放目录
end
methods
function obj = ClassCSTExport(filepath,savepath)
obj.filepath = filepath;
obj.savepath = savepath;
end
function SParameter(obj)
filepath = obj.filepath;
exportpath = obj.savepath;
if ~exist(exportpath,'dir')% 导出数据存放目录,如不存在,创建目录
mkdir(exportpath);
end
cst = actxserver('CSTStudio.application');
mws = invoke(cst,'OpenFile', filepath);% 打开一个MWS项目
% 读取端口设置,并自动判断输入端口
SelectTreeItem = invoke(mws,'SelectTreeItem',['1D Results\S-Parameters\',['SZmax(1),Zmax(1)']]);
if SelectTreeItem == 1% 如果存在'SZmax(1),Zmax(1)',输入端口为Zmax
% max为输入端口
str_S11_TE_TE = ['SZmax(1),Zmax(1)'];
str_S21_TE_TE = ['SZmin(1),Zmax(1)'];
str_S11_TM_TM = ['SZmax(2),Zmax(2)'];
str_S21_TM_TM = ['SZmin(2),Zmax(2)'];
lable_S11_TE_TE = 'S11_TE';
lable_S21_TE_TE = 'S21_TE';
lable_S11_TM_TM = 'S11_TM';
lable_S21_TM_TM = 'S21_TM';
exportpathname_S11_TE_TE = [exportpath,'\',lable_S11_TE_TE,'.txt'];
exportpathname_S21_TE_TE = [exportpath,'\',lable_S21_TE_TE,'.txt'];
exportpathname_S11_TM_TM = [exportpath,'\',lable_S11_TM_TM,'.txt'];
exportpathname_S21_TM_TM = [exportpath,'\',lable_S21_TM_TM,'.txt'];
CstExportSpTXT(mws, str_S11_TE_TE, exportpathname_S11_TE_TE);
CstExportSpTXT(mws, str_S21_TE_TE, exportpathname_S21_TE_TE);
CstExportSpTXT(mws, str_S11_TM_TM, exportpathname_S11_TM_TM);
CstExportSpTXT(mws, str_S21_TM_TM, exportpathname_S21_TM_TM);
elseif SelectTreeItem == 0 % 否则,输入端口为Zmin
% min为输入端口
str_S11_TE_TE = ['SZmin(1),Zmin(1)'];
str_S21_TE_TE = ['SZmax(1),Zmin(1)'];
str_S11_TM_TM = ['SZmin(2),Zmin(2)'];
str_S21_TM_TM = ['SZmax(2),Zmin(2)'];
lable_S11_TE_TE = 'S11_TE';
lable_S21_TE_TE = 'S21_TE';
lable_S11_TM_TM = 'S11_TM';
lable_S21_TM_TM = 'S21_TM';
exportpathname_S11_TE_TE = [exportpath,'\',lable_S11_TE_TE,'.txt'];
exportpathname_S21_TE_TE = [exportpath,'\',lable_S21_TE_TE,'.txt'];
exportpathname_S11_TM_TM = [exportpath,'\',lable_S11_TM_TM,'.txt'];
exportpathname_S21_TM_TM = [exportpath,'\',lable_S21_TM_TM,'.txt'];
CstExportSpTXT(mws, str_S11_TE_TE, exportpathname_S11_TE_TE);
CstExportSpTXT(mws, str_S21_TE_TE, exportpathname_S21_TE_TE);
CstExportSpTXT(mws, str_S11_TM_TM, exportpathname_S11_TM_TM);
CstExportSpTXT(mws, str_S21_TM_TM, exportpathname_S21_TM_TM);
end
end
end
end
附:
Matlab App界面
为方便使用,可以使用Matlab编写简单的App(图8),将代码集成、封装,统一维护、升级,后续也可根据需要,不断扩充App的功能,分享给需要的伙伴使用。
图8 App界面