Iterative improvement of fake Lakeshores

This commit is contained in:
Douglas Clowes
2013-06-25 10:15:41 +10:00
parent e26a1fc972
commit 0c179166de
7 changed files with 261 additions and 143 deletions

View File

@@ -62,15 +62,27 @@ def device_display():
return
try:
stdscr.addstr(0, 25, "Identity : %s (%d)" % (myDev.IDN, myPort))
stdscr.addstr(1, 25, "Temperature: %8.3f" % myDev.KRDG[1])
stdscr.addstr(2, 25, "Setpoint : %8.3f" % myDev.SETP[1])
stdscr.addstr(3, 25, "Difference : %8.3f" % (myDev.KRDG[1] - myDev.SETP[1]))
stdscr.addstr(5, 25, "Target : %8.3f" % myDev.TARGET[1])
stdscr.addstr(6, 25, "Ramp Rate : %8.3f" % myDev.RAMP_RATE[1])
stdscr.addstr(7, 25, "Ramp On : %8s" % ["No", "Yes"][myDev.RAMP_ON[1]])
stdscr.addstr(8, 25, "Ramping : %8s" % ["No", "Yes"][myDev.RAMP_ST[1]])
stdscr.addstr(0, 0, "Random : %8.3f" % myDev.RANDOM)
stdscr.addstr(0, 0, "Random :%8.3f" % myDev.RANDOM)
stdscr.addstr(0, 25, "Identity : %s (%d)" % (myDev.IDN, myPort))
stdscr.addstr(1, 0, "Sensor :")
for idx in myDev.CONFIG_SNSRS:
stdscr.addstr(1, 12 + (idx - 1) * 12, "%8.3f" % myDev.KRDG[idx])
stdscr.addstr(2, 0, "PV :")
stdscr.addstr(3, 0, "Setpoint :")
stdscr.addstr(4, 0, "Diff :")
for idx in myDev.CONFIG_LOOPS:
stdscr.addstr(2, 12 + (idx - 1) * 12, "%8.3f" % myDev.KRDG[myDev.LOOPINPUT[idx]])
stdscr.addstr(3, 12 + (idx - 1) * 12, "%8.3f" % myDev.SETP[idx])
stdscr.addstr(4, 12 + (idx - 1) * 12, "%8.3f" % (myDev.KRDG[myDev.LOOPINPUT[idx]] - myDev.SETP[idx]))
stdscr.addstr(5, 0, "Target :")
stdscr.addstr(6, 0, "Ramp Rate:")
stdscr.addstr(7, 0, "Ramp On :")
stdscr.addstr(8, 0, "Ramping :")
for idx in myDev.CONFIG_RAMPS:
stdscr.addstr(5, 12 + (idx - 1) * 12, "%8.3f" % myDev.TARGET[idx])
stdscr.addstr(6, 12 + (idx - 1) * 12, "%8.3f" % myDev.RAMP_RATE[idx])
stdscr.addstr(7, 12 + (idx - 1) * 12, "%8s" % ["No", "Yes"][myDev.RAMP_ON[idx]])
stdscr.addstr(8, 12 + (idx - 1) * 12, "%8s" % ["No", "Yes"][myDev.RAMP_ST[idx]])
stdscr.refresh()
except:
raise

View File

