Source code for PyExpLabSys.drivers.edwards_nxds
""" Driver for Edwards, nXDS pumps """
import time
import logging
import serial
LOGGER = logging.getLogger(__name__)
LOGGER.addHandler(logging.NullHandler())
[docs]class EdwardsNxds(object):
""" Driver for the Edwards nXDS series of dry pumps """
[docs] def __init__(self, port):
self.ser = serial.Serial(port, 9600, timeout=2)
time.sleep(0.1)
[docs] def comm(self, command):
""" Ensures correct protocol for instrument """
self.ser.write((command + '\r').encode('ascii'))
return_string = self.ser.readline().decode()
if not return_string[2:5] == command[2:5]:
raise IOError
return return_string[6:-1]
[docs] def read_pump_type(self):
""" Read identification information """
return_string = self.comm('?S801')
pump_type = return_string.split(';')
return {
'type': pump_type[0],
'software': pump_type[1],
'nominal_frequency': pump_type[2],
}
[docs] def read_pump_temperature(self):
""" Read Pump Temperature """
return_string = self.comm('?V808')
temperatures = return_string.split(';')
pump = int(temperatures[0])
controller = int(temperatures[1])
return {'pump': pump, 'controller': controller}
[docs] def read_serial_numbers(self):
""" Read Pump Serial numbers """
return_string = self.comm('?S835')
service = return_string.split(';')
serials = service[0].split(' ')
return {
'Pump SNs': serials[0],
'drive-module SN': serials[1],
'PCA SN': serials[2],
'type': service[1].strip(),
}
[docs] def read_run_hours(self):
""" Return number of run hours """
return_string = self.comm('?V810')
run_hours = int(return_string)
return run_hours
[docs] def set_run_state(self, on_state):
""" Start or stop the pump """
if on_state is True:
return_string = self.comm('!C802 1')
else:
return_string = self.comm('!C802 0')
return return_string
[docs] def status_to_bin(self, word):
""" Convert status word to array of binaries """
status_word = ''
for i in range(0, 4):
val = int(word[i], 16)
status_word += bin(val)[2:].zfill(4)
bin_word = [False] * 16
for i in range(0, 15):
bin_word[i] = status_word[i] == '1'
return bin_word
[docs] def bearing_service(self):
""" Status of bearings """
return_string = self.comm('?V815')
status = return_string.split(';')
time_since = int(status[0])
time_to = int(status[1])
return {'time_since_service': time_since, 'time_to_service': time_to}
[docs] def pump_controller_status(self):
""" Read the status of the pump controller """
return_string = self.comm('?V813')
status = return_string.split(';')
controller_run_time = int(status[0])
time_to_service = int(status[1])
return {
'controller_run_time': controller_run_time,
'time_to_service': time_to_service,
}
[docs] def read_normal_speed_threshold(self):
""" Read the value for acknowledge the pump as normally running """
return_string = self.comm('?S804')
return int(return_string)
[docs] def read_standby_speed(self):
""" Read the procentage of full speed on standby """
return_string = self.comm('?S805')
return int(return_string)
[docs] def read_pump_status(self):
""" Read the overall status of the pump """
return_string = self.comm('?V802')
status = return_string.split(';')
rotational_speed = int(status[0])
system_status_1 = self.status_to_bin(status[1])
messages = []
if system_status_1[15] is True:
messages.append('Decelerating')
if system_status_1[14] is True:
messages.append('Running')
if system_status_1[13] is True:
messages.append('Standby Active')
if system_status_1[12] is True:
messages.append('Above normal Speed')
# if system_status_1[11] is True: # It is not entirely clear what this
# messages.append('Above ramp speed') # message means
if system_status_1[5] is True:
messages.append('Serial interface enabled')
system_status_2 = self.status_to_bin(status[2])
if system_status_2[15] is True:
messages.append('At power limit!')
if system_status_2[14] is True:
messages.append('Acceleration limited')
if system_status_2[13] is True:
messages.append('Deceleration limited')
if system_status_2[11] is True:
messages.append('Time for service!')
if system_status_2[9] is True:
messages.append('Warning')
if system_status_2[8] is True:
messages.append('Alarm')
warnings = []
warning_status = self.status_to_bin(status[3])
if warning_status[14] is True:
warnings.append('Temperature too low')
if warning_status[9] is True:
warnings.append('Pump too hot')
if warning_status[5] is True:
warnings.append('Temperature above maxumum measureable value')
if warning_status[0] is True:
warnings.append('EEPROM problem - service needed!')
faults = []
fault_status = self.status_to_bin(status[4])
if fault_status[14] is True:
faults.append('Voltage too high')
if fault_status[13] is True:
faults.append('Current too high')
if fault_status[12] is True:
faults.append('Temperature too high')
if fault_status[11] is True:
faults.append('Temperature sensor fault')
if fault_status[10] is True:
faults.append('Power stage failure')
if fault_status[7] is True:
faults.append('Hardware latch fault')
if fault_status[6] is True:
faults.append('EEPROM problem')
if fault_status[4] is True:
faults.append('No parameter set')
if fault_status[3] is True:
faults.append('Self test fault')
if fault_status[2] is True:
faults.append('Serial control interlock')
if fault_status[1] is True:
faults.append('Overload time out')
if fault_status[0] is True:
faults.append('Acceleration time out')
return {
'rotational_speed': rotational_speed,
'messages': messages,
'warnings': warnings,
'faults': faults,
}
[docs] def read_service_status(self):
""" Read the overall status of the pump """
service_status = self.status_to_bin(self.comm('?V826'))
messages = []
if service_status[15] is True:
messages.append('Tip seal service is due')
if service_status[14] is True:
messages.append('Bearing service is due')
if service_status[12] is True:
messages.append('Controller service is due')
if service_status[8] is True:
messages.append('Service is due')
return messages
[docs] def set_standby_mode(self, standbymode):
""" Set the pump on or off standby mode """
if standbymode is True:
return_string = self.comm('!C803 1')
else:
return_string = self.comm('!C803 0')
return return_string
if __name__ == '__main__':
PUMP = EdwardsNxds('/dev/ttyUSB3')
# print(PUMP.read_pump_type())
print(PUMP.read_pump_temperature())
# print(PUMP.read_serial_numbers())
# print(PUMP.read_run_hours())
# print(PUMP.read_normal_speed_threshold())
# print(PUMP.read_standby_speed())
# print(PUMP.pump_controller_status())
# print(PUMP.bearing_service())
# print(PUMP.read_pump_status()['rotational_speed'])
# print(PUMP.set_run_state(True))
# print(PUMP.set_standby_mode(False))