Matlab自动批量导出CST仿真的S参数(含Matlab代码)

目录

背景

步骤

Matlab控制语句

actxserver

invoke

CST的VBA对象及方法

Project

Plot1D

ASCIIExport

Matlab代码


阅读本文,你可能解决什么?

  • 如何自动批量导出CST仿真的S参数数据?

  • Matlab如何调用CST的VBA对象?Matlab如何设置VBA对象的方法?

阅读本文,你可能收获什么?

  • Matlab控制CST的逻辑

  • Matlab编写的自动导出S参数的类代码

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第1张图片


背景

        在进行频率选择表面(Frequency Selective Surface,FSS)、超表面等的仿真设计时,通常需仿真得到无限大周期阵列的散射参数(通常简称S参数)。 CST 中 unite cell 的周期边界条件,除了可以方便仿真沿 x 、 y 正交方向矩形周期排列的结构(图1),也可支持非正交(周期平移方向之间的夹角≠90°)结构,如正六边形排列的蜂窝结构,其构造的结构对称性更好,性能稳定。

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第2张图片

​图1 CST自带的FSS圆环谐振器(FSS Ring Resonator)

        如图2所示,S 参数涉及的维度如下:

  • 极化:主极化分量:TE ←TE / TM ←TM ;交叉极化分量: TM ← TE / TE ← TM

  • 端口:S21:2端口出射与1端口入射的电场比值 , S11:1端口出射与1端口入射的电场比值

  • 角度:入射电磁波的θ和φ角

  • 频率:入射电磁波的频率

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第3张图片

图2 主极化TE的S21曲线

        如图3所示,CST 中单个窗口可同时显示多个入射角度下 S 参数随频率的变化,极化和端口维度组合得到8组S参数,每组数据需单独导出、命名、保存,费时费力。

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第4张图片

图3 CST仿真的S参数

        CST 内嵌宏文件,其使用 VBA 语言编写,通过编写对应的代码,可实现一定的自动导出功能,但有一定的学习成本。 Matlab 是理工科学生常用的一款编程软件,可方便进行数据的批量处理,通过下文的学习,也可很方便的与 CST 交互,实现自动化混合仿真。

        以 CST 仿真的 S 参数导出为例, Matlab 可控制 CST 自动导出所有的数据,当然也可批量导出多个 CST 文件的 S 参数数据,摒弃单调的重复操作。更重要的是,在掌握其背后的控制逻辑后,可以用 Matlab 开发更高级的控制脚本,通过混合仿真,将二者的功能发挥到极致。


        以 CST 仿真数据自动导出为例, Matlab 与 CST 的交互主要涉及:

控制语句: Matlab 与外部软件接口的通信

VBA对象及方法: CST 内部模块及属性

        借助 CST 自带的帮助文档,可快速查询 CST 支持访问的控件及其属性信息。


步骤

  1. 创建一个本地 OLE 自动化服务器,获取CST接口的句柄;

  2. 打开CST文件;

  3. 选中CST界面中仿真的S曲线;

  4. 在标题栏【1D Plot】界面,设置【Plot Type】,包括:'Linear','dB','Phase','Real'等,约定导出数据的形式,如幅度值是按dB还是按线性值导出;

  5. 打开【Post-Processing】界面的【Import / Export】选项,按【Export】的【Plot Data (ASCII)...】格式,导出、保存数据。

        以上步骤涉及Matlab的控制语句和CST的VBA对象设置,简介如下。

Matlab控制语句

        步骤1~2)涉及CST组件对象服务器创建,获取CST接口,用以打开CST工程。

actxserver

        创建组件对象模型(Component Object Model, COM)服务器,返回服务器默认接口的句柄。查询Matlab帮助文档,其语法如下:

语法
c = actxserver(progid);

        创建一个本地 OLE 自动化服务器,其中progid是与 OLE 兼容的 COM 服务器的编程标识符(ProgID)。此函数返回服务器的默认接口的句柄。

示例

com_cst = actxserver('CSTStudio.application');

创建一个CSTStudio服务器,返回CST的默认接口句柄。

invoke

        调用 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的VBA对象及方法

        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。

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第5张图片

图4 CST的VBA对象

        步骤3~)5涉及CST中的VBA对象有:Global中的【Project】,Plot中的【Plot1D】,Import / Export中的【ASCIIExport】。每个VBA对象具体需设置的方法(Methods)介绍如下:

Project

        如下图5.a,选中CST界面某条S曲线仿真结果,对应图5.b中VBA对象需使用的方法为'SelectTreeItem'。

代码如下:

SelectTreeItem = invoke(mws,'SelectTreeItem','1D Results\S-Parameters\SZmax(1),Zmax(1)');

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第6张图片

​图5.a CST界面选中的S曲线

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第7张图片

​图5.b VBA Objects-Global-Project-Results Plotting

Plot1D

        如下图6.a,CST界面对选中的S曲线设置画图类型,对应图6.b中VBA对象需使用的方法为'PlotView'。

代码如下:

plot1D = invoke(mws, 'Plot1D');% 
invoke(plot1D, 'PlotView', 'magnitudedb');

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第8张图片

图6.a CST界面选中曲线的类型

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第9张图片

图6.b VBA Objects-Plot-Plot 1D

ASCIIExport

        如下图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');

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第10张图片

​图7.a CST界面导出数据操作

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第11张图片

图7.b VBA Objects-Import/Export-ASCIIExport-FileName

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第12张图片

图7c VBA Objects-Import/Export-ASCIIExport-Execute

Matlab代码

      为了方便代码维护,可自定义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的功能,分享给需要的伙伴使用。

Matlab自动批量导出CST仿真的S参数(含Matlab代码)_第13张图片

​图8 App界面

你可能感兴趣的:(matlab)