""" ============================================================= *** modified 2022 - four wire resistance mode *** Institut f. Konstruktionsrechnik, Eggert Jung ============================================================= """ """ ================================================================================ *** Copyright 2019 Tektronix, Inc. *** *** See www.tek.com/sample-license for licensing terms. *** ================================================================================ """ """ ==================================================================================================== This example configures a series of channels within the 3706A mainframe for DCV measurement scanning. Additionally, a log file is created on a USB drive connected to the front port of the meter and writes the measurement information after each scan. ==================================================================================================== """ ## channel.exclusiveclose( import socket import struct import math import time import argparse import numpy as np from matplotlib import pyplot import channels echoCmd = 0 def instrConnect(mySocket, myAddress, myPort, timeOut, doReset, doIdQuery): mySocket.connect((myAddress, myPort)) # input to connect must be a tuple mySocket.settimeout(timeOut) if doReset == 1: instrSend(mySocket, "reset()") if doIdQuery == 1: tmpId = instrQuery(mySocket, "*IDN?", 100) print(tmpId) return mySocket def instrDisconnect(mySocket): mySocket.close() return def instrSend(mySocket, cmd): if echoCmd == 1: print(cmd) cmd = "{0}\n".format(cmd) mySocket.send(cmd.encode()) return def instrQuery(mySocket, cmd, rcvSize): instrSend(mySocket, cmd) time.sleep(0.1) return mySocket.recv(rcvSize).decode() def Write_Data(output_data_path, dataStr): # This function writes the floating point data to the # target file. #for f in floats: ofile = open(output_data_path, "a") # append the target data dataStr = "{0}".format(dataStr) ofile.write(dataStr) ofile.close() # Close the data file. return def Configure_Backplane(s): instrSend(s, "reset()") instrSend(s, "dmm.func = \"fourwireohms\"") #instrSend(s, "dmm.nplc = 0.1") instrSend(s, "dmm.autorange = dmm.OFF") instrSend(s, "dmm.range = 100") ## crossover connection is made on backplane 3 & 4 instrSend(s, 'channel.setbackplane("1001:1030", "1913")') instrSend(s, 'channel.setbackplane("1031:1060", "1924")') instrSend(s, 'channel.setbackplane("2001:2030", "2913")') instrSend(s, 'channel.setbackplane("2031:2060", "2924")') instrSend(s, 'channel.setbackplane("3001:3030", "3913")') instrSend(s, 'channel.setbackplane("3031:3060", "3924")') return def diff_4W_mess(s, ch1, ch2): instrSend(s, 'channel.exclusiveclose("{}")'.format(ch1)) instrSend(s, 'channel.close("{}")'.format(ch2)) #print(instrQuery(s, "print(dmm.measure())", 64)[:-1], end='\t') return float(instrQuery(s, "print(dmm.measure())", 64)) def get_mapped(arr): out = np.zeros(shape=(9, 10)) for i in range(0,90): x, y = channels.map[i] out[x-1][y-1] = arr[i] return out def done(): instrSend(s, "beeper.beep(0.500, 440)") instrSend(s, "beeper.beep(0.500, 440)") instrSend(s, "beeper.beep(0.500, 440)") instrSend(s, "beeper.beep(0.350, 349)") instrSend(s, "beeper.beep(0.150, 523)") instrSend(s, "beeper.beep(0.500, 440)") instrSend(s, "beeper.beep(0.350, 349)") instrSend(s, "beeper.beep(0.150, 523)") instrSend(s, "beeper.beep(1.000, 440)") instrSend(s, "beeper.beep(0.500, 659)") instrSend(s, "beeper.beep(0.500, 659)") instrSend(s, "beeper.beep(0.500, 659)") instrSend(s, "beeper.beep(0.350, 698)") instrSend(s, "beeper.beep(0.150, 523)") instrSend(s, "beeper.beep(0.500, 415)") instrSend(s, "beeper.beep(0.350, 349)") instrSend(s, "beeper.beep(0.150, 523)") instrSend(s, "beeper.beep(1.000, 440)") def calc_vector(x, y, arr): pass """ ============================================================================================================== MAIN CODE STARTS HERE ============================================================================================================== """ parser = argparse.ArgumentParser() parser.add_argument('-fromfile') parser.add_argument('-tofile') parser.add_argument('-ip', default="192.168.0.53") parser.add_argument('-port', default=5025) args = parser.parse_args() ip_address = args.ip port = args.port print(ip_address) # reserve space for matrixes full_matrix = np.zeros(shape=(90, 90)) point_specific_matrix = np.zeros(shape=(9, 10)) pyplot.ion() fig, ax = pyplot.subplots() axim = ax.imshow(full_matrix, interpolation='nearest', cmap='gray', vmin=0, vmax=30) t1 = time.time() # Start the timer... if args.fromfile: #TODO check bounds of imported matrix full_matrix = np.genfromtxt(args.fromfile, delimiter='\t') for row in full_matrix: point_specific_matrix=get_mapped(row) axim.set_data(point_specific_matrix) fig.canvas.flush_events() else: s = socket.socket() # Establish a TCP/IP socket object instrConnect(s, ip_address, port, 20000, 0, 0) Configure_Backplane(s) x = 0 y = 0 print() for ch1 in [*range(1001, 1031)] + [*range(2001, 2031)] + [*range(3001, 3031)]: for ch2 in [*range(1031, 1061)] + [*range(2031, 2061)] + [*range(3031, 3061)]: full_matrix[x][y]=diff_4W_mess(s, ch1, ch2) point_specific_matrix=get_mapped(full_matrix[x]) axim.set_data(point_specific_matrix) fig.canvas.flush_events() y+=1 y=0 x+=1 done() # Close the socket connection instrDisconnect(s) if args.tofile: np.savetxt(args.tofile, full_matrix, delimiter="\t") t2 = time.time() # Notify the user of completion and the data streaming rate achieved. print("done") print("Total Time Elapsed: {0:.3f} s".format(t2-t1)) input("Press Enter to continue...") exit()