The procedure for requesting AWR support has changed. Please read all about the new AWR product support process.
Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

This page is to describe differences in coding if you are used to the AWR VB scripting language.   

Case Sensitivity

When developing in VB where the type library is understood, the case for items is automatically created.  You don't have to be aware of the case when typing since it fixes itself. 

We will see if when we can get the type library in python if this is fixed.  When typing commands, you do need to be very aware of the case of each word.    

Calling Methods

When you call methods in VB, you do not need to use parathesis after the method.  

...

In python, you must use the () at the end of the method or it won't run.    

Creating Subroutines and Functions

in VB, the subroutine or function can be at any location in the file. 

In Python, the subroutine or function must be defined in the file before it is used.

Quotes

Python allows the use of single or double-quotes for strings.  This makes it easy to put single or double-quotes in a string by using the other type of quote to define the string.

Pathnames

If you are not specifying drive letters, python allows you to use a forward-slash in pathnames even on windows.  If you want to use back-slashes then you must double them up.

...

When building pathnames up, it is much better to use os.path.join than just concatenating strings as it will handle the delimiters correctly.

Calling Enumerated Value

in VB that has the type library defined, you can specific enumerated values by name such as, the mwGT_Rectangular below

...

I found the easiest way to do this was to have the code in VB, use F1 help on the top object and then browse to the page that lists the enumerated types.    

Examples

The code below is doing the AWR getting started guide for the liner filter by code.  One is done by VB, one is done by Python

VB

Code Block
languagevb
 
' Code Module
Sub Main
	Dim sch As Schematic

	CleanUp

	Set sch = CreateSchematic

	BuildSchematic(sch)

	SetValues(sch)

	SetFrequencies

	AddGraph(sch)

	Simulate

	AddMarkers(sch)

	AddEquations(sch)

	OptLimits(sch)

	SetOptGoals(sch)

	ArrangeWindows

	Optimize
End Sub
Private Sub Optimize
	Project.Optimizer.MaxIterations = 500
	Project.Optimizer.Type = find_opt_type("Random (Local)")
	Project.Optimizer.NewWindow
	Project.Optimizer.Start
	While Project.Optimizer.Running=True
		Wait(0.5)
	Wend
End Sub

Function find_opt_type(nm As String) As Integer
	Dim typ As Integer

	typ = -1
	For i = 1 To Project.Optimizer.TypeCount
		If nm = Project.Optimizer.TypeName(i) Then
			typ = i
		End If
	Next i
	If typ = -1 Then
		MsgBox ("could not find optimizer name specified:" & nm)
	End If
	find_opt_type = typ
End Function
Sub SetOptGoals(s As Schematic)
	Project.OptGoals.Add(s.Name,"DB(|S(1,1)|)",mwOGT_LessThan,1,2,0,500e6,mwUT_Frequency,-17,-17,mwUT_DB)
	Project.OptGoals.Add(s.Name,"DB(|S(2,1)|)",mwOGT_GreaterThan,1,2,0,500e6,mwUT_Frequency,-1,-1,mwUT_DB)
	Project.OptGoals.Add(s.Name,"DB(|S(2,1)|)",mwOGT_LessThan,1,2,700e6,1000e6,mwUT_Frequency,-30,-30,mwUT_DB)
End Sub
Sub OptLimits(s As Schematic)
	'setup various values for optimization including constraints.
	s.Equations("CAP").Optimize=True
	s.Equations("CAP").Constrain=True
	s.Equations("CAP").LowerConstraint = 8*0.75
	s.Equations("CAP").UpperConstraint = 8*1.25
	s.Equations("IND").Optimize=True
	s.Equations("IND").Constrain=True
	s.Equations("IND").LowerConstraint = 15*0.75
	s.Equations("IND").UpperConstraint = 15*1.25
	s.Elements("CAP.C2").Parameters("C").Optimize=True
	s.Elements("CAP.C2").Parameters("C").Constrain=True
	s.Elements("CAP.C2").Parameters("C").LowerConstraint = 10*0.75*1e-12
	s.Elements("CAP.C2").Parameters("C").UpperConstraint = 10*1.25*1e-12
