R3B-GLAD Magnet

Introduction

R3B is an experimental setup for studies of reactions with relativistic radioctive beams. For separation of the incoming particles a superconduction high field / high acceptance magnet ist used, the GLAD magnet. For more information about the experiment, see R3B, A next generation experimental setup for studies of Reactions with Relativistic Radioactive Beams.

Because of driving a superconductiong magnet, restrictions hold for control of the power converter. The main aspect is that rapid changes in the reference value for the current must be avoided. Depending on the current, limits in the ramp rate must not be exceeded.

The tolerable ramp rates are listed below. Full range time gives the time needed to ramp the full range at maximum ramp speed.
current range ramp rate full range time
0 A .. 360 A 2 A/s 180 s
360 A .. 2160 A 1 A/s 1800 s
2160 A .. 3240 A 0.4 A/s 2700 s
3240 A .. 3584 A 0.2 A/s 1720 s
The numbers indicate that the reference value for the current must be changed rather slowly. Setting the magnet to maximum current, always with maximum ramprate and starting from zero current, will take 6400 seconds, which is 1 hour, 46 minutes, and 40 seconds. These values are not fixed today (10. Sep. 2015) and may change in the future.

Aspects to be considered in interfacing can be found in the FAIR detailed specification Power Converter System for R3B-GLAD Magnet and in the Common Specification on Power Converters in general.

Meeting Minutes

Meeting 10. Sep. 2015

  • Control of the Magnet is in the first step by LSA/FESA. Experimenters requirement is to finally control the magnet via EPICS.
  • Ramp rates and current ranges (see table above) are subject to change in the future.
  • FESA may only control
    • Power on/off
    • Write and read set value (see below)
    • Read two actual values
    • Read status
  • For the set value, FESA must generate a ramp according to the table above. One idea is to always use the minimum step hight (3800 A / 220 ~= 3,7 mA) and calculate the necessary time between two steps using the specified gradient (ramp rate) of the particular range to reach the start or end value of the range or the set value itself.
    For the maximum gradient of 2 A/s and the minimum step hight, roughly 550 steps per second are necessary. Thus a new set value has to be sent approximatly every 1.8 ms.
    But probably this algorithm is too fine-grained. So see the Idea for the 'set value = actual value' tracing below.
  • When CDL and both CD connectors are closed, the 'set value = actual value' tracing must be on as well. It must not be on, when at least one of the CD connectors are open. (correct?)
  • All contactors are handled internally by MCS and MSS. FESA has no access to switch them. But their position must be readable via an ACU status register and reflected in the status property.
  • PS Power off does not mean that the magnet current is zero! There will be a status bit in an ACU register with: "Bit == 1" meaning "Imagnet > 5 A".
    • 5 A is just a random figure yet
  • As the PS is interfaced with an ACU, it is recommended to implement the FESA class with the help of or even within FESL.

Questions

  1. ACU registers are 16 bits wide. The DAC has a width of 20 bits (24 bits are planned). Thus two ACU registers are necessary to write the set value. In which order must the registers be written, MSBs first or LSBs first? Is it neccesary to trigger the DAC conversion only with the write of the second register?
  2. Der DAC und die ADCs sind, wie üblich, so angeschlossen, dass jeweils das MSB des DAC/ADCs auf dem MSB des (höherwertigen) ACU-Registers zu liegen kommt. Die Software rechnet also mit 231 - 1 entsprechend 3800 A (Wert ist vorzeichenbehaftet).
  3. Would it be sufficient to send new set values every 10 ms instead of 1.8 ms?
  4. Fährt man die Rampe nicht mit dem minimalen delta-I, dann führt das Aufaddieren der Einzelwerte in der Regel nicht genau zum gewünschten Sollwert. Nach Beendigung der Rampe sollte dann nochmal der korrekte Endwert geschickt werden. ...oder so ähnlich.
  5. [UK, 16.Nov.15] Should the set value always be updated according to the actual value (as long as there is current in the magnet)? In other words, should the set value update not depend on the operational status of the PS (isOperational() always returns true)? See Pseudo Code below.
  6. Is there a requirement to remotely test the PS (e.g. during maintanance) by sending set values that do not depend an the actual value of the magnet?
  7. Which states let isOperational() return false?
  8. Is it conceivable, that the FESA-class does not generate any ramp at all and that only the ACU does the ramping instead? The FESA class then would only write the desired end set value to the ACU.

