CST与Matlab连接设置
这里说明如何将CST 微波工作室(CST MWS)与MATLAB 一起使用。MATLAB 是以线性代数和矩阵数学为基础的科学计算程序。COM(组件对象模型)和 ActiveX 用来通过 CST MWS 的VBA 宏语言与 MATLAB 连接。CST MWS 与 MATLAB 连接的主要目的在于想利用MATLAB 的广泛的数据处理、信号处理和图 形处理能力。
COM 和 ActiveX 接口允许两个程序在工作后台的数据传递和紧密结合。这里所描述的连接方法对CST 工作室的其他产品都适用,同样也适用于将CST 工作室与任意其他以Windows 为基础的第三方软件相连接,比如: MATHCAD, MATHEMATICA, MAPLE 等。
1. 背景
假设用户已经熟悉与CST MWS VBA兼容的宏语言。如果用户对宏语言不熟悉,可以参考 CST 微波工作室的Advanced Topics manual(高级用户手册)。
CST MWS 可以设置成控制MATLAB 或者是受MATLAB 控制。当CST MWS 控制MATLAB 时,CST MWS 是客户系统,MATLAB 是服务系统,反之亦然。该用户说明主要是关于CST MWS 作为客户系统,MATLAB 作为服务系统。
在 MATLAB 的主页上可以得到更多的使用和编程方面的相关信息。MATLAB 中COM 对象技术的相关说明也可以通过在MATLAB 命令窗口中输入以下命令来获得。
h=actxserver(‘Matlab.Application’); invoke(h);
命令窗口中会出现以下语句:
Execute=String Execute(String)
GetCharArray=String GetChatArray(String,String)
GetFullMatrix=Void GetFullMatric(String,String,Variant(Pointer),Variant(Pointer))
MaximizeCommandWindow=Void MaximizeCommandWindow() MinimizeCommandWindow=Void
MinimizeCommandWindow() PutCharArray=Void
PutCharArray(String,String,String)
PutFullMatrix=Void PutFullMatrix(String,String,SafeArray,SafeArray)
Quit=Void Quit()
以上指令可以用于在 MATLAB 中发送、获取和处理数据。该执行方法可以用于 MATLAB 中任意语句,让用户感觉到与直接在MATLAB 的命令窗口中编程一样。
2. CST 与MATLAB连接例子说明
以下将通过一个具体的例子来说明 CST 与 MATLAB 是如何连接的。该例子通过一个CST VBA宏MATLAB Data Exchange来实现。
该宏主要是关于在CST MWS和 MATLAB之间交换数据。数据交换将CST 项目中的仿真结果S11 的数据线性地传递给 MATLAB,由MATLAB 计算S11 的dB 值,再将计算后的值送回到CST MWS,并在1D Result中画出。
3. 具体处理过程
这个宏用来证明COM 对象方法的正确使用,同样它们仅仅局限于一个端口/一种模式的结构。很容易扩展到任意端口、任意模式。你使用 CST MWS 的电脑上必须安装MATLAB。这些宏都可以集成到任一个可仿真获得S11 的CST MWS 的项目中。
将该宏文件放置在项目目录下的 Model\3D 文件夹中,这样仿真完成后选择菜单中的 Macros,最下方列出的局部宏就是“MATLAB Data Exchange”。
选择 MATLAB Data Exchange,CST MWS 将会启动 MATLAB,在出现的 MATLAB 窗口中将会以dB 的形式显示S11 的值。确保MATLAB 命令窗口依然开着,点击 MATLAB 的命令窗口,在命令行中输入whos 命令显示这些内部变量。注意到这些变量在MATLAB 中以cst_data.mat 文件存储,该文件存在C:\Program Files\CST Matlab data 目录下。返回 CST MWS 窗口中,在1DResults > Matlab > S11dB 中可以找到在MATLAB 中计算得到的S11dB值。
点击 CST MWS 的 Macros 菜单,在下拉菜单中选择 Edit/Move/Delete VBA Macro 子菜单。从结果列表中选中MATLAB Data Exchange,并且选择 edit。MATLAB Data Exchange 的VBA脚本将会在VBA editor 中出现。你可以滚动察看应用细节。脚本的第一部分标志为 user defined settings(用户定义的设置)。Matlab_visible 可以被设置为Ture 或者False,使得MATLAB命令窗口在计算结束时保持开启或者关闭状态。
User_path中包含了所有文件存储的完整路径和MATLAB 的设置路径。Save_file_name文件中指定了MATLAB 数据存储的.mat文件的名称。独立的MATLAB脚本文件(.m文件)则能够通过 COM对象方法的执行而运行。
4. 宏VBA代码:
Option Explicit
Sub Main
'User defined settings
Dim matlab_visible As Boolean
Dim user_path, save_file_name As String
matlab_visible = True 'True to keep
Matlab command window open, False to not display it
user_path = "C:\Program Files\
CST Matlab data" 'path that Matlab opens to and any data is saved to
save_file_name = "cst_data" 'name of .mat file matlab saves all data to
'variable defn
'------------------------------------------------------------------------------------
'Matlab variables
Dim matlab As Object
Dim Result As String
Dim sendA(2) As Double
'set up variables
Dim NumPorts, NumModes, NumFre
q, NumEng, NumTime As Integer
Dim factorA, factorB As Double
Dim j, i As Integer
'Result variables
Dim eng_obj, sig_in_obj, si
g_out_obj As Object
Dim file_nameA As String
Dim freqs() As Double
Dim times() As Double
Dim eng_time() As Double
Dim eng_A() As Double
Dim T_stop As Double
Dim sig_in() As Double
Dim sig_out() As Double
Dim MImag() As Double
Dim NumSamp As Integer
Dim Fmin, Fmax As Double
Dim S11dBD() As Double
Dim freqD() As Double
'MWS problem information
NumPorts = Solver.GetNumberOfPorts
NumModes = Solver.GetNumberOfPorts
factorA = Units.GetFrequencyUnitToSI
factorB = Units.GetTimeUnitToSI
NumSamp = Solver.GetNFsteps
Fmin = Solver.GetFmin
Fmax = Solver.GetFmax
'--------------------------------------------------------------------------------------------
'Retrieve MWS data
'------------------------------------------------------------------------------------
Set S11A = Result1D("a1(1)1(1)")
NumFreq = Solver.GetNFsteps
ReDim S11B(NumFreq-1)
ReDim freq(NumFreq-1)
ReDim S11dB(NumFreq-1)
ReDim MImag(NumFreq-1)
For j = 0 To NumFreq-1
freq(j) = S11A.GetX(j)/factorA
S11B(j) = S11A.GetY(j)
Next j
'Matlab COM/ActiveX interaction
'------------------------------------------------------------------------------------
'1) create COM object and initiate Matlab as an activeX server
Set matlab = CreateObject("Matlab.Application")
If matlab_visible Then
Result = matlab.Execute("h=actxser
ver('Matlab.Application');set(h,'visible',1);")
End If
'2) send all MWS data to Matlab using
Automation methods (see app note for listing)
Call matlab.PutCharArray("user_path","base",user_path)
Call matlab.PutCharArray("save_file_name","base",save_file_name)
Call matlab.PutFullMat
rix("S11","base",S11B,MImag)
Call matlab.PutFullMatri
x("freq","base",freq,MImag)
'3) use execute command to control Matlab engine
Result = matlab.Execute("cd(user_path)")
Result = matlab.Execu
te("S11dB=20.*log10(abs(S11));")
Result = matlab.Execu
te("plot(freq,S11dB);grid on;")
Result = matlab.Execute("title('S-pa
rameters from CST Microwave Studio');")
Result = matlab.Execute("xlabel('Freq, GHz.');")
Result = matlab.Execute("ylabel('S11, dB');")
Result = matlab.Execute("eval(['save ',save_file_name,';']);")
'4) retreive all data from Matlab to display in MWS
Call matlab.GetFullMat
rix("S11dB","base",S11dB,MImag)
'display or store Matlab data in MWS form
'------------------------------------------------------------------------------------
'1) write any data you wish to display to a file
fileA = "matlab_output.txt"
Open fileA For Output As #1
For j = 0 To NumFreq-1
Print #1,CStr(freq(j)) & " " & CStr(S11dB(j))
Next j
Close #1
'2) insert Matlab data into result tree
With ResultTree
.Reset
.Name "1D Results\Matlab\S11 dB"
.Type "XYSignal"
.Subtype "Linear"
.Title "S11 in dB computed in Matlab"
.Xlabel "Frequency, Hz"
.Ylabel "dB"
.File fileA
.Add
End With
End Sub
-
CST中文视频教程,资深专家讲解,视频操作演示,从基础讲起,循序渐进,并结合最新工程案例,帮您快速学习掌握CST的设计应用...【详细介绍】
推荐课程
-
7套中文视频教程,2本教材,样样经典
-
国内最权威、经典的ADS培训教程套装
-
最全面的微波射频仿真设计培训合集
-
首套Ansoft Designer中文培训教材
-
矢网,频谱仪,信号源...,样样精通
-
与业界连接紧密的课程,学以致用...
-
业界大牛Les Besser的培训课程...
-
Allegro,PADS,PCB设计,其实很简单..
-
Hyperlynx,SIwave,助你解决SI问题
-
现场讲授,实时交流,工作学习两不误