End Sub
Sub AddEquations(s As Schematic)
	'add equations and assign parameters to use the equation.
	s.Equations.Add("IND=15",1500,-1000)
	s.Equations.Add("CAP=8",2500,-1000)
	s.Elements("IND.L1").Parameters("L").ValueAsString = "IND"
	s.Elements("IND.L4").Parameters("L").ValueAsString = "IND"
	s.Elements("CAP.C1").Parameters("C").ValueAsString = "CAP"
	s.Elements("CAP.C3").Parameters("C").ValueAsString = "CAP"
End Sub
Sub AddMarkers(s As Schematic)
	Dim m As Marker
	Dim m2 As Marker

	Set m = Project.Graphs(1).Markers.Add(s.Name & ":DB(|S(2,1)|)",1,0.1e9)
	m.Type = mwMT_AutoSearch
	m.AutoSearch.mode=mwMAM_Max
	Set m2 = Project.Graphs(1).Markers.Add(s.Name & ":DB(|S(2,1)|)",1,0.5e9)
	m2.Type =mwMT_Offset
	m2.Offset.Distance = -3
	m2.Offset.mode=mwMOM_Y
	m2.Offset.ReferenceMarker="m1"

End Sub
Sub Simulate
	Project.Simulator.Analyze
End Sub
Sub AddGraph(s As Schematic)
	Dim g As Graph
	Set g = Project.Graphs.Add("s21 and s11",mwGT_Rectangular)
	g.Measurements.Add(s.Name,"DB(|S(1,1)|)")
	g.Measurements.Add(s.Name,"DB(|S(2,1)|)")
End Sub

Sub SetFrequencies
	Dim freqs() As Double

	fstart = 100
	fstop = 1000
	fstep = 10
	num = (fstop-fstart)/fstep
	ReDim freqs(num)
	Project.Frequencies.Clear
	cnt = 0
	For i = 100 To 1000 Step 10
		freqs(cnt) = i * 1e6 'enter in base units, Hz.
		cnt = cnt + 1
	Next i
	Project.Frequencies.AddMultiple(freqs)
End Sub

Sub SetValues(s As Schematic)
	'sets the parameter values of the elements to be non-default
	'values as double will always be in base units (Farads, Henries, etc)
	s.Elements("IND.L1").Parameters("L").ValueAsDouble = 15e-9
	s.Elements("IND.L2").Parameters("L").ValueAsDouble = 30e-9
	s.Elements("IND.L3").Parameters("L").ValueAsDouble = 30e-9
	s.Elements("IND.L4").Parameters("L").ValueAsDouble = 15e-9
	s.Elements("CAP.C1").Parameters("C").ValueAsDouble = 8e-12
	s.Elements("CAP.C2").Parameters("C").ValueAsDouble = 10e-12
	s.Elements("CAP.C3").Parameters("C").ValueAsDouble = 8e-12

End Sub

Sub BuildSchematic(s As Schematic)
	'add inductors
	'each visible grid in the schematic has a value of 100 for the coordinates
	s.Elements.Add("IND",0,0)
	s.Elements.Add("IND",1000,0)
	s.Elements.Add("IND",2000,0)
	s.Elements.Add("IND",3000,0)
	'add capacitors
	s.Elements.Add("CAP",1000,0,270)
	s.Elements.Add("CAP",2000,0,270)
	s.Elements.Add("CAP",3000,0,270)
	'add wire
	s.Wires.Add(1000,1000,3000,1000)
	'add ports
	s.Elements.Add("PORT",0,0)
	s.Elements.Add("PORT",4000,0,180)
	'add ground
	s.Elements.Add("GND",1000,1000)
End Sub

Function CreateSchematic() As Schematic
	Set CreateSchematic = Project.Schematics.Add("lpf")