Idea for the 'set value = actual value' tracing

  • Udo: Man will ja alle 10 ms (oder so) einen neuen Sollwert schicken - klar.
    • Idee: Der geschickete Sollwert ist der aktuelle Istwert + 20 mA (Bereich 0 - 360 A mit 2 A/s, sonst entsprechend weniger), bis der gewünschte Sollwert erreicht ist.
      Vorteil: Wenn das Gerät zwischendurch mal ausfällt und der Strom langsam abgefallen ist, macht man keine Sprünge, sondern fängt immer jeweils mit dem aktuellen Strom wieder an. Dabei muss man sich nicht mal darum kümmern, ob das Netzgerät gerade arbeitet oder nur der Strom im Kurzschluss fließt - es geht sofort an der richtigen Stelle weiter, wenn das Netzgerät wieder angeschaltet ist.
    • Kleine Problematik: Die Änderung des Sollwertes bei jedem Schritt sollte größer als das Rauschen des Istwertes sein, sonst geht man womöglich immer mal wieder unnötig zurück (und insgesamt langsamer als man könnte).
  • Ludwig: Das scheint mir eine recht elegante Lösung des Problems zu sein.
    • Ich bin nur noch am Grübeln, ob es nicht einen Fallstrick gibt, wenn man das Setzen des Sollwertes so eng an den Istwert des Magneten koppelt.
    • Die "+ 20 mA" müssen natürlich auch mal "- 20 mA" sein, wenn der Sollwert 'weiter unten' ist. Und was macht man, wenn der Sollwert nur noch 10 mA vom Istwert entfernt ist? Muss man also auch beachten im Rampen-Algorithmus.
    • Und was man evtl. noch beachten sollte: Ist Istwert = Sollwert erreicht, sollte das Schicken weiterer Sollwerte unterbleiben. Ansonsten könnte man womöglich kleine Rippel erzeugen, weil ständig neue Sollwerte geschickt würden, die ganz leicht um den Istwert schwanken und damit dann auch der Istwert selbst. Das Problem wird sein, eine Schwelle zu finden, die einerseits dazu führt, dass beim Über- oder Unterschreiten das Rampen wieder in Gang kommt, die aber andereseits groß genug ist, um das Rippeln zu vermeiden.
    • Eine weitere Frage: Funktioniert der Trace-Mechanismus auch, wenn das Netzgerät, weil der CDL geschlossen ist, seinen Strom ziemlich fix auf den des Magneten fährt? Ich denke ja, da ja zum Setzen des Sollwertes der Istwert vom Magneten (DCCT2) genommen wird.
    • Wären auch +/- 200 mA alle 100 ms noch okay?
    • Man sollte die periodische Aktion irgendwie überwachen (können). Eventuell reicht es aus, wenn man per Property auslesen kann, wann die Loop das letzte mal gelaufen ist.

Pseudo code for 'set value = actual value' tracing

// The set value sent from an application
//----------------------------------------
SetValType setVal  

// Do not write a new set value when absolute
// difference between setVal and actVal is 
// lower than this value
//--------------------------------------------
static const IncValType incThreshold = 0.0005  // or which value?

// Check whether PS is ready to receive set values
// 'okay' means no interlock, no error, no whatsoever, etc.
// [UK, 16.Nov.15]: See question 5 above.
//----------------------------------------------------------
isOperational()
    if PS is okay and 
       magnet is okay and
       CD connectors closed and  
       CP1/CP2 connectors closed and  // really?
       (what else?)
        return true
    else
        return false

// Read actual value from ACU
// (must be the DCCT2 value!)
//----------------------------
readActVal()
    return readFromAcu(ACTVAL_REG)

// Write set value to ACU
//------------------------
writeSetVal(val)
    writeToAcu(SETVAL_REG, val)

// Get increment (may be negative)
// Measured actual values may be below 0 A or above 3584 A!
// Which limit below 0 and above 3584 should be used so that 
// the value is still taken as valid when it is within this 
// limit? Approx. 10% less/more?
//------------------------------------------------------------
getIncVal(set, act)
    if -4 <= act < 0
        log("Info: Measured actual value is below 0 A")
        inc = 0.02  // 20mA/10ms
    else if 0 <= act <= 360
        inc = 0.02  // 20mA/10ms
    else if 360 < act <= 2160
        inc = 0.01  // 10mA/10ms
    else if 2160 < act <= 3240
        inc = 0.004  // 4mA/10ms
    else if 3240 < act <= 3584
        inc = 0.002  // 2mA/10ms
    else if 3584 < act <= 3800
        log("Info: Measured actual value is above 3584 A")
        inc = 0.002  // 2mA/10ms
    else
        log("Error: Measured actual value is out of valid range")
        inc = 0.0  // really?
    if act > set
        inc = -1 * inc

// Main loop, one execution every 10 ms
//======================================
main()
    while TRUE do
        if isOperational()  // [see Question 5 above]
            actVal = readActVal()
            incVal = getIncVal(setVal, actVal)
            if abs(setVal - actVal) > abs(incVal)
                writeSetVal(actVal + incVal)  // incVal may be negative
            else
                incVal = setVal - actVal
                if abs(incVal) > incThreshold
                    writeSetVal(actVal + incVal)  // incVal may be negative
                else
                    // do nothing, actVal == setVal within incThreshold accuracy
        sleep(10ms)
    done
Topic revision: r8 - 24 Nov 2015, LudwigHechler
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback