• RE: TSB Config Panel wont' install 3706A USB driver

    Hello,

    That is very perplexing.

    The USB0:: resource string is what I expect.
    Does the front panel display the REM annunciator to indicated the remote connection has been made?
    Also expect TSB will issue a reset().  For unknown reason, it is not successfully receiving a response from the 3706A.
    Try a different USB A-B cable.  Also try different USB port on the computer if you have one.

    With all Keithley related software, you should also have a utility program:  Keithley Communicator.
    Try: close TSB and reboot 3706A.  Invoke Communicator and open the same USB0:: resource.

    You and enter commands in the bottom frame, then hit the run button to send the command.
    If you send something that sends back a response, press F2 or menu Command>Read Instrument Data.
    Can you send *idn? command and read the response back?
    What about sending reset() command.  And errors displayed on the instrument front panel?

    Attached are some screen shots.
     
  • RE: TSB Config Panel wont' install 3706A USB driver

    In Test Script Builder (TSB), the 'Open Instrument' icon in the Instrument Console should be enumerating and displaying the detected USB0:: type of VISA resource string for your model 3706A.
    Do you have that?  If yes, select that and see if it can successfully connect.

    The Wizard that you mention sounds like the Keithley Configuration Panel.  There is no requirement to do anything in the Config Panel to have TSB be able to see the USB0:: resources or to subsequently use the instrument from Python or similar.  The config panel allows you to associate a VISA resource with an IVI driver and also to assign alias to it to use when opening communication sessions.  The NI MAX software tool covers these same optional configuration aspects.
  • Amps Measure Function Protective Fuse for DMM4020

    The 200 mA input is protected by a fuse (F2) rated at 440 mA, 1000 V (fast blow).

    Dimension: 0.406 IN diameter X 1.375 IN length

    Higher ranges are protected by fuse (F1) rated 11Amps, 1000V (fast blow).

    Dimension:  0.406 IN diameter  X 1.5 IN length

    These fuses are fairly popular in many different DMMs with amp measure.

    Consider Fluke:
    FUSE-440MA/1000VB1
    FUSE-11A/1000V B1

    Littlefuse FLU.440 and FLU011

    Ferraz Shawmut FSM44/100 and FSM11

  • RE: KTH-2651A Minimum Operating Voltage as Load

    For an electronic load product type like the 2380 series, you are right to be aware of minimum operating voltage when sinking current.

    However, a SourceMeter has very different analog architecture and does not have a similar concern.

    If asking the SMU to source negative current (sink current into the HI terminal) you will also specify a (maximum) voltage compliance limit.  But the actual voltage that will develop between the HI to LO terminal is a consequence of the I*R drop external to the SMU and not due to internal I*R drops.
    You could short HI to LO and have it sink current and it would be perfectly happy with the near to zero volt drop on HI to LO.

    When sourcing current, the minimum allowed voltage compliance programmed value is 10mV.  But you'd set it this low only if you wanted to enforce this as a maximum voltage that the DUT should experience when forcing the current by the SMU.
    Instead, you would set the voltage compliance to value larger than the expected I*R of the DUT.
  • RE: how to calculate the accuracy Dmm4020

    You have it correct. 

    For the 200 ohm range, the 1 year spec:  0.03% of value + 0.004% of range

    For 10 ohm DUT measured on this range:
    0.03% x 10 = 0.003 ohms
    0.004% x 200 = 0.008 ohms

    Total Error Budget:  0.011 ohms
  • RE: Connections on a 3723 single-pole matrix switch

    If you make use of backplane relays or connect the DMM LO to the Output HI of bank 2, then you could measure between any two pins of bank 1 and bank 2.

    If you have more than one 3723 card in the 3706A chassis, jumpering it to the backplane will be recommended way.

    On rear of the 3706A is a DB15 connector that brings out the DMM HI and LO as well as the backplane relays HI and LO.
    A small jumper on the DB15 could connect the DMM LO to the HI of backplane 3 (for example).
    Each card (one by one) would need to close backplane #3 of MUX Bank 2 when a channel on that card is one of pins.

    In the channel patterns, you can associate backplane relays with the card channel to have this automatic closure of the backplane relay with the channel.

  • RE: 4200A-SCS command "GD" and "EX" cannot find user library

    IP address is controlled in the "normal" way for a Windows computer (Network settings).
    Good question about if it uses the upper or lower port.  I find that it uses the one that is connected to my network.
    If I have LAN cable connected to both of them, I'm finding that KXCI will attach the IP address of the upper port.

    I did a little experiment with the commands.
    In KULT, build a simple Library and Module for the the system beep to play a tone.
    I'm able to remotely execute it with the UL and EX commands.
    The GD command brings back the info about the parameters of the library.
    See the attached images.

    I've got version 1.11 of Clarius on the 4200A-SCS
  • RE: AFG31000 Series - Sample Code for using optional SEQuencer

    If the optional SEQ license is not there, then the SEQ feature of Advanced mode can still be used, but only in run mode = continuous.
    Continuous also limits you to one waveform entry with infinite repeat.
    Wait, jump are disabled too.

    Both channels can have a waveform (but need same number of points in each).

    Right now, it seems the only means to present a single waveform file that contains more than 131K entries to the SEQ is to bring it on a thumb drive (*.tfwx).

    How to get it onto a thumb drive?  I used ArbExpress (3.6).  Use the File>Open to open a saved scope waveform or a csv file of the waveform.  Then use File>Save As to save the tfwx file for the AFG to use.
    Hopefully in near future we will have an API for creating the large sequence directly onto the AFG storage.
  • RE: AFG31022 downloading waveforms

    Here is a Python sample for loading a custom waveform to the standard ARB mode.
    It was targeting generation of double pulse test waveform type.
    It is easy matter to save the EMEM memory to a tfwx file on the M: or U: drive for use in the SEQ.
     
    '''
    Create waveform and send to AFG31102
    
    Double Pulse Test Waveform
    
                  --- A1----                ---A2--- 
                 |          |              |        |
                |            |            |          |
    -----------|              |----------|            |------------
    
    <--  t1 -->|<--- t2 --->|<-----t3---->|<---t4---->|<---t5---->|
    
    
    Pulse Heights, A1 and A2 , correspond to the Vgs applied to the FET
    and therefore control the Ids current level.
    
    rise/fall times = don't care yet
    
    duration of other time segements = important
    
    '''
    
    import pyvisa
    import numpy as np # for test wave
    import matplotlib.pyplot as plt # for plotting, not required
    
    #time durations for our waveform
    t1 = 1e-6
    t2 = 1e-6    #duration of A1
    t3 = 1e-6  # off time in between two pulses
    t4 = 1e-6   #duration of A2
    t5 = 1e-6
    #voltage amplitudes of the pulses
    A1 = 1.25    #volts
    A2 = 3    #volts
    AFG_SampleRate = 250e6
    
    
    
    total_time = t1 + t2 + t3 + t4 + t5
    t_axis = np.arange(0, total_time, 1/AFG_SampleRate)
    wave = np.multiply(0, t_axis)      # populate with zeros
    
    ARB_SRC_FREQ = int (AFG_SampleRate / len(t_axis))
    
    
    print('********************')
    print('ARB_SRC_FREQ: ' + str(ARB_SRC_FREQ))
    print('without option, limit size of ARB to 131K entries')
    print('Num Pts per ARB Waveform: ' + str(len(t_axis)))
    print(len(wave))
    
    #overwrite some of the zeros with our pulse height values
    
    #first pulse
    start_index=int(t1 * AFG_SampleRate)
    stop_index = start_index + int(t2 * AFG_SampleRate)
    print('start index pulse1: ' + str(start_index))
    print('stop index pulse1: ' + str(stop_index))
    for i in range(start_index, stop_index):    #pulse top
        wave[i] = A1
    
    # second pulse
    start_index=int((t1+ t2+ t3) * AFG_SampleRate)
    stop_index = start_index + int(t4* AFG_SampleRate)
    print('start index pulse2: ' + str(start_index))
    print('stop index pulse2: ' + str(stop_index))
    for i in range(start_index, stop_index):    #pulse top
        wave[i] = A2
        
    #build normalized array
    # normalize to dac values
    m = 16382 / (wave.max() - wave.min())
    b = -m * wave.min()
    dac_values = (m * wave + b)
    np.around(dac_values, out=dac_values)
    dac_values = dac_values.astype(np.uint16)
    
    
    # plot (optional)
    plt.plot(dac_values)
    plt.show()
    
    #Get the this from NI-MAX
    instrumentdescriptor = 'USB0::0x0699::0x035A::C013392::INSTR'
    #instrumentdescriptor = 'GPIB0::11::INSTR'
    
        
        
    print('****************************************')
    debug = 0
    if debug:
        for item in wave:
            print(item)
        
    
    #Write the waveform to a text file 
    debug = 0
    if debug:
        fid = open('waveform.txt', 'w')
        for j in wave:
            fid.write(str(j) + '\n')
        fid.close()
    
    
    print('Sending waveform to AFG')
    
    
    #Next sending to the AFG
    resource_mgr = pyvisa.ResourceManager()
    AFG = resource_mgr.open_resource(instrumentdescriptor)
    AFG.read_termination = '\n'
    AFG.encoding = 'latin_1'
    
    def halt_on_msg():
        e = int(AFG.query('*esr?'))
        if e != 0:
            raise Exception('non-zero esr')
    
    
    print(AFG.query('*IDN?'))
    #reset and clear the AFG status
    AFG.write('*rst')
    AFG.write('*cls')
    
    #configure the channel to play arbitrary waveform, burst mode, .2ms timer
    #on trigger, 0 - 5V output, 1 cycle of waveform per occurance.
    AFG.write('source1:function ememory')
    AFG.write('OUTP1:IMP INF')    #MAX=10Kohms, INF is >10K, MIN=1ohm
    AFG.write('source1:frequency ' + str(ARB_SRC_FREQ)  )
    AFG.write('source1:burst:mode trig')
    AFG.write('source1:burst:ncycles 1')
    AFG.write('source1:burst:state on')
    AFG.write('trigger:sequence:timer 0.005')
    AFG.write('source1:voltage:high ' + str(wave.max()))
    AFG.write('source1:voltage:low ' + str(wave.min()))
    #AFG.write('source1:voltage:offset 2.5')
    
    
    # ****************  send the ARB waveform ******************
    
    halt_on_msg()
    
    # datatype = "H" means unsigned short format
    AFG.write_binary_values(':TRAC:DATA EMEM1,',
                            dac_values,
                            datatype='h',                 
                            is_big_endian=True) 
    
    halt_on_msg()
    
    
    
    #finally, turn the output on
    AFG.write('output1 on')
    
  • AFG31000 Series - Sample Code for using optional SEQuencer

    On the AFG31K models, in the Advanced mode, the SEQ feature is separately licensed.
    Trial license can be obtained here:  Tek AMS Trial License for AFG

    Here is a Python simple demo program to use the SEQ feature from the sample waveform files on the unit P: drive for predefined waveforms.
     
    import pyvisa
    import time
    
    #Get the this from NI-MAX
    instrumentdescriptor = 'USB0::0x0699::0x035A::C013392::INSTR'
    debug = 1
    # define a couple helper functions
    def error_check():
        e = int(AFG.query('*esr?'))
        if e != 0:
            err_msg = AFG.query("SYST:ERR?")
            print(err_msg)
            #raise Exception('non-zero esr: ' + err_msg)
    # some operations need a litte time
    # and if we send next command too soon, bad things happen.
    # so use the operation complete query to be kind to AFG.
    # if operation takes longer than our VISA timeout, that errow will occur
    def check_if_done():
        e = int(AFG.query('*opc?'))
        if e != 1:
            print("did we get visa timeout?")
    
    # ***************  Connect to AFG
    resource_mgr = pyvisa.ResourceManager()
    AFG = resource_mgr.open_resource(instrumentdescriptor)
    AFG.read_termination = '\n'
    AFG.encoding = 'latin_1'  #for any binary data, this is needed
    AFG.timeout = 10000   #number of msec before timeout error for VISA read
    print(AFG.query('*IDN?'))
    print("Do you have the SEQ license?")
    print(AFG.query("LIC:LIST?"))  # make sure you have SEQ license!!
    #reset and clear the AFG status
    AFG.write('*RST')
    AFG.write('*CLS')
    
    #put instrument into Advanced/SEQ mode
    AFG.write("SEQControl:STATe ON")
    check_if_done()
    AFG.write("SEQuence:NEW")  #this gives us "clean slate" in the SEQ setup
    check_if_done()
    AFG.write("SEQControl:RMODe SEQ")  # run node = SEQ
    check_if_done()
    AFG.write("SEQuence:LENGth 2")  #this example will load two index in our SEQ
    AFG.write("SEQControl:SRATe 5.0E6")
    AFG.write("SEQControl:SOURce1:SCALe 100")  # 1000 is max value = FS of your AFG model
    AFG.write("SEQControl:SOURce1:OFFSet 0")  #offset in volts
    # load files from predefined location (P:)
    # this gives our sequence two Waveforms to use
    AFG.write("WLISt:WAVeform:IMPort \"P:/Pulse1000.tfwx\"")
    check_if_done()
    if debug: error_check()
    AFG.write("WLISt:WAVeform:IMPort \"P:/Sine1000.tfwx\"")
    check_if_done()
    if debug: error_check()
    
    AFG.write("SEQuence:ELEM1:WAVeform1 \"P:/Pulse1000.tfwx\"")  # load first element
    check_if_done()
    if debug: error_check()
    AFG.write("SEQuence:ELEM2:WAVeform1 \"P:/Sine1000.tfwx\"")   # load second element
    check_if_done()
    if debug: error_check()
    # set Repeat values for each element
    AFG.write("SEQuence:ELEM1:LOOP:COUNt 5")  # up to 1E6
    check_if_done()
    if debug: error_check()
    AFG.write("SEQuence:ELEM2:LOOP:COUNt 3")
    check_if_done()
    if debug: error_check()
    # have last element GOTO index 1 element
    AFG.write("SEQuence:ELEM2:GOTO:STATe 1")  # enable GOTO index behavior
    AFG.write("SEQuence:ELEM2:GOTO:INDEX 1")  # have last index GOTO index 1
    check_if_done()
    if debug: error_check()
    #the SEQ is loaded...now run it
    AFG.write("OUTPut1:IMPedance INF")  # presently connected to Hi-Z scope channel
    AFG.write("OUTPut1:STATe ON")
    AFG.write("SEQControl:RUN:IMMediate")
    
    time.sleep(5)  # let it run for a few seconds
    
    AFG.write("SEQControl:STOP:IMMediate")
    check_if_done()   # this is one example where a little time needed
    AFG.write("OUTPut1:STATe OFF")   # if you want the output reliably turned off
    
    #clean up our VISA connection
    AFG.clear()
    AFG.close()
    resource_mgr.close()
    print("*** all done ****")