@@ -62,15 +62,27 @@ def device_display():
return
try:
stdscr.addstr(0, 25, "Identity : %s (%d)" % (myDev.IDN, myPort))
stdscr.addstr(1, 25, "Temperature: %8.3f" % myDev.KRDG[1])
stdscr.addstr(2, 25, "Setpoint : %8.3f" % myDev.SETP[1])
stdscr.addstr(3, 25, "Difference : %8.3f" % (myDev.KRDG[1] - myDev.SETP[1]))
stdscr.addstr(5, 25, "Target : %8.3f" % myDev.TARGET[1])
stdscr.addstr(6, 25, "Ramp Rate : %8.3f" % myDev.RAMP_RATE[1])
stdscr.addstr(7, 25, "Ramp On : %8s" % ["No", "Yes"][myDev.RAMP_ON[1]])
stdscr.addstr(8, 25, "Ramping : %8s" % ["No", "Yes"][myDev.RAMP_ST[1]])
stdscr.addstr(0, 0, "Random : %8.3f" % myDev.RANDOM)
stdscr.addstr(0, 0, "Random :%8.3f" % myDev.RANDOM)
stdscr.addstr(0, 25, "Identity : %s (%d)" % (myDev.IDN, myPort))
stdscr.addstr(1, 0, "Sensor :")
for idx in myDev.CONFIG_SNSRS:
stdscr.addstr(1, 12 + (idx - 1) * 12, "%8.3f" % myDev.KRDG[idx])
stdscr.addstr(2, 0, "PV :")
stdscr.addstr(3, 0, "Setpoint :")
stdscr.addstr(4, 0, "Diff :")
for idx in myDev.CONFIG_LOOPS:
stdscr.addstr(2, 12 + (idx - 1) * 12, "%8.3f" % myDev.KRDG[myDev.LOOPINPUT[idx]])
stdscr.addstr(3, 12 + (idx - 1) * 12, "%8.3f" % myDev.SETP[idx])
stdscr.addstr(4, 12 + (idx - 1) * 12, "%8.3f" % (myDev.KRDG[myDev.LOOPINPUT[idx]] - myDev.SETP[idx]))
stdscr.addstr(5, 0, "Target :")
stdscr.addstr(6, 0, "Ramp Rate:")
stdscr.addstr(7, 0, "Ramp On :")
stdscr.addstr(8, 0, "Ramping :")
for idx in myDev.CONFIG_RAMPS:
stdscr.addstr(5, 12 + (idx - 1) * 12, "%8.3f" % myDev.TARGET[idx])
stdscr.addstr(6, 12 + (idx - 1) * 12, "%8.3f" % myDev.RAMP_RATE[idx])
stdscr.addstr(7, 12 + (idx - 1) * 12, "%8s" % ["No", "Yes"][myDev.RAMP_ON[idx]])
stdscr.addstr(8, 12 + (idx - 1) * 12, "%8s" % ["No", "Yes"][myDev.RAMP_ST[idx]])
stdscr.refresh()
except:
raise

View File

@@ -62,15 +62,29 @@ def device_display():
return
try:
stdscr.addstr(0, 25, "Identity : %s (%d)" % (myDev.IDN, myPort))
stdscr.addstr(1, 25, "Temperature: %8.3f" % myDev.KRDG[1])
stdscr.addstr(2, 25, "Setpoint : %8.3f" % myDev.SETP[1])
stdscr.addstr(3, 25, "Difference : %8.3f" % (myDev.KRDG[1] - myDev.SETP[1]))
stdscr.addstr(5, 25, "Target : %8.3f" % myDev.TARGET[1])
stdscr.addstr(6, 25, "Ramp Rate : %8.3f" % myDev.RAMP_RATE[1])
stdscr.addstr(7, 25, "Ramp On : %8s" % ["No", "Yes"][myDev.RAMP_ON[1]])
stdscr.addstr(8, 25, "Ramping : %8s" % ["No", "Yes"][myDev.RAMP_ST[1]])
stdscr.addstr(0, 0, "Random : %8.3f" % myDev.RANDOM)
stdscr.addstr(0, 0, "Random :%8.3f" % myDev.RANDOM)
stdscr.addstr(0, 25, "Identity : %s (%d)" % (myDev.IDN, myPort))
stdscr.addstr(1, 0, "Sensor :")
for idx in myDev.CONFIG_SNSRS:
if idx > 4:
continue
stdscr.addstr(1, 12 + (idx - 1) * 12, "%8.3f" % myDev.KRDG[idx])
stdscr.addstr(2, 0, "PV :")
stdscr.addstr(3, 0, "Setpoint :")
stdscr.addstr(4, 0, "Diff :")
for idx in myDev.CONFIG_LOOPS:
stdscr.addstr(2, 12 + (idx - 1) * 12, "%8.3f" % myDev.KRDG[myDev.LOOPINPUT[idx]])
stdscr.addstr(3, 12 + (idx - 1) * 12, "%8.3f" % myDev.SETP[idx])
stdscr.addstr(4, 12 + (idx - 1) * 12, "%8.3f" % (myDev.KRDG[myDev.LOOPINPUT[idx]] - myDev.SETP[idx]))
stdscr.addstr(5, 0, "Target :")
stdscr.addstr(6, 0, "Ramp Rate:")
stdscr.addstr(7, 0, "Ramp On :")
stdscr.addstr(8, 0, "Ramping :")
for idx in myDev.CONFIG_RAMPS:
stdscr.addstr(5, 12 + (idx - 1) * 12, "%8.3f" % myDev.TARGET[idx])
stdscr.addstr(6, 12 + (idx - 1) * 12, "%8.3f" % myDev.RAMP_RATE[idx])
stdscr.addstr(7, 12 + (idx - 1) * 12, "%8s" % ["No", "Yes"][myDev.RAMP_ON[idx]])
stdscr.addstr(8, 12 + (idx - 1) * 12, "%8s" % ["No", "Yes"][myDev.RAMP_ST[idx]])
stdscr.refresh()
except:
raise