End Function
Sub CleanUp
	Dim s As Schematic
	Dim g As Graph
	Dim opt As OptGoals

	For Each s In Project.Schematics
		Project.Schematics.Remove(s.Name)
	Next s

	For Each g In Project.Graphs
		Project.Graphs.Remove(g.Name)
	Next g

	Project.OptGoals.RemoveAll

	MWOffice.Windows.Close
End Sub
Sub ArrangeWindows
	Dim w As Window
	For Each w In MWOffice.Windows
		If w.Caption = "lpf" Then
			w.ViewAll
		End If
	Next w

	MWOffice.Windows.Tile(mwWTD_Vertical)

End Sub

Python

Code Block
languagepy
 # -*- coding: utf-8 -*-
 
"Connecting to MWO"
import win32com.client as win32
import time
def Cleanup():
 
    for s in awr.Project.Schematics:
        awr.Project.Schematics.Remove(s.Name)
    for g in awr.Project.Graphs:
        awr.Project.Graphs.Remove(g.Name)
    awr.Project.OptGoals.RemoveAll
    awr.Windows.Close
def CreateSchematic():
    s=awr.Project.Schematics.Add("lpf")
    return s
def BuildSchematic(s):
    "add inductors"
    "each visible grid in the schematic has a value of 100 for the coordinates"
    awr.Project.Schematics(s.Name).Elements.Add("IND",0,0)
    awr.Project.Schematics(s.Name).Elements.Add("IND",1000,0)
    awr.Project.Schematics(s.Name).Elements.Add("IND",2000,0)
    awr.Project.Schematics(s.Name).Elements.Add("IND",3000,0)
    "add capacitors"
    awr.Project.Schematics(s.Name).Elements.Add("CAP",1000,0,270)
    awr.Project.Schematics(s.Name).Elements.Add("CAP",2000,0,270)
    awr.Project.Schematics(s.Name).Elements.Add("CAP",3000,0,270)
    "add wire"
    awr.Project.Schematics(s.Name).Wires.Add(1000,1000,3000,1000)
    "add ports"
    awr.Project.Schematics(s.Name).Elements.Add("PORT",0,0)
    awr.Project.Schematics(s.Name).Elements.Add("PORT",4000,0,180)
    "add ground"
    awr.Project.Schematics(s.Name).Elements.Add("GND",1000,1000)
def SetValues(s):
    "sets the parameter values of the elements to be non-default"
    "values as double will always be in base units (Farads, Henries, etc)"
    awr.Project.Schematics(s.Name).Elements("IND.L1").Parameters("L").ValueAsDouble = 15e-9
    awr.Project.Schematics(s.Name).Elements("IND.L2").Parameters("L").ValueAsDouble = 30e-9
    awr.Project.Schematics(s.Name).Elements("IND.L3").Parameters("L").ValueAsDouble = 30e-9
    awr.Project.Schematics(s.Name).Elements("IND.L4").Parameters("L").ValueAsDouble = 15e-9
    awr.Project.Schematics(s.Name).Elements("CAP.C1").Parameters("C").ValueAsDouble = 8e-12
    awr.Project.Schematics(s.Name).Elements("CAP.C2").Parameters("C").ValueAsDouble = 10e-12
    awr.Project.Schematics(s.Name).Elements("CAP.C3").Parameters("C").ValueAsDouble = 8e-12
def ArrangeWindows():
    for i in range(awr.Windows.Count):
        awr.Windows(i+1).ViewAll()
    awr.Windows.Tile(1)
def SetFrequencies():
    freqs=[]
    awr.Project.Frequencies.Clear
    for i in range(100, 1000, 10):
        freqs.append(i*1e6)
    awr.Project.Frequencies.AddMultiple(freqs)
def AddGraph(s):
    g = awr.Project.Graphs.Add("s21 and s11",3)
    g.Measurements.Add(s.Name,"DB(|S(1,1)|)")
    g.Measurements.Add(s.Name,"DB(|S(2,1)|)")
