// Block definition (there may be more than one block per file)
FUNCTION_BLOCK tipper

// Define input variables
VAR_INPUT
    service : REAL;
    food : REAL;
END_VAR

// Define output variable
VAR_OUTPUT
    tip : REAL;
END_VAR

// Fuzzify input variable 'service'
FUZZIFY service
    TERM poor := (0, 1) (4, 0) ; 
    TERM good := (1, 0) (4,1) (6,1) (9,0);
    TERM excellent := (6, 0) (9, 1);
END_FUZZIFY

// Fuzzify input variable 'food'
FUZZIFY food
    TERM rancid := (0, 1) (1, 1) (3,0) ;
    TERM delicious := (7,0) (9,1);
END_FUZZIFY

// Defzzzify output variable 'tip'
DEFUZZIFY tip
    TERM cheap := (0,0) (5,1) (10,0);
    TERM average := (10,0) (15,1) (20,0);
    TERM generous := (20,0) (25,1) (30,0);
    // Use 'Center Of Gravity' defuzzification method
    METHOD : COG;
    // Default value is 0 (if no rule activates defuzzifier)
    DEFAULT := 0;
END_DEFUZZIFY

RULEBLOCK No1
    // Use 'min' for 'and' (also implicit use 'max'
    // for 'or' to fulfill DeMorgan's Law)
    AND : MIN;
    // Use 'min' activation method
    ACT : MIN;
    // Use 'max' accumulation method
    ACCU : MAX;

    RULE 1 : IF service IS poor OR food IS rancid 
                THEN tip IS cheap;

    RULE 2 : IF service IS good 
                THEN tip IS average; 

    RULE 3 : IF service IS excellent AND food IS delicious 
                THEN tip is generous;
END_RULEBLOCK

END_FUNCTION_BLOCK