From 0c179166de6170dbe6775e12a0e27fb74bdecf5b Mon Sep 17 00:00:00 2001 From: Douglas Clowes Date: Tue, 25 Jun 2013 10:15:41 +1000 Subject: [PATCH] Iterative improvement of fake Lakeshores --- .../fakeTempControl/lakeshore/LS336.py | 30 +++-- .../fakeTempControl/lakeshore/LS340.py | 30 +++-- .../fakeTempControl/lakeshore/LS370.py | 32 ++++-- .../fakeTempControl/lakeshore/Lakeshore336.py | 107 ++++++++++-------- .../fakeTempControl/lakeshore/Lakeshore340.py | 104 ++++++++++------- .../fakeTempControl/lakeshore/Lakeshore370.py | 76 ++++++++----- .../lakeshore/LakeshoreDevice.py | 25 ++++ 7 files changed, 261 insertions(+), 143 deletions(-) diff --git a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS336.py b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS336.py index 86023cb4..c4c5508e 100755 --- a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS336.py +++ b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS336.py @@ -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 diff --git a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS340.py b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS340.py index 9c052f52..b8e2d450 100755 --- a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS340.py +++ b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS340.py @@ -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 diff --git a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS370.py b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS370.py index f74cc779..9fd43318 100755 --- a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS370.py +++ b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LS370.py @@ -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 diff --git a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore336.py b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore336.py index 7ebdba3d..14fa80ca 100755 --- a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore336.py +++ b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore336.py @@ -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]) diff --git a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore340.py b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore340.py index 8b97c5bf..98ee09a6 100755 --- a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore340.py +++ b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore340.py @@ -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) + "\"" diff --git a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore370.py b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore370.py index 61d0dd0c..4183e5c3 100755 --- a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore370.py +++ b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/Lakeshore370.py @@ -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): diff --git a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LakeshoreDevice.py b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LakeshoreDevice.py index 4e739c8d..1ed64c75 100755 --- a/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LakeshoreDevice.py +++ b/site_ansto/instrument/TEST_SICS/fakeTempControl/lakeshore/LakeshoreDevice.py @@ -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]