Beispiel #1
0
 def set_trigger_PV(self,value):
     if value != self.__trigger_PV__:
         from CA import camonitor,camonitor_clear
         camonitor_clear(self.__trigger_PV__,callback=self.trigger_callback)
         self.trigger_times = []
         self.__trigger_PV__ = value
         camonitor(self.__trigger_PV__,callback=self.trigger_callback)
 def monitor(self,callback,new_thread=True):
     """Have the routine 'callback' be called every the time value
     of the PV changes.
     callback: function that takes three parameters:
     PV_name, value, char_value
     """
     from CA import camonitor
     camonitor(self.prefix+".RBV",callback=callback,new_thread=new_thread)
Beispiel #3
0
 def monitor(self,property_name,callback,*args,**kwargs):
     from CA import camonitor
     for PV_name in self.PV_names(property_name):
         def monitor_callback(PV_name,value,formatted_value):
             callback(*args,**kwargs)
         monitor_callback.callback = callback
         monitor_callback.args = args
         monitor_callback.kwargs = kwargs
         camonitor(PV_name,callback=monitor_callback,new_thread=True)
Beispiel #4
0
def caget_cached(PV_name):
    """Value of Channel Access (CA) Process Variable (PV)"""
    from CA import caget, camonitor
    camonitor(PV_name, callback=CA_cache_update)
    value = caget(PV_name, timeout=0)
    if value is None:
        if cache.exists(PV_name): value = cache.get(PV_name)
    if value is None: value = caget(PV_name)
    if value is None: warn("Failed to get PV %r" % PV_name)
    return value
Beispiel #5
0
 def monitor(self,PVs):
     """Update list of monitored process variables"""
     from CA import camonitor,camonitor_clear
     for PV in self.monitored_PVs+[]:
         if not PV in PVs:
             camonitor_clear(PV,self.callback)
             self.monitored_PVs.remove(PV)
     for PV in PVs:
         if not PV in self.monitored_PVs:
             camonitor(PV,callback=self.callback)
             self.monitored_PVs += [PV]
Beispiel #6
0
 def query(self,string,terminator="",count=0):
     """Receive data, until either the terminator character was received,
     the number of bytes given by 'count' have have received or
     a timeout has occurred."""
     # The first 'caget' after python statup always fails. As a work-around, use a
     # dummy caget just in case.
     if caget(self.port+".TMOD") != 0:
         caput(self.port+".TMOD",0,wait=True) # 0 = write/read
     if caget(self.port+".OEOS") != "":
         caput(self.port+".OEOS","\0",wait=True) # not output terminator
     if terminator: 
         if caget(self.port+".IEOS") != terminator:
             caput(self.port+".IEOS",terminator,wait=True) # input terminator
     else:
         if caget(self.port+".IEOS") != "":
             caput(self.port+".IEOS","\0",wait=True) # "\0" = none
     if caget(self.port+".IFMT") != 1:
         caput(self.port+".IFMT",1,wait=True) # 1 = hybrid
     if caget(self.port+".SCAN") != 0:
         caput(self.port+".SCAN",0,wait=True) # 0 = passive
     if caget(self.port+".NRRD") != count:
         caput(self.port+".NRRD",count,wait=True) # number of chars (0 = unlimited) 
     # If case string contains binary data, EpicsCA would strip away trailing
     # null characters. Sending non-ASCII chacters as except codes
     # makes sure that null characters are sent, too.
     encoded_string = repr(string)[1:-1]
     caput(self.port+".AOUT",encoded_string,wait=True)
     # With EpicsCA it is (as of June 2009) not possible to reliably retreive
     # special characters from the BINP (binary input) variable, because
     # EpicsCA strips off trailing  carriage return and null characters
     # before passing back a string. Thus, I read the TINP (Text input)
     # variable instead.
     timeout = caget(self.port+".TMOT")
     camonitor(self.port+".TINP",timeout=timeout)
     reply = caget(self.port+".TINP")
     if not reply: reply = ""
     n = caget(self.port+".NORD")
     if n == None: n = 0
     if n == 0: return "" # nothing read
     # Special characters in the TINP field are encoded as octal
     # escape sequences. Decode them.
     reply = eval("'"+reply+"'")
     if caget(self.port+".EOMR") == 2: # 2 = EOS 
         return reply+terminator # terminator was stripped off, add it back
     return reply
