Realizzazione di una base di dati per la memorizzazione di dati provenienti da sensori di un impianto fotovoltaico.
1. UNIVERSITÀ DEGLI STUDI DI
TRIESTE
FACOLTÀ DI INGEGNERIA
CORSO DI LAUREA IN INGEGNERIA DELL’INFORMAZIONE
CURRICULUM INFORMATICA
Realizzazione di una base di dati per la
memorizzazione di dati provenienti da sensori di un
impianto fotovoltaico.
RELATORE: LAUREANDO:
Prof. Maurizio FERMEGLIA Michele Furlanetto
ANNO ACCADEMICO 2011-2012
4. 1. INTRODUZIONE
All’interno dell’Università degli Studi di Trieste è stato installato, nel 2011,
un laboratorio per lo studio delle prestazioni di dispositivi fotovoltaici.
Il laboratorio è provvisto di un sistema di monitoraggio di dati climatici ed
elettriciinstallato della ditta LSI LASTEM1, e realizzato con sensori progettati
e prodotti dalla stessa.
Questi strumenti dialogano mediante dei dispositivi denominati Data
Loggercon un calcolatore fornito dalla stessa LSI LASTEM e dotato di una
suite software proprietaria necessaria per l’acquisizione dei dati.
Tra le possibili opzioni di stoccaggio dei dati offerte dalla suite, si fa notare la
presenza di una base di dati, vincolata all’uso del motore MICROSOFT®
SQL SERVER® EXPRESS Edition.
Con questa premessa, obiettivo di questa tesi sarà estendere le funzionalità
della base di dati per la fruizione da remoto.
Inoltre, si vuole automatizzare alcune operazioni di analisi dei dati.
Il progetto sarà esposto in questo documento in ordine di analisi, una breve
panoramica di com’è formato l’intero sistema in produzione, progettazione, le
linee guida seguite durante lo sviluppo, implementazione del codice necessario
e infine le conclusioni.
1
http://www.lsi-lastem.it/
4
5. 2. ANALISI
E’ possibile suddividere il sistema di monitoraggio in più sezioni: i sensori,
idata logger ed infine il calcolatore, di cui segue una breve descrizione.
2.1. Sensori
I sensori misurano sia grandezze elettriche sia climatiche;sono installati
all’esterno dell’edificio e sono adibiti alla rilevazione dei dati. Essi possono
essere suddivisi in base al tipo di misura rilevata, se elettrica oppure climatica.
Il sistema fotovoltaico monitorato e le misure elettriche
E’ composto di moduli fotovoltaici, convertitori e carichi.
Vi sono 5 moduli di 3 diverse tecnologie e di due produttori (Q.Cells e First
Solar):
Q.Smart 95, con angolo di tilt 10°;
Q.Smart 95, con angolo di tilt 34°;
Q.Pro 230, con angolo di tilt 10°;
Q.Pro 230, con angolo di tilt 34°;
FS-272, con angolo di tilt 34°.
Per ogni coppia modulo-convertitore dei sensori provvedono 4 misure,
riassunte nello schema seguente:
=
I_in I_out
V_out
V_in
=
Modulo Convertitore Resistenza
Figura 1 – Schema delle misure elettriche
Ulteriori analisi dei moduli esulano da questo trattato, ma può essere di
interesse che in origine il progetto dell’impianto prevedesse un sesto modulo,
del quale se ne può vedere traccia all’interno del database.
5
6. Sensori metereologici
Questo gruppo di sensori è composto da:
Piranometro, con angolo di tilt 10°;
Piranometro, con angolo di tilt 34°;
Piranometro, con angolo di tilt 0° e fascia ombreggiante;
Cella campione in silicio monocristallino
Cella campione in silicio policristallino
Termoigrometro;
Anemometro;
5 sensori di temperatura, ognuno associato ad un modulo fotovoltaico.
2.2. Dataloggers
Questi dispositivi, di fattura LSI LASTEM, permettono l’interfacciamento dei
sensori con il calcolatore.
Sono tre, di cui uno dedicato ai sensori metereologici e due al settore
fotovoltaico.
Questi dispositivi, oltre a effettuare il prelievo dei dati dai sensori, ne fanno
una prima elaborazione: per ogni minuto di registrazione e in base al sensore
di origine, forniscono il valore istantaneo, massimo, minimo e minimo.
2.3. Calcolatore
Il calcolatore fornito da LSI LASTEM è un portatile di marca HP®, modello
Compaq 6037s, con sistema operativo Microsoft® Windows Vista® e di cui
riporto i punti salienti della configurazione hardware:
Processore: Intel® Core™2 Duo T5670 @1.80GHz;
Memoria RAM: 2.00 GB;
Capacità HardDisk: 250 GB.
In tale portatile è stata installata, da parte del fornitore,la suite software
proprietariadi LSI LASTEM necessaria all’acquisizione ed al salvataggio dei
dati. Tale suite si compone dei programmi qui di seguito elencati.
3DOM
3DOM (Free Datalogger Oriented Manager) è il software contenente i driver
per i datalogger e per gli strumenti di rilevazione; consente la configurazione
dei sensori e la visualizzazione dei dati istantanei. Inoltre, permette la
configurazione dei servizi di stoccaggio dati, tra cui il database Gidas.
CommNetEG
CommNetEG è un programma che permette la ricezione dei dati
registratidagli strumenti LSI LASTEM, sia in modalità manuale che
automatica.
6
7. GidasViewer
GidasViewer è un programma per la visualizzazione e la rielaborazione dei
dati presenti nel database Gidas.
2.4. Obiettivi
Quello che si vuole realizzare è una infrastruttura in grado di fornire i dati
memorizzati secondo le seguenti strutture:
Tutti i dati metereologici ed elettrici memorizzati, organizzati in base
alla data e all’ora di campionamento;
I dati metereologici ed elettrici memorizzati, organizzati in base alla
data e all’ora di campionamento e di attuale utilizzo nelle linee di
ricerca attive;
I dati metereologici ed elettrici memorizzati, organizzati in base alla
data e all’ora di campionamento, di attuale utilizzo nelle linee di
ricerca attive e relativa analisi di stabilità;
I dati provenienti dall’anemometro;
Partendo poi dai punti precedenti, si vuole fornire solamente i dati relativi a un
determinato intervallo di tempo;
infine, si vuole fornire i dati in formato XML.
7
8. 3. PROGETTAZIONE
Per soddisfare le richieste di cui il punto2.4, è statoadottato un approccio di
tipo Bottom-Up, di cui lo schema seguenteriassume quanto implementato:
WEB Schema
«Table valued Function» «Table valued Function»
Stability_ToXML StabilityAlternative_ToXML
«Table valued Function» «Table valued Function»
Stability_WhitinDate StabilityAlternative_WhitinDate
-DateStart -DateStart
-DateStop -DateStop
«Table valued Function» «Table valued Function» «Table valued Function»
SortedData_ToXML Stability_GetAll StabilityAlternative_GetAll
«Function»
StabilityVoltage
-Voc
-W
-Vmp «Table valued Function»
-VoltageThreshold WindData_ToXML
«Table valued Function» «Function»
«Function» «Function»
SortedData_WhitinDate StabilityPower
StabilityCheck1 StabilityCheck2
-DateStart -Pn
-DateStop -PowerThreshold
«Table valued Function»
WindData_WhitinDate
«Function» -DateStart
StabilityRadiance -DateStop
-RadDIFFusaThreshold
View
SortedData
View View View View View
SortedAverageData SortedInstantaneousData SortedMinData SortedMaxData SortedWindData
View
vData_GetAll
CORE Schema
Table Table Table Table
RawValue ValueConfiguration InstrumentMeasure ElabTypeList
Figura 2 – Schema delle dipendenze
8
9. Legenda
«TipoFunzione»
<NomeFunzione> View Table
-<parametri>
<NomeVista> <NomeTabella>
Le tabelle RawValue, ValueConfiguration, InstrumentMeasure ed
ElabTypeList appartengono tutte allo schema Core, creato e gestito dal
programma 3DOM durante l’installazione.
Viene riportato in Figura 3lo schema logico delle suddette tabelle.
TABELLA CAMPI
RawValue ConfigurationID*, ElaborationDate,
ElaborationValue, ValidPercentage
ValueConfigu ValueConfigurationID,
ration InstrumentConfigurationID*,MeasureIndex*,Elab
orationBaseIndex,
ElaborationItemIndex*,ElaborationType*,
Position
InstrumentMe InstrumentConfigurationId,
asure MeasureIndex,MeasureName,MeasurePrecision,Mea
sureUnit, MeasureProperty, MeasureId
ElabTypeList IdElabType, ElabTypeString, ElabTypeToDo
Figura 3 - Schema logico dello schema Core
9
10. Lo schema Web
Raccoglie l’implementazione effettiva del codice e delle viste sviluppateper
questo progetto.
Per quanto possibile, si è cercato di mantenere la nomenclatura usata dai
progettisti della base di dati.
Le viste denominate con ‘Sorted’, la cui implementazione è riportata dal
paragrafo 4.2 al 4.6, hanno un duplice scopo: il primo, fondamentale, è quello
di ‘rimodellare’ la struttura della tabella Core.RawValue, in modo da ridurre la
chiave primaria al solo campo ElaborationDate, portando una tabella della
forma
ELAB.DATE MEASURENAME ELABO.TYPE ELAB.VALUE
<data-ora1> <misura-1> <elaborazione-1> <valore1>
<data-ora1> <misura-1> <elaborazione-2> <valore2>
<data-ora1> <misura-2> <elaborazione-1> <valore3>
<data-ora1> <misura-2> <elaborazione-2> <valore4>
<data-ora2> <misura-1> <elaborazione-1> <valore5>
… … … …
Nella forma
ELAB.DATE MISURA-1 MISURA-1 MISURA-2 …
ELAB-1 ELAB-2 ELAB-1
<data-ora1> <valore1> <valore2> <valore3> …
<data-ora2> <valore5> … … …
La seconda funzione di ogni vista è quella di operare un taglio verticale alla
tabella appena formatasi, evidenziando solo il sottoinsieme dei dati di
interesse.
Analisi di stabilità
Sui dati provenienti dai pannelli fotovoltaici viene svolta una suddivisione in
dati stabili e instabili.
In Figura 4 è possibile notare la differenza tra i due criteri utilizzati per tale
suddivisione. Entrambi si basano sull’analisi dei dati relativi alla potenza (P)
erogata dal modulo fotovoltaico e dall’irradianza diffusa (G), mentre il
criterio1 richiede una ulteriore analisi, basata sulla tensione (V).
10
11. P
V
G
AND
Criterio 1
P
G
AND
Criterio 2
Figura 4 – Criteri di stabilità
Al fine di semplificare l’esposizione, nel resto dell’analisi verrà esaminato il
criterio 1, riportando tra parentesi quadre [] le differenze con il criterio 2.
Undato si ritiene stabile se soddisfa contemporaneamente le tre
condizioniseguenti[solo le primedue]:
G) la radiazione diffusa dev’essere maggiore di ;
Viene implementato al punto (4.11).
P) la differenza di potenza tra il valore osservato e quello atteso deverisultare
inferiore a , ovvero se vale
Dove viene calcolata secondo l’equazione
Viene implementato al punto (4.10).
V) la differenza di tensione tra il valore osservato e quello atteso deverisultare
inferiore a , ovvero se vale
Dove viene calcolata secondo l’equazione
Viene implementato al punto (4.11).
11
12. Si ha quindi che l’analisi di stabilità dei dati provenienti da un singolo modulo
richiede l’immissione di 7 [i primi 3] parametri da parte dell’utente:
limite entro il quale il rapporto viene considerato stabile
limite entro il quale il rapporto viene considerato stabile
potenza nominale del modulo;
limite entro il quale il rapporto viene considerato stabile
tensione del punto di massima potenza a condizioni STC2
tensione dicircuito aperto a condizioni STC
Coefficiente di temperatura di
Figura 5 - Parametri dell'analisi di stabilità
Le soglie sono a discrezione dell’utente, in base alla rigidità richiesta
dall’analisi.
Gli altri valori sono invece reperibili nei datasheet dei moduli fotovoltaici.
Inoltre, per ogni coppia tensione-potenza sono richiesti anche
temperatura istantanea del modulo in esame
irraggiamento registrato dal piranometro avente lo stesso
angolo di tilt del modulo
2
Temperaturadi cella 25° C, irraggiamento 1000 W/m2, con distribuzione spettrale di
riferimento(massa d’aria AM 1,5).
12
13. Prestazioni
L’introduzione di un indice nel campo ElaborationDate della tabella
Core.RawValueha permesso l’abbattimento del tempo di elaborazione dovuto
alle operazioni delle viste vSortedMinData_GetAll, vSortedMaxData_GetAll,
vSortedAverageData_GetAll, vSortedInstantaneousData_GetAll,
vSortedWindData_GetAll, riducendo il costo dell’elaborazione a sole
operazioni di HashMatching.
Se da un lato questo indice conduce a un incremento di prestazioni, dall’altro
aumenta considerevolmente lo spazio occupato su disco;
per dare un idea dei numeri in gioco, si segnala che la tabella
Core.RawValueconsta, alla data di stesura di questo documento, di più di 50
milioni di record. Si rimanda al capitolo sulle considerazioni finali per un
ulteriore approfondimento.
13
14. 4. IMPLEMENTAZIONE
4.1. vData_GetAll
Costituisce le fondamenta dello schema sviluppato, ha il compito di estrarre i
valori delle misure memorizzate.
CREATE VIEW [Web].[vData_GetAll]
AS
SELECT RV.ElaborationDate, IM.MeasureName,
RV.ElaborationValue, ETL.ElabTypeString AS Elaboration
FROM Core.RawValue AS RV INNER JOIN
Core.ValueConfiguration AS VC ON
RV.ValueConfigurationID = VC.ValueConfigurationID
INNER JOIN Core.InstrumentMeasure AS IM ON
IM.InstrumentConfigurationId =
VC.InstrumentConfigurationID AND IM.MeasureIndex =
VC.MeasureIndex
INNER JOIN
Core.ElabTypeList AS ETL ON ETL.IdElabType =
VC.ElaborationType
14
15. 4.2. vSortedMinData_GetAll
Per ogni terna di valori massimi, medi e minimi campionati ogni minuto,
estrae i valori minimi.
CREATE VIEW [Web].[vSortedMinData_GetAll]
AS
SELECT ElaborationDate,
SUM(CASE MeasureName WHEN 'TENSAlim' THEN
ElaborationValueELSE NULL END) AS TENSAlim,
SUM(CASE MeasureName WHEN 'TempINTerna' THEN
ElaborationValueELSE NULL END) AS TempINTerna,
SUM(CASE MeasureName WHEN 'Tensione-1' THEN
ElaborationValueELSE NULL END) AS VinQPro34,
SUM(CASE MeasureName WHEN 'Corrente-1' THEN
ElaborationValueELSE NULL END) AS IinQPro34,
SUM(CASE MeasureName WHEN 'Tensione-2' THEN
laborationValueELSE NULL END) AS VoutQPro34,
SUM(CASE MeasureName WHEN 'Corrente-2' THEN
ElaborationValueELSE NULL END) AS IoutQPro34,
SUM(CASE MeasureName WHEN 'Tensione-3' THEN
ElaborationValueELSE NULL END) AS VinQPro10,
SUM(CASE MeasureName WHEN 'Corrente-3' THEN
ElaborationValueELSE NULL END) AS IinQPro10,
SUM(CASE MeasureName WHEN 'Tensione-4' THEN
ElaborationValueELSE NULL END) AS VinQSmart34,
SUM(CASE MeasureName WHEN 'Corrente-4' THEN
ElaborationValueELSE NULL END) AS IinQSmart34,
SUM(CASE MeasureName WHEN 'Tensione-5' THEN
ElaborationValueELSE NULL END) AS VoutQSmart34,
SUM(CASE MeasureName WHEN 'Corrente-5' THEN
ElaborationValueELSE NULL END) AS IoutQSmart34,
SUM(CASE MeasureName WHEN 'Tensione-6' THEN
ElaborationValueELSE NULL END) AS VinQSmart10,
SUM(CASE MeasureName WHEN 'Corrente-6' THEN
ElaborationValueELSE NULL END) AS IinQSmart10,
SUM(CASE MeasureName WHEN 'Tensione-7' THEN
ElaborationValueELSE NULL END) AS VinFS,
SUM(CASE MeasureName WHEN 'Corrente-7' THEN
ElaborationValueELSE NULL END) AS IinFS,
SUM(CASE MeasureName WHEN 'UmiditaRel' THEN
ElaborationValueELSE NULL END) AS UmiditaRel,
SUM(CASE MeasureName WHEN 'TempAria' THEN
ElaborationValueELSE NULL END) AS TempAria,
SUM(CASE MeasureName WHEN 'DIRvento' THEN
ElaborationValueELSE NULL END) AS DIRvento,
SUM(CASE MeasureName WHEN 'VELvento' THEN
ElaborationValueELSE NULL END) AS VELvento,
SUM(CASE MeasureName WHEN 'RadDIFFusa' THEN
ElaborationValueELSE NULL END) AS RadDIFFusa,
SUM(CASE MeasureName WHEN 'RadGLOBale' THEN
ElaborationValueELSE NULL END) AS RadGLOBale,
SUM(CASE MeasureName WHEN 'RadGL45' THEN
ElaborationValueELSE NULL END) AS RadGL45,
SUM(CASE MeasureName WHEN 'POLI'THEN
ElaborationValueELSE NULL END) AS POLI,
SUM(CASE MeasureName WHEN 'MONO' THEN
ElaborationValueELSE NULL END) AS MONO,
SUM(CASE MeasureName WHEN 'LivelloBATT' THEN
ElaborationValueELSE NULL END) AS LivelloBATT,
15
16. SUM(CASE MeasureName WHEN 'TeSUPerf1' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQPro34,
SUM(CASE MeasureName WHEN 'TeSUPerf2' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQSmart34,
SUM(CASE MeasureName WHEN 'TeSUPerf3' THEN
ElaborationValueELSE NULL END) AS TeSUPerfFS,
SUM(CASE MeasureName WHEN 'TeSUPerf4' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQPro10,
SUM(CASE MeasureName WHEN 'TeSUPerf5' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQSmart10
FROM Web.vData_GetAll
WHERE (Elaboration = 'Min')
GROUP BY ElaborationDate
16
17. 4.3. vSortedMaxData_GetAll
Per ogniterna di valorimassimi, medi e minimicampionatiogniminuto,
estraeivalorimassimi.
CREATE VIEW [Web].[vSortedMinData_GetAll]
AS
SELECT ElaborationDate,
SUM(CASE MeasureName WHEN 'TENSAlim' THEN
ElaborationValueELSE NULL END) AS TENSAlim,
SUM(CASE MeasureName WHEN 'TempINTerna' THEN
ElaborationValueELSE NULL END) AS TempINTerna,
SUM(CASE MeasureName WHEN 'Tensione-1' THEN
ElaborationValueELSE NULL END) AS VinQPro34,
SUM(CASE MeasureName WHEN 'Corrente-1' THEN
ElaborationValueELSE NULL END) AS IinQPro34,
SUM(CASE MeasureName WHEN 'Tensione-2' THEN
laborationValueELSE NULL END) AS VoutQPro34,
SUM(CASE MeasureName WHEN 'Corrente-2' THEN
ElaborationValueELSE NULL END) AS IoutQPro34,
SUM(CASE MeasureName WHEN 'Tensione-3' THEN
ElaborationValueELSE NULL END) AS VinQPro10,
SUM(CASE MeasureName WHEN 'Corrente-3' THEN
ElaborationValueELSE NULL END) AS IinQPro10,
SUM(CASE MeasureName WHEN 'Tensione-4' THEN
ElaborationValueELSE NULL END) AS VinQSmart34,
SUM(CASE MeasureName WHEN 'Corrente-4' THEN
ElaborationValueELSE NULL END) AS IinQSmart34,
SUM(CASE MeasureName WHEN 'Tensione-5' THEN
ElaborationValueELSE NULL END) AS VoutQSmart34,
SUM(CASE MeasureName WHEN 'Corrente-5' THEN
ElaborationValueELSE NULL END) AS IoutQSmart34,
SUM(CASE MeasureName WHEN 'Tensione-6' THEN
ElaborationValueELSE NULL END) AS VinQSmart10,
SUM(CASE MeasureName WHEN 'Corrente-6' THEN
ElaborationValueELSE NULL END) AS IinQSmart10,
SUM(CASE MeasureName WHEN 'Tensione-7' THEN
ElaborationValueELSE NULL END) AS VinFS,
SUM(CASE MeasureName WHEN 'Corrente-7' THEN
ElaborationValueELSE NULL END) AS IinFS,
SUM(CASE MeasureName WHEN 'UmiditaRel' THEN
ElaborationValueELSE NULL END) AS UmiditaRel,
SUM(CASE MeasureName WHEN 'TempAria' THEN
ElaborationValueELSE NULL END) AS TempAria,
SUM(CASE MeasureName WHEN 'DIRvento' THEN
ElaborationValueELSE NULL END) AS DIRvento,
SUM(CASE MeasureName WHEN 'VELvento' THEN
ElaborationValueELSE NULL END) AS VELvento,
SUM(CASE MeasureName WHEN 'RadDIFFusa' THEN
ElaborationValueELSE NULL END) AS RadDIFFusa,
SUM(CASE MeasureName WHEN 'RadGLOBale' THEN
ElaborationValueELSE NULL END) AS RadGLOBale,
SUM(CASE MeasureName WHEN 'RadGL45' THEN
ElaborationValueELSE NULL END) AS RadGL45,
SUM(CASE MeasureName WHEN 'POLI'THEN
ElaborationValueELSE NULL END) AS POLI,
SUM(CASE MeasureName WHEN 'MONO' THEN
ElaborationValueELSE NULL END) AS MONO,
SUM(CASE MeasureName WHEN 'LivelloBATT' THEN
ElaborationValueELSE NULL END) AS LivelloBATT,
17
18. SUM(CASE MeasureName WHEN 'TeSUPerf1' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQPro34,
SUM(CASE MeasureName WHEN 'TeSUPerf2' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQSmart34,
SUM(CASE MeasureName WHEN 'TeSUPerf3' THEN
ElaborationValueELSE NULL END) AS TeSUPerfFS,
SUM(CASE MeasureName WHEN 'TeSUPerf4' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQPro10,
SUM(CASE MeasureName WHEN 'TeSUPerf5' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQSmart10
FROM Web.vData_GetAll
WHERE (Elaboration = 'Max')
GROUP BY ElaborationDate
18
19. 4.4. vSortedInstantaneousData_GetAll
Per ogni set di campionatiogniminuto, estraeivaloriprivi di elaborazione o
istantanei.
CREATE VIEW [Web].[vSortedMinData_GetAll]
AS
SELECT ElaborationDate,
SUM(CASE MeasureName WHEN 'TENSAlim' THEN
ElaborationValueELSE NULL END) AS TENSAlim,
SUM(CASE MeasureName WHEN 'TempINTerna' THEN
ElaborationValueELSE NULL END) AS TempINTerna,
SUM(CASE MeasureName WHEN 'LivelloBATT' THEN
ElaborationValueELSE NULL END) AS LivelloBATT
FROM Web.vData_GetAll
WHERE (Elaboration = 'Inst')
GROUP BY ElaborationDate
19
20. 4.5. vSortedAverageData_GetAll
Per ogniterna di valorimassimi, medi e minimicampionatiogniminuto,
estraeivalorimedi.
CREATE VIEW [Web].[vSortedAverageData_GetAll]
AS
SELECT ElaborationDate,
SUM(CASE MeasureName WHEN 'TENSAlim' THEN
ElaborationValueELSE NULL END) AS TENSAlim,
SUM(CASE MeasureName WHEN 'TempINTerna' THEN
ElaborationValueELSE NULL END) AS TempINTerna,
SUM(CASE MeasureName WHEN 'Tensione-1' THEN
ElaborationValueELSE NULL END) AS VinQPro34,
SUM(CASE MeasureName WHEN 'Corrente-1' THEN
ElaborationValueELSE NULL END) AS IinQPro34,
SUM(CASE MeasureName WHEN 'Tensione-2' THEN
laborationValueELSE NULL END) AS VoutQPro34,
SUM(CASE MeasureName WHEN 'Corrente-2' THEN
ElaborationValueELSE NULL END) AS IoutQPro34,
SUM(CASE MeasureName WHEN 'Tensione-3' THEN
ElaborationValueELSE NULL END) AS VinQPro10,
SUM(CASE MeasureName WHEN 'Corrente-3' THEN
ElaborationValueELSE NULL END) AS IinQPro10,
SUM(CASE MeasureName WHEN 'Tensione-4' THEN
ElaborationValueELSE NULL END) AS VinQSmart34,
SUM(CASE MeasureName WHEN 'Corrente-4' THEN
ElaborationValueELSE NULL END) AS IinQSmart34,
SUM(CASE MeasureName WHEN 'Tensione-5' THEN
ElaborationValueELSE NULL END) AS VoutQSmart34,
SUM(CASE MeasureName WHEN 'Corrente-5' THEN
ElaborationValueELSE NULL END) AS IoutQSmart34,
SUM(CASE MeasureName WHEN 'Tensione-6' THEN
ElaborationValueELSE NULL END) AS VinQSmart10,
SUM(CASE MeasureName WHEN 'Corrente-6' THEN
ElaborationValueELSE NULL END) AS IinQSmart10,
SUM(CASE MeasureName WHEN 'Tensione-7' THEN
ElaborationValueELSE NULL END) AS VinFS,
SUM(CASE MeasureName WHEN 'Corrente-7' THEN
ElaborationValueELSE NULL END) AS IinFS,
SUM(CASE MeasureName WHEN 'UmiditaRel' THEN
ElaborationValueELSE NULL END) AS UmiditaRel,
SUM(CASE MeasureName WHEN 'TempAria' THEN
ElaborationValueELSE NULL END) AS TempAria,
SUM(CASE MeasureName WHEN 'DIRvento' THEN
ElaborationValueELSE NULL END) AS DIRvento,
SUM(CASE MeasureName WHEN 'VELvento' THEN
ElaborationValueELSE NULL END) AS VELvento,
SUM(CASE MeasureName WHEN 'RadDIFFusa' THEN
ElaborationValueELSE NULL END) AS RadDIFFusa,
SUM(CASE MeasureName WHEN 'RadGLOBale' THEN
ElaborationValueELSE NULL END) AS RadGLOBale,
SUM(CASE MeasureName WHEN 'RadGL45' THEN
ElaborationValueELSE NULL END) AS RadGL45,
SUM(CASE MeasureName WHEN 'POLI'THEN
ElaborationValueELSE NULL END) AS POLI,
SUM(CASE MeasureName WHEN 'MONO' THEN
ElaborationValueELSE NULL END) AS MONO,
SUM(CASE MeasureName WHEN 'LivelloBATT' THEN
ElaborationValueELSE NULL END) AS LivelloBATT,
20
21. SUM(CASE MeasureName WHEN 'TeSUPerf1' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQPro34,
SUM(CASE MeasureName WHEN 'TeSUPerf2' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQSmart34,
SUM(CASE MeasureName WHEN 'TeSUPerf3' THEN
ElaborationValueELSE NULL END) AS TeSUPerfFS,
SUM(CASE MeasureName WHEN 'TeSUPerf4' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQPro10,
SUM(CASE MeasureName WHEN 'TeSUPerf5' THEN
ElaborationValueELSE NULL END) AS TeSUPerfQSmart10
FROM Web.vData_GetAll
WHERE (Elaboration = 'Ave')
GROUP BY ElaborationDate
21
22. 4.6. vSortedWindData_GetAll
Per ogni set di valoricampionatiogniminuto, estraeivaloriprovenienti dal solo
anemometro.
CREATE VIEW [Web].[vSortedWindData_GetAll]
AS
SELECT TOP (100) PERCENT ElaborationDate, SUM(CASE
Elaboration WHEN 'RisDir' THEN ElaborationValueELSE
NULL END) AS [DIRVentoRisDir],
SUM(CASE Elaboration WHEN 'PrevDir' THEN
ElaborationValueELSE NULL END) AS [DIRVentoPrevDir],
SUM(CASE Elaboration WHEN 'RisVel' THEN
ElaborationValueELSE NULL END) AS [DIRVentoRisVel],
SUM(CASE Elaboration WHEN 'StdDevDir' THEN
ElaborationValueELSE NULL END) AS [DIRVentoStdDevDir],
SUM(CASE Elaboration WHEN 'CalmPerc' THEN
ElaborationValueELSE NULL END) AS [DIRVentoCalmPerc],
SUM(CASE Elaboration WHEN 'Min' THEN
ElaborationValueELSE NULL END) AS [VELVento Min],
SUM(CASE Elaboration WHEN 'Ave' THEN
ElaborationValueELSE NULL END) AS [VELVento Ave],
SUM(CASE Elaboration WHEN 'Max' THEN
ElaborationValueELSE NULL END) AS [VELVento Max]
FROMWeb.vData_GetAll
WHERE (MeasureName = 'DIRVento') OR
(MeasureName = 'VELVento')
GROUP BY ElaborationDate
ORDER BY ElaborationDate
22
23. 4.7. vSortedData_GetAll
Affianca orizzontalmente i valori medi e istantanei, provenienti dalle viste4.4
e 4.5.
CREATE VIEW [Web].[vSortedData_GetAll]
AS
SELECT AVE.ElaborationDate, AVE.VinQPro34,
AVE.IinQPro34, AVE.VoutQPro34, AVE.IoutQPro34,
AVE.VinQPro10, AVE.IinQPro10, AVE.VinQSmart34,
AVE.IinQSmart34, AVE.VoutQSmart34, AVE.IoutQSmart34,
AVE.VinQSmart10, AVE.IinQSmart10, AVE.VinFS, AVE.IinFS,
AVE.UmiditaRel, AVE.TempAria,
AVE.RadDIFFusa,AVE.RadGLOBale, AVE.RadGL45, AVE.POLI,
AVE.MONO, AVE.TeSUPerfQPro34, AVE.TeSUPerfQSmart34,
AVE.TeSUPerfFS, AVE.TeSUPerfQPro10,
AVE.TeSUPerfQSmart10, INST.TENSAlim, INST.TempINTerna,
INST.LivelloBATT
FROM Web.vSortedAverageData_GetAll AS AVE INNER JOIN
Web.vSortedInstantaneousData_GetAll AS INST ON
INST.ElaborationDate = AVE.ElaborationDate
23
24. 4.8. fSortedData_WithinDate
Ottiene la tabella con i dati medi e istantanei appartenenti ad un certo
intervallo di tempo.
CREATE FUNCTION [Web].[fSortedData_WithinDate]
(
-- Add the parameters for the function here
@DateStartdatetime,
@DateStopdatetime
)
RETURNS TABLE
AS
RETURN
(
-- Add the SELECT statement with parameter
references here
SELECT *
FROM Web.vSortedData_GetAll
WHERE ElaborationDate BETWEEN @DateStart AND
@DateStop
)
24
25. 4.9. fStabilityVoltage
Criterio di stabilità basato sulla tensione.
Restituisce ‘0’ se instabile, ‘1’ se stabile.
CREATE FUNCTION [Web].[fStabilityVoltage]
(
-- Add the parameters for the function here
@Vmp real, --Voltage at maximum power
@W real, --Temperature Coefficient of Voc
@Voc real, --Open Circuit Voltage
@Threshold real,
@Vin real, --Voltage analyzed
@Temperature real --Temperature of the module
)
RETURNS bit
AS
BEGIN
-- Declare the return variable here
DECLARE @Result bit
DECLARE @PreResult real
DECLARE @Vattesa real
-- Add the T-SQL statements to compute the return
value here
SET @Vattesa=@Vmp+(@W*@Vin)/100*(@Temperature-25)
-- Avoid the division by zero
IF (@Vattesa=0)
Return 0
SET @PreResult=ABS((@Vin-@Vattesa)/@Vattesa)
-- Return the result of the function
IF (@PreResult<@Threshold)
set @result=1
else
set @result=0
RETURN @Result
END
25
26. 4.10. fStabilityPower
Criterio di stabilità basato sulla potenza.
Restituisce ‘0’ se instabile, ‘1’ se stabile.
CREATE FUNCTION [Web].[fStabilityPower_QPro34]
(
-- Add the parameters for the function here
@Pn real, --Nominal Power of the module
@Threshold real,
@Irraggiamento real, --Irradiance of the module
@Pmisurata real --Measured power
)
RETURNS bit
AS
BEGIN
-- Declare the return variable here
DECLARE @Result bit
DECLARE @Pattesa real
SET @Pattesa=@Pn*@Irraggiamento/1000
--Avoid the division by zero
IF(@Pattesa=0)
RETURN 0
-- Return the result of the function
IF (ABS((@Pmisurata-@Pattesa)/@Pattesa)<@Threshold)
set @result=1
ELSE
SET @Result=0
RETURN @Result
END
26
27. 4.11. fStabilityIrradiance
Criterio di stabilità basato sull’irradianza diffusa.
Restituisce ‘0’ se instabile, ‘1’ se stabile.
CREATE FUNCTION [Web].[fStabilityIrradiance]
(
-- Add the parameters for the function here
@Threshold real,
@Value real
)
RETURNS bit
AS
BEGIN
-- Declare the return variable here
DECLARE @Result bit
IF (@Value>@Threshold)
set @result=1
else
set @result=0
RETURN @Result
-- Return the result of the function
END
27
28. 4.12. fStabilityCheck1
Implementa il criterio1 per l’analisi di stabilità.
CREATE FUNCTION [Web].[fStabilityCheck1]
(
--Add the parameters for the function here
--Parameters that will feed the stability functions
@Vmp real,
@W real,
@Voc real,
@Pn real,
@RadianceThreshold real,
@PowerThreshold real,
@VoltageThreshold real,
@DiffIrradiance real,
@AssocIrradiance real,
@Vin real,
@Iin real,
@Temperature real
)
RETURNS bit
AS
BEGIN
-- Declare the return variable here
DECLARE @Result bit=Web.fStabilityPower_QPro34(@Pn,
@PowerThreshold, @AssocIrradiance ,@Iin*@Vin)
SET @Result = @result &
Web.fStabilityDiffIrradiance(@RadianceThreshold,
@DiffIrradiance)
SET @Result = @result
&Web.fStabilityVoltage_QPro34(@Vmp, @W, @Voc,
@VoltageThreshold, @Vin, @Temperature)
-- Return the result of the function
RETURN @Result
END
28
29. 4.13. fStabilityCheck2
Implementa il criterio1 per l’analisi di stabilità.
CREATE FUNCTION [Web].[fStabilityCheck2]
(
-- Add the parameters for the function here
@RadianceThreshold decimal,
@Pn decimal,
@PowerThreshold decimal,
@DiffIrradiance decimal,
@AssocIrradiance decimal,
@Pin decimal
)
RETURNS bit
AS
BEGIN
-- Declare the return variable here
DECLARE @Result bit
SET @Result =
Web.fStabilityDiffIrradiance(@RadianceThreshold,
@DiffIrradiance) & Web.fStabilityPower_QPro34(@Pn,
@PowerThreshold, @AssocIrradiance ,@Pin)
-- Return the result of the function
RETURN @Result
END
29
30. 4.14. fStability_GetAll
Ottiene la tabella con i datimedi e istantanei e la relativa analisi di stabilità,
effettuata con il criterio 1.
CREATE FUNCTION [Web].[fStability_GetAll]
(
--QSmart34
@VmpQSmart34 real,
@WQSmart34 real,
@VocQSmart34 real,
@PnQSmart34 real,
--QSmart10
@VmpQSmart10 real,
@WQSmart10 real,
@VocQSmart10 real,
@PnQSmart10 real,
--QPro34
@VmpQPro34 real,
@WQPro34 real,
@VocQPro34 real,
@PnQPro34 real,
--QPro10
@VmpQPro10 real,
@WQPro10 real,
@VocQPro10 real,
@PnQPro10 real,
--FS
@VmpFS real,
@WFS real,
@VocFS real,
@PnFS real,
--common
@RadianceThreshold real,
@PowerThreshold real,
@VoltageThreshold real
)
RETURNS TABLE
AS
RETURN
(
-- Insert statements for procedure here
SELECT ElaborationDate, VinQPro34, IinQPro34,
TeSUPerfQPro34,Web.fStabilityCheck1(@VmpQPro34, @WQPro34,
@VocQPro34, @PnQPro34, @RadianceThreshold,
@PowerThreshold, @VoltageThreshold, RadDIFFusa, RadGL45
,VinQPro34, IinQPro34, TeSUPerfQPro34) AS
QPro34Stability, VoutQPro34, IoutQPro34, VinQPro10,
IinQPro10, TeSUPerfQPro10,
Web.fStabilityCheck1(@VmpQPro10, @WQPro10, @VocQPro10,
@PnQPro10, @RadianceThreshold, @PowerThreshold,
@VoltageThreshold, RadDIFFusa, RadGLOBale ,VinQPro10,
IinQPro10, TeSUPerfQPro10) AS
QPro10Stability,VinQSmart34, IinQSmart34,
TeSUPerfQSmart34, Web.fStabilityCheck1(@VmpQSmart34,
@WQSmart34, @VocQSmart34, @PnQSmart34,
@RadianceThreshold, @PowerThreshold, @VoltageThreshold,
RadDIFFusa, RadGL45 ,VinQSmart34, IinQSmart34,
TeSUPerfQSmart34) AS QSmart34Stability, VoutQSmart34,
IoutQSmart34, VinQSmart10, IinQSmart10, TeSUPerfQSmart10,
30
32. 4.15. fStabilityAlternative_GetAll
Ottiene la tabella con i dati medi e istantanei e la relativa analisi di stabilità,
effettuata con il criterio 2.
CREATE FUNCTION [Web].[fStabilityAlternative_GetAll]
(
--QSmart34
@PnQSmart34 real,
--QSmart10
@PnQSmart10 real,
--QPro34
@PnQPro34 real,
--QPro10
@PnQPro10 real,
--FS
@PnFS real,
--common
@RadianceThreshold real,
@PowerThreshold real
)
RETURNS TABLE
AS
RETURN
(
-- Insert statements for procedure here
SELECT ElaborationDate, VinQPro34, IinQPro34,
Web.fStabilityCheck2(@PnQPro34,VinQPro34*IinQPro34,@Radia
nceThreshold, @PowerThreshold, RadDIFFusa, RadGL45) AS
QPro34Stability, VoutQPro34, IoutQPro34, VinQPro10,
IinQPro10,Web.fStabilityCheck2(@PnQPro10,VinQPro10*IinQPr
o10, @RadianceThreshold, @PowerThreshold, RadDIFFusa,
RadGLOBale) AS QPro10Stability, VinQSmart34, IinQSmart34,
Web.fStabilityCheck2(@PnQSmart34,
VinQSmart34*IinQSmart34, @RadianceThreshold,
@PowerThreshold, RadDIFFusa, RadGL45) AS
QSmart34Stability, VoutQSmart34, IoutQSmart34,
VinQSmart10, IinQSmart10,
Web.fStabilityCheck2(@PnQSmart10,
VinQSmart10*IinQSmart10, @RadianceThreshold,
@PowerThreshold, RadDIFFusa, RadGLOBale) AS
QSmart10Stability, VinFS, IinFS,
Web.fStabilityCheck2(@PnFS, VinFS*IinFS,
@RadianceThreshold, @PowerThreshold, RadDIFFusa, RadGL45)
AS FSStability, UmiditaRel, TempAria, RadDIFFusa,
RadGLOBale, RadGL45, POLI, MONO, TeSUPerfQPro34,
TeSUPerfQSmart34, TeSUPerfFS, TeSUPerfQPro10,
TeSUPerfQSmart10
FROM Web.vSortedAverageData_GetAll
)
32
33. 4.16. fStability_WithinDate
Ottiene la tabella con i dati medi e istantanei appartenenti ad un certo
intervallo temporaneo e la relativa analisi di stabilità,
effettuata con il criterio 1.
CREATE FUNCTION [Web].[fStability_WithinDate]
(
--QSmart34
@VmpQSmart34 real,
@WQSmart34 real,
@VocQSmart34 real,
@PnQSmart34 real,
--QSmart10
@VmpQSmart10 real,
@WQSmart10 real,
@VocQSmart10 real,
@PnQSmart10 real,
--QPro34
@VmpQPro34 real,
@WQPro34 real,
@VocQPro34 real,
@PnQPro34 real,
--QPro10
@VmpQPro10 real,
@WQPro10 real,
@VocQPro10 real,
@PnQPro10 real,
--FS
@VmpFS real,
@WFS real,
@VocFS real,
@PnFS real,
--common
@RadianceThreshold real,
@PowerThreshold real,
@VoltageThreshold real,
@DateStart datetime,
@DateStop datetime
)
RETURNS TABLE
AS
RETURN
(
-- Insert statements for procedure here
SELECT *
FROM Web.fStability_GetAll(@VmpQSmart34,
@WQSmart34, @VocQSmart34, @PnQSmart34, @VmpQSmart10,
@WQSmart10, @VocQSmart10, @PnQSmart10, @VmpQPro34,
@WQPro34, @VocQPro34, @PnQPro34, @VmpQPro10, @WQPro10,
@VocQPro10, @PnQPro10, @VmpFS, @WFS, @VocFS, @PnFS,
@RadianceThreshold, @PowerThreshold,
@VoltageThreshold)
WHERE ElaborationDate BETWEEN @DateStart AND
@DateStop
)
33
34. 4.17. fStabilityAlternative_WithinDate
Ottiene la tabella con i dati medi e istantanei appartenenti ad un certo
intervallo temporaneo e la relativa analisi di stabilità,
effettuata con il criterio 2.
CREATE FUNCTION [Web].[fStabilityAlternative_WhitinDate]
(
--QSmart34
@PnQSmart34 real,
--QSmart10
@PnQSmart10 real,
--QPro34
@PnQPro34 real,
--QPro10
@PnQPro10 real,
--FS
@PnFS real,
--common
@RadianceThreshold real,
@PowerThreshold real,
@DateStart datetime,
@DateStop datetime
)
RETURNS TABLE
AS
RETURN
(
-- Insert statements for procedure here
SELECT *
FROM Web.fStabilityAlternative_GetAll(@PnQSmart34,
@PnQSmart10, @PnQPro34, @PnQPro34, @PnFS,
@RadianceThreshold, @PowerThreshold)
WHERE ElaborationDate BETWEEN @DateStart AND
@DateStop
)
34
35. 4.18. fWind_WithinDate
Ottiene la tabella con i dati provenienti dall’anemometro appertenenti
all’intervallo temporale specificato.
CREATE FUNCTION [Web].[fWind_WithinDate]
(
-- Add the parameters for the function here
@DateStart datetime,
@DateStop datetime
)
RETURNS TABLE
AS
RETURN
(
-- Add the SELECT statement with parameter
references here
SELECT *
FROM Web.vSortedWindData_GetAll
WHERE ElaborationDate BETWEEN @DateStart AND
@DateStop
)
35
36. 4.19. fSortedData_ToXML
Espone in formato XML i dati provenienti dall’anemometro.
CREATE FUNCTION [Web].[fSortedData_ToXML]
(
-- Add the parameters for the function here
@DateStartdatetime,
@DateStopdatetime
)
RETURNS XML
AS
BEGIN
-- Declare the return variable here
RETURN(
SELECT *
FROM
Web.fSortedData_WithinDate(@DateStart,@DateStop)
FOR XML PATH ('Data')
)
END
36
37. 4.20. fStability_ToXML
Espone in formato XML i dati provenienti dalla funzione
fStability_WithinData.
CREATE FUNCTION [Web].[fStability_toXML]
(
--QSmart34
@VmpQSmart34 real,
@WQSmart34 real,
@VocQSmart34 real,
@PnQSmart34 real,
--QSmart10
@VmpQSmart10 real,
@WQSmart10 real,
@VocQSmart10 real,
@PnQSmart10 real,
--QPro34
@VmpQPro34 real,
@WQPro34 real,
@VocQPro34 real,
@PnQPro34 real,
--QPro10
@VmpQPro10 real,
@WQPro10 real,
@VocQPro10 real,
@PnQPro10 real,
--FS
@VmpFS real,
@WFS real,
@VocFS real,
@PnFS real,
--common
@RadianceThreshold real,
@PowerThreshold real,
@VoltageThreshold real,
@DateStart datetime,
@DateStop datetime
)
RETURNS XML
AS
BEGIN
-- Insert statements for procedure here
RETURN (
SELECT *
FROM Web.fStability_WithinDate(@VmpQSmart34,
@WQSmart34, @VocQSmart34, @PnQSmart34,
@VmpQSmart10, @WQSmart10, @VocQSmart10,
@PnQSmart10, @VmpQPro34, @WQPro34, @VocQPro34,
@PnQPro34, @VmpQPro10, @WQPro10, @VocQPro10,
@PnQPro10, @VmpFS, @WFS, @VocFS, @PnFS,
@RadianceThreshold, @PowerThreshold,
@VoltageThreshold, @DateStart, @DateStop)
FOR XML PATH('Data')
)
END
37
38. 4.21. fStabilityAlternative_ToXML
Espone in formato XML i dati provenienti dalla funzione
fStabilityAlternative_WithinData.
CREATE FUNCTION [Web].[fStabilityAlternative_toXML]
(
--QSmart34
@PnQSmart34 real,
--QSmart10
@PnQSmart10 real,
--QPro34
@PnQPro34 real,
--QPro10
@PnQPro10 real,
--FS
@PnFS real,
--common
@RadianceThreshold real,
@PowerThreshold real,
@DateStart datetime,
@DateStop datetime
)
RETURNS XML
AS
BEGIN
-- Insert statements for procedure here
RETURN (
SELECT *
FROM
Web.fStabilityAlternative_WithinDate(@PnQSmart34,
@PnQSmart10, @PnQPro34, @PnQPro10, @PnFS,
@RadianceThreshold, @PowerThreshold, @DateStart,
@DateStop)
FOR XML PATH('Data')
)
END
38
39. 4.22. fWind_ToXML
Espone in formato XML i dati provenienti dall’anemometro.
CREATE FUNCTION [Web].[fWind_ToXML]
(
-- Add the parameters for the function here
@DateStart datetime,
@DateStop datetime
)
RETURNS XML
AS
BEGIN
-- Declare the return variable here
RETURN(
SELECT *
FROM
Web.fWind_WithinDate(@DateStart,@DateStop)
FOR XML PATH ('Data'), ROOT ('Wind')
)
END
39
40. 5. CONSIDERAZIONI FINALI
Con questo progetto si è voluto aumentare le potenzialità del sistema,
prevedendo l’interrogazione da remoto. A tal fine è stato aggiunto uno schema
esterno alla base di dati, in grado di fornire i dati nella struttura richiesta,
corredati della relativa analisi di stabilità.
Purtroppo, come accennato nell’introduzione, lo stato attuale delle cose
prevede che la base di dati risieda in un portatile di risorse assai limitate.
Ricordiamo che tale calcolatore venne fornito dalla stessa LSI LASTEMe che
la stessa, per non aumentare i costi, installò il motore SQL SERVER 2005,
con licenza Express.
Questa scelta portò nel mese di Gennaio 2013 a un blocco del sistema di
stoccaggio, in quanto fu raggiunto il limite di 4 GB della dimensione fisica del
database, imposto da tale licenza3.
Sollecitato il problema al fornitore, la soluzione temporanea è stata quella di
provvedere all’aggiornamento del motore alla versione 2008 R2, anch’essa
con licenza Express, ma con un limite di 10 GB4,di cui quasi 7 occupati alla
data della stesura di questo documento5.
Fortunatamente, la suite proprietaria prevede la possibilità di far risiedere la
base di dati in un servizio remoto. Questa capacità, unita agli strumenti di
migrazione dei dati di SQL SERVER Management Studio, rende possibile il
trasferimento del database a un calcolatore adeguato, possibilmente provvisto
di meccanismi di replicazione e backup, lasciando inalterato il sistema ‘fisico’
e aumentando la tolleranza ai guasti dello stesso.
Con questa soluzione, infatti, eventuali problemi del portatile si tradurranno
nella perdita dei dati acquisiti nel periodo di inoperatività del portatile, ma lo
storico dei dati accumulati negli anni risulterà indenne.
3
http://msdn.microsoft.com/en-us/library/ms345154(v=sql.90).aspx
4
http://msdn.microsoft.com/en-us/library/cc645993(v=sql.105).aspx
5
Si veda il capitolo sulle prestazioni per la spiegazione di un incremento così rapido.
40