REM file simboost.bas
REM E. Matagne   20/07/2007
'
' Ce programme est ‚crit en qbasic. Il est compatible (sauf pour
' les accents dans les commentaires) avec le freebasic.
' L'interface de d‚veloppement de ce dernier (joint au compilateur)
' peut ˆtre t‚l‚charg‚ … partir du site http://www.freebasic.net
' L'environnement qbasic, form‚ des fichiers qbasic.exe et
' qbasic.hlp, qui offre plus de facilit‚s pour la mise au point,
' fait partie du DOS … partir de la version 5. Il se trouve sur le
' cd d'installation de windows95/98 bien qu'il ne soit pas install‚
' de fa‡on standard. L'usage de l'interpr‚teur qbasic.exe est
' d‚conseill‚ en windows XP car la copie d'‚cran est alors impossible
' et des pertes de contr“le ont ‚t‚ observ‚es avec certaines versions.
'
DEFSNG A-Z
DECLARE SUB basin (a$, g!, b$)
DECLARE FUNCTION expon! (x!)
DECLARE FUNCTION analyse! (tempac!, global!)
DECLARE FUNCTION simulan! (impr%)
DIM SHARED pi!
DIM SHARED m7%, n1%
DIM SHARED esk, umod, imod, dursim, edisp, eextr, ejoule1, ejoule2
pi! = 4! * ATN(1!)
esk = 1.6021E-19 / 1.381E-23 'rapport ch. de l'‚lectron / cst. de Boltzmann
q2$ = "simboost.par"
SCREEN 9
CLS
PRINT "Simulation d'un module photovolta‹que Si-c"
PRINT "                alimentant un bus DC via un convertisseur boost"
PRINT
DIM SHARED nbcell!, gap0!, gapa!, gapb!, tcref, tkref, egref
DIM SHARED ilref, dilsdtref, i0ref, gammap, gamma, rsref, betars, rth
DIM SHARED rtr
PRINT " Les donn‚es par d‚faut correspondent au module Shell S36"
nbcell! = 36! 'nombre de cellules en s‚rie dans le module
gap0! = 1.16        'caract‚ristique du Si-c
gapa! = .000702     'caract‚ristique du Si-c
gapb! = 1108!       'caract‚ristique du Si-c
tcref = 25!
tkref = 273.15 + tcref
egref = gap0! - gapa! * tkref * tkref / (tkref + gapb!)
ilref = 2.3
dilsdtref = .001
i0ref = 8.919679E-13
gammap = 1.974763
gamma = .8093506
rsref = 3.408432E-02
betars = -.3557975
rth = .03
rtr = .02
debut:
basin "nombre de cellules en s‚rie", nbcell!, ""
PRINT
PRINT "paramŠtres internes en conditions de r‚f‚rence ("; tcref; "øC";
PRINT "1000 W/mý"
PRINT
basin "courant photog‚n‚r‚", ilref, "A"
basin "coeff. de temp‚rature de ce courant", dilsdtref, "A/K"
basin "courant de fuite de la diode id‚ale", i0ref, "A"
basin "gammap", gammap, ""
basin "gamma", gamma, ""
basin "r‚sistance s‚rie", rsref, "ohms"
basin "betars", betars, ""
basin "r‚sistance thermique jonction-amb.", rth, "K/(W/mý)"
PRINT
basin "r‚sistance du transistor … l'‚tat on", rtr, "ohms"
100 : PRINT
PRINT
n1% = 3
PRINT " Il y a "; n1%; " variables ind‚pendantes";
PRINT " (dur‚e, temp‚rature, ‚clairement)"
m7% = 3
DIM SHARED c(1 TO m7%)
c(1) = 5E-09
c(2) = 16.6
c(3) = 1.9E-07
PRINT " Il y a "; m7%; "paramŠtres (taille self, tension bus DC, inductance)"
impr% = 1
DIM SHARED c1%(1 TO m7%), c1old%(1 TO m7%)
m% = m7%
FOR l% = 1 TO m%
c1%(l%) = l%
NEXT l%
GOTO 590

