LSR/Examples/jFuzzyLogic/block.fcl
2020-06-04 17:24:47 +02:00

52 lines
1.7 KiB
Plaintext

FUNCTION_BLOCK ip // Block definition (there may be more than one block per file)
VAR_OUTPUT // Define input variables
force : REAL;
END_VAR
VAR_INPUT // Define output variable
x : REAL;
dxdt : REAL;
END_VAR
FUZZIFY x
TERM ok := (-0.1,0) (0,1) (0.1,0) ;
TERM left := (-2,1) (0,0);
TERM right := ( 0, 0) (2,1) ;
RANGE := (-2.0 .. 2.0) WITH 0.1; // Added range for x
END_FUZZIFY
FUZZIFY dxdt
TERM ok := TRIAN -1 0 1 ;
TERM left := (-1,1) (0,0);
TERM right := (0,0) (1,1) ;
TERM tooRight := (3,0) (4,1);
TERM tooLeft := (-4,1) (-3,0);
RANGE := (-4.0 .. 4.0) WITH 0.1; // Added range for dxdt
END_FUZZIFY
DEFUZZIFY force
TERM zero := TRIAN -1 0 1 ;
TERM left := (-101,0) (-100,1) (-99,0);
TERM right := (99,0) (100,1) (101,0);
METHOD : COG; // Use 'Center Of Gravity' defuzzification method
DEFAULT := 0; // Default value is 0 (if no rule activates defuzzifier)
RANGE := (-101.0 .. 101.0); // Added range for force
END_DEFUZZIFY
RULEBLOCK No1
AND : MIN; // Use 'min' for 'and' (also implicit use 'max' for 'or' to fulfill DeMorgan's Law)
ACT : MIN; // Use 'min' activation method
ACCU : MAX; // Use 'max' accumulation method
RULE 1 : IF x IS right AND dxdt IS NOT tooLeft THEN force IS left ;
RULE 2 : IF x IS left AND dxdt IS NOT tooRight THEN force IS right ;
RULE 3 : IF x IS ok AND dxdt IS right THEN force IS left ;
RULE 4 : IF x IS ok AND dxdt IS left THEN force IS right ;
RULE 5 : IF x IS ok AND dxdt IS ok THEN force IS zero ;
END_RULEBLOCK
END_FUNCTION_BLOCK