diff --git a/POCloud/.vscode/settings.json b/POCloud/.vscode/settings.json new file mode 100644 index 0000000..8ad19d5 --- /dev/null +++ b/POCloud/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/usr/local/bin/python" +} \ No newline at end of file diff --git a/POCloud/poc.py b/POCloud/poc.py index 03cf16e..28366c1 100644 --- a/POCloud/poc.py +++ b/POCloud/poc.py @@ -4,37 +4,39 @@ import threading import time import pickle -from device_base import deviceBase import traceback + from pycomm.ab_comm.clx import Driver as ClxDriver from collections import deque +from device_base import deviceBase PLC_IP_ADDRESS = '192.168.1.10' def read_tag(addr, tag): - c = ClxDriver() - if c.open(addr): + """Read a tag from the PLC.""" + plc = ClxDriver() + if plc.open(addr): try: - v = c.read_tag(tag) + v = plc.read_tag(tag) # print(v) return v except Exception: - err = c.get_status() - c.close() + err = plc.get_status() + plc.close() print err - pass - c.close() + plc.close() def read_array(addr, tag, start, end): - c = ClxDriver() - if c.open(addr): + """Read an array from the PLC.""" + plc = ClxDriver() + if plc.open(addr): arr_vals = [] try: for i in range(start, end): tag_w_index = tag + "[{}]".format(i) - v = c.read_tag(tag_w_index) + v = plc.read_tag(tag_w_index) # print('{} - {}'.format(tag_w_index, v)) arr_vals.append(round(v[0], 4)) # print(v) @@ -44,50 +46,63 @@ def read_array(addr, tag, start, end): print("No length for {}".format(addr)) return False except Exception: - err = c.get_status() - c.close() + err = plc.get_status() + plc.close() print err - pass - c.close() + plc.close() def write_tag(addr, tag, val): - c = ClxDriver() - if c.open(addr): + """Write a tag to the PLC.""" + plc = ClxDriver() + if plc.open(addr): try: - # typ = getTagType(addr, tag) - cv = c.read_tag(tag) - wt = c.write_tag(tag, val, cv[1]) - # print(wt) + cv = plc.read_tag(tag) + wt = plc.write_tag(tag, val, cv[1]) return wt except Exception: - err = c.get_status() - c.close() + err = plc.get_status() + plc.close() print err - c.close() + plc.close() -class Card(): - global PLC_IP_ADDRESS +class Card(object): + """Card class definition.""" def __init__(self, unified_time): + """Initialize the Card.""" self.sc = [] self.dc = [] self.sent = False self.read_time = unified_time self.readCard() + self.card_id = 0 + self.num_points = 0 def readCard(self): + """Read the card data.""" self.card_id = read_tag(PLC_IP_ADDRESS, "Card_Past[1].ID")[0] self.num_points = int(read_tag(PLC_IP_ADDRESS, "Card_Past[1].Num_Points")[0]) print("reading {} from card ID {}".format(self.num_points, self.card_id)) if self.num_points > 1: + surf_pos = False + while not surf_pos: + surf_pos = read_array(PLC_IP_ADDRESS, 'Card_Past[1].Surface_Position', 1, self.num_points) + + surf_lod = False + while not surf_lod: + surf_lod = read_array(PLC_IP_ADDRESS, 'Card_Past[1].Surface_Load', 1, self.num_points) + + down_pos = False + while not down_pos: + down_pos = read_array(PLC_IP_ADDRESS, 'Card_Past[1].Downhole_Position', 1, self.num_points) + + down_lod = False + while not down_lod: + down_lod = read_array(PLC_IP_ADDRESS, 'Card_Past[1].Downhole_Load', 1, self.num_points) - surf_pos = read_array(PLC_IP_ADDRESS, 'Card_Past[1].Surface_Position', 1, self.num_points) - surf_lod = read_array(PLC_IP_ADDRESS, 'Card_Past[1].Surface_Load', 1, self.num_points) - down_pos = read_array(PLC_IP_ADDRESS, 'Card_Past[1].Downhole_Position', 1, self.num_points) - down_lod = read_array(PLC_IP_ADDRESS, 'Card_Past[1].Downhole_Load', 1, self.num_points) if surf_pos and surf_lod and down_pos and down_lod: for i in range(0, self.num_points-1): if not (surf_pos[i] == 0.0) and not (surf_lod[i] == 0.0): @@ -97,18 +112,33 @@ class Card(): return True else: print("couldn't get a full set of position/load pairs") + print("Here's what we got:") + print("SURFACE POS") + print(surf_pos) + print("SURFACE LOAD") + print(surf_lod) + print("DOWNHOLE POS") + print(down_pos) + print("DOWNHOLE LOAD") + print(down_lod) return False def stringify(self): ''' returns a list of two strings [surface card, downhole card]''' - sc_str = "[" - dc_str = "[" - for i in range(0, len(self.sc)): - sc_str = sc_str + "[{},{}],".format(self.sc[i][0], self.sc[i][1]) - sc_str = sc_str + "[{},{}]]".format(self.sc[0][0], self.sc[0][1]) - for j in range(0, len(self.dc)): - dc_str = dc_str + "[{},{}],".format(self.dc[j][0], self.dc[j][1]) - dc_str = dc_str + "[{},{}]]".format(self.dc[0][0], self.dc[0][1]) + # sc_str = "[" + # dc_str = "[" + # for i in range(0, len(self.sc)): + # this_sc_pair = self.sc[i] + # try: + # sc_str = sc_str + "[{},{}],".format(this_sc_pair[0], this_sc_pair[1]) + # except IndexError, e: + # print("IndexError: {}\nFor {}".format(e, this_sc_pair)) + + # for j in range(0, len(self.dc)): + # dc_str = dc_str + "[{},{}],".format(self.dc[j][0], self.dc[j][1]) + # dc_str = dc_str + "[{},{}]]".format(self.dc[0][0], self.dc[0][1]) + sc_str = str(self.sc) + dc_str = str(self.dc) return[sc_str, dc_str] @@ -119,17 +149,20 @@ class start(threading.Thread, deviceBase): deviceBase.__init__(self, name=name, number=number, mac=mac, Q=Q, mcu=mcu, companyId=companyId, offset=offset, mqtt=mqtt, Nodes=Nodes) self.daemon = True - self.forceSend = False - self.version = "4" - self.device_address = "http://192.168.1.30/" - self.cardLoopTimer = 600 + self.version = "5" self.finished = threading.Event() threading.Thread.start(self) + + self.forceSend = False + self.cardLoopTimer = 600 self.statusChanged = False self.al_status_last = False self.dl_status_last = False self.card_storage_limit = 5 self.last_card_sent_time = 0 + self.runLoopStatus = "" + self.eventIds = [] + self.wellSetup = [] # load stored event ID's try: @@ -137,22 +170,17 @@ class start(threading.Thread, deviceBase): self.eventIds = pickle.load(handle) print "found pickled eventID dictionary: {0}".format(self.eventIds) - except: + except Exception: print "couldn't load enent ID's from pickle" - self.eventIds = [] + # load stored wellconfig's try: with open('wellSetup.p', 'rb') as handle: self.wellSetup = pickle.load(handle) - print "Found pickled Well Setup (but it's going to be too long to print)" - # print self.wellConfig - except: + except Exception: print "couldn't load Well Setup from pickle" - self.wellSetup = [] - - self.sendtodbJSON("device_address", self.device_address, 0) # this is a required function for all drivers, its goal is to upload some piece of data # about your device so it can be seen on the web @@ -161,24 +189,27 @@ class start(threading.Thread, deviceBase): def run(self): - self.runLoopStatus = "" + wait_sec = 30 + for i in range(0, wait_sec): + print("poc driver will start in {} seconds".format(wait_sec - i)) + time.sleep(1) + + card_storage = deque([]) # array of the last x cards while True: if self.forceSend: - print "FORCE SEND: TRUE" + print("FORCE SEND: TRUE") try: self.statusChanged = False - runLoopStatus = "Reading Cards" + self.runLoopStatus = "Reading Cards" if len(card_storage) > 0: if not read_tag(PLC_IP_ADDRESS, "Card_Past[1].ID")[0] == card_storage[0].card_id: current_time = time.time() current_card = Card(current_time) - self.sendtodbJSON("card_history", current_card.card_id, current_time) + self.sendtodbDevJSON(1, "card_history", current_card.card_id, current_time, 'poc') if (current_card.read_time - self.last_card_sent_time) > self.cardLoopTimer or self.forceSend: cards = current_card.stringify() - # self.sendtodbJSON("sc", cards[0], current_time) - # self.sendtodbJSON("dc", cards[1], current_time) self.sendtodbDev(1, 'sc', cards[0], current_time, "poc") self.sendtodbDev(1, 'dc', cards[1], current_time, "poc") self.last_card_sent_time = time.time() @@ -190,40 +221,32 @@ class start(threading.Thread, deviceBase): for c in card_storage: if not c.sent: cstr = c.stringify() - # self.sendtodbJSON("sc", cstr[0], c.read_time) - # self.sendtodbJSON("dc", cstr[1], c.read_time) self.sendtodbDev(1, 'sc', cstr[0], c.read_time, "poc") self.sendtodbDev(1, 'dc', cstr[1], c.read_time, "poc") self.last_card_sent_time = time.time() else: current_time = time.time() current_card = Card(current_time) - self.sendtodbJSON("card_history", current_card.card_id, current_time) + self.sendtodbDevJSON(1, "card_history", current_card.card_id, current_time, 'poc') if (current_card.read_time - self.last_card_sent_time) > self.cardLoopTimer or self.forceSend: cards = current_card.stringify() - # self.sendtodbJSON("sc", cards[0], current_time) - # self.sendtodbJSON("dc", cards[1], current_time) self.sendtodbDev(1, 'sc', cards[0], current_time, "poc") self.sendtodbDev(1, 'dc', cards[1], current_time, "poc") self.last_card_sent_time = time.time() current_card.sent = True card_storage.appendleft(current_card) - runLoopStatus = "Complete" + self.runLoopStatus = "Complete" time.sleep(3) self.forceSend = False except Exception, e: sleep_timer = 20 - print("Error during {0} of run loop: {1}\nWill try again in {2} seconds...".format(runLoopStatus, e, sleep_timer)) + print("Error during {0} of run loop: {1}\nWill try again in {2} seconds...".format(self.runLoopStatus, e, sleep_timer)) traceback.print_exc() time.sleep(sleep_timer) def poc_sync(self, name, value): - self.sendtodb("connected", "true", 0) - return True - - def poc_set_address(self, name, value): - self.device_address = value + self.sendtodb(1, "connected", "true", 0, 'poc') return True def poc_refresh_data(self, name, value): diff --git a/VFD/POC VFD/POC VFD.v12.ccwsuo b/VFD/POC VFD/POC VFD.v12.ccwsuo index 8a26648..84cae32 100644 Binary files a/VFD/POC VFD/POC VFD.v12.ccwsuo and b/VFD/POC VFD/POC VFD.v12.ccwsuo differ