Proteus Plus

La sintassi priva di operatori di Proteus, pur permettendo una notevole versatilità e precisione (nonché una maggiore velocità di interpretazione dei programmi), potrebbe talvolta risultare meno comoda  in tutti quei casi dove l'utilizzo del calcolo numerico è preponderante rispetto alle altre funzionalità.

Per venire incontro a queste necessità, è stato realizzato un metalinguaggio basato su Proteus, che ne mutua sostanzialmente la sintassi, introducendo alcune specifiche eccezioni per permettere l'utilizzo degli operatori aritmetici.

Naturalmente, con l'uso degli operatori diviene indispensabile ammettere anche l'introduzione delle parentesi, per specificare correttamente l'ordine di priorità nell'esecuzione delle operazioni.

I programmi Proteus Plus dovrebbero avere sempre estensione .prp; per poterli eseguire non è necessario un altro interprete: è sufficiente lanciare su di essi il programma prp.prt che provvederà a convertirli in un programma Proteus standard, eseguibile con il consueto interprete.

Queste sono le differenze più significative introdotte da Proteus Plus:

esempio: SWITCH  s STREQ()

Questi sono gli operatori ammessi e le corrispondenti funzioni, in ordine di precedenza:

(massima precedenza)

( )    operatore di grouping

[Operatori unari]

! NOT
~ NNOT
++ INC
-- DEC
+ ABS
- NEG

[Operatori binari]

* MUL
/ FDIV
\ DIV
% MOD
^^ POW
+ ADD
; STRCAT
- SUB
<< SHIFTLT
>> SHIFTRT
< LT
<= LE
> GT
>= GE
$ IN
== EQ
= EQ
!= NEQ
$= STREQ
!$ STRNEQ
& NAND
^ NXOR
| NOR
&& AND
|| OR
:= ISET
*= MUL@
/= FDIV@
\= DIV@
%= MOD@
+= ADD@
-= SUB@
&= NAND@
^= NXOR@
|= NOR@
<<= SHIFTLT@
>>= SHIFTRT@

(minima precedenza)

La sintassi per eseguire il convertitore da Proteus Plus a Proteus è la seguente:

proteus prp.prt source.prp [dest.prt | = [parametri..]]

Se si specifica il parametro dest.prt, il programma convertito sarà memorizzato in questo file; se invece si indica il carattere "=" al suo posto, il programma sarà convertito in un file temporaneo ed eseguito direttamente con i parametri eventualmente indicati; il file temporaneo sarà rimosso al termine dell'esecuzione. 

Codice di esempio in Proteus Plus

FUNCTION PVSF(TEMP)

PRIF = 101325.0
T = TEMP + 273.16
Z = 273.16 / T
IF T < 273.16
  P1 = -9.096936 * (Z - 1)
  P2 = -3.56654 * LOG10(Z)
  P3 = 0.876817 * (1.0 - (1.0 / Z))
  P4 = -2.2195983
ELSE
  P1 = (10.79586 * (1.0 - Z)) - 2.2195983
  P2 = 5.02808 * LOG10(Z)
  A1 = -8.29692 * ((1.0 / Z) - 1.0)
  P3 = "1.5047E-04" * (1.0 - (10.0 ^^ A1))
  A2 = 4.76955 * (1.0 - Z)
  P4 = "0.42873E-03" * ((10.0 ^^ A2) - 1.0)
FI
SUM = P1 + P2 + P3 + P4
RETURN PRIF * (10 ^^ SUM)


FUNCTION WBFF(W, DB)

