| 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 |