358 lines
11 KiB
Plaintext
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 |