Perform a Guided Calibration using SCPI
This VBScript program performs a Guided Calibration using ECal or Mechanical standards. This example includes optional ECal orientation features.
This example has been updated to include:
-
Guided Power Cal (Oct 8, 2010)
-
The setting of Unknown Thru or Adapter Removal adapter delay. (March 2006).
-
The activation of a channel to be calibrated. (Aug. 2006).
The SCPI commands in this example are sent over a COM interface using the SCPIStringParser object. You do NOT need a GPIB connection to run this example.
This VBScript (*.vbs) program can be run as a macro in the PNA. To do this, copy the following code into a text editor file such as Notepad and save it on the PNA hard drive as Guided.vbs. Learn how to setup and run the macro.
' Performing a Guided 2-port cal (Ports 1 and 2)
TwoPortGuidedCal
Sub TwoPortGuidedCal
Dim app
Dim scpi
Dim connList
Dim selectedConn1, selectedConn2
Dim kitList
Dim selectedKit
Dim message
' Create / Get the PNA application.
Set app = CreateObject("AgilentPNA835x.Application")
Set scpi = app.ScpiStringParser
'The following demonstrates that the Active Channel is cal'd
'Preset the PNA
scpi.Execute "SYST:UPR"
'Create a new measurement on Chan 2
'Now there are two windows, channels and measurements
'This becomes the Active Measurement
scpi.Execute ("DISPlay:WINDow2:STATE ON")
'Define a measurement name, parameter
scpi.Execute ("CALCulate2:PARameter:DEFine:EXT 'MyMeas',S21")
'"FEED" the measurement
scpi.Execute ("DISPlay:WINDow2:TRACe1:FEED 'MyMeas'")
'This is the Active Measurement
'Activate the 'Preset' measurement to cal chan 1
scpi.Execute ("CALC1:PAR:SEL 'CH1_S11_1'")
' Query the list of connectors that the PNA system recognizes
connList = scpi.Execute("sens:corr:coll:guid:conn:cat?")
' Format the list with linefeed characters in place of the commas
connList = FormatList(connList)
message = "Enter your DUT connector for Port 1. Choose from this list:"
message = message & Chr(10) & Chr(10) & connList
' Select the connector for Port 1
selectedConn1 = InputBox(message)
If selectedConn1 = "" Then Exit Sub
scpi.Execute "sens:corr:coll:guid:conn:port1 '" & selectedConn1 & "'"
message = "Enter your DUT connector for Port 2. Again, choose from this list:"
message = message & Chr(10) & Chr(10) & connList
' Select the connector for Port 2
selectedConn2 = InputBox(message)
If selectedConn2 = "" Then Exit Sub
scpi.Execute "sens:corr:coll:guid:conn:port2 '" & selectedConn2 & "'"
' Note: If your PNA has more than 2 ports, then uncomment
' one or both of these next two lines.
'scpi.Execute "sens:corr:coll:guid:conn:port3 ""Not used"" "
'scpi.Execute "sens:corr:coll:guid:conn:port4 ""Not used"" "
' This next block of commented code demonstrates how to specify an adapter
' and it's electrical delay, in situations where you are performing an
' Unknown Thru or Adapter Removal calibration. In most situations, the
' PNA is able to correctly determine an adapter's electrical length
' at the end of the calibration. However, there are scenarios where
' the PNA cannot correctly calculate the length -- such as when the channel
' has a relatively small number of measurement points (for example, 201 or less)
' and the adapter is significantly long (for example, a cable that is several feet).
' In these cases, the ADAP commands (below) enable you to explicitly specify
' the adapter you are using.
' Send these commands prior to the "sens:corr:coll:guid:init" command.
' Create adapter and return the adapter number
'adapterNum = scpi.Execute("sens:corr:coll:guid:adap:cre? '" & selectedConn1 & "','"& selectedConn2 & "'")
' The adapterNum string contains a '+' character.
' Here we convert to integer to remove that.
'adapterNum = CStr( CInt(adapterNum) )
' Specify that this adapter has 10 nanoseconds electrical delay (coaxial).
'scpi.Execute "sens:corr:coll:guid:adap" & adapterNum & ":del 10E-9"
' Text description of adapter
'scpi.Execute "sens:corr:coll:guid:adap" & adapterNum & ":desc 'My adapter'"
' Select to use this adapter specifically between ports 1 and 2
'scpi.Execute "sens:corr:coll:guid:adap" & adapterNum & ":path 1,2"
' End of adapter block
' Query the list of acceptable cal kits and
' ECal module characterizations for Port 1.
kitList = scpi.Execute("sens:corr:coll:guid:ckit:cat? '" & selectedConn1 & "'")
' Format the list with linefeed
' characters in place of the commas
kitList = FormatList(kitList)
message = "Enter your cal kit or ECal module characterization for Port 1. "
message = message & "Choose from this list:"
message = message & Chr(10) & Chr(10) & kitList
' Select the Cal Kit or ECal module
' characterization to use for Port 1.
selectedKit = InputBox(message)
If selectedKit = "" Then Exit Sub
scpi.Execute "sens:corr:coll:guid:ckit:port1 '" & selectedKit & "'"
' Query the list of acceptable cal kits
' and ECal module characterizations for Port 2.
kitList = scpi.Execute("sens:corr:coll:guid:ckit:cat? '" & selectedConn2 & "'")
' Format the list with linefeed characters in place of the commas
kitList = FormatList(kitList)
message = "Enter your cal kit or ECal module characterization for Port 2. "
message = message & "Choose from this list:"
message = message & Chr(10) & Chr(10) & kitList
' Select the Cal Kit or ECal module
' characterization to use for Port 2.
selectedKit = InputBox(message)
If selectedKit = "" Then Exit Sub
scpi.Execute "sens:corr:coll:guid:ckit:port2 '" & selectedKit & "'"
' This determines whether the cal will be a "Guided Power Cal"
' or just a traditional S-parameter cal.
message = "On which port number shall power be measured? "
message = message & "For a traditional guided cal without power cal, enter 0"
Dim powerPort
powerPort = CInt( InputBox(message) )
If powerPort > 0 Then
scpi.Execute("sens:corr:coll:guid:psen" & CStr(powerPort) & ":stat on")
Dim retVal
retVal = MsgBox("Is the power sensor's connector type or gender different from the DUT connector for that port?", vbYesNo)
If retVal = vbYes Then
message = "Enter your power sensor's connector. Choose from this list:"
message = message & Chr(10) & Chr(10) & connList
' Select the sensor's connector.
selectedConn1 = InputBox(message)
If selectedConn1 = "" Then Exit Sub
scpi.Execute "sens:corr:coll:guid:psen" & CStr(powerPort) & ":conn '" & selectedConn1 & "'"
' Query the list of acceptable cal kits and ECal module characterizations
' that are applicable for the sensor's connector.
kitList = scpi.Execute("sens:corr:coll:guid:ckit:cat? '" & selectedConn1 & "'")
' Format the list with linefeed
' characters in place of the commas
kitList = FormatList(kitList)
message = "Enter your cal kit or ECal module characterization to use for de-embed of the sensor's connector. "
message = message & "Choose from this list:"
message = message & Chr(10) & Chr(10) & kitList
' Select the Cal Kit or ECal module characterization to use for de-embed of the sensor's connector.
selectedKit = InputBox(message)
If selectedKit = "" Then Exit Sub
scpi.Execute "sens:corr:coll:guid:psen" & CStr(powerPort) & ":ckit '" & selectedKit & "'"
Else
scpi.Execute("sens:corr:coll:guid:psen" & CStr(powerPort) & ":conn 'Ignored'")
End If ' End of block that considers the sensor's connector
' Ask for the power level to perform the power cal at
' (if this command is omitted, the default is 0 dBm).
Dim powerLevel
powerLevel = InputBox("Enter the power level for the power cal to be performed at")
If powerLevel = "" Then Exit Sub
scpi.Execute "sens:corr:coll:guid:psen" & CStr(powerPort) & ":pow:lev " & powerLevel
Else
scpi.Execute("sens:corr:coll:guid:psen1:stat off")
End If ' End of block that considers if the cal will include power calibration
' This next block of commented code
' shows optional functions when using ECal.
' Send these "sens:corr:pref" commands prior to the
' "sens:corr:coll:guid:init" command.
' Read ECAL information from ECal module #1 on the USB bus
' about the Keysight factory characterization data
'module1Info = scpi.Execute("sens:corr:coll:ckit:inf? ECAL1,CHAR0")
'MsgBox "Description of ECal Module #1:" & Chr(10) & Chr(10) & module1Info
' The following command enables auto orientation of
' the ECal module (The PNA senses which port of the
' module is connected to which port of the PNA).
'scpi.Execute "sens:corr:pref:ecal:ori ON"
' However, if you are measuring at very low power levels where
' the PNA may fail to sense the module's orientation, then turn auto
' orientation OFF and specify how the module is connected.
' "A1,B2" indicates Port A of the module is connected
' to PNA Port 1 and Port B is connected to PNA Port 2).
'scpi.Execute "sens:corr:pref:ecal:ori OFF"
'scpi.Execute "sens:corr:pref:ecal:pmap ECAL1,'A1,B2'"
' End of optional ECal setup
' Select the thru method of "Default". This instructs the PNA to
' determine which thru standard measurement technique to use
' based upon the selected connectors and
' calibration kit(s) and the PNA model number.
' with new CMET and TMET 'default' is set by not sending the commands
'
' Initiate the calibration and query the number of steps
scpi.Execute "sens:corr:coll:guid:init"
numSteps = scpi.Execute("sens:corr:coll:guid:steps?")
MsgBox "Number of steps is " + CStr(numSteps)
' Measure the standards
For i = 1 To numSteps
step = "Step " + CStr(i) + " of " + CStr(numSteps)
strPrompt = scpi.Execute("sens:corr:coll:guid:desc? " + CStr(i))
MsgBox strPrompt, vbOKOnly, step
scpi.Execute "sens:corr:coll:guid:acq STAN" + CStr(i)
Next
' Conclude the calibration
scpi.Execute "sens:corr:coll:guid:save"
MsgBox "Cal is done!"
End Sub
Function FormatList(list)
Dim tokens
' Strip the leading and trailing quotation
' marks from the list string
list = Mid(list, 2, Len(list) - 3)
' Tokenize the comma-delimited list string
' into an array of the individual substrings
tokens = Split(list, ",")
' Rebuild the list string, placing linefeed
' characters where the commas were,
' using Trim to remove leading and trailing spaces.
list = ""
For i = 0 To UBound(tokens)
tokens(i) = Trim(tokens(i))
list = list & tokens(i) & Chr(9)
If i < UBound(tokens) Then
i = i + 1
tokens(i) = Trim(tokens(i))
list = list & tokens(i) & Chr(10)
End If
Next
FormatList = list
End Function