def get_pv_value(self, name, to_string=False, timeout=TIMEOUT): """Get the current value of the PV""" name = MYPVPREFIX + ':' + name if name not in CACHE.keys(): chan = CaChannel(name) chan.setTimeout(TIMEOUT) #Try to connect - throws if cannot chan.searchw() CACHE[name] = chan else: chan = CACHE[name] ftype = chan.field_type() if ca.dbr_type_is_ENUM(ftype) or ca.dbr_type_is_CHAR( ftype) or ca.dbr_type_is_STRING(ftype): to_string = True if to_string: if ca.dbr_type_is_ENUM(ftype): value = chan.getw(ca.DBR_STRING) else: value = chan.getw(ca.DBR_CHAR) #Could see if the element count is > 1 instead if isinstance(value, list): return self._waveform2string(value) else: return str(value) else: return chan.getw()
def pv_exists(self, name): """See if the PV exists""" name = MYPVPREFIX + ':' + name try: chan = CaChannel(name) #Try to connect - throws if cannot chan.searchw() return True except: return False
def failProcThread(self, num): failFlag = 0 while procFlag[num - 1]: time.sleep(5) chan = CaChannel('ACC_RCS_RRF:RRF' + str(num) + ':LLRF:Alarm') chan.searchw() failFlag = chan.getw() #print("procFlag:%d"%(procFlag[num-1])) #print("trigFlag:%d"%(trigFlag[num-1])) if failFlag == 0: trigFlag[num - 1] = 0 if ((failFlag == 1) and (trigFlag[num - 1] == 0)): readWavesFunc(self, num)
def __init__(self, pvname): try: self.pv = CaChannel() self.pv.searchw(pvname) self.alarm_status = "n/a" # used to store severity provided by callback self.alarm_severity = "n/a" # used to store severity provided by callback except : raise Exception("****** PV not found - "+pvname+" ******")
def _initialise_channel(self, name): """Initialises the channel by creating a connection callback. Args: name (string): The name of the PV to connect to. """ def _block_connection_callback(epics_args, user_args): connection_state = epics_args[1] if connection_state == ca.CA_OP_CONN_UP: print ca.name(epics_args[0]), "UP" # First time through creates the monitor if ca.name(epics_args[0]) not in self.curr_values: self._create_monitor(user_args[0], ca.name(epics_args[0])) else: print ca.name(epics_args[0]), "DOWN" self.curr_lock.acquire() try: self.curr_values[ca.name(epics_args[0])] = ("*** disconnected", None) except: # Don't care, it is all about releasing the lock pass finally: # Must release lock self.curr_lock.release() chan = CaChannel() chan.setTimeout(EXISTS_TIMEOUT) print "initialising %s" % name try: chan.search_and_connect(name, _block_connection_callback, chan) chan.pend_event(PEND_EVENT_TIMEOUT) return chan except: print "Could not connect" return None
def __init__(self, pvName=None, wait=True): """ Create an EPICS channel if pvName is specified, and optionally wait for connection. :param str pvName: An optional name of an EPICS Process Variable. :param bool wait: If wait is True and pvName is not None then this constructor will do a :meth:`CaChannel.CaChannel.searchw` on the PV. If wait is False and pvName ist not None then this constructor will do a :meth:`CaChannel.CaChannel.search` on the PV, and the user must subsequently do a :meth:`CaChannel.CaChannel.pend_io` on this or another :class:`epicsPV` or :class:`CaChannel` object. """ # Invoke the base class initialization self.callBack = callBack() CaChannel.__init__(self) if pvName is not None: if wait: self.searchw(pvName) else: self.search(pvName)
def array_get(self, req_type=None, count=None, **keywords): """ If :meth:`setMonitor` has not been called then this function simply calls :meth:`CaChannel.CaChannel.array_get`. If :meth:`setMonitor` has been called then it calls :meth:`CaChannel.CaChannel.pend_event` with a very short timeout, and then returns the PV value from the last callback. """ if self.callBack.monitorState != 0: # This should be self.poll(), but that is generating errors self.pend_event(.0001) if self.callBack.monitorState == 2: self.callBack.newMonitor = 0 return self.callBack.pv_value else: return CaChannel.array_get(self, req_type, count, **keywords)
def getValue(self): """ If :meth:`setMonitor` has not been called then this function simply calls :meth:`CaChannel.CaChannel.getValue`. If setMonitor has been called then it calls :meth:`CaChannel.CaChannel.pend_event` with a very short timeout, and then returns the PV value from the last callback. """ if self.callBack.monitorState != 0: # This should be self.poll(), but that is generating errors self.pend_event(.0001) if self.callBack.monitorState == 2: self.callBack.newMonitor = 0 return self.callBack.pv_value else: return CaChannel.getValue(self)
def connect_to_names_pv(self): """Connects amonitor to the block-server to get the names of the blocks. """ def _blocknames_callback(epics_args, user_args): names = json.loads(dehex_and_decompress(waveform_to_string(epics_args['pv_value']))) if self.block_names is None or names != self.block_names: self.block_names = names print "Updated" chan = CaChannel("BLOCKNAMES") chan.searchw("%s%s" % (self.prefix, "CS:BLOCKSERVER:BLOCKNAMES")) chan.add_masked_array_event( ca.DBR_CHAR, None, ca.DBE_VALUE | ca.DBE_ALARM, _blocknames_callback) chan.pend_event(PEND_EVENT_TIMEOUT)
def _caget(pvname, as_string=False): """Retrieve an EPICS PV value""" try: from CaChannel import CaChannel, CaChannelException, ca except ImportError: raise RuntimeError("CaChannel must be installed to use this algorithm. " "For details, see https://www.mantidproject.org/CaChannel_In_Mantid") if as_string: dbr_type = ca.DBR_STRING else: dbr_type = None try: chan = CaChannel(pvname) chan.setTimeout(5.0) chan.searchw() return chan.getw(dbr_type) except CaChannelException as e: raise RuntimeError("Error reading EPICS PV \"{}\": {}".format(pvname, str(e)))
def reset(self): print ('================= RESET EPICS WAVE SETUP ===============') from CaChannel import CaChannel wavex = CaChannel() wavey = CaChannel() for chan in range(1, 3): if getattr(self, 'wave_%d' % (chan)).isOn(): try: pv_wave_x = getattr(self, 'wave_%d_pv_x' % (chan)).data() wavex.searchw(pv_wave_x) except: msg = 'Error on PV waveform %d x variable' % (chan) Data.execute('DevLogErr($1,$2)', self.getNid(), msg) raise mdsExceptions.TclFAILED_ESSENTIAL try: pv_wave_y = getattr(self, 'wave_%d_pv_y' % (chan)).data() wavey.searchw(pv_wave_y) except: msg = 'Error reading y waveform %d values' % (chan) Data.execute('DevLogErr($1,$2)', self.getNid(), msg) raise mdsExceptions.TclFAILED_ESSENTIAL wavex.putw([0, 0]) wavey.putw([0, 0]) del wavex del wavey print ('========================================================') return 1
def readWavesFunc(self, num): try: trigFlag[num - 1] = 1 file_str1 = '' file_str2 = '' file_str3 = '' file_str4 = '' file_str5 = '' file_str6 = '' file_str7 = '' file_str8 = '' file_str9 = '' file_str10 = '' time_record = time.strftime("%Y_%m_%d_%H_%M_%S") rf_warning_value = 0 chan = CaChannel('rcsRf' + str(num) + ':alarm0_get') chan.searchw() llrf_warnings[0] = chan.getw() if (llrf_warnings[0] == 1): file_str1 = file_str1 + llrf_warnings_text[0] + ',' chan = CaChannel('rcsRf' + str(num) + ':alarm1_get') chan.searchw() llrf_warnings[1] = chan.getw() if (llrf_warnings[0] == 1): file_str1 = file_str1 + llrf_warnings_text[1] + ',' chan = CaChannel('rcsRf' + str(num) + ':alarm2_get') chan.searchw() llrf_warnings[2] = chan.getw() if (llrf_warnings[2] == 1): file_str1 = file_str1 + llrf_warnings_text[2] + ',' chan = CaChannel('rcsRf' + str(num) + ':alarm3_get') chan.searchw() llrf_warnings[3] = chan.getw() if (llrf_warnings[3] == 1): file_str1 = file_str1 + llrf_warnings_text[3] + ',' chan = CaChannel('rcsRf' + str(num) + ':alarm4_get') chan.searchw() llrf_warnings[4] = chan.getw() if (llrf_warnings[4] == 1): file_str1 = file_str1 + llrf_warnings_text[4] + ',' chan = CaChannel('rcsRf' + str(num) + ':alarm5_get') chan.searchw() llrf_warnings[5] = chan.getw() if (llrf_warnings[5] == 1): file_str1 = file_str1 + llrf_warnings_text[5] + ',' chan = CaChannel('rcsRf' + str(num) + ':alarm6_get') chan.searchw() llrf_warnings[6] = chan.getw() if (llrf_warnings[6] == 1): file_str1 = file_str1 + llrf_warnings_text[6] + ',' chan = CaChannel('rcsRf' + str(num) + ':alarm7_get') chan.searchw() llrf_warnings[7] = chan.getw() if (llrf_warnings[7] == 1): file_str1 = file_str1 + llrf_warnings_text[7] + '\n' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT19:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '阳极水压欠压' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT20:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '阳极水压过压' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT21:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '阳极水流量' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT22:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '隔直电容水流量' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT23:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '方仓风水交换水流量' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT24:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '功放柜急停开关' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT25:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '监控柜急停开关' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT26:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '主风压节点' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT27:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '副风压节点' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT28:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '方舱冷却前侧风压节点' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT29:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str2 = file_str2 + '断路器闭锁' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT30:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str3 = file_str3 + '放电棒状态' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT31:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str3 = file_str3 + '接地开关' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT32:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str3 = file_str3 + '灯丝欠流' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT33:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str3 = file_str3 + '方舱冷却后侧风压节点' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT34:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str3 = file_str3 + '门开关' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT35:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str3 = file_str3 + '帘栅电源' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT36:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str3 = file_str3 + '加载腔漏水' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT39:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str3 = file_str3 + '大偏流源' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT40:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '人身联锁' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT41:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '加载腔总入水过压' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT42:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '末级功放帘栅过流' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT43:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '反馈放大器帘栅电流' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT44:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '加载腔总进水过温' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT45:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '左加载腔出水过温' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT46:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '右加载腔出水过温' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT47:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '反馈放大器V1管栅极过压' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT48:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '反馈放大器V3管栅极过压' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT49:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str4 = file_str4 + '反馈放大器电源' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT50:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str5 = file_str5 + '栅极电压' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT51:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str5 = file_str5 + '高压光过流' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT52:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str5 = file_str5 + '反馈放大器阳极电流' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT53:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str5 = file_str5 + '末级功放阳极过流' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT54:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str5 = file_str5 + '左加载腔出水流量' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT55:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str5 = file_str5 + '右加载腔出水流量' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT56:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str5 = file_str5 + '高压电流模块仓温度' + ',' chan = CaChannel('ACC_RCS_RRF:RFPS' + str(num) + '::INT57:ai') chan.searchw() rf_warning_value = chan.getw() if (rf_warning_value == 3): file_str5 = file_str5 + '反馈放大器V2管栅极过压' + ',' chan = CaChannel('rcsRf' + str(num) + ':wf_amp_skew.VALA') chan.searchw() wf_1 = chan.getw() chan = CaChannel('rcsRf' + str(num) + ':wf_phaseError.VALA') chan.searchw() wf_2 = chan.getw() chan = CaChannel('rcsRf' + str(num) + ':wf_cavTunningError.VALA') chan.searchw() wf_3 = chan.getw() chan = CaChannel('rcsRf' + str(num) + ':wf_gridTunningError.VALA') chan.searchw() wf_4 = chan.getw() chan = CaChannel('rcsRf' + str(num) + ':wf_gridBias.VALA') chan.searchw() wf_5 = chan.getw() chan = CaChannel('rcsRf' + str(num) + ':wf_cavBias.VALA') chan.searchw() wf_6 = chan.getw() chan = CaChannel('rcsRf' + str(num) + ':wf_frontAmp.VALA') chan.searchw() wf_7 = chan.getw() chan = CaChannel('rcsRf' + str(num) + ':wf_gridAmp.VALA') chan.searchw() wf_8 = chan.getw() chan = CaChannel('rcsRf' + str(num) + ':wf_cavAmp.VALA') chan.searchw() wf_9 = chan.getw() parmFile = open( r'D:\eLog_Local\Software\Fail_Record\llrf_warnings' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write( '%s\n%s\n%s\n%s\n%s\n' % (file_str1, file_str2, file_str3, file_str4, file_str5)) parmFile.close() parmFile = open(r'D:\eLog_Local\Software\Fail_Record\ampSkew' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_1)) parmFile.close() parmFile = open( r'D:\eLog_Local\Software\Fail_Record\phaseError' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_2)) parmFile.close() parmFile = open( r'D:\eLog_Local\Software\Fail_Record\cavTunningError' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_3)) parmFile.close() parmFile = open( r'D:\eLog_Local\Software\Fail_Record\gridTunningError' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_4)) parmFile.close() parmFile = open( r'D:\eLog_Local\Software\Fail_Record\gridBias' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_5)) parmFile.close() parmFile = open(r'D:\eLog_Local\Software\Fail_Record\cavBias' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_6)) parmFile.close() parmFile = open( r'D:\eLog_Local\Software\Fail_Record\frontAmp' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_7)) parmFile.close() parmFile = open(r'D:\eLog_Local\Software\Fail_Record\gridAmp' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_8)) parmFile.close() parmFile = open(r'D:\eLog_Local\Software\Fail_Record\cavAmp' + str(num) + time_record + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (wf_9)) parmFile.close() #延时1s time.sleep(1) print("Fail Wave Record finished!") #写ELOG driver = webdriver.Chrome() driver.get("http://elog.csns.ihep.ac.cn/Ring+RF/?cmd=Login") driver.find_element_by_name("uname").send_keys("longw") driver.find_element_by_name("upassword").send_keys("csnsrcsrf") driver.find_element_by_class_name("login_submit").click() WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "title2"))) print(driver.title) driver.find_element_by_link_text("New").click() WebDriverWait(driver, 10) Select(driver.find_element_by_name( "Category")).select_by_value("Fault") driver.find_element_by_id("Beam commissioning").click() str_text = '自动故障记录:' + time_record time.sleep(2) driver.find_element_by_name("Subject").send_keys(str_text) time.sleep(2) driver.find_element_by_name("attfile").send_keys( 'D:\eLog_Local\Software\Fail_Record\llrf_warnings' + str(num) + time_record + '.txt') time.sleep(2) driver.find_element_by_xpath( "//input[@value='Upload']").click() time.sleep(1) driver.find_element_by_xpath( "//input[@value='Submit']").click() time.sleep(1) driver.quit() except CaChannelException as e: print(e)
def init(self): print ('================= INIT EPICS WAVE SETUP ===============') from CaChannel import CaChannel wavex = CaChannel() wavey = CaChannel() trig = CaChannel() try: pv_trig_name = self.pv_trig_name.data() trig.searchw(pv_trig_name) except: Data.execute('DevLogErr($1,$2)', self.getNid(), 'Error on PV trigger variable') raise mdsExceptions.TclFAILED_ESSENTIAL # trig.searchw('NB-SIGV-GISA:REF-TR_TIME') try: trig_data = self.trig_source.data() except: Data.execute('DevLogErr($1,$2)', self.getNid(), 'Trigger time') raise mdsExceptions.TclFAILED_ESSENTIAL #print('Trigger ', trig_data) trig.putw(float(trig_data)) for chan in range(1, 8): # wavex.searchw('NB-SIGV-GISA:PZ%d-WAVEX'%(chan)) # wavey.searchw('NB-SIGV-GISA:PZ%d-WAVEY'%(chan)) if getattr(self, 'wave_%d' % (chan)).isOn(): try: pv_wave_x = getattr(self, 'wave_%d_pv_x' % (chan)).data() wavex.searchw(pv_wave_x) except: msg = 'Error on PV waveform %d x variable' % (chan) Data.execute('DevLogErr($1,$2)', self.getNid(), msg) raise mdsExceptions.TclFAILED_ESSENTIAL try: wavex_data = getattr(self, 'wave_%d_x' % (chan)).data() except: msg = 'Error reading x waveform %d values' % (chan) Data.execute('DevLogErr($1,$2)', self.getNid(), msg) raise mdsExceptions.TclFAILED_ESSENTIAL try: pv_wave_y = getattr(self, 'wave_%d_pv_y' % (chan)).data() wavey.searchw(pv_wave_y) except: msg = 'Error reading y waveform %d values' % (chan) Data.execute('DevLogErr($1,$2)', self.getNid(), msg) raise mdsExceptions.TclFAILED_ESSENTIAL try: wavey_data = getattr(self, 'wave_%d_y' % (chan)).data() except: msg = 'Error reading y waveform %d values' % (chan) Data.execute('DevLogErr($1,$2)', self.getNid(), msg) raise mdsExceptions.TclFAILED_ESSENTIAL print('CH %d' % (chan)) print('X = ', wavex_data) print('Y = ', wavey_data) wavex.putw(wavex_data) wavey.putw(wavey_data) del wavex del wavey del trig print ('=======================================================') return 1
class pv(): # Wrapper for associating CaChannel class to specific PV using its name def __init__(self, pvname): try: self.pv = CaChannel() self.pv.searchw(pvname) self.alarm_status = "n/a" # used to store severity provided by callback self.alarm_severity = "n/a" # used to store severity provided by callback except : raise Exception("****** PV not found - "+pvname+" ******") #return pv # Wrapper for putw() function - writing a value to PV and waiting for input records to scan (update their value) def write(self, *args): try: if len(args) == 2: # arguments: value, scan_time self.pv.putw(args[0]) time.sleep(args[1]) if len(args) == 3: # arguments: value, scan_time, type if args[2] == "STRING": self.pv.putw(args[0],ca.DBR_STRING) else: raise Exception("Type "+ str(args[3]) +" not recognized") time.sleep(args[1]) print("***W: Set PV "+self.pv.name()+" to "+str(args[0])) except: print("Could not set PV "+self.pv.name()+" to "+str(args[0])) # Similar to write() except it does not print output when successfully sets the value # Useful for setUp and tearDown methods def write_silent(self, *args): try: if len(args) == 2: # arguments: value, scan_time self.pv.putw(args[0]) time.sleep(args[1]) if len(args) == 3: # arguments: value, scan_time, type if args[2] == "STRING": self.pv.putw(args[0],ca.DBR_STRING) else: raise Exception("Type "+ str(args[3]) +" not recognized") time.sleep(args[1]) except: print("Could not set PV "+self.pv.name()+" to "+str(args[0])) # Wrapper for getw() def read(self, *args): if len(args) == 1: if args[0] == "STRING": val = self.pv.getw(ca.DBR_STRING) else: raise Exception("Type "+ str(args[3]) +" not recognized") print("***R: Read PV "+self.pv.name()+" value "+str(val)) return val else: val = self.pv.getw() print("***R: Read PV "+self.pv.name()+" value "+str(val)) return val # Wrapper for getw() with CALLBACK for alarm status/severity def read_alarm(self): self.pv.array_get_callback(ca.dbf_type_to_DBR_STS(self.pv.field_type()), None, Callback, self) self.pv.flush_io() for i in range(20): self.pv.pend_event() # Wrapper for name() def name(self): return self.pv.name()
load_database_file(filename, macros, [os.path.dirname(subs)], args.encoding)) # print output as table printer = TablePrinter(30, 15, 15) printer.print_line('channel', 'IOC', 'database') printer.print_separator() for record in db.values(): if rtyps and record.rtyp not in rtyps: continue # issue connect requests and wait for connection chans = {} for field in record.fields: chan = CaChannel(record.name + '.' + field) chan.search() chans[field] = chan ca.pend_io(10) # issue read requests and wait for completion for chan in chans.values(): chan.array_get(ca.dbf_type_to_DBR_CTRL(chan.field_type())) ca.pend_io(10) # compare and print all_consistent = True for field, chan in chans.items(): # get configured value config_value = record.fields[field] # skip those with empty config values
def readWavesFunc(self, num): try: #初始化参数 chan = CaChannel('rcsRf' + str(num) + ':wf_amp_skew.VALA') chan.searchw() #parmFile = open(r'C:\Users\HP\Desktop\Waves\ampSkew'+str(num)+'.txt', 'w', encoding='utf-8') parmFile = open(r'ampSkew' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_gridTunningError.VALA') chan.searchw() parmFile = open(r'gridTunningError' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_cavTunningError.VALA') chan.searchw() parmFile = open(r'cavTunningError' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_phaseError.VALA') chan.searchw() parmFile = open(r'phaseError' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_beamPhase.VALA') chan.searchw() parmFile = open(r'beamPhase' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_cavBias.VALA') chan.searchw() parmFile = open(r'cavBias' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_cavBiasFF.VALA') chan.searchw() parmFile = open(r'cavBiasFF' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_gridBias.VALA') chan.searchw() parmFile = open(r'gridBias' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_cavAmp.VALA') chan.searchw() parmFile = open(r'cavAmp' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_gridAmp.VALA') chan.searchw() parmFile = open(r'gridAmp' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_frontAmp.VALA') chan.searchw() parmFile = open(r'frontAmp' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() chan = CaChannel('rcsRf' + str(num) + ':wf_beamAmp.VALA') chan.searchw() parmFile = open(r'beamAmp' + str(num) + '.txt', 'w', encoding='utf-8') parmFile.write('%s\n' % (chan.getw())) parmFile.close() #延时10s time.sleep(20) print("delay 20 s") except CaChannelException as e: print(e)
def set_pv_value(self, name, value, wait=False, timeout=TIMEOUT): """Set the PV to a value. When getting a PV value this call should be used, unless there is a special requirement. Parameters: name - the PV name value - the value to set wait - wait for the value to be set before returning """ name = MYPVPREFIX + ':' + name if name not in CACHE.keys(): chan = CaChannel(name) chan.setTimeout(TIMEOUT) #Try to connect - throws if cannot chan.searchw() CACHE[name] = chan else: chan = CACHE[name] if wait: chan.putw(value) else: def putCB(epics_args, user_args): #Do nothing in the callback pass ftype = chan.field_type() ecount = chan.element_count() chan.array_put_callback(value, ftype, ecount, putCB) chan.flush_io()