示例#1
0
    def update(self, state_words, values):
        sw = tuple(state_words)
        values.setdefault('Current', 0.0)
        values.setdefault('CurrentSetpoint', 0.0)
        values.setdefault('pending_bits', None)
        self._last_state_words = state_words
        alarms = self.alarms
        alarms.clear()

        sw_masked = [ sw[i] ^ M for i,M in enumerate(self.mask) ]
        sw_masked[3] = sw_masked[3] & 0xFFFE
        values['StateWords'] = sw_masked
        st, ione, itwo, regf, inff = sw_masked

        # translate error bits set in state byte to error message
        if bit(st, BIT_INTERLOCK_BYPASS):
            alarms += [ self.msg_state[BIT_INTERLOCK_BYPASS] ]

        # global interlock bit is silently ignored
        ilk_msg = bit_filter_msg(ione, self.msg_interlock1) + \
                  bit_filter_msg(itwo, self.msg_interlock2) + \
                  bit_filter_msg(regf, self.msg_regulation_fault) + \
                  bit_filter_msg(inff, self.msg_internal_fault)

        alarms += ilk_msg
        values["Alarm"] = ", ".join(ilk_msg)
        alarms += bit_filter_msg(regf, self.msg_regulation_fault)
        alarms += bit_filter_msg(inff, self.msg_internal_fault)

        self.power_on = bit(st, BIT_POWERON)

        if self.power_on and (not bit(st, BIT_REGOK) or time()<self.move_min_t):
                self.CURRENT_ADJUST()

        elif self.power_on:
                self.ON()

        elif len(ilk_msg):
            self.ALARMS(alarms)

        elif bit(st, BIT_GLOBAL_FAULT):
            self.ALARM('interlock or fault had been detected, please acknowledge')

        elif bit(st, BIT_STANDBY):
            self.STANDBY()

        elif bit(st, BIT_POWEROFF):
            self.OFF()

        else:
            ststr = '%04x '*5 % sw
            msg = "internal error, unforseen state words " + ststr
            self.device._fault(msg)

        pend_bit = values["pending_bits"]
        if  pend_bit == BIT_POWERON:
            self.SWITCH_ON(**values)
        elif pend_bit == BIT_POWEROFF:
            self.SWITCH_OFF(**values)
示例#2
0
 def update_stat2(self):
     '''Updates stat attribute from self.state_id and self.error_code
     '''
     self.alarms = bit_filter_msg(self.error_code, self.errors)
     if not self.errors:
         self.stat = DevState.INIT, 'module type not detected (yet)'
     elif self.alarms:
         status = '\n'.join(self.alarms)
         self.stat = DevState.ALARM, status
     elif self.state_id is None:
         self.stat = [ DevState.UNKNOWN, 'okay' ]
     elif self.state_id > len(self.machine_stat):
         self.stat = [ DevState.FAULT, 'unknown state [%02d]' % self.state_id ]
     else:
         self.stat = self.machine_stat[self.state_id]