FUNCTION FC 3 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
S1_Constant : REAL ;
P1_Constant : REAL ;
P2_Constant : REAL ;
Pressure : REAL ;
END_VAR
VAR_OUTPUT
rSpeed : REAL ;
END_VAR
VAR_TEMP
rSlope : REAL ;
rC : REAL ;
END_VAR
BEGIN
NETWORK
TITLE =calc slope and intercept
L #P1_Constant;
L #P2_Constant;
-R ;
L #S1_Constant;
/R ;
T #rSlope;
L #P2_Constant;
NEGR ;
L #rSlope;
*R ;
T #rC;
NETWORK
TITLE =check for which region to use
L #Pressure;
L #P1_Constant;
<=R ;
JC less;
TAK ;
L #P2_Constant;
>=R ;
JC more;
JU linr;
NETWORK
TITLE =linear part
linr: L #Pressure;
L #rSlope;
*R ;
L #rC;
+R ;
T #rSpeed;
JU Exit;
NETWORK
TITLE =less or more part
less: L #S1_Constant;
T #rSpeed;
JU Exit;
more: L 0.000000e+000;
T #rSpeed;
JU Exit;
NETWORK
TITLE =
Exit: SET ;
SAVE ;
END_FUNCTION
FUNCTION FC 4 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
S1_Constant : REAL ;
P1_Constant : REAL ;
P2_Constant : REAL ;
Pressure : REAL ;
END_VAR
VAR_OUTPUT
rSpeed : REAL ;
END_VAR
VAR_TEMP
rSlope : REAL ;
rC : REAL ;
bLess : BOOL ;
bMore : BOOL ;
bLinear : BOOL ;
rTemp : REAL ;
END_VAR
BEGIN
NETWORK
TITLE =calc slope
A( ;
L #P1_Constant;
L #P2_Constant;
-R ;
T #rTemp;
AN OV;
SAVE ;
CLR ;
A BR;
) ;
JNB _003;
L #S1_Constant;
L #rTemp;
/R ;
T #rSlope;
_003: NOP 0;
NETWORK
TITLE =calc intercept
A( ;
L #P2_Constant;
NEGR ;
T #rTemp;
SET ;
SAVE ;
CLR ;
A BR;
) ;
JNB _00b;
L #rTemp;
L #rSlope;
*R ;
T #rC;
_00b: NOP 0;
NETWORK
TITLE =determine which region to use - pressure less than P1
L #Pressure;
L #P1_Constant;
<=R ;
= #bLess;
NETWORK
TITLE =determine which region to use - pressure greater than P1
L #Pressure;
L #P2_Constant;
>=R ;
= #bMore;
NETWORK
TITLE =Linear region
AN #bLess;
AN #bMore;
= #bLinear;
NETWORK
TITLE =Linear region
A( ;
A #bLinear;
JNB _013;
L #Pressure;
L #rSlope;
*R ;
T #rTemp;
AN OV;
SAVE ;
CLR ;
_013: A BR;
) ;
JNB _017;
L #rTemp;
L #rC;
+R ;
T #rSpeed;
_017: NOP 0;
NETWORK
TITLE =less region
A #bLess;
JNB _01b;
L #S1_Constant;
T #rSpeed;
_01b: NOP 0;
NETWORK
TITLE =more region
A #bMore;
JNB _021;
L 0.000000e+000;
T #rSpeed;
_021: NOP 0;
END_FUNCTION
FUNCTION FC 4 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
S1_Constant : REAL ;
P1_Constant : REAL ;
P2_Constant : REAL ;
Pressure : REAL ;
END_VAR
VAR_OUTPUT
wOutput : WORD ;
END_VAR
VAR_TEMP
rSlope : REAL ;
rC : REAL ;
bLess : BOOL ;
bMore : BOOL ;
bLinear : BOOL ;
rTemp : REAL ;
rSpeed : REAL ;
diTemp : DINT ;
END_VAR
BEGIN
NETWORK
TITLE =calc slope
A( ;
L #P1_Constant;
L #P2_Constant;
-R ;
T #rTemp;
AN OV;
SAVE ;
CLR ;
A BR;
) ;
JNB _001;
L #S1_Constant;
L #rTemp;
/R ;
T #rSlope;
_001: NOP 0;
NETWORK
TITLE =calc intercept
A( ;
L #P2_Constant;
NEGR ;
T #rTemp;
SET ;
SAVE ;
CLR ;
A BR;
) ;
JNB _002;
L #rTemp;
L #rSlope;
*R ;
T #rC;
_002: NOP 0;
NETWORK
TITLE =determine which region to use - pressure less than P1
L #Pressure;
L #P1_Constant;
<=R ;
= #bLess;
NETWORK
TITLE =determine which region to use - pressure greater than P1
L #Pressure;
L #P2_Constant;
>=R ;
= #bMore;
NETWORK
TITLE =Linear region
AN #bLess;
AN #bMore;
= #bLinear;
NETWORK
TITLE =Linear region
A( ;
A #bLinear;
JNB _003;
L #Pressure;
L #rSlope;
*R ;
T #rTemp;
AN OV;
SAVE ;
CLR ;
_003: A BR;
) ;
JNB _004;
L #rTemp;
L #rC;
+R ;
T #rSpeed;
_004: NOP 0;
NETWORK
TITLE =less region
A #bLess;
JNB _005;
L #S1_Constant;
T #rSpeed;
_005: NOP 0;
NETWORK
TITLE =more region
A #bMore;
JNB _006;
L 0.000000e+000;
T #rSpeed;
_006: NOP 0;
NETWORK
TITLE =scale for drive 0-100 == 0-16384
A( ;
L #rSpeed;
L 1.638400e+001;
*R ;
T #rTemp;
AN OV;
SAVE ;
CLR ;
A BR;
) ;
JNB _007;
L #rTemp;
RND ;
T #diTemp;
_007: NOP 0;
NETWORK
TITLE =scaled value to output
L #diTemp;
T #wOutput;
NOP 0;
END_FUNCTION
JesperMP said:Just a small comment:
I think it is better to format the output as INT in stead of WORD.
Yes. If the REAL value cannot go outside +/- 100.0 then it is as simple as that:henno2000 said:To convert to INT I have used the RND function. Is this acceptable? (The number should be limited at 100).