From c42dd41decda9788cbe82af07d7d73639cc42558 Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Tue, 8 Apr 2025 08:32:26 +0200 Subject: [PATCH] WIP frappy_psi/tdkpower Change-Id: I80d1beb0fae2a1cdd2aa5fabc5d31c651c2cb3e7 --- frappy_psi/tdkpower.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/frappy_psi/tdkpower.py b/frappy_psi/tdkpower.py index 64cad5c..8361422 100644 --- a/frappy_psi/tdkpower.py +++ b/frappy_psi/tdkpower.py @@ -17,9 +17,11 @@ # Markus Zolliker # Leon Zimmermann # ***************************************************************************** -"""Powersupply TDK-Lambda GEN8-400-1P230""" +"""Powersupply TDK-Lambda GEN8-400-3P400""" + +from frappy.core import StringIO, Readable, Parameter, Writable, HasIO +from frappy.datatypes import BoolType, EnumType, FloatRange -from frappy.core import StringIO, Readable, Parameter, FloatRange, Writable, HasIO, BoolType class IO(StringIO): end_of_line = ('OK\r', '\r') @@ -40,8 +42,12 @@ class Power(HasIO, Readable): class Output(HasIO, Writable): value = Parameter(datatype=FloatRange(0,100,unit='%')) target = Parameter(datatype=FloatRange(0,100,unit='%')) - maxvolt = Parameter('voltage at 100%',datatype=FloatRange(0,8,unit='V'),readonly=False) - maxcurrent = Parameter('current at 100%',datatype=FloatRange(0,400,unit='A'),readonly=False) + mode = Parameter('regulation mode', EnumType(voltage=1, current=2, both=3), + default='voltage', readonly=False) + maxvolt = Parameter('voltage at 100%', + datatype=FloatRange(0,8,unit='V'), readonly=False) + maxcurrent = Parameter('current at 100%', + datatype=FloatRange(0,400,unit='A'), readonly=False) output_enable = Parameter('control on/off', BoolType(), readonly=False) def initModule(self): @@ -49,11 +55,22 @@ class Output(HasIO, Writable): self.write_output_enable(False) def write_target(self, target): - self.write_output_enable(target != 0) - self.communicate(f'PV {target*self.maxvolt:.5f}') - self.communicate(f'PC {target*self.maxcurrent:.5f}') + # take care of proper order + if target == 0: + self.write_output_enable(False) + prev_curr = self.communicate(f'PC?') + volt = self.maxvolt if self.mode == 'current' else self.maxvolt * 0.01 * target + curr = self.maxcurrent if self.mode == 'voltage' else self.maxcurrent * 0.01 * target + if curr < prev_curr: + self.communicate(f'PC {curr:.6g}') + self.communicate(f'PV {volt:.6g}') + else: + self.communicate(f'PV {volt:.6g}') + self.communicate(f'PC {curr:.6g}') + if target: + self.write_output_enable(True) self.value = target - + def write_output_enable(self, value): self.communicate(f'OUT {int(value)}')