View File

@@ -17,6 +17,7 @@ class Lakeshore336(LakeshoreDevice):
print Lakeshore336.__name__, "ctor"
self.CONFIG_LOOPS = [1, 2, 3, 4]
self.CONFIG_SNSRS = [1, 2, 3, 4]
self.CONFIG_RAMPS = [1, 2]
self.reset_powerup()
def doCommand(self, command, params):
@@ -51,12 +52,13 @@ class Lakeshore336(LakeshoreDevice):
self.CRVPT = {}
for i in range(1,21):
self.CRVPT[i] = [(0.0, 0.0)]
self.CSET = {1: "A,1,1,0", 2: "B,1,1,0"}
self.DOUT = 0
self.FILTER = {1: "1,10,2"}
self.FREQ = 2
self.GUARD = 0
self.HTR = 0.0
self.HTR = {}
for idx in self.CONFIG_LOOPS:
self.HTR[idx] = 0.0
self.HTRRNG = 0
self.HTRST = 0
self.IDN = "LSCI,MODEL336,123456/123456,1.0"
@@ -73,14 +75,26 @@ class Lakeshore336(LakeshoreDevice):
self.LOCK = "0,000"
self.MDAT = {1: "0,0,1"} # Min,Max,Reset
self.MOUT = {1: "0.0", 2: "0.0", 3: "0.0", 4: "0.0"}
self.OUTMODE = {1: "1,1,0", 2: "1,2,0", 3: "1,3,0", 4: "1,4,0"}
self.PID = {1: "+0150.0,+0005.0,+000.0", 2: "+0150.0,+0005.0,+000.0"}
self.RAMP_ON = {1: 0, 2: 0}
self.RAMP_RATE = {1: 0.000, 2: 0.000}
self.RAMP_ST = {1: 0, 2:0}
self.LOOPINPUT = {}
self.OUTMODE = {}
self.PID = {}
for idx in self.CONFIG_LOOPS:
self.PID[idx] = "+0150.0,+0005.0,+000.0"
self.LOOPINPUT[idx] = idx
if idx < 3:
self.OUTMODE[idx] = "1,%d,0" % idx
else:
self.OUTMODE[idx] = "4,%d,0" % idx
self.RAMP_ON = {}
self.RAMP_RATE = {}
self.RAMP_ST = {}
for idx in self.CONFIG_RAMPS:
self.RAMP_ON[idx] = 0
self.RAMP_RATE[idx] = 0.000
self.RAMP_ST[idx] = 0
self.RAMP_TIME = 0.0
self.RANGE = {}
for idx in range(1,5):
for idx in self.CONFIG_LOOPS:
self.RANGE[idx] = "1"
self.RDGST = {"A": 0, "B": 0, "C": 0, "D": 0}
self.RELAY = {1: "1,A,0", 2: "2,A,0"}
@@ -100,7 +114,7 @@ class Lakeshore336(LakeshoreDevice):
self.OPC = 0
self.SRE = 0
self.TST = 0
self.RANDOM = 0.5
self.RANDOM = 0.0
def doIteration(self):
delta_time = time.time() - self.LAST_ITERATION
@@ -109,7 +123,8 @@ class Lakeshore336(LakeshoreDevice):
#print "DoIteration:", delta_time
self.LAST_ITERATION = time.time()
for idx in self.CONFIG_LOOPS:
# TODO - progress ramping setpoints (SP)
ndx = self.LOOPINPUT[idx]
# progress ramping setpoints (SP)
if idx in self.RAMP_ON and self.RAMP_ON[idx] and self.TARGET[idx] != self.SETP[idx]:
delta_time = time.time() - self.RAMP_START_TIME[idx];
delta_temp = self.RAMP_RATE[idx] * (delta_time / 60.0)
@@ -125,15 +140,15 @@ class Lakeshore336(LakeshoreDevice):
self.RAMP_ST[idx] = 0
# TODO - iterate Power Level
if self.KRDG[idx] <> self.SETP[idx]:
self.HTR = self.SETP[idx] - self.KRDG[idx]
if self.HTR > 100.0:
self.HTR = 100.0
elif self.HTR < -100.0:
self.HTR = -100.0
if self.KRDG[ndx] <> self.SETP[idx]:
self.HTR[idx] = self.SETP[idx] - self.KRDG[ndx]
if self.HTR[idx] > 100.0:
self.HTR[idx] = 100.0
elif self.HTR[idx] < -100.0:
self.HTR[idx] = -100.0
# TODO - iterate Process Values (PV)
self.KRDG[idx] = (0.9 * self.KRDG[idx] + 0.1 * self.SETP[idx])
self.KRDG[ndx] = (0.9 * self.KRDG[ndx] + 0.1 * self.SETP[idx])
def doCommandCLS(self, cmd, args):
print "Unimplemented Command: \"*CLS\" in \"" + cmd + " " + ",".join(args) + "\""
@@ -257,12 +272,14 @@ class Lakeshore336(LakeshoreDevice):
def doQueryCOMM(self, cmd, args):
self.write("%f" % self.COMM)
def doQueryCRDG(self, cmd, args):
loop = ord(args[0]) - 64
if loop < 1:
loop = 1
if loop > 4:
loop = 4
self.write("%f" % (self.KRDG[loop] - 273.15 + self.RANDOM))
idx = ord(args[0]) - 64
if idx in self.KRDG:
if self.RANDOM > 0:
self.write("%f" % (self.KRDG[idx] - 273.15 + random.uniform(-self.RANDOM, self.RANDOM)))
else:
self.write("%f" % (self.KRDG[idx] - 273.15))
else:
self.write("+000.0")
def doCommandCRVDEL(self, cmd, args):
print "Unimplemented Command: \"CRVDEL\" in \"" + cmd + " " + ",".join(args) + "\""
def doCommandCRVHDR(self, cmd, args):
@@ -294,20 +311,7 @@ class Lakeshore336(LakeshoreDevice):
print "TODO implement Query: \"CRVPT?\" in \"" + cmd + " " + ",".join(args) + "\""
def doCommandCRVSAV(self, cmd, args):
pass
def doCommandCSET(self, cmd, args):
loop = int(args[0])
if loop < 1:
loop = 1
if loop > 2:
loop = 2
self.CSET[loop] = ",".join(args[1:])
def doQueryCSET(self, cmd, args):
loop = int(args[0])
if loop < 1:
loop = 1
if loop > 2:
loop = 2
self.write("%s" % self.CSET[loop])
# CSET - see OUTMODE
def doCommandDFLT(self, cmd, args):
if args[0] == "99":
print "Unimplemented Command: \"DFLT 99\" in \"" + cmd + " " + ",".join(args) + "\""
@@ -339,9 +343,13 @@ class Lakeshore336(LakeshoreDevice):
if idx in self.FILTER:
self.write(self.FILTER[idx])
else:
self.write("0")
raise IndexError
def doQueryHTR(self, cmd, args):
self.write("%f" % self.HTR)
idx = int(args[0])
if idx in self.HTR:
self.write("%f" % self.HTR[idx])
else:
raise IndexError
def doQueryHTRST(self, cmd, args):
self.write("%d" % self.HTRST)
def doQueryIEEE(self, cmd, args):
@@ -376,12 +384,14 @@ class Lakeshore336(LakeshoreDevice):
self.write("%d" % self.KEYST)
self.KEYST = 0
def doQueryKRDG(self, cmd, args):
loop = ord(args[0]) - 64
if loop < 1:
loop = 1
if loop > 4:
loop = 4
self.write("%f" % (self.KRDG[loop] + self.RANDOM))
idx = ord(args[0]) - 64
if idx in self.KRDG:
if self.RANDOM > 0:
self.write("%f" % (self.KRDG[idx] + random.uniform(-self.RANDOM, self.RANDOM)))
else:
self.write("%f" % (self.KRDG[idx]))
else:
self.write("+000.0")
def doQueryLDAT(self, cmd, args):
self.write("3.000E+02") # TODO
print "TODO implement Query: \"LDAT?\" in \"" + cmd + " " + ",".join(args) + "\""
@@ -429,7 +439,12 @@ class Lakeshore336(LakeshoreDevice):
else:
self.write(self.OUTMODE[1])
def doCommandOUTMODE(self, cmd, args):
print "Unimplemented Command: \"OUTMODE\" in \"" + cmd + " " + ",".join(args) + "\""
idx = int(args[0])
if idx in self.OUTMODE:
newVal = self.mergeParams(3, self.OUTMODE[idx], ",".join(args[1:]))
print "OUTMODE:", newVal
self.OUTMODE[idx] = newVal
self.LOOPINPUT[idx] = int(newVal.split(",")[1])
def doQueryPID(self, cmd, args):
idx = int(args[0])
self.write(self.PID[idx])

