POL_IDS={ "Circ_Plus": 1, "Circ_Minus": 2, "Lin_Hor":3, "Lin_Ver": 4, "Lin": 5} def get_id_status(id): # 0 = ok # 1 = Warning # 2 = Error # 3 = Not available if id<1 or id>2: raise Exception("Invalid id") return caget("X11MA-ID1-USER:STATUS" if (id==1) else "X11MA-ID2-USER:STATUS") def get_id_error(id): # B0 (1) = PLC (Taper, Motor controller, Limitswitch....) # B1 (2) = Encoders (cabel, not referenced) # B2 (4) = FeedForward (PS off, PS defect, FF ausgeschaltet) # B3 (8) = Operator COntrol # B4 (16)= Moving Timeout (moving longer then 120 sec) # B5 (32)= Interlock (Orbit, Temperature...)\ if id<1 or id>2: raise Exception("Invalid id") return caget("X11MA-ID1-USER:ERROR-SOURCE" if (id==1) else "X11MA-ID2-USER:ERROR-SOURCE") def get_id_pol(id, as_string=False): # 1: Circ+ # 2: Circ- # 3: Lin H # 4: Lin V # 5: LIn if id<1 or id>2: raise Exception("Invalid id") #ret = caget ("X11MA-ID1:MODE" if id==1 else "X11MA-ID2:MODE", 's' if as_string else 'i') mode = id1_mode.read() if (id==1) else id2_mode.read() if mode=="LINEAR": #linear mode alpha = get_alpha_id(id) if alpha==0 : ret = 3 elif alpha==90: ret = 4 else: ret = 5 elif mode == "CIRC +": ret = 1 elif mode == "CIRC -": ret = 2 else: ret = -1 if as_string: for (k,v) in POL_IDS.items(): if v==ret: return k return "Unknown" return ret def get_alpha_id(id): if id<1 or id>2: raise Exception("Invalid id") return id1_alpha.read() if (id==1) else id2_alpha.read() def put_id_offset(id, v): if id == 1: id1_offset.write(v) elif id == 2: id2_offset.write(v) else: raise Exception("Invalid id") def get_id_offset(id): if id<1 or id>2: raise Exception("Invalid id") return id1_offset.read() if (id==1) else id2_offset.read() def put_id_pol(id, pol, alpha=None): #pol = 1 : Mode =1, alpha = 0 circ + #pol = 2 : Mode =2, alpha = 0 circ - #pol = 3 : Mode =0, alpha = 0 lin hor #pol = 4 : Mode =0, alpha = 90 lin vert #pol = 5 : Mode =0, alpha = ? lin rot print "Set id" + str(id) + " Pol=" + str(pol) + " Alpha=" + str(alpha) if id<1 or id>2: raise Exception("Invalid id") mode_dev = id1_mode if (id==1) else id2_mode alpha_dev = id1_alpha if (id==1) else id2_alpha if is_string(pol): pol=POL_IDS[pol] if pol == 1: mode_dev.write("CIRC +") elif pol == 2: mode_dev.write("CIRC -") elif pol == 3: mode_dev.write("LINEAR") time.sleep(0.5) alpha_dev.write(0) elif pol == 4: mode_dev.write("LINEAR") time.sleep(0.5) alpha_dev.write(90) elif pol == 5: mode_dev.write("LINEAR") if alpha is not None: time.sleep(0.5) alpha_dev.write(alpha) def tune_detune(active_id): offset_1 = float(get_setting("OFFSET_ID_1")) offset_2 = float(get_setting("OFFSET_ID_2")) if active_id ==1: print "Tune ID1" put_id_offset(2, offset_2-40) #detuneID2 put_id_offset(1, offset_1) #tuneID1 else: print "Tune ID2" put_id_offset(1, offset_1-40) #detuneID1 put_id_offset(2, offset_2) #tuneID2 class IdPol(ReadonlyRegisterBase): def __init__(self, id): self.id = id def doRead(self): return get_id_pol(self.id, True) def getName(self): return "id" + str(self.id) + "_pol" add_device(IdPol(1), True) add_device(IdPol(2), True) id1_pol.update() id2_pol.update() id1_pol.setPolling(2000) id2_pol.setPolling(2000) class EnOptDesc(ReadonlyRegisterBase): def doRead(self): opt = energy_opt.read() if opt == "PGM": return "PGM" if opt == "PGM+ID1": return "ID1" if opt == "PGM+ID2": return "ID2" if opt == "PGM+ID1+ID2": return "ID1_ID2" return "" def getName(self): return "energy_opt_desc" add_device(EnOptDesc(), True) energy_opt_desc.setPolling(2000)