From 6b60d0f8062f25238de69a9dfce7744a89643991 Mon Sep 17 00:00:00 2001 From: Patrick McDonagh Date: Wed, 22 Feb 2017 14:57:56 -0600 Subject: [PATCH] Adds pump-off logic --- .../java/com/henrypump/poc/CLScanner.java | 17 +++ src/main/java/com/henrypump/poc/Database.java | 10 ++ .../java/com/henrypump/poc/IOControl.java | 1 + src/main/java/com/henrypump/poc/POC.java | 4 +- src/main/java/com/henrypump/poc/Well.java | 110 +++++++++++++++++- 5 files changed, 137 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/henrypump/poc/CLScanner.java b/src/main/java/com/henrypump/poc/CLScanner.java index 546dd78..3f59b31 100644 --- a/src/main/java/com/henrypump/poc/CLScanner.java +++ b/src/main/java/com/henrypump/poc/CLScanner.java @@ -21,7 +21,16 @@ class CLScanner implements Runnable { poc.thisWell.stop("commandline"); } + private void pumpoffWell(){ + poc.thisWell.pumpOff("commandline"); + } + + private void restartWell(){ + poc.thisWell.restart("commandline"); + } + private void exitPOC(){ + poc.thisWell.db.newRunStatus("Shutdown", "commandline"); System.exit(99); } @@ -49,6 +58,8 @@ class CLScanner implements Runnable { System.out.println("POSSIBLE COMMANDS"); System.out.println("start -- Issues the start command"); System.out.println("stop -- Issues the stop command"); + System.out.println("pumpoff -- Issues the pumpoff command"); + System.out.println("restart -- Issues the restart command"); System.out.println("status -- Gets the current run status"); System.out.println("showtapers -- Gets the current taper and well parameters"); System.out.println("showtotals -- Gets the current totals and averages"); @@ -76,6 +87,12 @@ class CLScanner implements Runnable { case "stop": stopWell(); break; + case "pumpoff": + pumpoffWell(); + break; + case "restart": + restartWell(); + break; case "exit": exitPOC(); break; diff --git a/src/main/java/com/henrypump/poc/Database.java b/src/main/java/com/henrypump/poc/Database.java index f90ccad..e578866 100644 --- a/src/main/java/com/henrypump/poc/Database.java +++ b/src/main/java/com/henrypump/poc/Database.java @@ -224,4 +224,14 @@ public class Database { } return frictionEstimate; } + + public long newRunStatus(String runStatus, String initiator){ + MongoCollection collection = database.getCollection("runStatus"); + + Document doc = new Document("status", runStatus) + .append("initiator", initiator) + .append("timesstamp", Date.from(ZonedDateTime.now().toInstant())); + collection.insertOne(doc); + return collection.count(); + } } diff --git a/src/main/java/com/henrypump/poc/IOControl.java b/src/main/java/com/henrypump/poc/IOControl.java index aa1a31c..a910d5b 100644 --- a/src/main/java/com/henrypump/poc/IOControl.java +++ b/src/main/java/com/henrypump/poc/IOControl.java @@ -34,6 +34,7 @@ public class IOControl implements Runnable { } private void exitPOC(){ + poc.thisWell.db.newRunStatus("Shutdown", "io"); allOutputsOff(); System.exit(0); } diff --git a/src/main/java/com/henrypump/poc/POC.java b/src/main/java/com/henrypump/poc/POC.java index 14591bd..a04c528 100644 --- a/src/main/java/com/henrypump/poc/POC.java +++ b/src/main/java/com/henrypump/poc/POC.java @@ -41,7 +41,7 @@ public class POC implements Runnable{ thisWell.setupFluidRatio(0.50, 0.50, 1.12); thisWell.checkSafeties(); while (true) { - while (thisWell.getRunStatus() == Well.RUNSTATUS_RUNNING || thisWell.getRunStatus() == Well.RUNSTATUS_STARTING) { +// while (thisWell.getRunStatus() == Well.RUNSTATUS_RUNNING || thisWell.getRunStatus() == Well.RUNSTATUS_STARTING) { for (int i = 0; i <= thisWell.sim.getLastFilledIndex(); i++) { thisWell.eval(i); @@ -52,7 +52,7 @@ public class POC implements Runnable{ e.printStackTrace(); } } - } +// } } } diff --git a/src/main/java/com/henrypump/poc/Well.java b/src/main/java/com/henrypump/poc/Well.java index 5db05be..974f8e1 100644 --- a/src/main/java/com/henrypump/poc/Well.java +++ b/src/main/java/com/henrypump/poc/Well.java @@ -15,11 +15,10 @@ import static java.lang.Math.exp; import static java.lang.Math.pow; import static java.lang.Math.sqrt; -import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; -import java.time.LocalDate; import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; /** * Created by patrickjmcd on 1/31/17. @@ -172,6 +171,16 @@ public class Well { private Measurement pumpIntakePressure; private Measurement surfaceStrokeLength; private Measurement tubingMovement; + private Measurement pumpFillPercent; + + // Running Setpoints + private double pumpOffFillPercentSetpoint = 65; + private int pumpOffStrokes = 5; + private int lowFillageStrokes = 0; + private ZonedDateTime pumpedOffTime; + private long pumpOffDowntimeMinutes = 5; + private long minutesSincePumpOff = 0; + private long minutesSincePumpOff_last = 0; Well(String dbHostname, int inclinometerChannel, int loadCellChannel, int runCommandChannel){ this.wellName = wellName; @@ -182,6 +191,7 @@ public class Well { loadCell = new AnalogIn(loadCellChannel, 0, 50000, 0, 50000); initializeMeasurements(); + db.newRunStatus("Boot", "io"); } Well(String dbHostname, String simFileName, int inclinometerChannel, int loadCellChannel, int runCommandChannel){ @@ -194,6 +204,7 @@ public class Well { loadCell = new AnalogIn(loadCellChannel, 0, 50000, 0, 50000); initializeMeasurements(); + db.newRunStatus("Boot", "commandline"); } private void initializeMeasurements(){ @@ -216,6 +227,7 @@ public class Well { pumpIntakePressure = new Measurement("Pump Intake Pressure", db, 5.0, 600); surfaceStrokeLength = new Measurement("Surface Stroke", db, 0.5, 1800); tubingMovement = new Measurement("Tubing Movement", db, 0.5, 600); + pumpFillPercent = new Measurement("Pump Fill Percent", db, 0.5, 600); } public double getDt() { @@ -456,6 +468,42 @@ public class Well { this.kFactor = kFactor; } + public int getLowFillageStrokes() { + return lowFillageStrokes; + } + + public ZonedDateTime getPumpedOffTime() { + return pumpedOffTime; + } + + public long getMinutesSincePumpOff() { + return minutesSincePumpOff; + } + + public double getPumpOffFillPercentSetpoint() { + return pumpOffFillPercentSetpoint; + } + + public void setPumpOffFillPercentSetpoint(double pumpOffFillPercentSetpoint) { + this.pumpOffFillPercentSetpoint = pumpOffFillPercentSetpoint; + } + + public int getPumpOffStrokes() { + return pumpOffStrokes; + } + + public void setPumpOffStrokes(int pumpOffStrokes) { + this.pumpOffStrokes = pumpOffStrokes; + } + + public long getPumpOffDowntimeMinutes() { + return pumpOffDowntimeMinutes; + } + + public void setPumpOffDowntimeMinutes(long pumpOffDowntimeMinutes) { + this.pumpOffDowntimeMinutes = pumpOffDowntimeMinutes; + } + public void setupFluidRatio(double oilRatio, double waterRatio, double gasRatio){ fluidOilRatio = oilRatio; fluidWaterRatio = waterRatio; @@ -468,13 +516,34 @@ public class Well { System.out.println("Starting " + wellName + " from " + initiator + "..."); runStatus = RUNSTATUS_STARTING; strokesSinceStart = 0; + db.newRunStatus(getRunStatusString(), initiator); } } public void stop(String initiator){ - if (runStatus == RUNSTATUS_STARTING || runStatus == RUNSTATUS_RUNNING){ + if (runStatus == RUNSTATUS_STARTING || runStatus == RUNSTATUS_RUNNING || runStatus == RUNSTATUS_PUMPEDOFF){ System.out.println("Stopping " + wellName + " from " + initiator + "..."); runStatus = RUNSTATUS_STOPPED; + db.newRunStatus(getRunStatusString(), initiator); + } + } + + public void restart(String initiator){ + if (runStatus == RUNSTATUS_PUMPEDOFF && permissiveOK){ + System.out.println("Restarting after pump-off from " + initiator + "..."); + runStatus = RUNSTATUS_STARTING; + strokesSinceStart = 0; + db.newRunStatus(getRunStatusString(), initiator); + } + } + + public void pumpOff(String initiator){ + if (runStatus == RUNSTATUS_RUNNING){ + System.out.println("Pumping off from " + initiator + "..."); + System.out.println("Restarting in " + pumpOffDowntimeMinutes + " minutes."); + pumpedOffTime = ZonedDateTime.now(); + runStatus = RUNSTATUS_PUMPEDOFF; + db.newRunStatus(getRunStatusString(), initiator); } } @@ -941,6 +1010,7 @@ public class Well { pumpIntakePressure.update(currentCard.getPumpIntakePressure()); surfaceStrokeLength.update(currentCard.getSurfaceStrokeLength()); tubingMovement.update(currentCard.getTubingMovement()); + pumpFillPercent.update(currentCard.getFillageCalculated()); db.newCard(currentCard); currentCard = new Card(strokesLifetime); @@ -949,6 +1019,18 @@ public class Well { runStatus = RUNSTATUS_RUNNING; } + if (runStatus == RUNSTATUS_RUNNING) { + if (pumpFillPercent.getCurrentValue() < pumpOffFillPercentSetpoint) { + lowFillageStrokes++; + } else { + lowFillageStrokes = 0; + } + + if (lowFillageStrokes > pumpOffStrokes) { + pumpOff("lowpumpfill"); + } + } + } public void gaugeOff(){ @@ -1004,6 +1086,17 @@ public class Well { pointCounter++; } + if (runStatus == RUNSTATUS_PUMPEDOFF){ + minutesSincePumpOff = ChronoUnit.MINUTES.between(ZonedDateTime.now(), pumpedOffTime); + if(minutesSincePumpOff_last != minutesSincePumpOff){ + System.out.println("Restarting in " + (pumpOffDowntimeMinutes - minutesSincePumpOff) + " minutes."); + minutesSincePumpOff_last = minutesSincePumpOff; + } + if (minutesSincePumpOff > pumpOffDowntimeMinutes){ + restart("pumpoffdowntime"); + } + } + if(isNewDay()){ gaugeOff(); } @@ -1039,6 +1132,17 @@ public class Well { pointCounter++; } + if (runStatus == RUNSTATUS_PUMPEDOFF){ + minutesSincePumpOff = ChronoUnit.MINUTES.between(pumpedOffTime, ZonedDateTime.now()); + if(minutesSincePumpOff_last != minutesSincePumpOff){ + System.out.println("Restarting in " + (pumpOffDowntimeMinutes - minutesSincePumpOff) + " minutes."); + minutesSincePumpOff_last = minutesSincePumpOff; + } + if (minutesSincePumpOff > pumpOffDowntimeMinutes){ + restart("pumpoffdowntime"); + } + } + if(isNewDay()){ gaugeOff(); }