Commit cbfd2d82 authored by Claudio Scafuri's avatar Claudio Scafuri 💬
Browse files

first import

parent 4c19ec2a
.pydevproject
.project
.cproject
.settings
obj
bin
core*
*~
*.pyc
*.so
*.so*
.pylintrc
.metadata
.idea
.cvsignore
.nse_depinfo
software
oldsrc
CVS
Make*
main.cpp
----------------------------------------------------------------------------
Linee guida nella realizzazione di Device Server (DS) Tango per alimentatori
----------------------------------------------------------------------------
----------------------------------------------------------------------------
Changes:
----------------------------------------------------------------------------
Ver 20101119
Corretti i nomi delle proprieta' ed aggiunto anche Warning nella sezione
"Configurazione del Device server". Specificato il valore della corrente da
impostare in determinati stati nella sezione "Note". Creata una sezione
"Ciclaggio" per separare le informazioni inerenti tale procedura dalla sezione
"Note" dove finiscono tutte le informazioni di carattere generale.
Ver 20101115
L'attributo Voltage in scrittura e' opzionale (modificata la "Tabella della
verità Stato/Attributo"). Aggiunte alcune note su CycWaitTime e CycNumTimes.
Sia che il ciclaggio vada a buon fine o no il DS deve impostare la corrente
CycEndCurr.
Ver 20101112
Eliminati VoltageSet, CurrentLimit e VoltageLimit dalla lista degli attributi.
Reso piu' chiara la parte del documento riferita al ciclaggio.
Ver 20101105
Se le transazioni sono lunghe queste devono essere gestite con lo stato MOVING
pertanto la funzione Abort deve essere configurata solo su questo stato. Corretta
la tabella della verità Stato/Commando.
Ver 20101018
Aggiunto lo stato ALARM nelle sezioni "Stati", "Tabella della verità Stato/Commando"
ed in "Tabella della verità Stato/Attributo".
Aggiunta la sezione "Configurazione del Device server".
Ver 20101008
Prima versione rilasciata di questo documento.
----------------------------------------------------------------------------
Attributi:
----------------------------------------------------------------------------
RW DevDouble Current Legge la corrente effettivamente erogata
Scrive la corrente richiesta (setpoint)
R DevDouble Voltage Legge la tensione effettivamente erogata
R DevDouble CurrentSet Legge la corrente richiesta (setpoint impostato)
R DevBoolean[] PsStat I vari flag del dispositivo
----------------------------------------------------------------------------
Comandi:
----------------------------------------------------------------------------
void StartCycling Comando di ciclaggio
void Abort Abortisce il ciclaggio o la transazione di accensione/spegnimento
void On Accende
void Off Spenge
void Reset Recupero da uno stato di FAULT
----------------------------------------------------------------------------
Stati:
----------------------------------------------------------------------------
ON
OFF
FAULT
MOVING Ciclaggio o nella transazione di accensione/spegnimento
ALARM Gestito automaticamnte da Tango nel caso vengano superati i limiti nel
range delle grandezze scalari.
----------------------------------------------------------------------------
Tabella della verità Stato/Commando:
----------------------------------------------------------------------------
Commando
Stato \ startCycling Abort On Off Reset
ON Y N Y Y N
OFF N N Y Y N
FAULT N N N N Y
MOVING N Y N N N
ALARM ** ** ** ** **
(**) Il DS deve comportarsi come se fosse nello stato che ricava dalla lettura
dello stato del dispositivo pertanto nel DS non e' richiesta nessuna gestione
particolare dello stato ALARM.
----------------------------------------------------------------------------
Tabella della verità Stato/Attributo:
----------------------------------------------------------------------------
Attributo
Stato \ Current Voltage CurrentSet PsStat
ON RW RW* R R
OFF R R R R
FAULT R R R R
MOVING R R R R
ALARM ** ** ** **
(*) Non tutti gli alimentatore supportano l'impostazione della tensione.
In tali caso Voltage deve risultare solamente solo in lettura cioe' R.
(**) Il DS deve comportarsi come se fosse nello stato che ricava dalla lettura
dello stato del dispositivo pertanto nel DS non e' richiesta nessuna gestione
particolare dello stato ALARM.
----------------------------------------------------------------------------
Note
----------------------------------------------------------------------------
I commandi On() e Off() devono poter essere rieseguiti anche se il dispositivo
risulta gia' nel relativo stato (quindi eseguire On() quando lo stato
risulti gia' ON ed Off() quando lo stato risulti gia' in OFF).
I commandi che impostano una tensione o/e una corrente non devono essere permessi
(quindi deve essere aggiunto un controllo nella State Machine del DS) quando
lo stato e' diverso da ON. Giacche' si vuole pero' essere in grado di leggere
tali valori in tutti gli stati tale modifica deve essere apportata
a mano (Pogo 6.x non permette di specificarlo).
Il commando di Reset, eseguito con successo, puo' far rientrare solamente
lo stato di FAULT del DS.
Il comando Abort, se eseguito durante il ciclaggio, riporta il dispositivo
nello stato di partenza (stato ON con corrente settata CycEndCurr).
Qualora invece venga eseguito durante la transazione di accensione/spegnimento
riporta sempre il dispositivo nello stato di OFF.
Prima di entrare in stato di FAULT o al momento sia dell'accensione che dello
spegnimento bisogna impostare la corrente a 0.
Inoltre va aggiunto questo codice nell'inizializzazione del DS:
Tango::WAttribute *attr_set_current;
try {
Tango::MultiAttribute *attr_list = get_device_attr();
attr_set_current = 0;
attr_set_current = &(attr_list->get_w_attr_by_name("Current"));
}
catch(...) {
INFO_STREAM << "A2605::init_device(): ERROR GETTING ATTRIBUTE" << endl;
}
nella read_Current:
double set_curr = set_current_from_field();
if (attr_set_current)
attr_set_current->set_write_value(set_curr);
----------------------------------------------------------------------------
Ciclaggio
----------------------------------------------------------------------------
Il comando startCycling() cicla l'alimentatore tra il valore indicato da
CycMinCurr e quelle indicato da CycMaxCurr un certo numero di volte indicato
da CycNumTimes mantenendo il livello per CycWaitTime secondi. La corrente deve
variare con un rateo definito indicato da CycRampSlopeCurr. Qualora il rateo
sia forzato dal dispositivo stesso il DS puo' semplicemente ignorare
tale proprieta'.
Prima di procedere la ciclaggio vero e proprio startCycling() deve impostare
alla partenza la corrente CycStartCurr. Parimenti una volta terminato il
ciclaggio deve impostare la corrente CycEndCurr. Se facendo cio' si genera un
cambio di stato questo non deve essere considerato per le finalita'
di CycNumTimes.
Il DS dovra' anche memorizzare l'esito dell'ultimo ciclaggio. Se questo risulti
fallito il DS, senza comunque variare lo stato, deve riportarlo nel messaggio
testuale che ritorna all'utente da Status(). Un ciclaggio deve essere considerato
fallito sia se durante la sua esecuzione riscontri un problema sia nel caso venga
abortito con il relativo commando. Il messaggio di ciclaggio fallito deve essere
rimosso solo una volta che sia portato a termine con successo un successivo
ciclaggio.
Ricapitolando il comportamento del comando startCycling() e' determinato dalle
seguenti proprieta' del dispositivo:
CycMinCurr
CycMaxCurr
CycEndCurr
CycStartCurr
CycNumTimes
CycWaitTime
CycRampSlopeCurr
Si nota che l'esigenza di parametrizzare questi valori nasce dalla volonta' di
gestire sia gli alimentatori bipolari che monopolari (per esempio nei primi il
valore minimo assoluto di corrente e' 0 mentre cio' non e' vero per i secondi).
----------------------------------------------------------------------------
Configurazione del Device server
----------------------------------------------------------------------------
E' molto importante che i device siano configurati correttamente.
Per tutti gli attributi che ricadono in grandezze analogiche devono
essere configurati le seguenti proprieta':
Display format: Imposta implicitamente il numero di cifre significative
visualizzate, che sono una caratteristica dell' istanza del DS (Pogo).
Value min/max: Sono una caratteristica del DS (Pogo).
Warning min/max: Opzionalmente si possono configurare per segnalare
stati anomali che non impedisce l'operativita' (Pogo).
Alarm min/max: Sono una caratteristica del DS. Se configurati possono
porre il device nello stato ALARM (Pogo).
Delta time,Delta value: Usati solo per le grandezze RW. Se quanto letto
differisce da quanto impostato setting per un certo tempo il device viene
posto nello stato di ALARM (Pogo).
Polling: Parametro molto importante per trovare il corretto bilanciamento tra
prontezza della risposta e carico prodotto dal server. Se il polling non
e' abilitato il device non puo' genenare eventi in modo automatico (Jive).
Event: Vanno configurati per lo meno per avere un sistema di archiviazione
efficiente. Vano stabilite le soglie che per il DS rappresentano un
variazione significativa di una grandezza scalare. Sono quindi legate
alla risoluzione e al rapporto segnale rumore (Jive).
/*----- PROTECTED REGION ID(PowerSupply::ClassFactory.cpp) ENABLED START -----*/
//=============================================================================
//
// file : ClassFactory.cpp
//
// description : C++ source for the class_factory method of the DServer
// device class. This method is responsible for the creation of
// all class singleton for a device server. It is called
// at device server startup.
//
// project : PowerSupply abstract class
//
// This file is part of Tango device class.
//
// Tango is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Tango is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Tango. If not, see <http://www.gnu.org/licenses/>.
//
// $Author: claudio $
//
// $Revision: 1.1 $
// $Date: 2013-01-09 15:33:17 $
//
// $HeadURL: $
//
//=============================================================================
// This file is generated by POGO
// (Program Obviously used to Generate tango Object)
//=============================================================================
#include <tango.h>
#include <PowerSupplyClass.h>
// Add class header files if needed
/**
* Create PowerSupply Class singleton and store it in DServer object.
*/
void Tango::DServer::class_factory()
{
// Add method class init if needed
add_class(PowerSupply_ns::PowerSupplyClass::init("PowerSupply"));
}
/*----- PROTECTED REGION END -----*/ // PowerSupply::ClassFactory.cpp
/*----- PROTECTED REGION ID(PowerSupply.cpp) ENABLED START -----*/
//=============================================================================
//
// file : PowerSupply.cpp
//
// description : C++ source for the PowerSupply and its commands.
// The class is derived from Device. It represents the
// CORBA servant object which will be accessed from the
// network. All commands which can be executed on the
// PowerSupply are implemented in this file.
//
// project : PowerSupply abstract class.
//
// $Author: claudio $
//
// $Revision: 1.3 $
// $Date: 2020-01-09 11:26:01 $
//
// SVN only:
// $HeadURL: $
//
// CVS only:
// $Source: /home/cvsadm/cvsroot/AbstractClasses7/Powersupply/PowerSupply.cpp,v $
// $Log: PowerSupply.cpp,v $
// Revision 1.3 2020-01-09 11:26:01 claudio
// pogo 9
//
// Revision 1.2 2014-04-23 08:47:29 claudio
// tango-8.1.2.c
//
// Revision 1.1 2013-01-09 15:33:17 claudio
// for tango 8
//
//
//=============================================================================
// This file is generated by POGO
// (Program Obviously used to Generate tango Object)
//=============================================================================
#include <PowerSupply.h>
#include <PowerSupplyClass.h>
/*----- PROTECTED REGION END -----*/ // PowerSupply.cpp
/**
* PowerSupply class description:
* This is the abstract class for power supplies. It will be the superclass for all concrete
* implementations of power supplies in TANGO.
*/
//================================================================
// The following table gives the correspondence
// between command and method names.
//
// Command name | Method name
//================================================================
// State | Inherited (no method)
// Status | Inherited (no method)
// On | Inherited (no method)
// Off | Inherited (no method)
// Reset | Inherited (no method)
//================================================================
//================================================================
// Attributes managed are:
//================================================================
// Current | Tango::DevDouble Scalar
// Voltage | Tango::DevDouble Scalar
// CurrentSet | Tango::DevDouble Scalar
// Stat | Tango::DevBoolean Spectrum ( max = 128)
//================================================================
namespace PowerSupply_ns
{
/*----- PROTECTED REGION ID(PowerSupply::namespace_starting) ENABLED START -----*/
// static initializations
/*----- PROTECTED REGION END -----*/ // PowerSupply::namespace_starting
//--------------------------------------------------------
/**
* Method : PowerSupply::PowerSupply()
* Description : Constructors for a Tango device
* implementing the classPowerSupply
*/
//--------------------------------------------------------
PowerSupply::PowerSupply(Tango::DeviceClass *cl, string &s)
: TANGO_BASE_CLASS(cl, s.c_str())
{
/*----- PROTECTED REGION ID(PowerSupply::constructor_1) ENABLED START -----*/
init_device();
/*----- PROTECTED REGION END -----*/ // PowerSupply::constructor_1
}
//--------------------------------------------------------
PowerSupply::PowerSupply(Tango::DeviceClass *cl, const char *s)
: TANGO_BASE_CLASS(cl, s)
{
/*----- PROTECTED REGION ID(PowerSupply::constructor_2) ENABLED START -----*/
init_device();
/*----- PROTECTED REGION END -----*/ // PowerSupply::constructor_2
}
//--------------------------------------------------------
PowerSupply::PowerSupply(Tango::DeviceClass *cl, const char *s, const char *d)
: TANGO_BASE_CLASS(cl, s, d)
{
/*----- PROTECTED REGION ID(PowerSupply::constructor_3) ENABLED START -----*/
init_device();
/*----- PROTECTED REGION END -----*/ // PowerSupply::constructor_3
}
//--------------------------------------------------------
/**
* Method : PowerSupply::delete_device()
* Description : will be called at device destruction or at init command
*/
//--------------------------------------------------------
void PowerSupply::delete_device()
{
DEBUG_STREAM << "PowerSupply::delete_device() " << device_name << endl;
/*----- PROTECTED REGION ID(PowerSupply::delete_device) ENABLED START -----*/
// Delete device allocated objects
/*----- PROTECTED REGION END -----*/ // PowerSupply::delete_device
}
//--------------------------------------------------------
/**
* Method : PowerSupply::init_device()
* Description : will be called at device initialization.
*/
//--------------------------------------------------------
void PowerSupply::init_device()
{
DEBUG_STREAM << "PowerSupply::init_device() create device " << device_name << endl;
/*----- PROTECTED REGION ID(PowerSupply::init_device_before) ENABLED START -----*/
// Initialization before get_device_property() call
/*----- PROTECTED REGION END -----*/ // PowerSupply::init_device_before
// No device property to be read from database
/*----- PROTECTED REGION ID(PowerSupply::init_device) ENABLED START -----*/
// Initialize device
/*----- PROTECTED REGION END -----*/ // PowerSupply::init_device
}
//--------------------------------------------------------
/**
* Method : PowerSupply::always_executed_hook()
* Description : method always executed before any command is executed
*/
//--------------------------------------------------------
void PowerSupply::always_executed_hook()
{
DEBUG_STREAM << "PowerSupply::always_executed_hook() " << device_name << endl;
/*----- PROTECTED REGION ID(PowerSupply::always_executed_hook) ENABLED START -----*/
// code always executed before all requests
/*----- PROTECTED REGION END -----*/ // PowerSupply::always_executed_hook
}
//--------------------------------------------------------
/**
* Method : PowerSupply::read_attr_hardware()
* Description : Hardware acquisition for attributes
*/
//--------------------------------------------------------
void PowerSupply::read_attr_hardware(TANGO_UNUSED(vector<long> &attr_list))
{
DEBUG_STREAM << "PowerSupply::read_attr_hardware(vector<long> &attr_list) entering... " << endl;
/*----- PROTECTED REGION ID(PowerSupply::read_attr_hardware) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // PowerSupply::read_attr_hardware
}
//--------------------------------------------------------
/**
* Method : PowerSupply::write_attr_hardware()
* Description : Hardware writing for attributes
*/
//--------------------------------------------------------
void PowerSupply::write_attr_hardware(TANGO_UNUSED(vector<long> &attr_list))
{
DEBUG_STREAM << "PowerSupply::write_attr_hardware(vector<long> &attr_list) entering... " << endl;
/*----- PROTECTED REGION ID(PowerSupply::write_attr_hardware) ENABLED START -----*/
// Add your own code
/*----- PROTECTED REGION END -----*/ // PowerSupply::write_attr_hardware
}
//--------------------------------------------------------
/**
* Method : PowerSupply::add_dynamic_attributes()
* Description : Create the dynamic attributes if any
* for specified device.
*/
//--------------------------------------------------------
void PowerSupply::add_dynamic_attributes()
{
/*----- PROTECTED REGION ID(PowerSupply::add_dynamic_attributes) ENABLED START -----*/
// Add your own code to create and add dynamic attributes if any
/*----- PROTECTED REGION END -----*/ // PowerSupply::add_dynamic_attributes
}
//--------------------------------------------------------
/**
* Method : PowerSupply::add_dynamic_commands()
* Description : Create the dynamic commands if any
* for specified device.
*/
//--------------------------------------------------------
void PowerSupply::add_dynamic_commands()
{
/*----- PROTECTED REGION ID(PowerSupply::add_dynamic_commands) ENABLED START -----*/
// Add your own code to create and add dynamic commands if any
/*----- PROTECTED REGION END -----*/ // PowerSupply::add_dynamic_commands
}
/*----- PROTECTED REGION ID(PowerSupply::namespace_ending) ENABLED START -----*/
// Additional Methods
/*----- PROTECTED REGION END -----*/ // PowerSupply::namespace_ending
} // namespace
/*----- PROTECTED REGION ID(PowerSupply.h) ENABLED START -----*/
//=============================================================================
//
// file : PowerSupply.h
//
// description : Include for the PowerSupply class.
//
// project : PowerSupply abstract class.
//
// $Author: claudio $
//
// $Revision: 1.3 $
// $Date: 2020-01-09 11:26:01 $
//
// SVN only:
// $HeadURL: $
//
// CVS only:
// $Source: /home/cvsadm/cvsroot/AbstractClasses7/Powersupply/PowerSupply.h,v $
// $Log: PowerSupply.h,v $
// Revision 1.3 2020-01-09 11:26:01 claudio
// pogo 9
//
// Revision 1.2 2014-04-23 08:47:29 claudio
// tango-8.1.2.c
//
// Revision 1.1 2013-01-09 15:33:17 claudio
// for tango 8
//
// Revision 1.4 2013-01-09 15:22:49 claudio
// *** empty log message ***
//
// Revision 1.3 2012-09-28 13:03:15 claudio
// CuurentSet is read only as per specs
//
//
//=============================================================================
// This file is generated by POGO
// (Program Obviously used to Generate tango Object)
//=============================================================================
#ifndef POWERSUPPLY_H
#define POWERSUPPLY_H
#include <tango.h>
/*----- PROTECTED REGION END -----*/ // PowerSupply.h
/**
* PowerSupply class description:
* This is the abstract class for power supplies. It will be the superclass for all concrete
* implementations of power supplies in TANGO.
*/
namespace PowerSupply_ns
{
/*----- PROTECTED REGION ID(PowerSupply::Additional Class Declarations) ENABLED START -----*/
// Additional Class Declarations
/*----- PROTECTED REGION END -----*/ // PowerSupply::Additional Class Declarations
class PowerSupply : public TANGO_BASE_CLASS
{
/*----- PROTECTED REGION ID(PowerSupply::Data Members) ENABLED START -----*/
// Add your own data members
/*----- PROTECTED REGION END -----*/ // PowerSupply::Data Members
// Attribute data members
public:
// Constructors and destructors
public:
/**
* Constructs a newly device object.
*
* @param cl Class.
* @param s Device Name
*/
PowerSupply(Tango::DeviceClass *cl,string &s);
/**
* Constructs a newly device object.
*
* @param cl Class.
* @param s Device Name
*/
PowerSupply(Tango::DeviceClass *cl,const char *s);
/**
* Constructs a newly device object.
*
* @param cl Class.
* @param s Device name
* @param d Device description.
*/