530 : PRINT                                 'drapeau 4
PRINT "not yet programmed"
540 : PRINT                                 'drapeau 3
PRINT "operation aborded"
GOTO 590
560 : PRINT "operation terminated"          'drapeau 2
GOTO 590
580 : PRINT "operation completed"           'drapeau 1
590 : GOSUB pourconti
flag% = 0
CLS
PRINT
PRINT "menu"
PRINT
PRINT "F5   input parameters"
PRINT "F6   output parameters"
PRINT
PRINT "F10  simulation"
PRINT "F12  exit"
PRINT
PRINT "press a softkey F";
DO
    in$ = INKEY$
LOOP WHILE LEN(in$) < 2
in$ = RIGHT$(in$, 1)
menu% = ASC(in$) - 58
IF menu% > 10 THEN menu% = menu% - 64
PRINT menu%
IF menu% <> 5 AND menu% <> 6 AND menu% <> 10 AND menu% <> 12 THEN GOTO 530
IF menu% = 5 THEN GOSUB 2720        'set parameters
IF menu% = 6 THEN GOSUB 2751        'print parameters
IF menu% = 10 THEN GOSUB 4971       'Simulation avec boost
IF menu% = 12 THEN GOSUB fin        'fin du programme
820 IF flag% = 1 THEN GOTO 580
IF flag% = 2 THEN GOTO 560
IF flag% = 3 THEN GOTO 540
IF flag% = 4 THEN GOTO 530
STOP
'*********** f5 initialize **********************************
913 : PRINT "No par. ", "value", "adjustable? (0/1)"
mold% = m%
FOR m% = 1 TO mold%
    c1old%(m%) = c1%(m%)
NEXT m%
m% = 0
FOR l% = 1 TO m7%
    FOR j% = 1 TO mold%
        IF c1old%(j%) = l% THEN 914
    NEXT j%
    j% = 0
    GOTO 915
914 : j% = 1
915 : PRINT "No"; l%, c(l%), "(df"; j%; ")",
    INPUT in$
    IF in$ <> "" THEN j% = VAL(in$)
    IF j% <> 0 AND j% <> 1 THEN 915
    IF j% = 0 THEN GOTO 923
    m% = m% + 1
    c1%(m%) = l%
923 : NEXT l%
IF m% > 0 THEN 950
PRINT "it is necessary to have one adj. par."
PRINT "try again"
GOTO 913
950 : PRINT "there is"; m%; "adjustable parameters"
flag% = 1
RETURN

' *-------------------------* F6 set parameters *---------------------*
2720 : CLS
zut% = 1
PRINT "enter 1 to input parameters from keyboard"
PRINT "      2 to input parameters from disk"
PRINT "your choice (df"; zut%; ") =";
INPUT in$
IF in$ <> "" THEN zut% = VAL(in$)
IF zut% < 1 OR zut% > 2 THEN GOTO 2720
IF zut% = 1 THEN
    PRINT "values of the parameters (empty enter for no change)"
    l% = 0
    PRINT "No", "adj.", "old value", "", "new value"
8870 : l% = l% + 1
    PRINT l%,
    FOR j% = 1 TO m%
        IF c1%(j%) = l% THEN 8886
    NEXT j%
    PRINT "no",
    GOTO 8887
8886 PRINT "yes",
8887 PRINT c(l%),
    INPUT in$
    IF in$ <> "" THEN c(l%) = VAL(in$)
    IF l% < m7% THEN GOTO 8870
ELSE
    PRINT "Name of the file (df "; q2$; ") is ";
    INPUT in$
    IF in$ <> "" THEN q2$ = in$
    OPEN q2$ FOR INPUT AS #1
    INPUT #1, i%
    PRINT "There is "; i%; "parameters on file"
    IF i% > m7% THEN i% = m7%
    FOR j% = 1 TO i%
        INPUT #1, c(j%)
    NEXT j%
    CLOSE #1
END IF
flag% = 1
RETURN

'********************** print parameters ****************************
2751 CLS
zut% = 1
PRINT "enter 1 to print parameters on screen"
PRINT "      2 to output parameters to disk"
PRINT "your choice (df"; zut%; ") =";
INPUT in$
IF in$ <> "" THEN zut% = VAL(in$)
IF zut% < 1 OR zut% > 2 THEN GOTO 2751
IF zut% = 1 THEN
    GOSUB 8770
