diff --git a/create_SQLite_db.sql b/create_SQLite_db.sql index 0bfe9f1..09b66a9 100644 --- a/create_SQLite_db.sql +++ b/create_SQLite_db.sql @@ -40,7 +40,8 @@ CREATE TABLE IF NOT EXISTS Well_Test ( api_gravity_oil REAL, sg_oil REAL, sg_water REAL, - test_hours REAL + test_hours REAL, + deleted INTEGER DEFAULT 0 ); CREATE TABLE IF NOT EXISTS config ( @@ -76,9 +77,11 @@ INSERT INTO note_types (id, type) VALUES ('4', 'Other'); CREATE TABLE IF NOT EXISTS fluid_shot( id INTEGER PRIMARY KEY, shot_datetime TIMESTAMP, + taken_by TEXT, pump_intake_pressure REAL, fluid_gradient REAL, - friction REAL + friction REAL, + deleted INTEGER DEFAULT 0 ); CREATE TABLE IF NOT EXISTS card_history( diff --git a/dataLogger_SQLite_pycomm.py b/dataLogger_SQLite_pycomm.py index 4dec5b2..ad05183 100644 --- a/dataLogger_SQLite_pycomm.py +++ b/dataLogger_SQLite_pycomm.py @@ -311,119 +311,122 @@ def main(): ############# # CARD DATA # ############# + try: - EOS = readTag(PLC_IP_ADDRESS, "End_Of_Stroke")[0] - stroke_tags['card_id'].read(False) + EOS = readTag(PLC_IP_ADDRESS, "End_Of_Stroke")[0] + stroke_tags['card_id'].read(False) - if (EOS and not (last_stroke == stroke_tags['card_id'].value)): - sData = {} - last_stroke = stroke_tags['card_id'].value - stroke_time = time.time() - dt = datetime.fromtimestamp(stroke_time) - sData['localtime'] = dt - sData['stroke_time'] = dt - sData['utctime'] = datetime.utcfromtimestamp(stroke_time) - for t in stroke_tags: - stroke_tags[t].read(True) + if (EOS and not (last_stroke == stroke_tags['card_id'].value)): + sData = {} + last_stroke = stroke_tags['card_id'].value + stroke_time = time.time() + dt = datetime.fromtimestamp(stroke_time) + sData['localtime'] = dt + sData['stroke_time'] = dt + sData['utctime'] = datetime.utcfromtimestamp(stroke_time) + for t in stroke_tags: + stroke_tags[t].read(True) - [sData['Surface_Position'], sData['Surface_Load'], sData['Downhole_Position'], sData['Downhole_Load']] = readPoints() + [sData['Surface_Position'], sData['Surface_Load'], sData['Downhole_Position'], sData['Downhole_Load']] = readPoints() - # st = datetime.strftime(dt, "%Y%m%d_%H%M%S") - date = datetime.strftime(dt, "%Y%m%d") - if not date == last_date: - checkDateInDB(date) - last_date = date + # st = datetime.strftime(dt, "%Y%m%d_%H%M%S") + date = datetime.strftime(dt, "%Y%m%d") + if not date == last_date: + checkDateInDB(date) + last_date = date - sData["card_type"] = stroke_tags['card_type'].value - sData["card_id"] = stroke_tags['card_id'].value - sData['sp_string'] = ', '.join(map(str, sData['Surface_Position'])) - sData['sl_string'] = ', '.join(map(str, sData['Surface_Load'])) - sData['dp_string'] = ', '.join(map(str, sData['Downhole_Position'])) - sData['dl_string'] = ', '.join(map(str, sData['Downhole_Load'])) + sData["card_type"] = stroke_tags['card_type'].value + sData["card_id"] = stroke_tags['card_id'].value + sData['sp_string'] = ', '.join(map(str, sData['Surface_Position'])) + sData['sl_string'] = ', '.join(map(str, sData['Surface_Load'])) + sData['dp_string'] = ', '.join(map(str, sData['Downhole_Position'])) + sData['dl_string'] = ', '.join(map(str, sData['Downhole_Load'])) - insert_query = "INSERT INTO card_history (Card_ID, Card_Type, Stroke_Time, Surface_Position, Surface_Load, Downhole_Position, Downhole_Load) VALUES (:card_id, :card_type, :stroke_time, :sp_string, :sl_string, :dp_string, :dl_string)" - with con: - cur = con.cursor() - cur.execute(insert_query, sData) - con.commit() - print "CARD NUMBER " + str(sData["card_id"]) + " READ!" + insert_query = "INSERT INTO card_history (Card_ID, Card_Type, Stroke_Time, Surface_Position, Surface_Load, Downhole_Position, Downhole_Load) VALUES (:card_id, :card_type, :stroke_time, :sp_string, :sl_string, :dp_string, :dl_string)" + with con: + cur = con.cursor() + cur.execute(insert_query, sData) + con.commit() + print "CARD NUMBER " + str(sData["card_id"]) + " READ!" - ################### - # HISTORICAL DATA # - ################### + ################### + # HISTORICAL DATA # + ################### - for hist in history_tags: - h = history_tags[hist] - if h.read(False): - h.sendToDB() - h.last_send_time = time.time() + for hist in history_tags: + h = history_tags[hist] + if h.read(False): + h.sendToDB() + h.last_send_time = time.time() - ############## - # TAPER DATA # - ############## + ############## + # TAPER DATA # + ############## - update_taper = readTag(PLC_IP_ADDRESS, "Write_Tapers")[0] > 0 - if (update_taper == 0): - if read_tapers: - read_tapers = False - print "Update Tapers = False" + update_taper = readTag(PLC_IP_ADDRESS, "Write_Tapers")[0] > 0 + if (update_taper == 0): + if read_tapers: + read_tapers = False + print "Update Tapers = False" - if (update_taper and (not read_tapers)): - print "reading taper file" - read_tapers = evalTapers() + if (update_taper and (not read_tapers)): + print "reading taper file" + read_tapers = evalTapers() - ################## - # GAUGE OFF DATA # - ################## - gauge_off = readTag(PLC_IP_ADDRESS, "Gauge_Off_Command")[0] - if (gauge_off == 0): - if already_gauged_off: - already_gauged_off = False - print "Already gauged off... Setting gauge_off to False" + ################## + # GAUGE OFF DATA # + ################## + gauge_off = readTag(PLC_IP_ADDRESS, "Gauge_Off_Command")[0] + 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)): - print "Gauging off..." - for goff in gaugeoff_tags: - g = gaugeoff_tags[goff] - g.read(True) + if (gauge_off and (not already_gauged_off)): + print "Gauging off..." + for goff in gaugeoff_tags: + g = gaugeoff_tags[goff] + g.read(True) - gauge_date = datetime(year=gaugeoff_tags['year'].value, month=gaugeoff_tags['month'].value, day=gaugeoff_tags['day'].value, hour=gaugeoff_tags['hour'].value, minute=gaugeoff_tags['min'].value, second=gaugeoff_tags['sec'].value) + gauge_date = datetime(year=gaugeoff_tags['year'].value, month=gaugeoff_tags['month'].value, day=gaugeoff_tags['day'].value, hour=gaugeoff_tags['hour'].value, minute=gaugeoff_tags['min'].value, second=gaugeoff_tags['sec'].value) - with con: - cur = con.cursor() - con.execute("""INSERT INTO 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, gaugeoff_tags['percent_run'].value, gaugeoff_tags['kwh'].value, gaugeoff_tags['electricity_cost'].value, gaugeoff_tags['max_load'].value, gaugeoff_tags['min_load'].value, gaugeoff_tags['average_spm'].value, gaugeoff_tags['production_calculated'].value, gaugeoff_tags['full_card_production'].value, gaugeoff_tags['polished_rod_hp'].value, gaugeoff_tags['lifting_cost'].value, gaugeoff_tags['fluid_level'].value, gaugeoff_tags['pump_intake_pressure'].value, gaugeoff_tags['kwh_regen'].value, gaugeoff_tags['inflow_rate'].value)) - con.commit() + with con: + cur = con.cursor() + con.execute("""INSERT INTO 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, gaugeoff_tags['percent_run'].value, gaugeoff_tags['kwh'].value, gaugeoff_tags['electricity_cost'].value, gaugeoff_tags['max_load'].value, gaugeoff_tags['min_load'].value, gaugeoff_tags['average_spm'].value, gaugeoff_tags['production_calculated'].value, gaugeoff_tags['full_card_production'].value, gaugeoff_tags['polished_rod_hp'].value, gaugeoff_tags['lifting_cost'].value, gaugeoff_tags['fluid_level'].value, gaugeoff_tags['pump_intake_pressure'].value, gaugeoff_tags['kwh_regen'].value, gaugeoff_tags['inflow_rate'].value)) + con.commit() - already_gauged_off = True - print "Gauged off!" + already_gauged_off = True + print "Gauged off!" - ################## - # WELL TEST DATA # - ################## + ################## + # WELL TEST DATA # + ################## - well_test_entered = readTag(PLC_IP_ADDRESS, "Well_Test.Test_Submit")[0] > 0 - 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)): - for wtest in welltest_tags: - w = welltest_tags[wtest] - w.read(True) - print "Well Test Entered" - print('{}/{}/{} {}:{}:{}'.format(welltest_tags['year'].value, welltest_tags['month'].value, welltest_tags['day'].value, welltest_tags['hour'].value, welltest_tags['min'].value, welltest_tags['sec'].value)) - test_date = datetime(year=welltest_tags['year'].value, month=welltest_tags['month'].value, day=welltest_tags['day'].value, hour=welltest_tags['hour'].value, minute=welltest_tags['min'].value, second=welltest_tags['sec'].value) + well_test_entered = readTag(PLC_IP_ADDRESS, "Well_Test.Test_Submit")[0] > 0 + 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)): + for wtest in welltest_tags: + w = welltest_tags[wtest] + w.read(True) + print "Well Test Entered" + print('{}/{}/{} {}:{}:{}'.format(welltest_tags['year'].value, welltest_tags['month'].value, welltest_tags['day'].value, welltest_tags['hour'].value, welltest_tags['min'].value, welltest_tags['sec'].value)) + test_date = datetime(year=welltest_tags['year'].value, month=welltest_tags['month'].value, day=welltest_tags['day'].value, hour=welltest_tags['hour'].value, minute=welltest_tags['min'].value, second=welltest_tags['sec'].value) - with con: - cur = con.cursor() - test_query = "INSERT INTO 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, welltest_tags['v_oil'].value, welltest_tags['v_water'].value, welltest_tags['v_gas'].value, welltest_tags['k_factor'].value, welltest_tags['p_v_oil'].value, welltest_tags['p_v_water'].value, welltest_tags['api_oil'].value, welltest_tags['sg_water'].value, welltest_tags['test_duration'].value) - # print test_query - con.execute(test_query) - con.commit() + with con: + cur = con.cursor() + test_query = "INSERT INTO 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, welltest_tags['v_oil'].value, welltest_tags['v_water'].value, welltest_tags['v_gas'].value, welltest_tags['k_factor'].value, welltest_tags['p_v_oil'].value, welltest_tags['p_v_water'].value, welltest_tags['api_oil'].value, welltest_tags['sg_water'].value, welltest_tags['test_duration'].value) + # print test_query + con.execute(test_query) + con.commit() - already_entered_well_test = True - print "Well Test Stored!" + already_entered_well_test = True + print "Well Test Stored!" - time.sleep(.20) + time.sleep(.20) + except Exception, e: + print("Error during loop: {}", e) if __name__ == '__main__': main() diff --git a/getTodaysTotals.py b/getTodaysTotals.py index f670e83..a4f2ebe 100644 --- a/getTodaysTotals.py +++ b/getTodaysTotals.py @@ -4,29 +4,16 @@ import os import sys from random import randint import time -import MySQLdb +import sqlite3 as lite +import logging +from pycomm.ab_comm.clx import Driver as ClxDriver +import traceback -def main(): +con = lite.connect("/mnt/usb/testdata.db") +PLC_IP_ADDRESS = "192.168.1.10" +PLC_TYPE = "VFD" - 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() - try: - PLC_IP_ADDRESS = setup[0][2] - PLC_TYPE = setup[0][1] - except: - print("PLC Address not set in database... using default of 192.168.1.10") - PLC_IP_ADDRESS = "192.168.1.10" - PLC_TYPE = "VFD" - - from pycomm.ab_comm.clx import Driver as ClxDriver - c = ClxDriver(True, 'ClxDriver.log') - - today_tags = [ +today_tags = [ {'name':"Average_SPM",'tag':"TODAY_Average_SPM"}, {'name':"Downhole_Net_Stroke",'tag':"TODAY_Downhole_NetStroke"}, {'name':"Electricity_Cost",'tag':"TODAY_Electricity_Cost"}, @@ -46,21 +33,63 @@ def main(): {'name':"Pump_Intake_Presure",'tag':"TODAY_Pump_Intake_Pressure"}, {'name':"Surface_Stroke_Length",'tag':"TODAY_Surface_StrokeLength"}, {'name':"Tubing_Movement",'tag':"TODAY_Tubing_Movement"} - ] +] - out_tags = {} + +def readConfig(): + global PLC_IP_ADDRESS, PLC_TYPE + with con: + cur = con.cursor() + query = "SELECT * FROM config ORDER BY dateChanged DESC LIMIT 1;" + cur.execute(query) + setup = cur.fetchall() + try: + PLC_IP_ADDRESS = setup[0][2] + PLC_TYPE = setup[0][1] + except: + PLC_IP_ADDRESS = "192.168.1.10" + PLC_TYPE = "VFD" + +retry_attempts = 0 +retries_allowed = 10 + +def readTag(addr, tag): + # logging.basicConfig( + # filename="clx.log", + # format="%(levelname)-10s %(asctime)s %(message)s", + # level=logging.DEBUG + # ) + c = ClxDriver() + if c.open(addr): + try: + v = c.read_tag(tag) + # print(v) + return v + except Exception: + err = c.get_status() + c.close() + # print err + # pass + c.close() + +def main(): + global PLC_IP_ADDRESS, today_tags, retry_attempts, retries_allowed try: - if c.open(PLC_IP_ADDRESS): - out_list = map(lambda i: {'name':i['name'], 'value':c.read_tag([i['tag']])[0][1]}, today_tags) - return {'status':'success', 'values':out_list} - # for i in today_tags: - # out_tags[i['name']] = c.read_tag([i['tag']])[0][1] - # return out_tags - - + readConfig() + outList = [] + for tag in today_tags: + outList.append({'name':tag['name'], 'value':readTag(PLC_IP_ADDRESS, tag['tag'])[0]}) + print outList + return outList except Exception, e: # print("FATAL ERROR: Communication Error connecting to the PLC... ", e) - return {'status':'error', 'message':e} + # traceback.print_exc() + retry_attempts = retry_attempts + 1 + if retry_attempts < retries_allowed: + main() + else: + print {'status':'error', 'message':e} + return {'status':'error', 'message':e} if __name__ == '__main__': - print main() + main()