| Proteus Plus |
Proteus syntax does not include operators: this approach has many advantages (greater speed and precision), but sometimes lead to confusion when doing a lot of maths.
For this reason, we have created a Proteus-based metalanguage, which has almost the same syntax of Proteus but adds a few exceptions, introduced to accomodate many useful operators.
Obviously, when adding operators we need to use parenthesis, to tell Proteus the order in which operations must be performed.
Proteus Plus programs should always keep the extension .prp; you don't need another interpreter to run them: just run the script prp.prt, which will convert them to Proteus scripts, which can be run by the standard interpreter.
These are the most significative differences introduced by Proteus Plus:
e.g.
SWITCH s STREQ()
This is the list of allowed operators and the corresponding functions, ordered by priority:
(maximum priority)
| ( ) | grouping operator |
[Unary operators]
| ! | NOT |
| ~ | NNOT |
| ++ | INC |
| -- | DEC |
| + | ABS |
| - | NEG |
[Binary operators]
| * | 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@ |
(minimum priority)
The syntax to invoke the converter from Proteus Plus to Proteus is the following:
proteus prp.prt source.prp [dest.prt | = [parameters..]]
If the parameter dest.prt is specified, the converted program will be saved to this file; if the character "=" takes its place, the program will be saved to a temporary file and run directly, using the optional specified parameters; the temporary file will be removed when the program ends.
Example 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 "ERROR IN PSDBRH : DB=" ; PFORMAT("6.2f", DB) ; " RH=" ; PFORMAT("6.2f", RH)
CONSOLELN "Relative humidity not compatible"
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 "ERROR IN PSDBW : DB=" ; PFORMAT("6.2f", DB) ; " H=" ; PFORMAT("10.3e", W)
CONSOLELN "Specific humidity not compatible"
ABORT 0
FI
XS = 0.62198 * PVSF(DB) / (PB - PVSF(DB))
IF W > XS
CONSOLELN ""
CONSOLELN "ERROR IN PSDBW : DB=" ; PFORMAT("6.2f", DB) ; " H=" ; PFORMAT("10.3e", W)
CONSOLELN "Specific humidity not compatible"
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
Code translated by prp.prt to standard Proteus
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 "ERROR IN PSDBRH : DB=" PFORMAT("6.2f",DB) " RH=" PFORMAT("6.2f",RH)
CONSOLELN "Relative humidity not compatible"
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 "ERROR IN PSDBW : DB=" PFORMAT("6.2f",DB) " H=" PFORMAT("10.3e",W)
CONSOLELN "Specific humidity not compatible"
ABORT 0
FI
XS = FDIV(MUL(0.62198,PVSF(DB)),SUB(PB,PVSF(DB)))
IF GT(W,XS)
CONSOLELN ""
CONSOLELN "ERROR IN PSDBW : DB=" PFORMAT("6.2f",DB) " H=" PFORMAT("10.3e",W)
CONSOLELN "Specific humidity not compatible"
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
| Start of page | Next topic | Previous topic | Contents | Index |