def Simulate():
    awr.Project.Simulator.Analyze()
def AddMarkers(s):
    m = awr.Project.Graphs(1).Markers.Add(s.Name + ":DB(|S(2,1)|)",1,0.1e9)
    m.Type = 3
    m.AutoSearch.mode=0
    m2 = awr.Project.Graphs(1).Markers.Add(s.Name + ":DB(|S(2,1)|)",1,0.5e9)
    m2.Type =4
    m2.Offset.Distance = -3
    m2.Offset.mode=1
    m2.Offset.ReferenceMarker="m1"
def AddEquations(s):
    awr.Project.Schematics(s.Name).Equations.Add("IND=15",1500,-1000)
    awr.Project.Schematics(s.Name).Equations.Add("CAP=8",2500,-1000)
    awr.Project.Schematics(s.Name).Elements("IND.L1").Parameters("L").ValueAsString = "IND"
    awr.Project.Schematics(s.Name).Elements("IND.L4").Parameters("L").ValueAsString = "IND"
    awr.Project.Schematics(s.Name).Elements("CAP.C1").Parameters("C").ValueAsString = "CAP"
    awr.Project.Schematics(s.Name).Elements("CAP.C3").Parameters("C").ValueAsString = "CAP"
def OptLimits(s):
    awr.Project.Schematics(s.Name).Equations("CAP").Optimize=True
    awr.Project.Schematics(s.Name).Equations("CAP").Constrain=True
    awr.Project.Schematics(s.Name).Equations("CAP").LowerConstraint = 8*0.75
    awr.Project.Schematics(s.Name).Equations("CAP").UpperConstraint = 8*1.25
    awr.Project.Schematics(s.Name).Equations("IND").Optimize=True
    awr.Project.Schematics(s.Name).Equations("IND").Constrain=True
    awr.Project.Schematics(s.Name).Equations("IND").LowerConstraint = 15*0.75
    awr.Project.Schematics(s.Name).Equations("IND").UpperConstraint = 15*1.25
    awr.Project.Schematics(s.Name).Elements("CAP.C2").Parameters("C").Optimize=True
    awr.Project.Schematics(s.Name).Elements("CAP.C2").Parameters("C").Constrain=True
    awr.Project.Schematics(s.Name).Elements("CAP.C2").Parameters("C").LowerConstraint = 10*0.75*1e-12
    awr.Project.Schematics(s.Name).Elements("CAP.C2").Parameters("C").UpperConstraint = 10*1.25*1e-12
def SetOptGoals(s):
    awr.Project.OptGoals.Add(s.Name,"DB(|S(1,1)|)",1,1,2,0,500e6,1,-17,-17,15)
    awr.Project.OptGoals.Add(s.Name,"DB(|S(2,1)|)",2,1,2,0,500e6,1,-1,-1,15)
    awr.Project.OptGoals.Add(s.Name,"DB(|S(2,1)|)",1,1,2,700e6,1000e6,1,-30,-30,15)
def Optimize():
    awr.Project.Optimizer.MaxIterations = 500
    awr.Project.Optimizer.Type = find_opt_type("Random (Local)")
    awr.Project.Optimizer.NewWindow()
    awr.Project.Optimizer.Start()
    while awr.Project.Optimizer.Running == True:
        time.sleep(0.5)
def find_opt_type(nm):
    typ = -1
    for i in range(awr.Project.Optimizer.TypeCount):
        if nm == awr.Project.Optimizer.TypeName(i+1):
            typ = i+1
    if typ == -1:
        print ("could not find optimizer name specified:" + nm)
    return typ
"main program"
awr = win32.Dispatch("MWOApp.MWOffice")
Cleanup()
sch = CreateSchematic()
BuildSchematic(sch)
SetValues(sch)
SetFrequencies()
AddGraph(sch)
Simulate()
AddMarkers(sch)
AddEquations(sch)
ArrangeWindows()
OptLimits(sch)
SetOptGoals(sch)
Optimize()