Beispiel #7
0
    def write_read(self, command_dict):
        """Writes commands to multiple pumps with pump ids and commands
        assembled in a dictionary. (with 1-based indices for the pumps)
        Returns a dictionary of pump ids and their respective responses."""
        from CA import caput, camonitor
        from time import time, sleep

        self.replies = {}
        self.monitor_ids = command_dict.keys()
        for i in command_dict:
            camonitor(self.prefix + "%s.AINP" % i, callback=self.monitor)
        if len(command_dict) > 1: caput(self.prefix + ".SPMG", 0)  # halt queue
        self.replies = {}
        for i, command in command_dict.iteritems():
            caput(self.prefix + "%s.AOUT" % i, command)
        if len(command_dict) > 1:
            caput(self.prefix + ".SPMG", 3)  # resume queue
        t0 = time()
        while not all([i in self.replies for i in command_dict]):
            if time() - t0 > self.timeout: break
            sleep(0.010)
        return self.replies
Beispiel #8
0
def CA_history(PV_name):
    """Value of Channel Access (CA) Process Variable (PV)"""
    from CA import camonitor
    camonitor(PV_name, callback=update)
    history = PV_history.get(PV_name, ([], []))
    return history
Beispiel #9
0
#!/usr/bin/env python
"""
Author: Friedrich Schotte
Date created: 2019-02-02
Date last modified: 2019-02-03
"""
from redirect import redirect
redirect("collect_monitor")
from CA import camonitor
camonitor("NIH:TIMING.registers.ch7_state.count")
camonitor("NIH:TIMING.registers.image_number.count")
camonitor("NIH:TIMING.registers.xdet_count.count")
camonitor("NIH:TIMING.registers.xdet_trig_count.count")
camonitor("NIH:TIMING.registers.xdet_acq_count.count")
camonitor("NIH:TIMING.registers.acquiring.count")
from time import sleep
while True: sleep(0.1)
    def startup(self):
        from CAServer import casput,casmonitor
        from CA import caput,camonitor
        from numpy import nan
        #self.P_default , self.I_default , self.D_default = 1.0,0.316,0.562
        #print('startup with prefix = %r' %self.prefix)
        casput(self.prefix+".SCAN",self.SCAN)
        casput(self.prefix+".DESC",value = "Temperature server IOC: a System Layer server that orchestrates setting on Lightwave IOC and Oasis IOC.", update = False)
        casput(self.prefix+".EGU",value = "C")
        # Set defaults
        casput(self.prefix+".VAL",value = nan)
        casput(self.prefix+".VAL_ADV",value = nan)
        casput(self.prefix+".RBV",value = nan)
        casput(self.prefix+".P",value = nan)
        casput(self.prefix+".I",value = nan)
        casput(self.prefix+".TIME_POINTS",self.time_points)
        casput(self.prefix+".TEMP_POINTS",self.temp_points)
        casput(self.prefix+".FAULTS"," ")
        casput(self.prefix+".DMOV",value = nan)
        casput(self.prefix+".KILL",value = 'write password to kill the process')

        casput(self.prefix+".P_default",value = self.P_default)
        casput(self.prefix+".I_default",value = self.I_default)
        casput(self.prefix+".D_default",value = self.D_default)


        casput(self.prefix+".oasis_slave",value = self.oasis_slave)
        casput(self.prefix+".temperature_oasis_switch",value = self.temperature_oasis_switch)
        casput(self.prefix+".idle_temperature_oasis",value = self.idle_temperature_oasis)
        casput(self.prefix+".temperature_oasis_limit_high",value = self.temperature_oasis_limit_high)
        casput(self.prefix+".oasis_headstart_time",value = self.oasis_headstart_time)
        casput(self.prefix+".lightwave_prefix",value = self.lightwave_prefix)
        casput(self.prefix+".oasis_prefix",value = self.oasis_prefix)
        casput(self.prefix+".set_point_update_period",value = self.set_point_update_period)

        casput(self.prefix+".oasis_RBV",value = nan)
        casput(self.prefix+".oasis_VAL",value = nan)

        #PV with a list of all process variable registered at the current Channel Access Server
        casput(self.prefix+".LIST_ALL_PVS",value = self.get_pv_list())

        # Monitor client-writable PVs.
        casmonitor(self.prefix+".VAL",callback=self.monitor)
        casmonitor(self.prefix+".VAL_ADV",callback=self.monitor)
        casmonitor(self.prefix+".TIME_POINTS",callback=self.monitor)
        casmonitor(self.prefix+".TEMP_POINTS",callback=self.monitor)
        casmonitor(self.prefix+".KILL",callback=self.monitor)

        casmonitor(self.prefix+".P_default",callback=self.monitor)
        casmonitor(self.prefix+".I_default",callback=self.monitor)
        casmonitor(self.prefix+".D_default",callback=self.monitor)

        casmonitor(self.prefix+".oasis_slave",callback=self.monitor)
        casmonitor(self.prefix+".temperature_oasis_switch",callback=self.monitor)
        casmonitor(self.prefix+".idle_temperature_oasis",callback=self.monitor)
        casmonitor(self.prefix+".temperature_oasis_limit_high",callback=self.monitor)
        casmonitor(self.prefix+".oasis_headstart_time",callback=self.monitor)
        casmonitor(self.prefix+".lightwave_prefix",callback=self.monitor)
        casmonitor(self.prefix+".oasis_prefix",callback=self.monitor)
        casmonitor(self.prefix+".set_point_update_period",callback=self.monitor)

        #############################################################################
        ## Monitor server-writable PVs that come other servers

        ## Monitor Timing system IOC
        from timing_system import timing_system
        camonitor(timing_system.acquiring.PV_name,callback=self.on_acquire)

        ## Lightwave Temperature controller server
        prefix = self.lightwave_prefix
        camonitor(prefix+".VAL",callback=self.lightwave_monitor)
        camonitor(prefix+".RBV",callback=self.lightwave_monitor)
        camonitor(prefix+".P",callback=self.lightwave_monitor)
        camonitor(prefix+".I",callback=self.lightwave_monitor)
        camonitor(prefix+".DMOV",callback=self.lightwave_monitor)

        ## Oasis chiller server
        prefix = self.oasis_prefix
        camonitor(prefix+".VAL",callback=self.oasis_monitor)
        camonitor(prefix+".RBV",callback=self.oasis_monitor)

        ## Create local circular buffers
        from circular_buffer_LL import Server
        self.buffers = {}
        self.buffers['oasis_RBV'] = Server(size = (2,1*3600*2) , var_type = 'float64')
        self.buffers['oasis_VAL'] = Server(size = (2,1*3600*2) , var_type = 'float64')
        self.buffers['oasis_FAULTS'] = Server(size = (2,1*3600*2) , var_type = 'float64')

        self.buffers['lightwave_RBV'] = Server(size = (2,1*3600*2) , var_type = 'float64')
        self.buffers['lightwave_P'] = Server(size = (2,1*3600*2) , var_type = 'float64')
        self.buffers['lightwave_I'] = Server(size = (2,1*3600*2) , var_type = 'float64')
        self.buffers['lightwave_VAL'] = Server(size = (2,1*3600*2) , var_type = 'float64')
Beispiel #11
0
 def set_monitoring_trigger(self,value):
     from CA import camonitor,camonitor_clear
     if value: camonitor(self.trigger_PV,callback=self.trigger_callback)
     else: camonitor_clear(self.trigger_PV,callback=self.trigger_callback)
     self.__monitoring_trigger__ = value