WB1 = DB
REPEAT
  WS1 = XSAT(WB1)
  W1 = ( (WS1 * (2501 - (2.364 * WB1))) + (1.006 * (WB1 - DB)) ) / (2501 + (1.83 * DB) - (4.194 * WB1))
  Y1 = W - W1
  IF ABS(Y1) <= 0.00003
    RETURN WB1
  FI
  IF Y1 = 0
    RETURN WB1
  FI
  IF Y1 > 0
    WB1 = WB1 + 0.5
    CONTINUE
  FI
  REPEAT
    WB2 = WB1 - 1
    WS2 = XSAT(WB2)  
    W2 = ( (WS2 * (2501 - (2.364 * WB2))) + (1.006 * (WB2 - DB)) ) / (2501 + (1.83 * DB) - (4.194 * WB2))
    Y2 = W - W2
    IF ABS(Y2) <= 0.00003
      RETURN WB2
    FI
    IF Y2 = 0
      RETURN WB2
    FI
    IF (Y1 * Y2) < 0
      Z = ABS(Y1 / Y2)
      RETURN ((WB2 * Z) + WB1) / (Z + 1)
    FI
    IF (Y1 * Y2) = 0
      IF Y1 != 0
        RETURN WB2
      ELSE
        RETURN WB1
      FI
    ELSE
      WB1 = WB2
      Y1 = Y2
    FI
  UNTIL 0
UNTIL 0
RETURN


FUNCTION PSDBRH(@DB, @WB, @DP, @PB, @PV, @W, @H, @V, @RH)

IF RH = 0
  RH = 0.001
FI
IF (RH < 0.001) || (RH > 100)
  CONSOLELN ""
  CONSOLELN "ERRORE IN PSDBRH : DB=" ; PFORMAT("6.2f", DB) ; "  RH=" ; PFORMAT("6.2f", RH)
  CONSOLELN "Umidità relativa non compatibile"
  ABORT 0
FI
PVS = PVSF(DB)
X = RH - 100.0
IF ABS(X) <= 0.09
  RH = 100.0
FI
PV = (RH / 100.0) * PVS
W = (0.62198 * PV) / (PB - PV)
V = (8314.32 / 28.9645) * (DB + 273.16) * (1.0 + (1.6078 * W)) / PB
H = (DB * 1.006) + ((2501 + (1.83 * DB)) * W)
DP = DPF(PV)
WB = WBFF(W, DB)
RETURN


FUNCTION PSDBW(@DB, @WB, @DP, @PB, @PV, @W, @H, @V, @RH)

IF W = 0
  W = "1.E-07"
FI
IF W < "1.E-07"
  CONSOLELN ""
  CONSOLELN "ERRORE IN PSDBW : DB=" ; PFORMAT("6.2f", DB) ; "  H=" ; PFORMAT("10.3e", W)
  CONSOLELN "Umidità specifica non compatibile"
  ABORT 0
FI
XS = 0.62198 * PVSF(DB) / (PB - PVSF(DB))
IF W > XS
  CONSOLELN ""
  CONSOLELN "ERRORE IN PSDBW : DB=" ; PFORMAT("6.2f", DB) ; "  H=" ; PFORMAT("10.3e", W)
  CONSOLELN "Umidità specifica non compatibile"
  ABORT 0
FI
H = 1.006 * DB + (2501.0 + 1.83 * DB) * W
V = 8314.32 / 28.9645 * (DB + 273.16) * (1.0 + 1.6078 * W) / PB
PV = W * PB / (0.62198 + W)
RH = PV / PVSF(DB) * 100.0
WB = WBFF(W, DB)
DP = DPF(PV)
RETURN

Codice equivalente tradotto in Proteus da prp.prt

FUNCTION PVSF(TEMP)

PRIF = 101325.0
T = ADD(TEMP,273.16)
Z = FDIV(273.16,T)
IF LT(T,273.16)
  P1 = MUL(-9.096936,SUB(Z,1))
  P2 = MUL(-3.56654,LOG10(Z))
  P3 = MUL(0.876817,SUB(1.0,FDIV(1.0,Z)))
  P4 = -2.2195983
ELSE
  P1 = SUB(MUL(10.79586,SUB(1.0,Z)),2.2195983)
  P2 = MUL(5.02808,LOG10(Z))
  A1 = MUL(-8.29692,SUB(FDIV(1.0,Z),1.0))
  P3 = MUL("1.5047E-04",SUB(1.0,POW(10.0,A1)))
  A2 = MUL(4.76955,SUB(1.0,Z))
  P4 = MUL("0.42873E-03",SUB(POW(10.0,A2),1.0))
FI
SUM = ADD(ADD(ADD(P1,P2),P3),P4)
RETURN MUL(PRIF,POW(10,SUM))


FUNCTION WBFF(W, DB)

