Commit 90e45ebe9dbf970c62e8a864a3462d161ea969d0
Committed by
GitHub
1 parent
ccf79815aa
Exists in
master
Add files via upload
Showing 8 changed files with 556 additions and 1 deletions Side-by-side Diff
instruments/AG34461A.py
1 | +from abstract_instrument import abstract_instrument | |
2 | +import socket | |
3 | + | |
4 | +#============================================================================== | |
5 | + | |
6 | +ALL_VAL_TYPE = "DCV, ACV, DCI, ACI, RES2W, RES4W, FREQ" | |
7 | + | |
8 | +#============================================================================== | |
9 | + | |
10 | +class AG34461A(abstract_instrument): | |
11 | + def __init__(self, adress="192.168.0.61", vtype="DCV"): | |
12 | + self.adress = adress | |
13 | + self.port = 5025 | |
14 | + self.vtype = vtype | |
15 | + | |
16 | + def model(self): | |
17 | + self.send("*IDN?") | |
18 | + return self.read() | |
19 | + | |
20 | + def connect(self): | |
21 | + try: | |
22 | + print('Connecting to device @%s:%s...' %(self.adress, self.port)) | |
23 | + self.sock = socket.socket(socket.AF_INET, | |
24 | + socket.SOCK_STREAM, | |
25 | + socket.IPPROTO_TCP) | |
26 | + self.sock.settimeout(10.0) # Don't hang around forever | |
27 | + self.sock.connect((self.adress, self.port)) | |
28 | + print(' --> Ok') | |
29 | + | |
30 | + print(self.model()) | |
31 | + | |
32 | + if self.vtype == "DCV": | |
33 | + self.send("CONF:VOLT:DC") | |
34 | + elif self.vtype == "ACV": | |
35 | + self.send("CONF:VOLT:AC") | |
36 | + elif self.vtype == "DCI": | |
37 | + self.send("CONF:CURR:DC") | |
38 | + elif self.vtype == "ACI": | |
39 | + self.send("CONF:CURR:AC") | |
40 | + elif self.vtype == "RES2W": | |
41 | + self.send("CONF:RES") | |
42 | + elif self.vtype == "RES4W": | |
43 | + self.send("CONF:FRES") | |
44 | + elif self.vtype == "FREQ": | |
45 | + self.send("CONF:FREQ") | |
46 | + else: | |
47 | + print("Wrong -v argument") | |
48 | + raise | |
49 | + | |
50 | + except socket.timeout: | |
51 | + print("Socket timeout error during connection.") | |
52 | + raise | |
53 | + except socket.error as er: | |
54 | + print("Socket error during connection: " + str(er)) | |
55 | + raise | |
56 | + except Exception as er: | |
57 | + print("Unexpected error during connection: " + str(er)) | |
58 | + raise | |
59 | + | |
60 | + def getValue(self): | |
61 | + self.send("READ?") | |
62 | + return self.read() | |
63 | + | |
64 | + def read(self): | |
65 | + ans = '' | |
66 | + nb_data_list = [] | |
67 | + nb_data = '' | |
68 | + try: | |
69 | + while ans != '\n': | |
70 | + ans = self.sock.recv(1) | |
71 | + nb_data_list.append(ans) # Return the number of data | |
72 | + list_size = len(nb_data_list) | |
73 | + for j in range (0, list_size): | |
74 | + nb_data = nb_data+nb_data_list[j] | |
75 | + return nb_data | |
76 | + except socket.timeout: | |
77 | + print "Socket timeout error when reading." | |
78 | + raise | |
79 | + | |
80 | + def disconnect(self): | |
81 | + self.send('*RST') | |
82 | + self.sock.close() | |
83 | + | |
84 | + def send(self, command): | |
85 | + self.sock.send("%s\n"%command) |
instruments/AG34972A.py
1 | +from abstract_instrument import abstract_instrument | |
2 | +import socket | |
3 | + | |
4 | +#============================================================================== | |
5 | + | |
6 | +ALL_VAL_TYPE = "DCV, ACV, DCI, ACI, RES2W, RES4W, FREQ" | |
7 | + | |
8 | +#============================================================================== | |
9 | + | |
10 | +class AG34972A(abstract_instrument): | |
11 | + def __init__(self, adress="192.168.0.72", vtype="DCV"): | |
12 | + self.adress = adress | |
13 | + self.port = 5025 | |
14 | + self.vtype = vtype | |
15 | + | |
16 | + def model(self): | |
17 | + self.send("*IDN?") | |
18 | + return self.read() | |
19 | + | |
20 | + def connect(self): | |
21 | + try: | |
22 | + print('Connecting to device @%s:%s...' %(self.adress, self.port)) | |
23 | + self.sock = socket.socket(socket.AF_INET, | |
24 | + socket.SOCK_STREAM, | |
25 | + socket.IPPROTO_TCP) | |
26 | + self.sock.settimeout(2.0) # Don't hang around forever | |
27 | + self.sock.connect((self.adress, self.port)) | |
28 | + print(' --> Ok') | |
29 | + | |
30 | + print(self.model()) | |
31 | + | |
32 | + if self.vtype == "DCV": | |
33 | + self.send("CONF:VOLT:DC (@102:103)") | |
34 | + elif self.vtype == "ACV": | |
35 | + self.send("CONF:VOLT:AC (@102:103)") | |
36 | + elif self.vtype == "DCI": | |
37 | + self.send("CONF:CURR:DC (@102:103)") | |
38 | + elif self.vtype == "ACI": | |
39 | + self.send("CONF:CURR:AC (@102:103)") | |
40 | + elif self.vtype == "RES2W": | |
41 | + self.send("CONF:RES (@102:103)") | |
42 | + elif self.vtype == "RES4W": | |
43 | + self.send("CONF:FRES (@102:103)") | |
44 | + elif self.vtype == "FREQ": | |
45 | + self.send("CONF:FREQ (@102:103)") | |
46 | + else: | |
47 | + print("Wrong -v argument") | |
48 | + raise | |
49 | + | |
50 | + except socket.timeout: | |
51 | + print("Socket timeout error during connection.") | |
52 | + raise | |
53 | + except socket.error as er: | |
54 | + print("Socket error during connection: " + str(er)) | |
55 | + raise | |
56 | + except Exception as er: | |
57 | + print("Unexpected error during connection: " + str(er)) | |
58 | + raise | |
59 | + | |
60 | + def getValue(self): | |
61 | + self.send("MEAS? AUTO,DEF,(@102:103)") | |
62 | + return self.read() | |
63 | + | |
64 | + def read(self): | |
65 | + ans = '' | |
66 | + nb_data_list = [] | |
67 | + nb_data = '' | |
68 | + try: | |
69 | + while ans != '\n': | |
70 | + ans = self.sock.recv(1) | |
71 | + nb_data_list.append(ans) # Return the number of data | |
72 | + list_size = len(nb_data_list) | |
73 | + for j in range (0, list_size): | |
74 | + nb_data = nb_data+nb_data_list[j] | |
75 | + return nb_data | |
76 | + except socket.timeout: | |
77 | + print "Socket timeout error when reading." | |
78 | + raise | |
79 | + | |
80 | + def disconnect(self): | |
81 | + self.send('*RST') | |
82 | + self.sock.close() | |
83 | + | |
84 | + def send(self, command): | |
85 | + self.sock.send("%s\n"%command) |
instruments/LS350.py
1 | +from abstract_instrument import abstract_instrument | |
2 | +import socket | |
3 | + | |
4 | +#============================================================================== | |
5 | + | |
6 | +ALL_VAL_TYPE = "TEMP, RES" | |
7 | + | |
8 | +#============================================================================== | |
9 | + | |
10 | +class LS350(abstract_instrument): | |
11 | + def __init__(self, adress="192.168.0.12", vtype="TEMP"): | |
12 | + self.adress = adress | |
13 | + self.port = 7777 | |
14 | + self.vtype = vtype | |
15 | + | |
16 | + def model(self): | |
17 | + self.send("*IDN?") | |
18 | + return self.read() | |
19 | + | |
20 | + def connect(self): | |
21 | + try: | |
22 | + print('Connecting to device @%s:%s...' %(self.adress, self.port)) | |
23 | + self.sock = socket.socket(socket.AF_INET, | |
24 | + socket.SOCK_STREAM, | |
25 | + socket.IPPROTO_TCP) | |
26 | + self.sock.settimeout(10.0) # Don't hang around forever | |
27 | + self.sock.connect((self.adress, self.port)) | |
28 | + print(' --> Ok') | |
29 | + | |
30 | + print(self.model()) | |
31 | + | |
32 | + if self.vtype == "TEMP": | |
33 | + 1 | |
34 | + elif self.vtype == "RES": | |
35 | + 1 | |
36 | + else: | |
37 | + print("Wrong -v argument") | |
38 | + raise | |
39 | + | |
40 | + except socket.timeout: | |
41 | + print("Socket timeout error during connection.") | |
42 | + raise | |
43 | + except socket.error as er: | |
44 | + print("Socket error during connection: " + str(er)) | |
45 | + raise | |
46 | + except Exception as er: | |
47 | + print("Unexpected error during connection: " + str(er)) | |
48 | + raise | |
49 | + | |
50 | + def getValue(self): | |
51 | + if self.vtype == 'TEMP': | |
52 | + self.send('krdg? a;krdg? b;krdg? c;krdg? d') | |
53 | + return self.read() | |
54 | + elif self.vtype == 'RES': | |
55 | + self.send('srdg? a;srdg? b;srdg? c;srdg? d') | |
56 | + return self.read() | |
57 | + | |
58 | + def read(self): | |
59 | + self.send("++read eoi") | |
60 | + ans = '' | |
61 | + nb_data_list = [] | |
62 | + nb_data = '' | |
63 | + try: | |
64 | + while ans != '\n': | |
65 | + ans = self.sock.recv(1) | |
66 | + nb_data_list.append(ans) # Return the number of data | |
67 | + list_size = len(nb_data_list) | |
68 | + for j in range (0, list_size): | |
69 | + nb_data = nb_data+nb_data_list[j] | |
70 | + return nb_data | |
71 | + except socket.timeout: | |
72 | + print "Socket timeout error when reading." | |
73 | + raise | |
74 | + | |
75 | + def disconnect(self): | |
76 | + self.send('MODE0') | |
77 | + self.sock.close() | |
78 | + | |
79 | + def send(self, command): | |
80 | + self.sock.send("%s\n"%command) |
instruments/PM100D.py
1 | +from abstract_instrument import abstract_instrument | |
2 | +import os | |
3 | + | |
4 | +#============================================================================== | |
5 | + | |
6 | +ALL_VAL_TYPE = "PWR" | |
7 | + | |
8 | +#============================================================================== | |
9 | + | |
10 | +class PM100D(abstract_instrument): | |
11 | + def __init__(self, adress="/dev/usbtmc0", vtype="PWR"): | |
12 | + self.adress = adress | |
13 | + self.vtype = vtype | |
14 | + | |
15 | + def model(self): | |
16 | + self.send("*IDN?") | |
17 | + return self.read() | |
18 | + | |
19 | + def connect(self): | |
20 | + try: | |
21 | + print('Connecting to device @%s...' %(self.adress)) | |
22 | + self.FILE = os.open(self.adress, os.O_RDWR) | |
23 | + print(' --> Ok') | |
24 | + | |
25 | + print(self.model()) | |
26 | + | |
27 | + if self.vtype == "PWR": | |
28 | + 1 | |
29 | + else: | |
30 | + print("Wrong -v argument") | |
31 | + raise | |
32 | + | |
33 | + except Exception as er: | |
34 | + print("Unexpected error during connection: " + str(er)) | |
35 | + raise | |
36 | + | |
37 | + def getValue(self): | |
38 | + self.send("READ?") | |
39 | + return self.read() | |
40 | + | |
41 | + def read(self): | |
42 | + return os.read(self.FILE, 300) | |
43 | + | |
44 | + def disconnect(self): | |
45 | + self.send('*RST') | |
46 | + | |
47 | + def send(self, command): | |
48 | + os.write(self.FILE, command) |
instruments/T7Pro.py
1 | +from abstract_instrument import abstract_instrument | |
2 | +from labjack import ljm | |
3 | +import numpy | |
4 | + | |
5 | +#============================================================================== | |
6 | + | |
7 | +ALL_VAL_TYPE = "TEMP, RES" | |
8 | + | |
9 | +#============================================================================== | |
10 | + | |
11 | +class T7Pro(abstract_instrument): | |
12 | + def __init__(self, adress="192.168.0.26", vtype="TEMP"): | |
13 | + self.adress = adress | |
14 | + self.vtype = vtype | |
15 | + self.names = ["TEMPERATURE_AIR_K", | |
16 | + "CURRENT_SOURCE_200UA_CAL_VALUE", | |
17 | + "AIN0",# "AIN1", | |
18 | + "AIN2",# "AIN3", | |
19 | + "AIN4",# "AIN5", | |
20 | + "AIN6",# "AIN7" | |
21 | + ] | |
22 | + | |
23 | + def model(self): | |
24 | + return 'T7Pro' | |
25 | + | |
26 | + def connect(self): | |
27 | + try: | |
28 | + print('Connecting to device @%s...' %(self.adress)) | |
29 | + self.handle = ljm.openS("T7", "ETHERNET", self.adress) | |
30 | + self.configureAINs() | |
31 | + print(' --> Ok') | |
32 | + | |
33 | + print(self.model()) | |
34 | + | |
35 | + if self.vtype == "TEMP": | |
36 | + 1 | |
37 | + elif self.vtype == "RES": | |
38 | + 1 | |
39 | + else: | |
40 | + print("Wrong -v argument") | |
41 | + raise | |
42 | + | |
43 | + except Exception as er: | |
44 | + print("Unexpected error during connection: " + str(er)) | |
45 | + raise | |
46 | + | |
47 | + def getValue(self): | |
48 | + results = self.read(self.names) | |
49 | + temp = results[0] | |
50 | + res1 = results[2]/results[1] | |
51 | + res2 = results[3]/results[1] | |
52 | + res3 = results[4]/results[1] | |
53 | + res4 = results[5]/results[1] | |
54 | + | |
55 | + if self.vtype == 'TEMP': | |
56 | + # Temperature calculation | |
57 | + temp1 = self.res2tempSensor(628, res1) | |
58 | + temp2 = self.res2tempSensor(16947, res2) | |
59 | + temp3 = self.res2tempSensor(625, res3) | |
60 | + temp4 = self.res2tempSensor(100, res4) | |
61 | + string = '%f\t%f\t%f\t%f\t%f\n'%(temp, temp1, temp2, temp3, temp4) | |
62 | + elif self.vtype == 'RES': | |
63 | + string = '%f\t%f\t%f\t%f\t%f\n'%(temp, res1, res2, res3, res4) | |
64 | + else: | |
65 | + string = '' | |
66 | + | |
67 | + return string | |
68 | + | |
69 | + def read(self, names): | |
70 | + return ljm.eReadNames(self.handle, len(names), names) | |
71 | + | |
72 | + def disconnect(self): | |
73 | + ljm.close(self.handle) | |
74 | + | |
75 | + def send(self, command): | |
76 | + pass | |
77 | + | |
78 | + def configureAINs(self): | |
79 | + # Setup and call eWriteNames to configure AINs on the LabJack. | |
80 | + names = ["AIN0_NEGATIVE_CH", "AIN0_RANGE", "AIN0_RESOLUTION_INDEX", | |
81 | + #"AIN1_NEGATIVE_CH", "AIN1_RANGE", "AIN1_RESOLUTION_INDEX", | |
82 | + "AIN2_NEGATIVE_CH", "AIN2_RANGE", "AIN2_RESOLUTION_INDEX", | |
83 | + #"AIN3_NEGATIVE_CH", "AIN3_RANGE", "AIN3_RESOLUTION_INDEX", | |
84 | + "AIN4_NEGATIVE_CH", "AIN4_RANGE", "AIN4_RESOLUTION_INDEX", | |
85 | + #"AIN5_NEGATIVE_CH", "AIN5_RANGE", "AIN5_RESOLUTION_INDEX", | |
86 | + "AIN6_NEGATIVE_CH", "AIN6_RANGE", "AIN6_RESOLUTION_INDEX", | |
87 | + #"AIN7_NEGATIVE_CH", "AIN7_RANGE", "AIN7_RESOLUTION_INDEX" | |
88 | + ] | |
89 | + l_names = len(names) | |
90 | + aValues = [1, 1, 12, | |
91 | + #199, 0.01, 0, | |
92 | + 3, 1, 12, | |
93 | + #199, 0.01, 0, | |
94 | + 5, 1, 12, | |
95 | + #199, 0.01, 0, | |
96 | + 7, 0.1, 12, | |
97 | + #199, 0.01, 0 | |
98 | + ] | |
99 | + ljm.eWriteNames(self.handle, l_names, names, aValues) | |
100 | +# print("\nSet configuration:") | |
101 | +# for i in range(len(names)): | |
102 | +# print(" %s : %f" % (names[i], aValues[i])) | |
103 | + | |
104 | + def res2tempSensor(self, sensor, res): | |
105 | + if sensor==627: | |
106 | + K = [0.399341181655472610, | |
107 | + 10.8420092277810909, | |
108 | + -26.4597939187660813, | |
109 | + 245.9828566655493379, | |
110 | + -668.069876596331596, | |
111 | + 1001.69882618263364, | |
112 | + -267.272089680656791] | |
113 | + if sensor==625: | |
114 | + K = [0.333548856582638109, | |
115 | + 11.7361551595386118, | |
116 | + -31.32988932320903987, | |
117 | + 262.878643524833024, | |
118 | + -704.163538021035492, | |
119 | + 1056.6040485650301, | |
120 | + -307.057196729816496] | |
121 | + if sensor==628: | |
122 | + K = [0.463200932294057566, | |
123 | + 13.5049710820894688, | |
124 | + -30.5191222755238414, | |
125 | + 231.098593852017075, | |
126 | + -550.122691885568202, | |
127 | + 806.038547554984689, | |
128 | + -198.510489917360246] | |
129 | + if sensor==16945: | |
130 | + K = [3.2497, 5.1777, 2.499] | |
131 | + if sensor==16943: | |
132 | + K = [3.4738, 5.1198, 2.3681] | |
133 | + if sensor==16944: | |
134 | + K = [3.3674, 5.2874, 2.5165] | |
135 | + if sensor==16941: | |
136 | + K = [2.9486, 4.5862, 2.266] | |
137 | + if sensor==16947: | |
138 | + K = [3.4597, 5.2422, 2.4169] | |
139 | + if sensor==100: | |
140 | + K = [0.003850] | |
141 | + return self.res2temp(K, res) | |
142 | + | |
143 | + def res2temp(K, res): | |
144 | + temp = 0 | |
145 | + tmp = 1000./res | |
146 | + if len(K)==7: | |
147 | + for i in range(len(K)): | |
148 | + temp += K[i]*tmp**i | |
149 | + if len(K)==3: | |
150 | + for i in range(len(K)): | |
151 | + temp += K[i]*numpy.log10(tmp)**(2-i) | |
152 | + temp = 10**temp | |
153 | + if len(K)==1: | |
154 | + temp = (res/100.-1)/K[0]+273.15 | |
155 | + return temp |
instruments/__init__.py
1 | -foo | |
1 | +from os import listdir | |
2 | +from os.path import dirname | |
3 | + | |
4 | +for module in listdir(dirname(__file__)): | |
5 | + if module == '__init__.py' or module == 'abstract_instrument.py' or module[-3:] != '.py': | |
6 | + continue | |
7 | + __import__(module[:-3], locals(), globals()) | |
8 | + | |
9 | +del module, listdir, dirname |
instruments/abstract_instrument.py
1 | +import abc | |
2 | + | |
3 | +class abstract_instrument(object): | |
4 | + __metaclass__ = abc.ABCMeta | |
5 | + | |
6 | + @abc.abstractmethod | |
7 | + def __init__(self, adress, vtype): | |
8 | + """Build the class""" | |
9 | + return | |
10 | + | |
11 | + @abc.abstractmethod | |
12 | + def model(self): | |
13 | + """return the instrument model""" | |
14 | + return | |
15 | + | |
16 | + @abc.abstractmethod | |
17 | + def connect(self): | |
18 | + """Create a connection with the instrument""" | |
19 | + return | |
20 | + | |
21 | + @abc.abstractmethod | |
22 | + def disconnect(self): | |
23 | + """Disconnect the instrument""" | |
24 | + return | |
25 | + | |
26 | + @abc.abstractmethod | |
27 | + def read(self): | |
28 | + """read the buffer""" | |
29 | + return | |
30 | + | |
31 | + @abc.abstractmethod | |
32 | + def send(self): | |
33 | + """send a command""" | |
34 | + return | |
35 | + | |
36 | + @abc.abstractmethod | |
37 | + def getValue(self): | |
38 | + """return the value of measurment""" | |
39 | + return |
instruments/testDevice.py
1 | +from abstract_instrument import abstract_instrument | |
2 | +import numpy, time | |
3 | + | |
4 | +#============================================================================== | |
5 | + | |
6 | +ALL_VAL_TYPE = "DCV, ACV, DCI, ACI, RES2W, RES4W, FREQ" | |
7 | + | |
8 | +#============================================================================== | |
9 | + | |
10 | +class testDevice(abstract_instrument): | |
11 | + def __init__(self, adress="123.456.789.123", vtype="DCV"): | |
12 | + self.adress = adress | |
13 | + self.port = 9999 | |
14 | + self.vtype = vtype | |
15 | + | |
16 | + def model(self): | |
17 | + return 'test device' | |
18 | + | |
19 | + def connect(self): | |
20 | + print('Connecting to device @%s:%s...' %(self.adress, self.port)) | |
21 | + time.sleep(1) | |
22 | + print(' --> Ok') | |
23 | + | |
24 | + print(self.model()) | |
25 | + | |
26 | + if self.vtype == "DCV": | |
27 | + print("CONF:VOLT:DC") | |
28 | + elif self.vtype == "ACV": | |
29 | + print("CONF:VOLT:AC") | |
30 | + elif self.vtype == "DCI": | |
31 | + print("CONF:CURR:DC") | |
32 | + elif self.vtype == "ACI": | |
33 | + print("CONF:CURR:AC") | |
34 | + elif self.vtype == "RES2W": | |
35 | + print("CONF:RES") | |
36 | + elif self.vtype == "RES4W": | |
37 | + print("CONF:FRES") | |
38 | + elif self.vtype == "FREQ": | |
39 | + print("CONF:FREQ") | |
40 | + else: | |
41 | + print("Wrong -v argument") | |
42 | + raise | |
43 | + | |
44 | + def getValue(self): | |
45 | + return str(numpy.random.rand()) | |
46 | + | |
47 | + def read(self): | |
48 | + print('reading') | |
49 | + return 1 | |
50 | + | |
51 | + def disconnect(self): | |
52 | + print('reset') | |
53 | + | |
54 | + def send(self, command): | |
55 | + print('send %s'%command) |