#! /usr/bin/python from datetime import datetime import time import mysql.connector as mysqlcon from pycomm.ab_comm.clx import Driver as ClxDriver import micro800 as u800 import traceback import pickle with open('mysql_cfg.pickle', 'rb') as cfgFile: mysql_cfg = pickle.load(cfgFile) con = mysqlcon.connect(**mysql_cfg) PLC_IP_ADDRESS = "10.10.10.3" def readTag(addr, tag): time.sleep(0.01) c = ClxDriver() if c.open(addr): try: v = c.read_tag(tag) # print(v) return v except Exception: print("ERROR RETRIEVING TAG: {}".format(tag)) err = c.get_status() c.close() print traceback.print_exc() pass c.close() class Tag(): global readTag, con, PLC_IP_ADDRESS def __init__(self, name, tag, data_type, change_threshold, guarantee_sec, mapFn=None, plc_type='CLX'): self.name = str(name) self.tag = str(tag) self.data_type = str(data_type) self.value = None self.last_value = None self.guarantee_sec = guarantee_sec self.chg_threshold = change_threshold self.last_send_time = 0 self.mapFn = mapFn self.plc_type = plc_type self.readFn = readTag if self.plc_type == "u800": self.readFn = u800.readTag def read(self, forceSend): writeToDB = False if self.tag: v = self.readFn(PLC_IP_ADDRESS, self.tag) if v: if self.data_type == 'BOOL' or self.data_type == 'STRING': val = v[0] if self.mapFn: val = self.mapFn[val] if (self.last_send_time == 0) or (self.value is None) or not (self.value == val) or ((time.time() - self.last_send_time) > self.guarantee_sec) or (forceSend): self.last_value = self.value self.value = val writeToDB = True else: writeToDB = False else: if (self.last_send_time == 0) or (self.value is None) or (abs(self.value - v[0]) > self.chg_threshold) or ((time.time() - self.last_send_time) > self.guarantee_sec) or (forceSend): self.last_value = self.value self.value = v[0] writeToDB = True else: writeToDB = False if writeToDB: self.sendToDB() def sendToDB(self): # TODO: Datetime query = "INSERT INTO poconsole.tag_vals (dtime, name, val) VALUES ('{}', '{}', {})".format(time.strftime('%Y-%m-%d %H:%M:%S'), self.name, self.value) self.last_send_time = time.time() print query # TODO: CHECK ON THIS LOGIC -- with con: con.connect() cur = con.cursor() cur.execute(query) con.commit() cur.close()