View File

@@ -17,6 +17,7 @@ class Lakeshore340(LakeshoreDevice):
print Lakeshore340.__name__, "ctor"
self.CONFIG_LOOPS = [1, 2]
self.CONFIG_SNSRS = [1, 2, 3, 4]
self.CONFIG_RAMPS = [1, 2]
self.reset_powerup()
def doCommand(self, command, params):
@@ -41,8 +42,12 @@ class Lakeshore340(LakeshoreDevice):
self.CLIMI = 0.0
self.CLIMIT = {1: "400.0,10,0,0", 2: "400.0,10,0,0"}
self.CMODE = {}
self.CSET = {}
self.LOOPINPUT = {}
for idx in self.CONFIG_LOOPS:
self.CMODE[idx] = 1
self.CSET[idx] = "%s,1,1,0" % chr(64 + idx)
self.LOOPINPUT[idx] = idx
self.CRVHDR = {}
self.CRVHDR[1] = "DT-336-1 ,STANDARD ,1,+500.000,1"
self.CRVHDR[2] = "DT-336-2 ,STANDARD ,2,+0.500,1"
@@ -51,12 +56,13 @@ class Lakeshore340(LakeshoreDevice):
self.CRVPT = {}
for i in range(1,21):
self.CRVPT[i] = [(0.0, 0.0)]
self.CSET = {1: "A,1,1,0", 2: "B,1,1,0"}
self.DOUT = 0
self.FILTER = {1: "1,10,2"}
self.FREQ = 2
self.GUARD = 0
self.HTR = 0.0
self.HTR = {}
for idx in self.CONFIG_LOOPS:
self.HTR[idx] = 0.0
self.HTRRNG = 0
self.HTRST = 0
self.IDN = "LSCI,MODEL340,123456,01022003"
@@ -75,14 +81,19 @@ class Lakeshore340(LakeshoreDevice):
self.LOCK = "0,000"
self.MDAT = {1: "0,0,1"} # Min,Max,Reset
self.MOUT = {1: "0.0", 2: "0.0", 3: "0.0", 4: "0.0"}
self.OUTMODE = {1: "1,1,0", 2: "1,2,0", 3: "1,3,0", 4: "1,4,0"}
self.PID = {1: "+0150.0,+0005.0,+000.0", 2: "+0150.0,+0005.0,+000.0"}
self.RAMP_ON = {1: 0, 2: 0}
self.RAMP_RATE = {1: 0.000, 2: 0.000}
self.RAMP_ST = {1: 0, 2:0}
self.PID = {}
for idx in self.CONFIG_LOOPS:
self.PID[idx] = "+0150.0,+0005.0,+000.0"
self.RAMP_ON = {}
self.RAMP_RATE = {}
self.RAMP_ST = {}
for idx in self.CONFIG_RAMPS:
self.RAMP_ON[idx] = 0
self.RAMP_RATE[idx] = 0.000
self.RAMP_ST[idx] = 0
self.RAMP_TIME = 0.0
self.RANGE = {}
for idx in range(1,5):
for idx in self.CONFIG_LOOPS:
self.RANGE[idx] = "1"
self.RDGST = {"A": 0, "B": 0, "C": 0, "D": 0}
self.RELAY = {1: "1,A,0", 2: "2,A,0"}
@@ -103,7 +114,7 @@ class Lakeshore340(LakeshoreDevice):
self.OPC = 0
self.SRE = 0
self.TST = 0
self.RANDOM = 0.5
self.RANDOM = 0.0
def doIteration(self):
delta_time = time.time() - self.LAST_ITERATION
@@ -112,7 +123,8 @@ class Lakeshore340(LakeshoreDevice):
#print "DoIteration:", delta_time
self.LAST_ITERATION = time.time()
for idx in self.CONFIG_LOOPS:
# TODO - progress ramping setpoints (SP)
ndx = self.LOOPINPUT[idx]
# progress ramping setpoints (SP)
if idx in self.RAMP_ON and self.RAMP_ON[idx] and self.TARGET[idx] != self.SETP[idx]:
delta_time = time.time() - self.RAMP_START_TIME[idx];
delta_temp = self.RAMP_RATE[idx] * (delta_time / 60.0)
@@ -128,15 +140,15 @@ class Lakeshore340(LakeshoreDevice):
self.RAMP_ST[idx] = 0
# TODO - iterate Power Level
if self.KRDG[idx] <> self.SETP[idx]:
self.HTR = self.SETP[idx] - self.KRDG[idx]
if self.HTR > 100.0:
self.HTR = 100.0
elif self.HTR < -100.0:
self.HTR = -100.0
if self.KRDG[ndx] <> self.SETP[idx]:
self.HTR[idx] = self.SETP[idx] - self.KRDG[ndx]
if self.HTR[idx] > 100.0:
self.HTR[idx] = 100.0
elif self.HTR[idx] < -100.0:
self.HTR[idx] = -100.0
# TODO - iterate Process Values (PV)
self.KRDG[idx] = (0.9 * self.KRDG[idx] + 0.1 * self.SETP[idx])
self.KRDG[ndx] = (0.9 * self.KRDG[ndx] + 0.1 * self.SETP[idx])
def doCommandCLS(self, cmd, args):
print "Unimplemented Command: \"*CLS\" in \"" + cmd + " " + ",".join(args) + "\""
@@ -260,12 +272,14 @@ class Lakeshore340(LakeshoreDevice):
def doQueryCOMM(self, cmd, args):
self.write("%f" % self.COMM)
def doQueryCRDG(self, cmd, args):
loop = ord(args[0]) - 64
if loop < 1:
loop = 1
if loop > 4:
loop = 4
self.write("%f" % (self.KRDG[loop] - 273.15 + self.RANDOM))
idx = ord(args[0]) - 64
if idx in self.KRDG:
if self.RANDOM > 0:
self.write("%f" % (self.KRDG[idx] - 273.15 + random.uniform(-self.RANDOM, self.RANDOM)))
else:
self.write("%f" % (self.KRDG[idx] - 273.15))
else:
self.write("+000.0")
def doCommandCRVDEL(self, cmd, args):
print "Unimplemented Command: \"CRVDEL\" in \"" + cmd + " " + ",".join(args) + "\""
def doCommandCRVHDR(self, cmd, args):
@@ -298,19 +312,17 @@ class Lakeshore340(LakeshoreDevice):
def doCommandCRVSAV(self, cmd, args):
pass
def doCommandCSET(self, cmd, args):
loop = int(args[0])
if loop < 1:
loop = 1
if loop > 2:
loop = 2
self.CSET[loop] = ",".join(args[1:])
idx = int(args[0])
if idx in self.CSET:
newVal = self.mergeParams(4, self.CSET[idx], ",".join(args[1:]))
self.CSET[idx] = newVal
self.LOOPINPUT[idx] = ord(newVal.split(",")[0]) - 64
def doQueryCSET(self, cmd, args):
loop = int(args[0])
if loop < 1:
loop = 1
if loop > 2:
loop = 2
self.write("%s" % self.CSET[loop])
idx = int(args[0])
if idx in self.CSET:
self.write(self.CSET[idx])
else:
raise IndexError
def doCommandDATETIME(self, cmd, args):
print "Unimplemented Command: \"DATETIME\" in \"" + cmd + " " + ",".join(args) + "\""
def doQueryDATETIME(self, cmd, args):
@@ -346,9 +358,13 @@ class Lakeshore340(LakeshoreDevice):
if idx in self.FILTER:
self.write(self.FILTER[idx])
else:
self.write("0")
raise IndexError
def doQueryHTR(self, cmd, args):
self.write("%f" % self.HTR)
idx = int(args[0])
if idx in self.HTR:
self.write("%f" % self.HTR[idx])
else:
raise IndexError
def doQueryHTRST(self, cmd, args):
self.write("%d" % self.HTRST)
def doQueryIEEE(self, cmd, args):
@@ -394,12 +410,14 @@ class Lakeshore340(LakeshoreDevice):
self.write("%d" % self.KEYST)
self.KEYST = 0
def doQueryKRDG(self, cmd, args):
loop = ord(args[0]) - 64
if loop < 1:
loop = 1
if loop > 4:
loop = 4
self.write("%f" % (self.KRDG[loop] + self.RANDOM))
idx = ord(args[0]) - 64
if idx in self.KRDG:
if self.RANDOM > 0:
self.write("%f" % (self.KRDG[idx] + random.uniform(-self.RANDOM, self.RANDOM)))
else:
self.write("%f" % (self.KRDG[idx]))
else:
self.write("+000.0")
def doQueryLDAT(self, cmd, args):
self.write("3.000E+02") # TODO
print "TODO implement Query: \"LDAT?\" in \"" + cmd + " " + ",".join(args) + "\""