WB1 = DB
REPEAT
  WS1 = XSAT(WB1)
  W1 = FDIV(ADD(MUL(WS1,SUB(2501,MUL(2.364,WB1))),MUL(1.006,SUB(WB1,DB))),SUB(ADD(2501,MUL(1.83,DB)),MUL(4.194,WB1)))
  Y1 = SUB(W,W1)
  IF LE(ABS(Y1),0.00003)
    RETURN WB1
  FI
  IF EQ(Y1,0)
    RETURN WB1
  FI
  IF GT(Y1,0)
    WB1 = ADD(WB1,0.5)
    CONTINUE
  FI
  REPEAT
    WB2 = SUB(WB1,1)
    WS2 = XSAT(WB2)
    W2 = FDIV(ADD(MUL(WS2,SUB(2501,MUL(2.364,WB2))),MUL(1.006,SUB(WB2,DB))),SUB(ADD(2501,MUL(1.83,DB)),MUL(4.194,WB2)))
    Y2 = SUB(W,W2)
    IF LE(ABS(Y2),0.00003)
      RETURN WB2
    FI
    IF EQ(Y2,0)
      RETURN WB2
    FI
    IF LT(MUL(Y1,Y2),0)
      Z = ABS(FDIV(Y1,Y2))
      RETURN FDIV(ADD(MUL(WB2,Z),WB1),ADD(Z,1))
    FI
    IF EQ(MUL(Y1,Y2),0)
      IF NEQ(Y1,0)
        RETURN WB2
      ELSE
        RETURN WB1
      FI
    ELSE
      WB1 = WB2
      Y1 = Y2
    FI
  UNTIL 0
UNTIL 0
RETURN


FUNCTION PSDBRH(@DB, @WB, @DP, @PB, @PV, @W, @H, @V, @RH)

IF EQ(RH,0)
  RH = 0.001
FI
IF OR(LT(RH,0.001),GT(RH,100))
  CONSOLELN ""
  CONSOLELN "ERRORE IN PSDBRH : DB=" PFORMAT("6.2f",DB) "  RH=" PFORMAT("6.2f",RH)
  CONSOLELN "Umidità relativa non compatibile"
  ABORT 0
FI
PVS = PVSF(DB)
X = SUB(RH,100.0)
IF LE(ABS(X),0.09)
  RH = 100.0
FI
PV = MUL(FDIV(RH,100.0),PVS)
W = FDIV(MUL(0.62198,PV),SUB(PB,PV))
V = FDIV(MUL(MUL(FDIV(8314.32,28.9645),ADD(DB,273.16)),ADD(1.0,MUL(1.6078,W))),PB)
H = ADD(MUL(DB,1.006),MUL(ADD(2501,MUL(1.83,DB)),W))
DP = DPF(PV)
WB = WBFF(W,DB)
RETURN


FUNCTION PSDBW(@DB, @WB, @DP, @PB, @PV, @W, @H, @V, @RH)

IF EQ(W,0)
  W = "1.E-07"
FI
IF LT(W,"1.E-07")
  CONSOLELN ""
  CONSOLELN "ERRORE IN PSDBW : DB=" PFORMAT("6.2f",DB) "  H=" PFORMAT("10.3e",W)
  CONSOLELN "Umidità specifica non compatibile"
  ABORT 0
FI
XS = FDIV(MUL(0.62198,PVSF(DB)),SUB(PB,PVSF(DB)))
IF GT(W,XS)
  CONSOLELN ""
  CONSOLELN "ERRORE IN PSDBW : DB=" PFORMAT("6.2f",DB) "  H=" PFORMAT("10.3e",W)
  CONSOLELN "Umidità specifica non compatibile"
  ABORT 0
FI
H = ADD(MUL(1.006,DB),MUL(ADD(2501.0,MUL(1.83,DB)),W))
V = FDIV(MUL(MUL(FDIV(8314.32,28.9645),ADD(DB,273.16)),ADD(1.0,MUL(1.6078,W))),PB)
PV = FDIV(MUL(W,PB),ADD(0.62198,W))
RH = MUL(FDIV(PV,PVSF(DB)),100.0)
WB = WBFF(W,DB)
DP = DPF(PV)
RETURN
Inizio pagina Prossimo argomento Argomento precedente Indice per argomenti Indice analitico