Indice |
Abstract
Dimensionare una linea aerea trifase con Fortran 90/95.
Introduzione
Questo codice Fortran 90/95 permette di dimensionare una linea aerea, i cui conduttori sono disposti ai vertici di un triangolo equilatero di lato a, alimentata ad un estremo con tensione V e lungo la quale si trovano n carichi concentrati.
Un tipico esercizio di impianti in bassa e media tensione:
Dimensionare la linea aerea trifase di figura alimentata alla tensione di 20 kV a 50 Hz. La linea dovrà essere realizzata in corda di rame, con conduttori disposti a triangolo, a distanza a= 1 m e dovrà presentare una caduta di tensione massima non superiore a ΔVx%= 3%. Calcolare, inoltre, le perdite del sistema.
Dati:
- V= 20 kV; f = 50 Hz; ΔVx%= 3%; L1= 5 km; L2= 2 km; L3= 5 km; a= 1 m;
- P1= 600 kW; cosφ1= 0,7; P2= 300 kW; cosφ1= 0,8; P3= 400 kW; cosφ1= 0,75
Subito dopo aver letto l’articolo di RenzoDF, Simulazione reti in Scilab, dissi:
- Pure io!
Con il commento di admin:
- Credo proprio che bisogna insistere nel proporre articoli come questo, che mostrano come usare gli strumenti software per risolvere problemi elettrotecnici e, più in generale tecnici. Chi ha usato il regolo calcolatore, l'unico strumento di calcolo disponibile per lo studente di qualche decennio fa, non può che entusiasmarsi di questa possibilità, che permette di concentrarsi sull'impostazione corretta del problema delegando il lavoro lungo faticoso e frustrante dei calcoli ad una macchina sempre più potente.
Continuai:
- Beh! Non ho altra scelta.
L’articolo di g.schgor, Il computer e la matematica, mi ha indirizzato verso il Fortran 90/95.
Sulla scrivania avevo il testo dell’esercizio di impianti in bassa e media tensione...
Programmi sequenziali e programmi con strutture di controllo
Un codice, o programma, sequenziale legge i dati di input da tastiera o file, li elabora, fornisce i risultati finali, visualizzandoli sul monitor o riportandoli in un file, e termina la propria esecuzione. Non è possibile ripetere più volte nessuna sezione di codice o far eseguire sezioni particolari di codice in funzione dei dati di input. Altri codici presentano strutture di controllo: istruzioni di diramazione e istruzioni di loop. Queste istruzioni permettono di eseguire più volte una determinata sezione di codice o saltare totalmente gruppi di istruzioni al verificarsi di una certa condizione. Il codice da me scritto è sostanzialmente un codice di tipo sequenziale, molto semplice, anche se presenta istruzioni di loop. Ho visto dei codici Fortran con migliaia di righe di istruzioni, più di 100 pagine in formato A4…il mio è semplicemente ridicolo!
Input/Output
Il codice Fortran 90/95 dovrà essere salvato in una cartella che conterrà due file di input e un file di output.
File di input.
Nel file Tabella.txt è stata riportata parte della tabella Conduttori unificati di rame crudo:
- Prima colonna: valori delle sezioni commerciali dei suddetti conduttori [mmq];
- Seconda colonna: diametro del conduttore [mm];
- Terza colonna: resistenza chilometrica del conduttore [ohm/km].
10 4.05 0.809 12.5 4.50 1.465 16 4.50 1.117 25 6.40 0.7199 35 7.55 0.5192 40 8.10 0.4522 50 9 0.3788 70 10.70 0.2678 80 11.50 0.2319 100 13.00 0.1814 125 14.70 0.1435
Il file Input.txt conterrà i dati del problema, riportati in questo ordine:
- Prima riga: numero di carichi concentrati, tensione di alimentazione in [kV], c.d.t. max in percentuale, resistività del rame in [ohm*mmq/metro] e il lato del triangolo equilatero in [m];
- Seconda riga: Lunghezza del primo tratto in [m], Potenza attiva del primo carico concentrato in [kW] e fattore di potenza del carico;
- Terza riga: Lunghezza del secondo tratto in [m], Potenza attiva del secondo carico concentrato in [kW] e fattore di potenza del carico;
- Quarta riga:---------------------------------------------------------
- n+1-esima riga: Lunghezza n-esimo tratto in [m], Potenza attiva n-esimo carico concentrato in [kW] e fattore di potenza del carico.
3 20 3 0.0178 1 5 600 0.7 2 300 0.8 5 400 0.75
File di output.
Nel file Output.txt il programma riporterà i risultati finali della elaborazione:
- Sezione commerciale [mmq];
- Resistenza chilometrica [ohm/km];
- Perdite totali sulla linea dPt [W].
Sezione commerciale = 25. [mmq] Resistenza chilometrica r = .7199 [ohm/km] Perdite totali sulla linea dPt = 33473.61 [W]
Ovviamente, modificando in modo insignificante il codice, sarà possibile visualizzare anche i diversi risultati parziali.
Il codice
!**************************************************** !* * !* Programmatore: EdmondDantes * !* * !* Copyright: Nessuno * !* * !* Data: 22 agosto 2009 * !* * !**************************************************** !* Descrizione: * !* * !* Questo codice Fortran 90/95 calcola la sezione di una * !* linea aerea trifase alimentata ad un estremo con tensione * !* nota, realizzata in corda di rame, essendo nota la massima * !* caduta di tensione. * !* Per ipotesi, i conduttori sono disposti ai vertici di un triangolo * !* equilatero di lato a. * !* Calcola, inoltre, le perdite del sistema. * !***************************************************** PROGRAM Linea_aerea ! Dizionario dei simboli usati nel codice seguente: ! I_f(i) : Componente in fase delle correnti assorbite; ! I_q(i) : Componente in quadratura delle correnti assorbite; IMPLICIT NONE REAL*8 :: pi, mu, V, dV, ro, a, L(15), P(15), fdp(15), & I_f(15), I_q(15), tgfi(15), F, Q, Lt(15), & S_min, Tab(20,3), r, d, xl, Mf(15), Mq(15), & Itf(15), Itq(15), It(15), dP(15), dPt, dVt, b, c INTEGER*4 :: k, n, j REAL*8, PARAMETER :: x=0.4, fr=50 OPEN(UNIT=1,FILE='Input.txt',STATUS='OLD',ACTION='READ') OPEN(UNIT=2,FILE='Output.txt',STATUS='REPLACE',ACTION='WRITE') OPEN(UNIT=3,FILE='Tabella.txt',STATUS='OLD',ACTION='READ', & FORM='FORMATTED' ) ! Definisco il valore del pi_greco e della ! permeabilità magnetica dell'aria pi=4*ATAN(1.) mu=4*pi*0.0001 ! Leggo il numero di carichi concentrati, la tensione di ! alimentazione in kV, la c.d.t.% max, la resistività ro ! del rame e il lato l del triangolo READ(1,*) n, V, dV, ro, a ! Leggo: vettore lunghezze tratte, vettore potenze assorbite, vettore fdp DO k=1,n READ(1,*) L(k), P(k), fdp(k) END DO ! Calcolo le componenti in fase e in quadratura delle correnti: DO k=1,n I_f(k)=P(k)/(SQRT(3.)*V) tgfi(k)=TAN(ACOS(fdp(k))) I_q(k)=I_f(k)*tgfi(k) END DO ! Calcolo la massima caduta di tensione dV=(dV*V*10**3.)/100 ! Procediamo con calcoli i diversi calcoli intermedi c=0 F=0 Q=0 DO k=1,n Lt(k)=c+L(k) c=Lt(k) F=F+I_f(k)*Lt(k)*1000 Q=Q+I_q(k)*Lt(k) END DO F=SQRT(3.)*ro*F Q=SQRT(3.)*x*Q ! Calcolo la minima sezione ammissibile: S_min=F/(dv-Q) ! Leggo la tabella dei conduttori unificati in corda di rame crudo DO k=1,11 READ(3,*) (Tab(k,j), j=1,3) END DO ! Leggo la sezione commerciale immediatamente superiore alla S_min k=1 j=k+1 b=S_min IF (S_min<10.) THEN S_min=Tab(1,1) r=Tab(1,3) d=Tab(2,2) ELSE DO IF((b>Tab(k,1)).AND.(b<Tab(j,1))) EXIT k=k+1 j=j+1 END DO ! Leggo la resistenza chilometrica e il diametro del conduttore scelto S_min=Tab(j,1) r=Tab(j,3) d=Tab(j,2) END IF ! Calcolo la reattanza chilometrica effettiva del sistema xl=(fr*mu)*(LOG((a**(1./3))/((0.78*d*0.001)/2))) ! Calcolo la caduta di tensione totale sulla linea ! Momenti amperometrici b=0 c=0 DO k=1,n Mf(k)=I_f(k)*Lt(k) Mq(k)=I_q(k)*Lt(k) b=b+Mf(k) c=c+Mq(k) END DO dVt=SQRT(3.)*(r*b+xl*c) ! Correnti totali nelle diverse tratte b=0 c=0 DO k=n,1,-1 Itf(k)=b+I_f(k) Itq(k)=c+I_q(k) b=Itf(k) c=Itq(k) It(k)=SQRT((Itf(k))**2+(Itq(k))**2) END DO ! Perdite nelle diverse tratte c=0 DO k=1,n dP(k)=3*r*L(k)*(It(k))**2 dPt=c+dP(k) c=dPt END DO WRITE(2,100) S_min, r, dPt 100 FORMAT(1X,'Sezione commerciale =',F4.0,2X,'[mmq]',/, & 'Resistenza chilometrica r =',F6.4,2X,'[ohm/km]',/, & 'Perdite totali sulla linea dPt =',F10.2,2X,'[W]') CLOSE(1) CLOSE(2) CLOSE(3) STOP END PROGRAM Linea_aerea
Conclusioni
Il codice è molto semplice, utile per controllare i risultati di un esercizio svolto manualmente sotto le stesse ipotesi. E’ stato provato con due diversi set di dati, ottenendo in entrambi i casi risultati corretti.
Se avrò tempo cercherò di migliorare il codice, permettendo all'utente di sceglire la tipologia di sistema: linea alimentata ad un estremo con carichi concentrati lungo il percorso, linea alimentata ad un estremo con carichi distribuiti, linea alimentata ai due estremi con tensioni uguali o differenti, linea monofase o trifase e così via. Sono tutti esempi tipici del corso impianti elettrici in bassa e media tensione. Un codice così pensato richiederà molte righe di istruzioni: non è pensabile scriverlo come unico programma principale. E' buona norma inserire delle subroutine che eseguano blocchi di operazioni presenti in più parti del codice e a cui si accede mediante una CALL.
Spero che il mio contributo possa essere utile a qualcuno.