#!/usr/bin/env python ''' Tag Logger Created on April 7, 2016 @author: Patrick McDonagh @description: Continuously loops through a list of tags to store values from a PLC ''' import traceback import time import json import requests from pycomm_helper.tag import Tag # DEFAULTS db_address = "10.10.10.10:3000" db_url = "https://{}".format(db_address) scan_rate = 30 # seconds save_all = "test" # use True, False, or any string plc_handshake_tags = {} last_handshake_time = 0 tag_store = {} device_types = {} def main(): global db_address, scan_rate, save_all, tag_store, device_types, plc_handshake_tags, last_handshake_time try: # Get tags stored in database get_tag_request_data = {'where': '{"tag_class": 5}'} get_tag_request = requests.get('{}/tag'.format(db_url), params=get_tag_request_data, verify=False) tags = json.loads(get_tag_request.text) except Exception as e: print("Error getting tags: {}".format(e)) time.sleep(10) main() try: # Get tags stored in database get_device_type_request = requests.get('{}/device_type'.format(db_url), verify=False) device_types_json = json.loads(get_device_type_request.text) for t in device_types_json: device_types[t['id']] = t['dType'] except Exception as e: print("Error getting tags: {}".format(e)) time.sleep(10) main() try: sr_req_data = 'where={"parameter": "scan_rate"}' sr_req = requests.get('{}/config?{}'.format(db_url, sr_req_data), verify=False) sr_try = json.loads(sr_req.text) if len(sr_try) > 0: scan_rate = int(sr_try[0]['val']) except Exception as e: print("Error getting scan rate: {}".format(e)) print("I'll just use {} seconds as the scan rate...".format(scan_rate)) try: sa_req_data = {"where": {"parameter": "save_all"}} sa_req = requests.get('{}/config'.format(db_url), params=sa_req_data, verify=False) sa_try = json.loads(sa_req.text) if len(sa_try) > 0: if sa_try[0]['val'].lower() == "true": save_all = True elif sa_try[0]['val'].lower() == "false": save_all = False except Exception as e: print("Error getting save-all: {}".format(e)) print("I'll just use {} as the save-all parameter...".format(save_all)) try: # Get tags stored in database get_hs_request_data = {'where': '{"tag_class": 6}'} get_hs_request = requests.get('{}/tag'.format(db_url), params=get_hs_request_data, verify=False) hs_tags = json.loads(get_hs_request.text) if len(hs_tags) > 0: for hs in hs_tags: plc_handshake_tags[hs['name']] = Tag(hs['name'], hs['tag'], hs['id'], hs['data_type'], hs['change_threshold'], hs['guarantee_sec'], mapFn=hs['map_function'], ip_address=hs['deviceID']['address'], device_type=device_types[hs['deviceID']['device_type']]) except Exception as e: print("Error getting handshake tags: {}".format(e)) for t in tags: # name, tag, db_id, data_type, change_threshold, guarantee_sec, mapFn=None, device_type='CLX', ip_address='192.168.1.10'): tag_store[t['name']] = Tag(t['name'], t['tag'], t['id'], t['data_type'], t['change_threshold'], t['guarantee_sec'], mapFn=t['map_function'], ip_address=t['deviceID']['address'], device_type=device_types[t['deviceID']['device_type']], db_address=db_address) while True: for tag in tag_store: try: tag_store[tag].read('test') except: print("ERROR EVALUATING {}".format(tag)) traceback.print_exc() if plc_handshake_tags: if time.time() - last_handshake_time > 30.0: for hs_tag in plc_handshake_tags: plc_handshake_tags[hs_tag].write(1) print("Handshake with {} - {}".format(plc_handshake_tags[hs_tag].address, hs_tag)) last_handshake_time = time.time() time.sleep(scan_rate) if __name__ == '__main__': main()