Files
E300-IPP/Controller/Controller/Micro820/Micro820/Control.stf

358 lines
11 KiB
Plaintext

PROGRAM Control
(* CURRENT TIME IN SECONDS... this doesn't really correlate to anything other than a second counter *)
time_CurrentTime := ANY_TO_DINT( __SYSVA_CYCLEDATE) / 1000;
(*IO Mapping*)
IF NOT Test_Mode THEN
Contactor_Status := DigitalInput_Status_0;
Start_Button := DigitalInput_Status_1;
Auto_Mode := DigitalInput_Status_2;
Hand_Mode := DigitalInput_Status_3;
LinearScale_Pressure(13107.0, 65535.0, Pressure_EU_Min, Pressure_EU_Max, ANY_TO_REAL(_IO_P1_AI_00));
Pressure_In := LinearScale_Pressure.EU_Out;
ELSE
Contactor_Status := cmd_Run;
VoltageOK := TRUE;
END_IF;
(* First Scan Variable Setting*)
IF (__SYSVA_FIRST_SCAN) THEN
Shutdown_Time := time_CurrentTime;
Device_Status:= 'Startup';
Restart_Command := FALSE;
Restart_Allowed := FALSE;
Run_Permissive := FALSE;
Start_Permissive := FALSE;
cfg_READ := TRUE;
sts_TimerRunTimeSet := FALSE;
sts_TimerWaitTimeSet := FALSE;
sts_TimerCycleActive := FALSE;
sts_TripCountIncreased := FALSE;
val_OverloadTripCount := 0;
val_TripCount := 0;
END_IF;
(*Convert kWh and kWh regen to REAL from LREAL for HMI use *)
E300_kWh := ANY_TO_REAL(E300.RealEnergyConsumedOdometer);
E300_kWh_Regen := ANY_TO_REAL(E300.RealEnergyGeneratedOdometer);
IF Downhole_Tool_Enabled THEN
(*Modbus Mapping*)
DH_IntakeTemperature := ANY_TO_REAL(Modbus_Read0[2]) / 10.0;
DH_IntakePressure := ANY_TO_REAL(Modbus_Read0[3]) - 14.0;
DH_NumChannels := Modbus_Read0[10];
DH_ToolVoltage := Modbus_Read0[11];
DH_MaxIntakeTemperature_Startup := ANY_TO_REAL(Modbus_Read0[40]) / 10.0;
DH_MaxIntakePressure_Startup := Modbus_Read0[41];
DH_DownholeStatus_INT := Modbus_Read0[99];
DH_Fluid_Level := DH_IntakePressure * (1.0 / 0.433) * (1.0 / cfg_SpecificGravity) + cfg_DHSensorDistToIntake;
CASE Modbus_Read0[99] OF
0: DH_DownholeStatus := 'OK';
1: DH_DownholeStatus := 'Connecting';
2: DH_DownholeStatus := 'Open Circuit';
3: DH_DownholeStatus := 'Shorted';
4: DH_DownholeStatus := 'Cannot Decode';
ELSE
DH_DownholeStatus := 'Error';
END_CASE;
DH_ToolType := Modbus_Read1000[5];
DH_PSIRating := Modbus_Read1000[7] * 1000;
DH_MaxIntakeTemperature_Forever := ANY_TO_REAL(Modbus_Read1000[8]) / 10.0;
DH_MaxIntakePressure_Forever := Modbus_Read1000[9];
ELSE
DH_DownholeStatus := 'Disabled';
Pressure_Shutdown_Enabled := FALSE;
Pressure_Startup_Enabled := FALSE;
Temp_Shutdown_Enabled := FALSE;
Temp_Startup_Enabled := FALSE;
END_IF;
IF Pressure_Transducer_Enabled AND
Contactor_Status AND
Run_Time > Pressure_Alarm_Startup_Delay THEN
IF Pressure_In >= Pressure_Hi_SP THEN
Pressure_Hi := TRUE;
Pressure_Lo := FALSE;
ELSIF Pressure_in <= Pressure_Lo_SP THEN
Pressure_Hi := FALSE;
Pressure_Lo := TRUE;
ELSE
Pressure_Hi := FALSE;
Pressure_Lo := FALSE;
END_IF;
IF NOT Pressure_Hi AND NOT Pressure_Lo THEN
Pressure_OK := TRUE;
Pressure_OOT_Scans := 0;
Pressure_OOT_Seconds := 0;
ELSE
Pressure_OOT_Scans := Pressure_OOT_Scans + 1;
Pressure_OOT_Seconds := Pressure_OOT_Scans * ANY_TO_UDINT(__SYSVA_TCYCURRENT) / 1000;
END_IF;
IF Pressure_OOT_Seconds > Pressure_Alarm_Delay THEN
Pressure_OK := FALSE;
END_IF;
ELSE
Pressure_OK := TRUE;
END_IF;
alarm_TubingPressure := NOT Pressure_OK;
(* Start Permissive Status *)
SP_Pressure := (NOT Pressure_Startup_Enabled) OR (DH_IntakePressure > Pressure_Startup);
SP_Temperature := (NOT Temp_Startup_Enabled) OR (DH_IntakeTemperature < Temp_Startup);
SP_Mode := Hand_Mode OR Auto_Mode OR Test_Mode;
SP_Trip := NOT TripStatus;
SP_Voltage := VoltageOK;
(* Pressure should be above the startup pressure setpoint and temperature should be below the startup temp setpoint to begin*)
Start_Permissive := (SP_Pressure AND SP_Temperature AND SP_Mode AND SP_Trip AND SP_Voltage);
IF NOT Start_Permissive AND NOT cmd_Run THEN
Device_Status := 'Not ready to start';
END_IF;
IF Device_Status = 'Not ready to start' AND Start_Permissive AND NOT cmd_Run THEN
Device_Status := 'Ready to start';
END_IF;
(* Run Permissive Status *)
RP_Pressure := (NOT Pressure_Shutdown_Enabled) OR (DH_IntakePressure > Pressure_Shutdown);
RP_Temperature := (NOT Temp_Shutdown_Enabled) OR (DH_IntakeTemperature < Temp_Shutdown);
RP_Mode := Hand_Mode OR Auto_Mode OR Test_Mode;
RP_Trip := NOT TripStatus;
RP_TubingPressure := Pressure_OK;
(* Pressure should be be above the shutdown pressure and temperature should be below shutdown temp setpoint to continue to run *)
Run_Permissive := (RP_Pressure AND RP_Temperature AND RP_Mode AND RP_Trip AND RP_TubingPressure);
alarm_DHPressure := NOT RP_Pressure AND Contactor_Status;
alarm_DHTemperature := NOT RP_Temperature AND Contactor_Status;
IF (NOT Run_Permissive AND cmd_Run) THEN
Device_Status := 'Lost Run Permissive';
Shutdown_Time := time_CurrentTime;
IF NOT sts_TripCountIncreased THEN
IF OverloadTrip THEN
val_OverloadTripCount := val_OverloadTripCount + 1;
ELSE
val_TripCount := val_TripCount + 1;
END_IF;
sts_TripCountIncreased := TRUE;
END_IF;
END_IF;
IF val_OverloadTripCount > cfg_OverloadTripCountLimit THEN
Restart_Allowed := FALSE;
Device_Status := 'Not able to restart - Overload Limit';
END_IF;
IF val_TripCount > cfg_TripCountLimit THEN
Restart_Allowed := FALSE;
Device_Status := 'Not able to restart - Trip Limit';
END_IF;
(* If the pump hasn't been started by the user, don't allow it to auto-restart *)
IF (Start_Command OR Start_Button) AND Start_Permissive THEN
TEST_started := TRUE;
Restart_Allowed := TRUE;
IF cfg_TimerModeEnabled THEN
sts_TimerCycleActive := TRUE;
cmd_TimerRun := TRUE;
END_IF;
END_IF;
(* If run permissive goes false, do not allow a restart for a specified amount of time *)
IF (Auto_Mode AND
(NOT OverloadTrip) AND
(NOT cmd_Run) AND
((sts_TimerCycleActive AND cmd_TimerRun) OR (NOT sts_TimerCycleActive)) AND
Restart_Allowed) THEN
IF (time_CurrentTime - Shutdown_Time) > Downtime_Time_Parameter THEN
IF (NOT Restart_Command) THEN
TripResetCmd := TRUE;
Restart_Command := TRUE;
IF cfg_TimerModeEnabled THEN
cmd_TimerRun := TRUE;
sts_TimerCycleActive := TRUE;
END_IF;
END_IF;
ELSE
IF cfg_TimerModeEnabled THEN
cmd_TimerRun := FALSE;
END_IF;
sts_TimerCycleActive := FALSE;
Restart_Command := FALSE;
Time_Until_Startup := Downtime_Time_Parameter - (time_CurrentTime - Shutdown_Time);
Time_Until_Startup_Min := Time_Until_Startup / 60;
Time_Until_Startup_Sec := Time_Until_Startup - (Time_Until_Startup_Min * 60);
Time_Until_Startup_String := ANY_TO_STRING(Time_Until_Startup_Min) + ':' + RIGHT('0' + ANY_TO_STRING(Time_Until_Startup_Sec),2);
IF Auto_Mode THEN
Device_Status := 'Waiting to attempt restart: ' + Time_Until_Startup_String;
END_IF;
END_IF;
ELSIF (Auto_Mode AND
OverloadTrip AND
(NOT cmd_Run) AND
Restart_Allowed) THEN
IF (time_CurrentTime - Shutdown_Time) > Downtime_Time_Parameter_OL THEN
IF (NOT Restart_Command) THEN
Restart_Command := True;
IF cfg_TimerModeEnabled THEN
cmd_TimerRun := TRUE;
sts_TimerCycleActive := TRUE;
END_IF;
END_IF;
ELSE
IF cfg_TimerModeEnabled THEN
cmd_TimerRun := FALSE;
END_IF;
sts_TimerCycleActive := FALSE;
Restart_Command := FALSE;
Time_Until_Startup := Downtime_Time_Parameter_OL - (time_CurrentTime - Shutdown_Time);
Time_Until_Startup_Min := Time_Until_Startup / 60;
Time_Until_Startup_Sec := Time_Until_Startup - (Time_Until_Startup_Min * 60);
Time_Until_Startup_String := ANY_TO_STRING(Time_Until_Startup_Min) + ':' + RIGHT('0' + ANY_TO_STRING(Time_Until_Startup_Sec),2);
IF Auto_Mode THEN
Device_Status := 'Waiting to restart (OL Timer):' + Time_Until_Startup_String;
END_IF;
END_IF;
END_IF;
(* Run only if commanded to start and start permissive is met or already running and not being told to stop *)
IF ((((Start_Button OR Start_Command OR cmd_TimerRun OR (Restart_Allowed AND Restart_Command)) AND Start_Permissive) OR cmd_Run) AND
(NOT Stop_Command) AND (cmd_TimerRun OR NOT cfg_TimerModeEnabled) AND Run_Permissive) THEN
cmd_Run := TRUE;
Restart_Command:= FALSE;
Start_Command := FALSE;
IF NOT Start_Time_Set THEN
Start_Time := time_CurrentTime;
Start_Time_Set := TRUE;
Device_Status := 'Running';
sts_TripCountIncreased := FALSE;
END_IF;
IF Contactor_Status THEN
Run_Time := time_CurrentTime - Start_Time;
END_IF;
ELSE
cmd_Run := FALSE;
END_IF;
IF cmd_Run AND NOT Contactor_Status THEN
IF NOT E300_Output_Enable THEN
IF E300_Output_Toggled THEN
E300_Output_Enable := TRUE;
END_IF;
E300_Output_Toggled := TRUE;
ELSE
IF NOT E300_Output_Toggled THEN
E300_Output_Enable := FALSE;
END_IF;
END_IF;
END_IF;
IF Contactor_Status AND (Run_Time > cfg_ClearTripCountAfter) THEN
val_OverloadTripCount := 0;
val_TripCount := 0;
END_IF;
IF NOT Auto_Mode THEN
Restart_Command := FALSE;
Restart_Allowed := FALSE;
END_IF;
(* Start up automatically if powering up in auto mode *)
RTrig_AutoMode(Auto_Mode);
IF RTrig_AutoMode.Q THEN
Restart_Allowed := TRUE;
Shutdown_Time := time_CurrentTime;
END_IF;
IF Stop_Command THEN
Restart_Allowed := FALSE;
Device_Status := 'User Stopped';
sts_TimerCycleActive := FALSE;
val_OverloadTripCount := 0;
val_TripCount := 0;
cmd_TimerRun := FALSE;
sts_TimerRunTimeSet := FALSE;
END_IF;
IF (NOT Hand_Mode) AND (NOT Auto_Mode) THEN
val_OverloadTripCount := 0;
val_TripCount := 0;
cmd_TimerRun := FALSE;
sts_TimerCycleActive := FALSE;
sts_TimerRunTimeSet := FALSE;
(*Restart_Allowed := FALSE;*)
END_IF;
IF NOT Contactor_Status THEN
Start_Time_Set := FALSE;
END_IF;
(* TIMER MODE *)
IF cfg_TimerModeEnabled AND sts_TimerCycleActive THEN
IF cmd_TimerRun THEN
IF NOT sts_TimerRunTimeSet THEN
sts_TimerRunTimeSet := TRUE;
time_TimerRunTime := time_CurrentTime;
END_IF;
timer_RunTimeLeft := (cfg_TimerRunTime * 60) - (time_CurrentTime - time_TimerRunTime);
IF timer_RunTimeLeft <= 0 THEN
cmd_TimerRun := FALSE;
sts_TimerRunTimeSet := FALSE;
END_IF;
time_RunTimeLeftMin := timer_RunTimeLeft / 60;
time_RunTimeLeftSec := timer_RunTimeLeft - (time_RunTimeLeftMin * 60);
ELSE
IF NOT sts_TimerWaitTimeSet THEN
sts_TimerWaitTimeSet := TRUE;
time_TimerWaitTime := time_CurrentTime;
Device_Status := 'Waiting to start (Timer Mode)';
END_IF;
timer_WaitTimeLeft := (cfg_TimerWaitTime * 60) - (time_CurrentTime - time_TimerWaitTime);
IF timer_WaitTimeLeft <= 0 THEN
cmd_TimerRun := TRUE;
sts_TimerWaitTimeSet := FALSE;
END_IF;
time_WaitTimeLeftMin := timer_WaitTimeLeft / 60;
time_WaitTimeLeftSec := timer_WaitTimeLeft - (time_WaitTimeLeftMin * 60);
END_IF;
END_IF;
IF NOT cfg_TimerModeEnabled OR Stop_Command THEN
cmd_TimerRun := FALSE;
sts_TimerRunTimeSet := FALSE;
sts_TimerWaitTimeSet := FALSE;
END_IF;
IF TripStatus OR OverloadTrip THEN
IF MOD(time_CurrentTime, cfg_ResetCycle) = 0 THEN
TripResetCmd := TRUE;
END_IF;
END_IF;
END_PROGRAM