View File

@@ -17,6 +17,7 @@ class Lakeshore370(LakeshoreDevice):
print Lakeshore370.__name__, "ctor"
self.CONFIG_LOOPS = [1]
self.CONFIG_SNSRS = [i for i in range(1,17)]
self.CONFIG_RAMPS = [1]
self.reset_powerup()
def doCommand(self, command, params):
@@ -35,8 +36,12 @@ class Lakeshore370(LakeshoreDevice):
self.ANALOG = {1: "0,1,1,1,400.0,0.0,0.0", 2: "0,1,1,1,400.0,0.0,0.0"}
self.AOUT = { 1: 0.0, 2: 0.0 }
self.CMODE = {}
self.CSET = {}
self.LOOPINPUT = {}
for idx in self.CONFIG_LOOPS:
self.CMODE[idx] = 1
self.CSET[idx] = "1,0,1,30,1,8,100"
self.LOOPINPUT[idx] = idx
self.CMR = 0
self.CPOL = 0
self.CRVHDR = {}
@@ -47,12 +52,13 @@ class Lakeshore370(LakeshoreDevice):
self.CRVPT = {}
for i in range(1,21):
self.CRVPT[i] = [(0.0, 0.0)]
self.CSET = "1,0,1,30,1,8,100"
self.DOUT = 0
self.FILTER = {1: "1,10,2"}
self.FREQ = 2
self.GUARD = 0
self.HTR = 0.0
self.HTR = {}
for idx in self.CONFIG_LOOPS:
self.HTR[idx] = 0.0
self.HTRRNG = 0
self.HTRST = 0
self.IDN = "LSCI,MODEL370,123456,00000000,1.5"
@@ -70,11 +76,16 @@ class Lakeshore370(LakeshoreDevice):
self.LOCK = "0,000"
self.MDAT = {1: "0,0,1"} # Min,Max,Reset
self.MOUT = {1: "0.0", 2: "0.0", 3: "0.0", 4: "0.0"}
self.OUTMODE = {1: "1,1,0", 2: "1,2,0", 3: "1,3,0", 4: "1,4,0"}
self.PID = {1: "+0150.0,+0005.0,+000.0", 2: "+0150.0,+0005.0,+000.0"}
self.RAMP_ON = {1: 0}
self.RAMP_RATE = {1: 0.000}
self.RAMP_ST = {1: 0}
self.PID = {}
for idx in self.CONFIG_LOOPS:
self.PID[idx] = "+0150.0,+0005.0,+000.0"
self.RAMP_ON = {}
self.RAMP_RATE = {}
self.RAMP_ST = {}
for idx in self.CONFIG_RAMPS:
self.RAMP_ON[idx] = 0
self.RAMP_RATE[idx] = 0.000
self.RAMP_ST[idx] = 0
self.RAMP_TIME = 0.0
self.RDGST = {"A": 0, "B": 0, "C": 0, "D": 0}
self.RELAY = {1: "1,A,0", 2: "2,A,0"}
@@ -94,7 +105,7 @@ class Lakeshore370(LakeshoreDevice):
self.OPC = 0
self.SRE = 0
self.TST = 0
self.RANDOM = 0.5
self.RANDOM = 0.0
def doIteration(self):
delta_time = time.time() - self.LAST_ITERATION
@@ -103,7 +114,8 @@ class Lakeshore370(LakeshoreDevice):
#print "DoIteration:", delta_time
self.LAST_ITERATION = time.time()
for idx in self.CONFIG_LOOPS:
# TODO - progress ramping setpoints (SP)
ndx = self.LOOPINPUT[idx]
# progress ramping setpoints (SP)
if idx in self.RAMP_ON and self.RAMP_ON[idx] and self.TARGET[idx] != self.SETP[idx]:
delta_time = time.time() - self.RAMP_START_TIME[idx];
delta_temp = self.RAMP_RATE[idx] * (delta_time / 60.0)
@@ -119,15 +131,15 @@ class Lakeshore370(LakeshoreDevice):
self.RAMP_ST[idx] = 0
# TODO - iterate Power Level
if self.KRDG[idx] <> self.SETP[idx]:
self.HTR = self.SETP[idx] - self.KRDG[idx]
if self.HTR > 100.0:
self.HTR = 100.0
elif self.HTR < -100.0:
self.HTR = -100.0
if self.KRDG[ndx] <> self.SETP[idx]:
self.HTR[idx] = self.SETP[idx] - self.KRDG[ndx]
if self.HTR[idx] > 100.0:
self.HTR[idx] = 100.0
elif self.HTR[idx] < -100.0:
self.HTR[idx] = -100.0
# TODO - iterate Process Values (PV)
self.KRDG[idx] = (0.9 * self.KRDG[idx] + 0.1 * self.SETP[idx])
self.KRDG[ndx] = (0.9 * self.KRDG[ndx] + 0.1 * self.SETP[idx])
def doCommandCLS(self, cmd, args):
print "Unimplemented Command: \"*CLS\" in \"" + cmd + " " + ",".join(args) + "\""
@@ -259,9 +271,17 @@ class Lakeshore370(LakeshoreDevice):
self.write("1.0E+01,1.0+E02") # TODO
print "TODO implement Query: \"CRVPT?\" in \"" + cmd + " " + ",".join(args) + "\""
def doCommandCSET(self, cmd, args):
self.CSET = args[0]
idx = 1
if idx in self.CSET:
newVal = self.mergeParams(7, self.CSET[idx], ",".join(args[:]))
self.CSET[idx] = newVal
self.LOOPINPUT[idx] = int(args[0])
def doQueryCSET(self, cmd, args):
self.write("%s" % self.CSET)
idx = 1
if idx in self.CSET:
self.write(self.CSET[idx])
else:
raise IndexError
def doCommandDFLT(self, cmd, args):
if args[0] == "99":
print "Unimplemented Command: \"DFLT 99\" in \"" + cmd + " " + ",".join(args) + "\""
@@ -293,7 +313,7 @@ class Lakeshore370(LakeshoreDevice):
if idx in self.FILTER:
self.write(self.FILTER[idx])
else:
self.write("0")
raise IndexError
def doCommandFREQ(self, cmd, args):
self.FREQ = int(args[0])
def doQueryFREQ(self, cmd, args):
@@ -303,7 +323,11 @@ class Lakeshore370(LakeshoreDevice):
def doQueryGUARD(self, cmd, args):
self.write("%d" % self.GUARD)
def doQueryHTR(self, cmd, args):
self.write("%f" % self.HTR)
idx = 1
if idx in self.HTR:
self.write("%f" % self.HTR[idx])
else:
raise IndexError
def doCommandHTRRNG(self, cmd, args):
self.HTRRNG = int(args[0])
def doQueryHTRRNG(self, cmd, args):
@@ -390,14 +414,12 @@ class Lakeshore370(LakeshoreDevice):
response = "%d" % self.RAMP_ST
self.write(response)
def doQueryRDGK(self, cmd, args):
if len(args) == 0 or len(args[0]) == 0:
idx = 1
else:
idx = int(args[0])
idx = int(args[0])
if idx in self.KRDG:
self.RANDOM = random.uniform(-0.5, 0.5)
self.RANDOM = 0.5
self.write("%f" % (self.KRDG[idx] + self.RANDOM))
if self.RANDOM > 0:
self.write("%f" % (self.KRDG[idx] + random.uniform(-self.RANDOM, self.RANDOM)))
else:
self.write("%f" % (self.KRDG[idx]))
else:
self.write("+000.0")
def doQueryRDGPWR(self, cmd, args):

View File

@@ -61,6 +61,31 @@ class LakeshoreDevice(object):
self.write(self.IDN)
return True
def doQueryRANDOM(self, command, params):
self.write("%f" % self.RANDOM)
def doCommandRANDOM(self, command, params):
self.RANDOM = float(params[0])
def mergeParams(self, count, theOld, theNew):
oldParams = theOld.split(",")
if len(oldParams) != count:
raise IndexError
newParams = theNew.split(",")
if len(newParams) > count:
raise IndexError
mergedParams = []
for idx in range(count):
if oldParams[idx] == '':
raise ValueError
if idx >= len(newParams) or newParams[idx] == '':
mergedParams.append(oldParams[idx])
else:
mergedParams.append(newParams[idx])
if len(mergedParams) != count:
raise IndexError
return ",".join(mergedParams)
def dataReceived(self, data):
print LakeshoreDevice.__name__, "PDU: \"" + data + "\""
command = data.split()[0]