• RE: Random measurement drop err. -113 Undefined Header

    On the old forum, user blegeyt gave helpful answer.

    The old post was for model 2400 but you have different model of product.

    Suggest:  use ni trace to capture the gpib bus traffic and see which exact command and error occurs.
    I suggest to verify root cause more fully.

    User blegeyt suggest to stop use of status byte reading and *opc, and instead *opc? and visa read with appropriate duration timeout.  He attributes the issue to usb to gpib interface or driver used by PC.
  • RE: DAQ6510 PLC COMM

    Yes.
    Typical way is to use raw sockets from the AB to talk to the instrument over LAN.
    Alternately, add a KTTI-rs232 communication module to the DAQ if the AB has COM port ability.

    This seems somewhat related:
    Using external equipment with AB PLC
  • RE: Hardware communication Error 5067 Keithley 2651A

    You might also want to contact David at the email in earlier post.

    Are you using any output off mode commands?
    Are you using the high capacitance mode?

    What is the Isc at 0V of your cell?
    What is the Voc at 0A?
  • RE: [4200A-SCS] KXCI recieve wrong command

    In KCON settings, your EOI is off.  Try turning that on in KCON for the gpib communication.
  • RE: Remote Restart SMU

    Thanks for clarifying.
    see if this post helps.  Same DST process for SMU or DAQ:
    https://my.tek.com/en/tektalk/switching-data-acq/8644f450-3c70-ee11-a81c-000d3a32997c

     
  • RE: How can I set "pulse mode" in keithley 2602B ?

    Needs an update:

    The code posted above will not take you into pulse region 4.
    These high watt pulse regions are in our Extended Operating Area and have firmware imposed max PW and Duty Cycle limits.

    To access the EOA regions, supply a higher voltage value for the trigger.source.limitv which will be applied only during the high watt pulse.
    When not sourcing the pulse level, the lower value set for the smuX.source.limitv applies.  The combo of smuX.source.leveli and smuX.source.limitv needs to be within the DC operating area of the SMU.

    These three lines in particular for accessing EOA region:

    smuX.measure.rangev = EOA_limit

    smuX.source.limitv = limitV

    smuX.trigger.source.limitv = EOA_limit

    I'll upload scope shot of 1.5A into 10Ω.

    Revised code:
    1. function Run_test(show_data, PulsePeriod, PulseWidth, MeasDelay)
    2.  
    3.  
    4.    -- when passthrough is true, the timer will "tic" immediately,
    5.    -- which for this application will start as soon as the
    6.    -- trigger model is ARMED.  
    7.    node[1].trigger.timer[1].delay = PulsePeriod
    8.    node[1].trigger.timer[1].stimulus = node[1].smua.trigger.ARMED_EVENT_ID
    9.    node[1].trigger.timer[1].count = 1  --PulseCount - 1
    10.    node[1].trigger.timer[1].passthrough = true
    11.    node[1].trigger.timer[1].clear()
    12.    
    13.    node[1].trigger.timer[2].delay = PulseWidth
    14.    node[1].trigger.timer[2].stimulus = node[1].trigger.timer[1].EVENT_ID
    15.    node[1].trigger.timer[2].count = 1        
    16.    node[1].trigger.timer[2].passthrough = false
    17.    node[1].trigger.timer[2].clear()
    18.    
    19.    node[1].trigger.timer[3].delay = MeasDelay
    20.    node[1].trigger.timer[3].stimulus = node[1].trigger.timer[1].EVENT_ID
    21.    node[1].trigger.timer[3].count = 1        
    22.    node[1].trigger.timer[3].passthrough = false
    23.    node[1].trigger.timer[3].clear()
    24.  
    25.  
    26.     
    27.     -- digital output trigger for external equipment
    28.     -- configure digital IO line 1 to output a active LO/falling edge
    29.     -- pulse at start of each current pulse
    30.     digio.trigger[1].clear()
    31.     digio.trigger[1].mode = digio.TRIG_FALLING  --digio.TRIG_RISINGM
    32.     digio.trigger[1].pulsewidth = 100e-6
    33.     digio.trigger[1].stimulus = node[1].trigger.timer[1].EVENT_ID  -- source stimulus too
    34.     
    35.         
    36.    -- clear the reading buffers
    37.    reset_buffers(node[1].smua)
    38.      
    39.  
    40.  
    41.     -- Turn the outputs on
    42.     smua.source.output                    = smua.OUTPUT_ON
    43.     
    44.     -- after blue light state change, delay a little 
    45.     delay(0.1)  
    46.  
    47.     -- Start the trigger model execution
    48.     smua.trigger.initiate()   -- start this one last as all the other smus follow this leader
    49.     
    50.     -- Wait until the sweep has completed
    51.     waitcomplete()
    52.  
    53. --[[
    54. -- hot switch:
    55. -- to bleed off the trapped charge on PN junction capacitance and non-zero voltage
    56. -- briefly set the voltage compliance to small number
    57. restore_val = smua.source.limitv
    58. smua.source.limitv = 0.01
    59. delay(0.001)
    60. smua.source.limitv = restore_val
    61. ]]
    62.  
    63.     -- before blue light state change, delay a little 
    64.     delay(0.1)
    65.     -- Turn the output off
    66.     smua.source.output                    = smua.OUTPUT_OFF
    67.     
    68.  
    69.     -- IV data for the laser
    70.     if show_data == true then
    71.        -- Print the data back to the Console in tabular format
    72.        print(" Voltage\tCurrent\tResistance")
    73.        for x=1,smua.nvbuffer1.n do
    74.           -- Voltage readings are in nvbuffer2.  Current readings are in nvbuffer1.
    75.           print(smua.nvbuffer2[x], smua.nvbuffer1[x], smua.nvbuffer2[x]/smua.nvbuffer1[x] )
    76.        end
    77.     end
    78.     
    79.  
    80.     
    81. end
    82.  
    83. function reset_buffers(smu)
    84.         -- Prepare the Reading Buffers
    85.     smu.nvbuffer1.clear()
    86.     smu.nvbuffer1.appendmode        = 1
    87.     smu.nvbuffer1.collecttimestamps    = 1
    88.     smu.nvbuffer2.clear()
    89.     smu.nvbuffer2.appendmode        = 1
    90.     smu.nvbuffer2.collecttimestamps    = 1
    91.  
    92. end
    93.  
    94.  
    95. function config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, EOA_limit, nplc, remoteSense)
    96.     
    97.     smu.source.func                    = smu.OUTPUT_DCAMPS
    98.     if (remoteSense == true) then
    99.         smu.sense                    = smu.SENSE_REMOTE
    100.     else
    101.         smu.sense                    = smu.SENSE_LOCAL
    102.     end
    103.     smu.source.autorangei            = smu.AUTORANGE_OFF
    104.     smu.source.rangei                = srcRange
    105.     smu.source.leveli                = 0
    106.     smu.source.limitv                = limitV
    107.  
    108.     -- Disabling Auto-Ranging and Auto-Zero ensures accurate and consistent timing
    109.     smu.measure.autozero            = smu.AUTOZERO_ONCE
    110.     smu.measure.autorangev            = smu.AUTORANGE_OFF
    111.     smu.measure.rangev                = EOA_limit
    112.     smu.measure.nplc                = nplc
    113.     -- A timer will be used to set the measure delay and synchronize the measurement
    114.     -- between the SMUs so set the built in delay to 0.
    115.     smu.measure.delay                = 0
    116.     
    117.     -- Configure SMU Trigger Model for Sweep
    118.     --smu.trigger.source.lineari(start, stop, numPoints)
    119.     smu.trigger.source.listi(srclist)
    120.     smu.trigger.source.limitv        = EOA_limit
    121.     smu.trigger.measure.action        = smu.ENABLE
    122.     smu.trigger.measure.iv(smu.nvbuffer1, smu.nvbuffer2)
    123.     smu.trigger.endpulse.action        = smu.SOURCE_IDLE
    124.     smu.trigger.endsweep.action        = smu.SOURCE_IDLE
    125.     smu.trigger.count                = table.getn(srclist)
    126.     smu.trigger.arm.stimulus        = 0
    127.     smu.trigger.source.stimulus        = trigger.timer[1].EVENT_ID
    128.     smu.trigger.measure.stimulus    = trigger.timer[3].EVENT_ID
    129.     smu.trigger.endpulse.stimulus    = trigger.timer[2].EVENT_ID
    130.     smu.trigger.source.action        = smu.ENABLE
    131. end
    132.  
    133.  
    134. --  **************************************  MAIN PROGRAM BELOW *****************
    135.  
    136. reset()
    137. errorqueue.clear()
    138.  
    139. nodesFound = tsplink.reset(1)
    140.  
    141. print("Nodes found = " .. nodesFound)
    142.  
    143. --smua.interlock.enable = smua.DISABLE
    144.  
    145.  
    146. -- use of pulse region 4 of 2602B:  10A at up to 20V
    147. -- max 1.8msec pulse with 1% duty cycle
    148. local PulseWidth = 1.0e-3
    149. local PulsePeriod = PulseWidth / 0.01
    150. local MeasDelay = PulseWidth * 0.8
    151. local nplc = (PulseWidth - MeasDelay - 60e-6) * localnode.linefreq
    152.  
    153.  
    154. print("Computed NPLC value: "..tostring(nplc))
    155.  
    156. if tostring(nplc) < "0.001" then
    157.   nplc = 0.001   -- 16.7usec, minimum value allowed
    158.   MeasDelay = 1e-6
    159. end -- if
    160.  
    161.  
    162. -- voltage ranges on 2602B:  100mV, 1V, 6V, 40V
    163. -- pick a limit value higher than expected I*DUT_R and
    164. -- puts you on appropriate range.
    165. local voltageLimit = 1
    166. local duringPulse_voltageLimit = 20
    167.  
    168. -- ranges:  decades of 10.....100mA, 1A, 3A, 10A
    169. local mySrcRange = 3  
    170. mysrclist = { 1.5}  -- use this one for a single pulse
    171. --local numPulses = table.getn(mysrclist)
    172.  
    173.  
    174.  
    175.    
    176.     --config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, EOA_limit, nplc, remoteSense)
    177.     config_smu_list_sweep(1, node[1].smua, mySrcRange, mysrclist, voltageLimit, duringPulse_voltageLimit, nplc, true)
    178.  
    179.  
    180.  
    181.    timer.reset()
    182.    
    183.    
    184.    Run_test(true, PulsePeriod, PulseWidth, MeasDelay) -- pass true to print data back to console
    185.    
    186.    time = timer.measure.t()
    187.    print("Time to run: "..time)
    188.    print("****************************************")
    189.    print("Current Source Range: "..node[1].smua.source.rangei)

    ​​​​​​​
  • RE: Driver to control Keithley 3706A with visual basic application using ethernet cable

    Attached is a form file from a VB sample using IVI driver and 3706A.
  • RE: Driver to control Keithley 3706A with visual basic application using ethernet cable

    The IVI driver is probably the way to go.
    The IVI driver "sits upon" NI VISA for the communication with instruments.
    Instead of GPIB0:: type resource name, pass info for your LAN connected instrument.
    Typically like this:  TCPIP0::192.168.1.50::inst0::INSTR
    Substitute your IP address in there.
  • RE: How can I set "pulse mode" in keithley 2602B ?

    See how this does for you.
    In the attachment is scope shot of the 1.5Amp, 1msec pulse into 50mΩ resistor (~75mV response).

    TSP code:
    1. ​​​​​​​
    2.  
    3. function Run_test(show_data, PulsePeriod, PulseWidth, MeasDelay)
    4.  
    5.  
    6.    -- when passthrough is true, the timer will "tic" immediately,
    7.    -- which for this application will start as soon as the
    8.    -- trigger model is ARMED.  
    9.    node[1].trigger.timer[1].delay = PulsePeriod
    10.    node[1].trigger.timer[1].stimulus = node[1].smua.trigger.ARMED_EVENT_ID
    11.    node[1].trigger.timer[1].count = 1  --PulseCount - 1
    12.    node[1].trigger.timer[1].passthrough = true
    13.    node[1].trigger.timer[1].clear()
    14.    
    15.    node[1].trigger.timer[2].delay = PulseWidth
    16.    node[1].trigger.timer[2].stimulus = node[1].trigger.timer[1].EVENT_ID
    17.    node[1].trigger.timer[2].count = 1        
    18.    node[1].trigger.timer[2].passthrough = false
    19.    node[1].trigger.timer[2].clear()
    20.    
    21.    node[1].trigger.timer[3].delay = MeasDelay
    22.    node[1].trigger.timer[3].stimulus = node[1].trigger.timer[1].EVENT_ID
    23.    node[1].trigger.timer[3].count = 1        
    24.    node[1].trigger.timer[3].passthrough = false
    25.    node[1].trigger.timer[3].clear()
    26.  
    27.  
    28.     
    29.     -- digital output trigger for external equipment
    30.     -- configure digital IO line 1 to output a active LO/falling edge
    31.     -- pulse at start of each current pulse
    32.     digio.trigger[1].clear()
    33.     digio.trigger[1].mode = digio.TRIG_FALLING  --digio.TRIG_RISINGM
    34.     digio.trigger[1].pulsewidth = 100e-6
    35.     digio.trigger[1].stimulus = node[1].trigger.timer[1].EVENT_ID  -- source stimulus too
    36.     
    37.         
    38.    -- clear the reading buffers
    39.    reset_buffers(node[1].smua)
    40.      
    41.  
    42.  
    43.     -- Turn the outputs on
    44.     smua.source.output                    = smua.OUTPUT_ON
    45.     
    46.     -- after blue light state change, delay a little 
    47.     delay(0.1)  
    48.  
    49.     -- Start the trigger model execution
    50.     smua.trigger.initiate()   -- start this one last as all the other smus follow this leader
    51.     
    52.     -- Wait until the sweep has completed
    53.     waitcomplete()
    54.  
    55. --[[
    56. -- hot switch:
    57. -- to bleed off the trapped charge on PN junction capacitance and non-zero voltage
    58. -- briefly set the voltage compliance to small number
    59. restore_val = smua.source.limitv
    60. smua.source.limitv = 0.01
    61. delay(0.001)
    62. smua.source.limitv = restore_val
    63. ]]
    64.  
    65.     -- before blue light state change, delay a little 
    66.     delay(0.1)
    67.     -- Turn the output off
    68.     smua.source.output                    = smua.OUTPUT_OFF
    69.     
    70.  
    71.     -- IV data for the laser
    72.     if show_data == true then
    73.        -- Print the data back to the Console in tabular format
    74.        print(" Voltage\tCurrent\tResistance")
    75.        for x=1,smua.nvbuffer1.n do
    76.           -- Voltage readings are in nvbuffer2.  Current readings are in nvbuffer1.
    77.           print(smua.nvbuffer2[x], smua.nvbuffer1[x], smua.nvbuffer2[x]/smua.nvbuffer1[x] )
    78.        end
    79.     end
    80.     
    81.  
    82.     
    83. end
    84.  
    85. function reset_buffers(smu)
    86.         -- Prepare the Reading Buffers
    87.     smu.nvbuffer1.clear()
    88.     smu.nvbuffer1.appendmode        = 1
    89.     smu.nvbuffer1.collecttimestamps    = 1
    90.     smu.nvbuffer2.clear()
    91.     smu.nvbuffer2.appendmode        = 1
    92.     smu.nvbuffer2.collecttimestamps    = 1
    93.  
    94. end
    95.  
    96.  
    97. function config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, nplc, remoteSense)
    98.     
    99.     smu.source.func                    = smu.OUTPUT_DCAMPS
    100.     if (remoteSense == true) then
    101.         smu.sense                    = smu.SENSE_REMOTE
    102.     else
    103.         smu.sense                    = smu.SENSE_LOCAL
    104.     end
    105.     smu.source.autorangei            = smu.AUTORANGE_OFF
    106.     smu.source.rangei                = srcRange
    107.     smu.source.leveli                = 0
    108.     smu.source.limitv                = limitV
    109.  
    110.     -- Disabling Auto-Ranging and Auto-Zero ensures accurate and consistent timing
    111.     smu.measure.autozero            = smu.AUTOZERO_ONCE
    112.     smu.measure.autorangev            = smu.AUTORANGE_OFF
    113.     smu.measure.rangev                = limitV
    114.     smu.measure.nplc                = nplc
    115.     -- A timer will be used to set the measure delay and synchronize the measurement
    116.     -- between the SMUs so set the built in delay to 0.
    117.     smu.measure.delay                = 0
    118.     
    119.     -- Configure SMU Trigger Model for Sweep
    120.     --smu.trigger.source.lineari(start, stop, numPoints)
    121.     smu.trigger.source.listi(srclist)
    122.     smu.trigger.source.limitv        = limitV
    123.     smu.trigger.measure.action        = smu.ENABLE
    124.     smu.trigger.measure.iv(smu.nvbuffer1, smu.nvbuffer2)
    125.     smu.trigger.endpulse.action        = smu.SOURCE_IDLE
    126.     smu.trigger.endsweep.action        = smu.SOURCE_IDLE
    127.     smu.trigger.count                = table.getn(srclist)
    128.     smu.trigger.arm.stimulus        = 0
    129.     smu.trigger.source.stimulus        = trigger.timer[1].EVENT_ID
    130.     smu.trigger.measure.stimulus    = trigger.timer[3].EVENT_ID
    131.     smu.trigger.endpulse.stimulus    = trigger.timer[2].EVENT_ID
    132.     smu.trigger.source.action        = smu.ENABLE
    133. end
    134.  
    135.  
    136. --  **************************************  MAIN PROGRAM BELOW *****************
    137.  
    138. reset()
    139. errorqueue.clear()
    140.  
    141. nodesFound = tsplink.reset(1)
    142.  
    143. print("Nodes found = " .. nodesFound)
    144.  
    145. --smua.interlock.enable = smua.DISABLE
    146.  
    147.  
    148. -- use of pulse region 4 of 2602B:  10A at up to 20V
    149. -- max 1.8msec pulse with 1% duty cycle
    150. local PulseWidth = 1.0e-3
    151. local PulsePeriod = PulseWidth / 0.01
    152. local MeasDelay = PulseWidth * 0.8
    153. local nplc = (PulseWidth - MeasDelay - 60e-6) * localnode.linefreq
    154.  
    155.  
    156. print("Computed NPLC value: "..tostring(nplc))
    157.  
    158. if tostring(nplc) < "0.001" then
    159.   nplc = 0.001   -- 16.7usec, minimum value allowed
    160.   MeasDelay = 1e-6
    161. end -- if
    162.  
    163.  
    164. -- voltage ranges on 2602B:  100mV, 1V, 6V, 40V
    165. -- pick a limit value higher than expected I*DUT_R and
    166. -- puts you on appropriate range.
    167. local voltageLimit = 1
    168.  
    169. -- ranges:  decades of 10.....100mA, 1A, 3A, 10A
    170. local mySrcRange = 3  
    171. mysrclist = { 1.5}  -- use this one for a single pulse
    172. --local numPulses = table.getn(mysrclist)
    173.  
    174.  
    175.  
    176.    
    177.     --config_smu_list_sweep(nodenum, smu, srcRange, srclist, limitV, nplc, remoteSense)
    178.     config_smu_list_sweep(1, node[1].smua, mySrcRange, mysrclist, voltageLimit, nplc, true)
    179.  
    180.  
    181.  
    182.    timer.reset()
    183.    
    184.    
    185.    Run_test(true, PulsePeriod, PulseWidth, MeasDelay) -- pass true to print data back to console
    186.    
    187.    time = timer.measure.t()
    188.    print("Time to run: "..time)
    189.    print("****************************************")
    190.    print("Current Source Range: "..node[1].smua.source.rangei)
    191.  
  • RE: Triggering SMUs via tsplink

    See if this helps:
    1. --[[
    2.  
    3.      Purpose:  show how an event on one 2600B can be "echoed" to second 2600B
    4.      
    5.      Setup:  need two 2600B that have TSP-LINK connectors.
    6.              Assign node 1 and 2 and use the cross-over cable to link them.
    7.              On front panel, use the reset under TSPLINK to verify the link.
    8.              
    9.      Method:  Use a timer as stimulus for digital IO active lo pulse.
    10.               Cause 10 pulses from DIO line 1 on rear DB25 connector.
    11.               Echo the timer event_id on tsp-link for digital IO on second node to also pulse.        
    12.  
    13.  
    14. ]]--
    15.  
    16.  
    17. function ConfigTSPLinkTriggers(nodenum)
    18.     node[nodenum].tsplink.trigger[1].clear()
    19.     node[nodenum].tsplink.trigger[1].mode        = tsplink.TRIG_FALLING
    20.     node[nodenum].tsplink.trigger[2].clear()
    21.     node[nodenum].tsplink.trigger[2].mode        = tsplink.TRIG_FALLING
    22.     node[nodenum].tsplink.trigger[3].clear()
    23.     node[nodenum].tsplink.trigger[3].mode        = tsplink.TRIG_FALLING
    24. end
    25.  
    26.  
    27. -- *********************
    28. --
    29. --  Main Program
    30. --
    31. -- *********************
    32. reset()
    33. errorqueue.clear()
    34.  
    35. if tsplink.state == "offline" then
    36.     nodesFound = tsplink.reset()
    37.     if nodesFound ~= 2 then
    38.         print(string.format("Error: Found %d Nodes. Expecting 2.", nodesFound))
    39.         exit()
    40.     end
    41. end
    42.  
    43. -- for each tsplink node    
    44. ConfigTSPLinkTriggers(1)
    45. ConfigTSPLinkTriggers(2)
    46.  
    47.  
    48. -- configure a timer on node 1 to issue 10 events
    49. -- upon receipt of one tsplink event_id
    50. nodenum = 1
    51. node[nodenum].trigger.timer[1].delay = 1e-3
    52. node[nodenum].trigger.timer[1].stimulus = node[nodenum].tsplink.trigger[1].EVENT_ID
    53. node[nodenum].trigger.timer[1].count = 10
    54. node[nodenum].trigger.timer[1].passthrough = false
    55. node[nodenum].trigger.timer[1].clear()
    56.  
    57. -- echo the timer event on tsplink two
    58. node[nodenum].tsplink.trigger[2].stimulus = node[nodenum].trigger.timer[1].EVENT_ID
    59.  
    60. -- digital IO *could* use timer event directly on this same node
    61. -- but it can also make use of the locally available tsplink two   
    62. node[nodenum].digio.trigger[1].clear()
    63. node[nodenum].digio.trigger[1].mode = digio.TRIG_FALLING
    64. node[nodenum].digio.trigger[1].pulsewidth = 100e-6
    65. --node[nodenum].digio.trigger[1].stimulus = node[nodenum].trigger.timer[1].EVENT_ID
    66. node[nodenum].digio.trigger[1].stimulus = node[nodenum].tsplink.trigger[2].EVENT_ID  
    67.  
    68. -- this remote node cannot "see" the timer events on other node
    69. -- this remote node must use the echoed event on tsplink two    
    70. nodenum = 2
    71. node[nodenum].digio.trigger[1].clear()
    72. node[nodenum].digio.trigger[1].mode = digio.TRIG_FALLING 
    73. node[nodenum].digio.trigger[1].pulsewidth = 100e-6
    74. node[nodenum].digio.trigger[1].stimulus = node[nodenum].tsplink.trigger[2].EVENT_ID    
    75.  
    76.  
    77. -- issue an assert to get the party started
    78. node[1].tsplink.trigger[1].assert()       
    79.     

    Scope shot of the digital IO pulses in attached document.