ELSE
    PRINT "Name of the file (df "; q2$; ") is ";
    INPUT in$
    IF in$ <> "" THEN q2$ = in$
    OPEN q2$ FOR OUTPUT AS #1
    PRINT #1, m7%
    FOR j% = 1 TO m7%
        PRINT #1, c(j%)
    NEXT j%
    CLOSE #1
END IF
flag% = 1
RETURN


'*--------------------------* F10 Simulation *------------------*
4971 : CLS
PRINT "simulation avec convertisseur boost"
PRINT
PRINT "niveau d'impression 0 si aucune"
PRINT "                    1 si seulement fichier en cours de traitement"
PRINT "                    2 pour chaque point exp‚rimental"
PRINT "                    3 pour d‚tails et arrˆts"
PRINT "  Votre choix (df "; impr%; " ) =";
INPUT in$
IF in$ <> "" THEN impr% = VAL(in$)
IF impr% < 0 OR impr% > 3 THEN GOTO 4971
ebus = simulan!(impr%)
CLS
PRINT "dur‚e de la simulation :"; dursim; " heures ="; dursim / 24; " jours"
PRINT
PRINT " ‚nergie totale disponible =     "; edisp; " Wh"
PRINT " ‚nergie non extraite =          "; edisp - eextr; " Wh"
PRINT " ‚nergie perdue par effet Joule ds la self="; ejoule1; " Wh"
PRINT " ‚nergie perdue par effet Joule ds le transistor ="; ejoule2; " Wh"
PRINT " ‚nergie re‡ue par le bus DC = "; ebus; " Wh"
PRINT
PRINT " efficacit‚ ="; ebus / edisp * 100!; " %"
flag% = 1
RETURN

8770 : PRINT "values of the parameters"
noline% = 0
FOR l% = 1 TO m7%
noline% = noline% + 1
IF noline% > 20 THEN
    INPUT dummy$
    CLS
    noline% = 0
END IF
PRINT "c("; l%; ") ="; c(l%),
FOR j% = 1 TO m%
IF c1%(j%) = l% THEN 8795
NEXT j%
PRINT "not adjustable",
8795 : PRINT
NEXT l%
flag% = 1
RETURN




pourconti:
PRINT
PRINT "Press <enter> to continue";
INPUT dummy$
RETURN

fin: END

FUNCTION analyse! (tempac, global)
' tempac est la temp‚rature ambiante en øC
' global est l'‚clairement ‚nerg‚tique en W/m2
' la fonction retourne la puissance ‚lectrique disponible et attribue
' une valeur aux variables partag‚es umod et imod (point r‚el)

'c(1) est la caract‚ristique dimensionnelle de la self en Wb2/ohm
'c(2) est la tension du bus DC en V
'c(3) est la valeur de la self en H

tc = tempac + rth * global    'temp‚rature de la jonction en øC
                              ' calcul de tc am‚liorable !
tk = 273.15 + tc              'temp‚rature de la jonction en øK
il = (ilref + dilsdtref * (tc - tcref)) * (global / 1000!)   'courant photog.
eg = gap0! - gapa! * tk * tk / (tk + gapb!)
zut = tk / tkref
zut1 = EXP(esk / gamma * (egref / tkref - eg / tk))
i0 = i0ref * zut ^ (3! / gammap) * zut1
rs = rsref * zut ^ betars
esgkt = esk / gamma / tk
ucell = (LOG(il / i0 + 1!)) / esgkt
uoc = ucell * nbcell!
ujonctbas = 0!
ujoncthaut = ucell
FOR iter% = 1 TO 40
    ujonct = (ujoncthaut + ujonctbas) / 2!
    GOSUB calcourdi
    IF ijonct * esgkt * (ucell - rs * imod) > imod THEN
       ujoncthaut = ujonct
    ELSE
       ujonctbas = ujonct
    END IF
NEXT iter%
umpp = ucell * nbcell!
y1 = umpp * imod
IF umpp > c(2) THEN
   umod = c(2)
   ujonctbas = umod / nbcell!
   ujoncthaut = uoc / nbcell!
   ucelltent = umod / nbcell!
   FOR iter% = 1 TO 40
      ujonct = (ujoncthaut + ujonctbas) / 2!
      GOSUB calcourdi
      IF ucell > ucelltent THEN
         ujoncthaut = ujonct
      ELSE
         ujonctbas = ujonct
      END IF
   NEXT iter%
