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 |