ELake20
Lifetime Supporting Member
I have an application where I need to determine the minimum and maximum value of 6 analog inputs. (known as Cyl1-6 in code) I have it working in ladder with FC25 (Min) and FC27 (Max) but I think this would be a great exercise in SCL. The code I've got compiles, but I think I'm doing something wrong because it won't work.
The idea is to take the minimum and maximum values, toss them out and average the remaining 4. The various compares ensure that I will only have 1 Min and 1 Max. I had it setup with 3 IFs and ELSIFs to eliminate the over abundance of END_IFs. I'm using the Hans Berger SCL book for most of my information. I have a couple examples, but they are mostly just changing data types and doing complex functions that I don't need.
Any help is greatly appreciated!!!
The idea is to take the minimum and maximum values, toss them out and average the remaining 4. The various compares ensure that I will only have 1 Min and 1 Max. I had it setup with 3 IFs and ELSIFs to eliminate the over abundance of END_IFs. I'm using the Hans Berger SCL book for most of my information. I have a couple examples, but they are mostly just changing data types and doing complex functions that I don't need.
Any help is greatly appreciated!!!
FUNCTION_BLOCK FB1508
TITLE = 'MinMaxEDS'
Name: EDS_TEST
Family: EDS
Author: EML
Version: '0.1' //first attempt
VAR_INPUT
Cyl1 : REAL;
Cyl2 : REAL;
Cyl3 : REAL;
Cyl4 : REAL;
Cyl5 : REAL;
Cyl6 : REAL;
OnlineOffline1 : BOOL;
OnlineOffline2 : BOOL;
OnlineOffline3 : BOOL;
OnlineOffline4 : BOOL;
OnlineOffline5 : BOOL;
OnlineOffline6 : BOOL;
END_VAR
VAR_OUTPUT
EDS_SP : REAL; // Setpoint for EDS Algorithm
Cyl1IsMax : BOOL;
Cyl2IsMax : BOOL;
Cyl3IsMax : BOOL;
Cyl4IsMax : BOOL;
Cyl5IsMax : BOOL;
Cyl6IsMax : BOOL;
Cyl1IsMin : BOOL;
Cyl2IsMin : BOOL;
Cyl3IsMin : BOOL;
Cyl4IsMin : BOOL;
Cyl5IsMin : BOOL;
Cyl6IsMin : BOOL;
TotalVal : REAL;
AverageVal : REAL;
END_VAR
//Determine Maximum Value
IF Cyl1 > Cyl2 AND Cyl1 > Cyl3 AND Cyl1 > Cyl4 AND Cyl1 > Cyl5 AND Cyl1 > Cyl6 THEN // Cylinder 1 is Maximum Value Determination
Cyl1IsMax := TRUE;
IF Cyl2 > Cyl1 AND Cyl2 > Cyl3 AND Cyl2 > Cyl4 AND Cyl2 > Cyl5 AND Cyl2 > Cyl6 THEN // Cylinder 2 is Maximum Value Determination
Cyl2IsMax := TRUE;
IF Cyl3 > Cyl1 AND Cyl3 > Cyl2 AND Cyl3 > Cyl4 AND Cyl3 > Cyl5 AND Cyl3 > Cyl6 THEN // Cylinder 3 is Maximum Value Determination
Cyl3IsMax := True;
IF Cyl4 > Cyl1 AND Cyl4 > Cyl2 AND Cyl4 > Cyl3 AND Cyl4 > Cyl5 AND Cyl4 > Cyl6 THEN // Cylinder 4 is Maximum Value Determination
Cyl4IsMax := True;
IF Cyl5 > Cyl1 AND Cyl5 > Cyl2 AND Cyl5 > Cyl3 AND Cyl5 > Cyl4 AND Cyl5 > Cyl6 THEN // Cylinder 5 is Maximum Value Determination
Cyl5IsMax := True;
IF Cyl6 > Cyl1 AND Cyl6 > Cyl2 AND Cyl6 > Cyl3 AND Cyl6 > Cyl4 AND Cyl6 > Cyl5 THEN // Cylinder 6 is Maximum Value Determination
Cyl6IsMax := True;
//Determine Minimum Value
IF Cyl1 < Cyl2 AND Cyl1 < Cyl3 AND Cyl1 < Cyl4 AND Cyl1 < Cyl5 AND Cyl1 < Cyl6 THEN // Cylinder 1 is Minimum Value Determination
Cyl1IsMin := TRUE;
IF Cyl2 < Cyl1 AND Cyl2 < Cyl3 AND Cyl2 < Cyl4 AND Cyl2 < Cyl5 AND Cyl2 < Cyl6 THEN // Cylinder 2 is Minimum Value Determination
Cyl2IsMin := TRUE;
IF Cyl3 < Cyl1 AND Cyl3 < Cyl2 AND Cyl3 < Cyl4 AND Cyl3 < Cyl5 AND Cyl3 < Cyl6 THEN // Cylinder 3 is Minimum Value Determination
Cyl3IsMin := True;
IF Cyl4 < Cyl1 AND Cyl4 < Cyl2 AND Cyl4 < Cyl3 AND Cyl4 < Cyl5 AND Cyl4 < Cyl6 THEN // Cylinder 4 is Minimum Value Determination
Cyl4IsMin := True;
IF Cyl5 < Cyl1 AND Cyl5 < Cyl2 AND Cyl5 < Cyl3 AND Cyl5 < Cyl4 AND Cyl5 < Cyl6 THEN // Cylinder 5 is Minimum Value Determination
Cyl5IsMin := True;
IF Cyl6 < Cyl1 AND Cyl6 < Cyl2 AND Cyl6 < Cyl3 AND Cyl6 < Cyl4 AND Cyl6 < Cyl5 THEN // Cylinder 6 is Minimum Value Determination
Cyl6IsMin := True;
//Subtract Minimum & Maximum and get Total Value
IF Cyl1IsMin = TRUE OR Cyl1IsMax = True THEN TotalVal := Cyl2 + Cyl3 + Cyl4 + Cyl5 + Cyl6;
IF Cyl2IsMin = TRUE OR Cyl2IsMax = True THEN TotalVal := Cyl1 + Cyl3 + Cyl4 + Cyl5 + Cyl6;
IF Cyl3IsMin = True OR Cyl3IsMax = True THEN TotalVal:= Cyl1 + Cyl2 + Cyl4 + Cyl5 + Cyl6;
IF Cyl4IsMin = True OR Cyl4IsMax = True THEN TotalVal := Cyl1 + Cyl2 + Cyl3 + Cyl5 + Cyl6;
IF Cyl5IsMin = True OR Cyl5IsMax = True THEN TotalVal := Cyl1 + Cyl2 + Cyl3 + Cyl4 + Cyl6;
IF Cyl6IsMin = True OR Cyl6IsMax = True THEN TotalVal := Cyl1 + Cyl2 + Cyl3 + Cyl4 + Cyl5;
//Divide Total Value by 4 to get Average Value
AverageVal := TotalVal / 4;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_IF;
END_FUNCTION_BLOCK