ELSE
   umod = umpp
END IF
GOTO finanal

calcourdi:   'calcul du courant de la diode id‚ale
zut = ujonct * esgkt
ijonct = i0 * (expon!(zut) - 1!)
imod = il - ijonct
ucell = ujonct - rs * imod
RETURN

finanal: analyse! = y1
END FUNCTION

SUB basin (a$, g!, b$)
PRINT " "; a$; " (df "; g!; " "; b$; ")= ";
INPUT in$
IF in$ <> "" THEN g! = VAL(in$)
END SUB

FUNCTION expon! (x!)

IF x! < 88! THEN
     expon! = EXP(x!)
ELSE
     expon! = 1.651636E+38
END IF

END FUNCTION

FUNCTION simulan! (impr%)
' la fonction retourne la valeur de l'‚nergie transmise au bus DC
' et attribue une valeur aux variables partag‚es dursim,
' edisp, eextr, ejoule1 et ejoule2
dursim = 0!
edisp = 0!
eextr = 0!
psimax = 0!
intil2 = 0!
intit2 = 0!
FOR nomois% = 1 TO 12
   impr1% = impr%
   nbjour% = 31
   IF nomois% = 4 OR nomois% = 6 THEN nbjour% = 30
   IF nomois% = 9 OR nomois% = 11 THEN nbjour% = 30
   IF nomois% = 2 THEN nbjour% = 28
   mois$ = STR$(nomois%)
   IF nomois% < 10 THEN
      mois$ = "0" + RIGHT$(mois$, 1)
   ELSE
      mois$ = RIGHT$(mois$, 2)
   END IF
q1$ = "METLLN" + mois$ + ".DAT"
IF impr1% > 0 THEN PRINT "analyse des donn‚es du fichier "; q1$
OPEN q1$ FOR INPUT AS #1
INPUT #1, n%
INPUT #1, nbdata%
IF nbdata% <> n1% THEN
   PRINT "nombre de donn‚es par ligne incorrect"
   STOP
END IF
IF impr1% > 1 THEN PRINT "alpha", "beta", "pmpp (W)", "pextr (W)"
FOR i% = 1 TO n%
  INPUT #1, duree
  INPUT #1, tempac
  INPUT #1, global
  IF duree < 0! OR tempac < -90! OR global < 0! THEN GOTO passe
  dursim = dursim + duree
  pdisp = analyse(tempac, global)
  edisp = edisp + pdisp * duree
  pextr = umod * imod
  eextr = eextr + pextr * duree
  alpha = 1! - umod / c(2)
  deltailt = alpha * .00005 * umod / c(3)
  IF imod >= .5 * deltailt THEN
     beta = 1!
     deltail = deltailt
     psic = (ibus + .5 * deltail) * c(3)
     il2 = imod * imod + deltail * deltail / 12!
  ELSE
     beta = SQR(2! * imod / deltailt)
     deltail = deltailt * beta
     psic = deltail * c(3)
     il2 = (deltail * deltail / 3!) * SQR(beta)
  END IF
  it2 = il2 * SQR(alpha)
  IF psic > psimax THEN psimax = psic
  intil2 = intil2 + il2 * duree
  intit2 = intit2 + it2 * duree
  IF impr1% > 1 THEN
     IF beta < 1! THEN COLOR 10
     impress$ = "#.#####         #.#####         ##.####         ##.####"
     PRINT USING impress$; alpha; beta; pdisp; pextr
     IF pdisp < pextr THEN
        PRINT "anomalie"
        INPUT dummy$
     END IF
  END IF
  IF impr1% > 2 THEN
     COLOR 12
     PRINT "   psic="; psic; " Wb"
     PRINT "   umod="; umod; " V"
     PRINT "   imod="; imod; " A"
     INPUT in$
     IF in$ <> "" THEN impr1% = VAL(in$)
  END IF
COLOR 15
passe:
NEXT i%
CLOSE
NEXT nomois%
ejoule1 = (psimax * psimax / c(1)) * intil2
ejoule2 = rtr * intit2
simulan! = eextr - ejoule1 - ejoule2
END FUNCTION

