377 lines
17 KiB
Python
377 lines
17 KiB
Python
#!/usr/bin/env python
|
|
|
|
'''
|
|
Created on Oct 1, 2014
|
|
|
|
@author: PJMcdona
|
|
'''
|
|
|
|
|
|
#from prettytable import PrettyTable
|
|
import csv
|
|
from datetime import datetime
|
|
import os
|
|
import sys
|
|
from random import randint
|
|
import time
|
|
import MySQLdb
|
|
|
|
|
|
|
|
db = MySQLdb.connect(host="127.0.0.1",user="website",passwd="henrypump",db="WellData")
|
|
cur = db.cursor()
|
|
query = "SELECT * FROM WellData.config ORDER BY dateChanged DESC LIMIT 1;"
|
|
cur.execute(query)
|
|
setup = cur.fetchall()
|
|
db.commit()
|
|
db.close()
|
|
|
|
PLC_IP_ADDRESS = setup[0][2]
|
|
PLC_TYPE = setup[0][1]
|
|
|
|
sys.path.append("../")
|
|
|
|
path_to_CSV = "/mnt/usb/"
|
|
|
|
#TUXEIP Connection to PLC
|
|
from tuxeip import TuxEIP, LGX, LGX_REAL
|
|
tux = TuxEIP(libpath="/usr/lib/libtuxeip.so")
|
|
sess = tux.OpenSession(PLC_IP_ADDRESS)
|
|
reg = tux.RegisterSession(sess)
|
|
conn = tux.ConnectPLCOverCNET(sess, LGX, 1, 100, 123, randint(0,9999), 123, 321, 100, 5000, 1, '01')
|
|
|
|
if os.path.exists(path_to_CSV + "current.csv"):
|
|
os.remove(path_to_CSV + "current.csv")
|
|
|
|
|
|
|
|
data = {}
|
|
|
|
tags_to_read = [['Card_Past[1].ID', 'INT', "Card_ID"],
|
|
['Card_Past[1].Params.Num_Tapers', 'INT', 'Num_Tapers'],
|
|
['Card_Past[1].Num_Points', 'INT', 'Num_Points'],
|
|
['Card_Past[1].Card_Type', 'INT', 'Card_Type'],
|
|
['Card_Past[1].Name.Data[0]','STRING', 'Well_Name'],
|
|
['Card_Past[1].Params.Tubing_Head_Pressure','REAL', 'Tubing_Head_Pressure'],
|
|
['Card_Past[1].Params.Fluid_Gradient','REAL', 'Fluid_Gradient'],
|
|
['Card_Past[1].Params.Stuffing_Box_Friction','REAL', 'Stuffing_Box_Friction'],
|
|
['Card_Past[1].Params.dt','REAL', 'dt'],
|
|
['Card_Past[1].Downhole_Max_Load.Load','REAL', 'Downhole_Max_Load'],
|
|
['Card_Past[1].Downhole_Min_Load.Load','REAL', 'Downhole_Min_Load'],
|
|
['Card_Past[1].Downhole_Max_Position.Position','REAL', 'Downhole_Max_Position'],
|
|
['Card_Past[1].Downhole_Min_Position.Position','REAL', 'Downhole_Min_Position'],
|
|
['Card_Past[1].Downhole_GrossStroke','REAL', 'Downhole_Gross_Stroke'],
|
|
['Card_Past[1].Downhole_AdjustedGrossStroke','REAL', 'Downhole_Adjusted_Gross_Stroke'],
|
|
['Card_Past[1].Downhole_NetStroke','REAL', 'Downhole_Net_Stroke'],
|
|
['Card_Past[1].Downhole_FluidLoad','REAL', 'Downhole_Fluid_Load'],
|
|
['Card_Past[1].Surface_Max.Load','REAL', 'Surface_Max_Load'],
|
|
['Card_Past[1].Surface_Min.Load','REAL', 'Surface_Min_Load'],
|
|
['Card_Past[1].Surface_Max.Position','REAL', 'Surface_Max_Position'],
|
|
['Card_Past[1].Surface_Min.Position','REAL', 'Surface_Min_Position'],
|
|
['Card_Past[1].Tubing_Movement','REAL', 'Tubing_Movement'],
|
|
['Card_Past[1].Surface_StrokeLength','REAL', 'Surface_Stroke_Length'],
|
|
['Card_Past[1].Fillage_Percent','REAL', 'Fillage_Percent'],
|
|
['Card_Past[1].Polished_Rod_HP','REAL', 'Polished_Rod_HP'],
|
|
['Card_Past[1].Pump_HP','REAL', 'Pump_HP'],
|
|
['Card_Past[1].SPM','REAL', 'SPM'],
|
|
['Card_Past[1].Fluid_Above_Pump','REAL', 'Fluid_Above_Pump'],
|
|
['Card_Past[1].Pump_Intake_Pressure','REAL', 'Pump_Intake_Pressure'],
|
|
['Stroke_Production','REAL', 'Stroke_Production'],
|
|
['DriveTorqueMode','BOOL', 'Drive_Torque_Mode'],
|
|
['PF755_Drive:O.TrqRefAStpt','REAL', 'Torque_Reference'],
|
|
['Pump_PF755.PSet_SpeedRef','REAL', 'Speed_Reference'],
|
|
]
|
|
|
|
datetime_tags = [
|
|
['Card_Past[1].End_Time.Year', 'INT', '_Year'],
|
|
['Card_Past[1].End_Time.Month', 'INT', '_Month'],
|
|
['Card_Past[1].End_Time.Day', 'INT', '_Day'],
|
|
['Card_Past[1].End_Time.Hour', 'INT', '_Hour'],
|
|
['Card_Past[1].End_Time.Min', 'INT', '_Minute'],
|
|
['Card_Past[1].End_Time.Sec', 'INT', '_Second']
|
|
]
|
|
|
|
|
|
def ReadFromPLC(tag, tag_type):
|
|
try:
|
|
if (tag_type == "REAL"):
|
|
a = tux.ReadLGXDataAsFloat(sess, conn, tag, 1)
|
|
#print a
|
|
result = float(a[0])
|
|
#print tag, result
|
|
elif (tag_type == "INT"):
|
|
a = tux.ReadLGXDataAsInteger(sess, conn, tag, 1)
|
|
#print a
|
|
result = int(a[0])
|
|
#print tag, result
|
|
elif (tag_type == "BOOL"):
|
|
a = tux.ReadLGXDataAsInteger(sess, conn, tag, 1)
|
|
val = int(a[0])
|
|
if val != 0:
|
|
val = 1
|
|
result = val
|
|
elif (tag_type =="STRING"):
|
|
#print "./read_"+tag_type+ " , " + tag
|
|
a = tux.ReadLGXDataAsInteger(sess, conn, tag, 82)
|
|
#print a
|
|
#split_chars = a.split(",")
|
|
#print split_chars
|
|
word = ""
|
|
for ch in range(len(a)):
|
|
word = word + unichr(int(a[ch]))
|
|
#print word
|
|
result = word
|
|
else:
|
|
result = "?"
|
|
return result
|
|
except:
|
|
print "Unable to read " + tag
|
|
return 911
|
|
|
|
def readPoints():
|
|
surface = []
|
|
downhole = []
|
|
for i in range(0, data['Num_Points']):
|
|
sp = round(ReadFromPLC("Card_Past[1].Surface_Position[" + str(i) + "]", "REAL"),3)
|
|
sl = round(ReadFromPLC("Card_Past[1].Surface_Load[" + str(i) + "]", "REAL"),3)
|
|
surface.append([sp,sl])
|
|
|
|
dp = round(ReadFromPLC("Card_Past[1].Downhole_Position[" + str(i) + "]", "REAL"),3)
|
|
dl = round(ReadFromPLC("Card_Past[1].Downhole_Load[" + str(i) + "]", "REAL"),3)
|
|
downhole.append([dp, dl])
|
|
|
|
|
|
def readSetpoints():
|
|
modeMap = {
|
|
0: "Error",
|
|
1: "Auto",
|
|
2: "POC",
|
|
3: "Timer",
|
|
4: "Manual",
|
|
5: "DH PID"
|
|
}
|
|
|
|
|
|
with open('/mnt/usb/setpoints.csv', 'w') as setpoint_file:
|
|
wr = csv.writer(setpoint_file)
|
|
stroke_time = time.time()
|
|
dt = datetime.fromtimestamp(stroke_time)
|
|
wr.writerow(['localtime', dt])
|
|
wr.writerow(['utctime', datetime.utcfromtimestamp(stroke_time)])
|
|
wr.writerow(['Mode', ReadFromPLC("Pump.Mode", "INT")])
|
|
wr.writerow(['Speed_Setpoint_SPM', ReadFromPLC("Pump.Speed_Setpoint_SPM", "REAL")])
|
|
wr.writerow(['Speed_Max', ReadFromPLC("Pump.Speed_Max", "REAL")])
|
|
wr.writerow(['Speed_Min', ReadFromPLC("Pump.Speed_Min", "REAL")])
|
|
wr.writerow(['Auto-Speed_Startpoint_SPM', ReadFromPLC("Pump.Speed_Startpoint_SPM_Auto", "REAL")])
|
|
wr.writerow(['Auto-Percentage_Ramp_Down', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['Auto-Increment_Ramp_Down', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['Auto-Percent_Ramp_Up', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['Auto-Percent_Ramp_Down', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['Auto-Min_Speed_Strokes', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['Auto-Percent_Ramp_Up', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['Auto-POC-Startup_Ignore_Cards', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['Auto-POC-Card_Quantity', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['Auto-Percent_Ramp_Up', ReadFromPLC("Pump.Mode", "REAL")])
|
|
wr.writerow(['POC-Percent_Pumpoff', ReadFromPLC("Pump.Mode", "REAL")])
|
|
|
|
|
|
cards_read = 1
|
|
read_tapers = False
|
|
already_gauged_off = False
|
|
already_entered_well_test = False
|
|
while True:
|
|
now = datetime.now()
|
|
with open('/mnt/usb/status.txt', 'w') as status_file:
|
|
status_file.write("{0}-->{1}\n{2},{3},{4},{5}".format(datetime.strftime(now,"%Y%m%d_%H%M%S"), ReadFromPLC("Pump.Run_Status", "INT"),ReadFromPLC("Card_Past[1].ID", "INT"),ReadFromPLC("Card_Past[1].Fillage_Percent", "REAL"),ReadFromPLC("Card_Past[1].Fluid_Above_Pump", "REAL"),ReadFromPLC("Stroke_Production", "REAL")))
|
|
#status_file.write("{0}-->{1}\n{2},{3},{4},{5}".format(datetime.now(), ReadFromPLC("Pump.Run_Status", "INT"),ReadFromPLC("Card_Past[1].ID", "INT"),ReadFromPLC("Card_Past[1].Fillage_Percent", "REAL"),ReadFromPLC("Card_Past[1].Fluid_Above_Pump", "REAL"),ReadFromPLC("Stroke_Production", "REAL")))
|
|
|
|
#############
|
|
# CARD DATA #
|
|
#############
|
|
|
|
EOS = ReadFromPLC("End_Of_Stroke", "INT")
|
|
Already_Read = ReadFromPLC("Card_Past[1].Data_Read", "INT") > 0
|
|
num_points = ReadFromPLC("Card_Past[1].Num_Points", "INT")
|
|
|
|
|
|
if (EOS and not Already_Read and (EOS != 911)):
|
|
filename = path_to_CSV + "current.csv"
|
|
myfile = open(filename, 'wb')
|
|
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
|
|
stroke_time = time.time()
|
|
dt = datetime.fromtimestamp(stroke_time)
|
|
wr.writerow(['localtime', dt])
|
|
wr.writerow(['utctime', datetime.utcfromtimestamp(stroke_time)])
|
|
for t in tags_to_read:
|
|
#print t
|
|
data[t[2]] = ReadFromPLC(t[0], t[1])
|
|
wr.writerow([t[2] ,data[t[2]]])
|
|
wr.writerow(["s_pos", "s_load"])
|
|
for i in range(1, num_points-1):
|
|
wr.writerow([round(ReadFromPLC("Card_Past[1].Surface_Position[" + str(i) + "]", "REAL"),3), round(ReadFromPLC("Card_Past[1].Surface_Load[" + str(i) + "]", "REAL"),3)])
|
|
wr.writerow(["d_pos", "d_load"])
|
|
for i in range(1, num_points-1):
|
|
wr.writerow([round(ReadFromPLC("Card_Past[1].Downhole_Position[" + str(i) + "]", "REAL"),3), round(ReadFromPLC("Card_Past[1].Downhole_Load[" + str(i) + "]", "REAL"),3)])
|
|
myfile.close()
|
|
|
|
st = datetime.strftime(dt,"%Y%m%d_%H%M%S")
|
|
date = datetime.strftime(dt,"%Y%m%d")
|
|
|
|
if (data["Card_Type"] == 0):
|
|
data["Card_Type"] = "Normal"
|
|
elif (data["Card_Type"]==1):
|
|
data["Card_Type"] = "Shutdown"
|
|
elif (data["Card_Type"]==2):
|
|
data["Card_Type"] = "Alarm"
|
|
elif (data["Card_Type"]==3):
|
|
data["Card_Type"] = "Startup"
|
|
else:
|
|
data["Card_Type"] ="Unknown"
|
|
|
|
if not os.path.exists(path_to_CSV +"CSV/"+date):
|
|
os.makedirs(path_to_CSV+"CSV/"+date)
|
|
|
|
fill_percent_file = str(data['Fillage_Percent']).replace(".","-")
|
|
rename_file = path_to_CSV+"CSV/"+ date+"/"+st+"_"+str(data["Card_ID"])+"_"+data['Card_Type']+ "_"+fill_percent_file +".csv"
|
|
os.rename(filename, rename_file)
|
|
|
|
tux.WriteLGXData(sess, conn, "Card_Past[1].Data_Read", LGX_REAL, 1, 1)
|
|
print "CARD NUMBER " + str(cards_read) + " READ: "+str(data["Card_ID"])+ ", STORED AS "+ rename_file
|
|
cards_read = cards_read + 1
|
|
|
|
|
|
##############
|
|
# TAPER DATA #
|
|
##############
|
|
|
|
update_taper = ReadFromPLC("Write_Tapers", "INT")
|
|
if (update_taper == 0):
|
|
if read_tapers:
|
|
read_tapers = False
|
|
print "Update Tapers = False"
|
|
|
|
if (update_taper and (not read_tapers) and (update_taper != 911)):
|
|
print "reading taper file"
|
|
taper_count = 0;
|
|
|
|
tFilename = path_to_CSV + "CSV/TAPER/TAPER_" + datetime.strftime(now,"%Y%m%d_%H%M%S")+ '.CSV'
|
|
tFile = open(tFilename, 'wb')
|
|
twr = csv.writer(tFile, quoting=csv.QUOTE_ALL)
|
|
for taps in range(1,10):
|
|
taper_in_use_temp = ReadFromPLC('Taper.Taper[' + str(taps)+'].Calculated.InUse', "INT")
|
|
if taper_in_use_temp:
|
|
taper_count = taper_count + 1
|
|
#print "reading Taper"+ str(taper_count)
|
|
twr.writerow(["Taper",taper_count])
|
|
twr.writerow(['Length',ReadFromPLC('Taper.Taper['+str(taps) +'].Setup.Length', 'REAL')])
|
|
twr.writerow(['Diameter',ReadFromPLC('Taper.Taper['+str(taps) +'].Setup.Diameter', 'REAL')])
|
|
tMaterial = ReadFromPLC('Taper.Taper['+str(taps) +'].Setup.Material', 'INT')
|
|
if (tMaterial == 1):
|
|
twr.writerow(['Material',"Steel"])
|
|
elif (tMaterial == 2):
|
|
twr.writerow(['Material',"Fiberglass"])
|
|
twr.writerow(['Weight_Per_Foot', ReadFromPLC('Taper.Taper['+str(taps) +'].Setup.Weight', 'REAL')])
|
|
twr.writerow(['Youngs_Modulus',ReadFromPLC('Taper.Taper['+str(taps) +'].Setup.Youngs_Modulus', 'REAL')])
|
|
twr.writerow(['Damping_Factor',ReadFromPLC('Taper.Taper['+str(taps) +'].Setup.c', 'REAL')])
|
|
twr.writerow(['Area',ReadFromPLC('Taper.Taper['+str(taps) +'].Calculated.Area', 'REAL')])
|
|
twr.writerow(['Rod_Depth',ReadFromPLC('Taper.Taper['+str(taps) +'].Calculated.Rod_Depth', 'REAL')])
|
|
twr.writerow(['Pressure',ReadFromPLC('Taper.Taper['+str(taps) +'].Calculated.Pressure', 'REAL')])
|
|
twr.writerow(['Buoyant_Force',ReadFromPLC('Taper.Taper['+str(taps) +'].Calculated.Buoyant_Force', 'REAL')])
|
|
twr.writerow(['Rod_Weight',ReadFromPLC('Taper.Taper['+str(taps) +'].Calculated.Rod_Weight_Air', 'REAL')])
|
|
twr.writerow(['Force',ReadFromPLC('Taper.Taper['+str(taps) +'].Calculated.Force', 'REAL')])
|
|
twr.writerow(['Stretch',ReadFromPLC('Taper.Taper['+str(taps) +'].Calculated.Stretch', 'REAL')])
|
|
twr.writerow(["",""])
|
|
else:
|
|
break
|
|
twr.writerow(["UnitConfig",""])
|
|
twr.writerow(['Pump_Diameter',ReadFromPLC('UnitConfig.Pump_Diameter', 'REAL')])
|
|
tFile.close()
|
|
read_tapers = True
|
|
print "TAPER DATA READ: "+ tFilename
|
|
|
|
##################
|
|
# GAUGE OFF DATA #
|
|
##################
|
|
gauge_off = ReadFromPLC("Gauge_Off_Command", "INT")
|
|
if (gauge_off == 0):
|
|
if already_gauged_off:
|
|
already_gauged_off = False
|
|
print "Already gauged off... Setting gauge_off to False"
|
|
|
|
if (gauge_off and (not already_gauged_off) and (gauge_off != 911)):
|
|
print "Gauging off..."
|
|
gYear = ReadFromPLC("GAUGEOFF_DateTime.Year", "INT")
|
|
gMonth = ReadFromPLC("GAUGEOFF_DateTime.Month", "INT")
|
|
gDay = ReadFromPLC("GAUGEOFF_DateTime.Day", "INT")
|
|
gHour = ReadFromPLC("GAUGEOFF_DateTime.Hour", "INT")
|
|
gMin = ReadFromPLC("GAUGEOFF_DateTime.Min", "INT")
|
|
gSec = ReadFromPLC("GAUGEOFF_DateTime.Sec", "INT")
|
|
gauge_date = datetime(year = gYear, month = gMonth,day = gDay,hour = gHour,minute = gMin,second = gSec)
|
|
percent_run = round(ReadFromPLC("GAUGEOFF_Percent_Run", "REAL"),2)
|
|
kWh = round(ReadFromPLC("GAUGEOFF_kWh", "REAL"),3)
|
|
electricity_cost = round(ReadFromPLC("GAUGEOFF_Electricity_Cost", "REAL"),2)
|
|
peak_load = round(ReadFromPLC("GAUGEOFF_Max_Load", "REAL"),3)
|
|
min_load = round(ReadFromPLC("GAUGEOFF_Min_Load", "REAL"),3)
|
|
average_SPM = round(ReadFromPLC("GAUGEOFF_Average_SPM", "REAL"),4)
|
|
production_calculated = round(ReadFromPLC("GAUGEOFF_Production_Calculated", "REAL"),2)
|
|
full_card_production = round(ReadFromPLC("GAUGEOFF_Full_Card_Production", "REAL"),2)
|
|
polished_rod_HP = round(ReadFromPLC("GAUGEOFF_Polished_Rod_HP", "REAL"),3)
|
|
lifting_cost = round(ReadFromPLC("GAUGEOFF_Lifting_Cost", "REAL"),4)
|
|
fluid_above_pump = round(ReadFromPLC("GAUGEOFF_Fluid_Above_Pump", "REAL"),2)
|
|
pump_intake_pressure = round(ReadFromPLC("GAUGEOFF_pump_intake_pressure", "REAL"),2)
|
|
kWh_regen = round(ReadFromPLC("GAUGEOFF_kWh_regen", "REAL"),2)
|
|
inflow_rate = round(ReadFromPLC("GAUGEOFF_Inflow_Rate", "REAL"),4)
|
|
|
|
db = MySQLdb.connect(host="127.0.0.1",user="website",passwd="henrypump",db="WellData")
|
|
cur = db.cursor()
|
|
print """INSERT INTO WellData.Hist_Day (gauge_date, percent_run, kWh, electricity_cost, peak_load, min_load, average_SPM, production_calculated, full_card_production, polished_rod_HP, lifting_cost, fluid_above_pump, pump_intake_pressure, kWh_regen, inflow_rate) VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f');"""%(gauge_date, percent_run, kWh, electricity_cost, peak_load, min_load, average_SPM, production_calculated, full_card_production, polished_rod_HP, lifting_cost, fluid_above_pump, pump_intake_pressure, kWh_regen, inflow_rate)
|
|
storeHist = cur.execute("""INSERT INTO WellData.Hist_Day (gauge_date, percent_run, kWh, electricity_cost, peak_load, min_load, average_SPM, production_calculated, full_card_production, polished_rod_HP, lifting_cost, fluid_above_pump, pump_intake_pressure, kWh_regen, inflow_rate) VALUES ('%s', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f', '%f');"""%(gauge_date, percent_run, kWh, electricity_cost, peak_load, min_load, average_SPM, production_calculated, full_card_production, polished_rod_HP, lifting_cost, fluid_above_pump, pump_intake_pressure, kWh_regen, inflow_rate))
|
|
db.commit()
|
|
db.close()
|
|
|
|
already_gauged_off = True
|
|
print "Gauged off!"
|
|
|
|
|
|
##################
|
|
# WELL TEST DATA #
|
|
##################
|
|
|
|
well_test_entered = ReadFromPLC("Well_Test.Test_Submit", "INT")
|
|
if (well_test_entered == 0):
|
|
if already_entered_well_test:
|
|
already_entered_well_test = False
|
|
print "Already entered well Test... Setting well_test_entered to False"
|
|
if (well_test_entered and (not already_entered_well_test) and well_test_entered != 911):
|
|
print "Well Test Entered"
|
|
|
|
tYear = ReadFromPLC("Well_Test.DateTime_Complete.Year", "INT")
|
|
tMonth = ReadFromPLC("Well_Test.DateTime_Complete.Month", "INT")
|
|
tDay = ReadFromPLC("Well_Test.DateTime_Complete.Day", "INT")
|
|
tHour = ReadFromPLC("Well_Test.DateTime_Complete.Hour", "INT")
|
|
tMin = ReadFromPLC("Well_Test.DateTime_Complete.Min", "INT")
|
|
tSec = ReadFromPLC("Well_Test.DateTime_Complete.Sec", "INT")
|
|
test_date = datetime(year = tYear, month = tMonth,day = tDay,hour = tHour,minute = tMin,second = tSec)
|
|
test_duration = round(ReadFromPLC("Well_Test.Test_Duration", "REAL"),3)
|
|
v_water = round(ReadFromPLC("Well_Test.Volume_Water", "REAL"),3)
|
|
v_oil = round(ReadFromPLC("Well_Test.Volume_Oil", "REAL"),3)
|
|
v_gas = round(ReadFromPLC("Well_Test.Volume_Gas", "REAL"),3)
|
|
p_v_water = round(ReadFromPLC("Well_Test.Projected_Volume_Water", "REAL"),3)
|
|
p_v_oil = round(ReadFromPLC("Well_Test.Projected_Volume_Oil", "REAL"),3)
|
|
k_factor = round(ReadFromPLC("Well_Test.k_Factor", "REAL"),3)
|
|
api_oil = round(ReadFromPLC("Well_Test.API_Oil", "REAL"),3)
|
|
sg_water = round(ReadFromPLC("Well_Test.SG_Water", "REAL"),3)
|
|
|
|
db = MySQLdb.connect(host="localhost",user="website",passwd="henrypump",db="WellData")
|
|
cur = db.cursor()
|
|
test_query = "INSERT INTO WellData.Well_Test (test_date, test_volume_oil, test_volume_water, test_volume_gas, k_factor, projected_volume_oil, projected_volume_water, api_gravity_oil, sg_water, test_hours) VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}');".format(test_date, v_oil, v_water, v_gas, k_factor, p_v_oil, p_v_water, api_oil, sg_water, test_duration)
|
|
print test_query
|
|
storeTest = cur.execute(test_query)
|
|
db.commit()
|
|
db.close()
|
|
|
|
already_entered_well_test = True
|
|
print "Well Test Stored!"
|
|
|
|
time.sleep(.20)
|