import time from .psw_gw_instek import GWInstekPSW from .tpg262_gnome232 import TPG262GNOME232 def write2file(fname, value): with open(fname, 'w') as f: f.write(str(value)) def fill_chamber(target_pressure, eps=0.1, start_v=10, interval=0.5, proportional_const=1e-1, derivative_const=1e-1, max_time=60, fail_pressure=200, psw_address='192.168.2.75', gauge_address='192.168.2.246', verbose=False): psw = GWInstekPSW(psw_address) gauge = TPG262GNOME232(gauge_address) v = start_v psw.set_voltage(v) psw.set_output(True) last_p = p = 0 start_t = time.time() while True: #for x in range(10): last_p = p p = gauge.get_pressure(1) * 1e3 # to mPa write2file('/dev/shm/pressure_chamber_mPa', p) if p > fail_pressure: psv.set_output(False) raise RuntimeError('pressure {} over limit {}'.format(p, fail_pressure)) elapsed = time.time() - start_t if elapsed > max_time: raise RuntimeError('did not converge, maintaining pressure {}'.format(p)) err = target_pressure - p change = p - last_p if abs(err) < eps and abs(change)/interval < eps: if verbose: print('reached pressure {} with error {} and change {} in {} seconds '.format(p, err, change, elapsed)) break v += proportional_const * err - derivative_const * change / interval psw.set_voltage(v) if verbose: print('pressure {}, setting voltage {}'.format(p, v)) time.sleep(interval) def close_valve(psw_address='192.168.2.75'): psw = GWInstekPSW(psw_address) psw.set_output(False)