CCCPaste

Dynamic fan selection

FUNCTION_BLOCK fb19

VAR_INPUT

FansSelection : INT; // HMI Fans Selections

Update_Bt : BOOL := FALSE; // HMI Update button

FTP_Start : BOOL;

FTP_Stop : BOOL;

END_VAR

VAR_OUTPUT

Fan1_start : BOOL;

Fan2_start : BOOL;

Fan3_start : BOOL;

END_VAR

VAR_TEMP

index : INT;

target_fan_to_run : INT;

Update_Button :BOOL ;

END_VAR

CONST

ST_IDLE := 0;

ST_WAIT := 1;

ST_TURN_ON_TARGET_FAN := 2;

ST_NORAML_OP_2FANS := 3;

ST_NORAML_OP_3FANS := 4;

ST_TURN_OFF_UNWANTED_FAN := 5;

END_CONST

VAR

Fan_Lookuptable : ARRAY[0..3, 0..2] OF INT :=

1, 2, 0,

2, 3, 0,

3, 1, 0,

1, 2, 3;

Index_Selection : ARRAY[0..8] OF INT:= -1, 0, 1, -1, 2, -1, -1, -1, 3;


Fan_Run : ARRAY[0..2] OF BOOL := 0, 0, 0;

old_running : ARRAY[0..2] OF INT := 0, 0, 0;

already_started : BOOL;

Update_Button_old : BOOL;

updated : BOOL := FALSE ;

No_TargetFans : INT;

unused_fan : INT;

State : INT; // FSM current state

TON_timer : sfb4;

Running_fan : INT := 0;

END_VAR

BEGIN

IF FansSelection < 1 THEN

FansSelection := 1;

END_IF;



//index := REAL_TO_INT(LN(FansSelection) / LN(2.0));
index := Index_Selection[FansSelection];

Update_Button:= Update_Bt AND NOT Update_Button_old;

Update_Button_old:=Update_Bt;

CASE State OF



// ----------------------

ST_IDLE :

// ----------------------

No_TargetFans := 2 + BOOL_TO_INT(FansSelection=8);



Fan1_start := FALSE;

Fan2_start := FALSE;

Fan3_start := FALSE;

already_started := FALSE;

updated:= FALSE;

Running_fan := 0 ;

// Reset timer

TON_timer(IN := 0);





IF FTP_Start THEN

State := ST_WAIT;

END_IF;



// ----------------------

ST_WAIT :

// ----------------------

IF NOT TON_timer.Q THEN

TON_timer(IN := 1, PT:= T#5s);

END_IF;



IF TON_timer.Q THEN

State := ST_TURN_ON_TARGET_FAN;

END_IF;



// ----------------------

ST_TURN_ON_TARGET_FAN :

// ----------------------

IF NOT already_started THEN

target_fan_to_run := Fan_Lookuptable[index,Running_fan];

ELSE

target_fan_to_run := 6 - (old_running[0] + old_running[1]);

END_IF;



Fan_Run[target_fan_to_run - 1] := TRUE;

old_running[Running_fan] := target_fan_to_run;



Running_fan := Running_fan + 1;



// Reset timer

TON_timer(IN := 0);



IF Running_fan < No_TargetFans THEN

State := ST_WAIT;

ELSE

already_started := TRUE;

State := ST_NORAML_OP_2FANS + BOOL_TO_INT(Running_fan = 3);

END_IF;



// ----------------------

ST_NORAML_OP_2FANS :

// ----------------------

IF NOT updated THEN

old_running[0] := Fan_Lookuptable[index,0];

old_running[1] := Fan_Lookuptable[index,1];

updated := TRUE;

END_IF;



IF Update_Button THEN

IF FansSelection = 8 THEN

No_TargetFans := 3;

State := ST_TURN_ON_TARGET_FAN;

ELSE

State := ST_TURN_OFF_UNWANTED_FAN;

END_IF;

updated := False;

END_IF;



IF FTP_Stop THEN

State := ST_IDLE;

END_IF ;

// ----------------------

ST_NORAML_OP_3FANS :

// ----------------------

No_TargetFans := 3;



IF Update_Button AND (FansSelection <> 8) THEN

No_TargetFans := 2;

State := ST_TURN_OFF_UNWANTED_FAN;

END_IF;



IF FTP_Stop THEN

State := ST_IDLE;

END_IF ;



// ----------------------

ST_TURN_OFF_UNWANTED_FAN :

// ----------------------

unused_fan := 6 - (Fan_Lookuptable[index,0] + Fan_Lookuptable[index,1] + Fan_Lookuptable[index,2]);



Fan_Run[unused_fan - 1] := FALSE;



Running_fan := Running_fan - 1;



IF Running_fan = 2 THEN

State := ST_NORAML_OP_2FANS;

ELSE

State := ST_WAIT;

END_IF;



END_CASE;

// Update_Button := FALSE ;

Fan1_start := Fan_Run[0];

Fan2_start := Fan_Run[1];

Fan3_start := Fan_Run[2];

END_FUNCTION_BLOCK