diff --git a/EthernetIP/artifacts/hp.greengrass.EthernetIP/1.1.0/EthernetIP.py b/EthernetIP/artifacts/hp.greengrass.EthernetIP/1.1.0/EthernetIP.py index a111e3e..75a483a 100644 --- a/EthernetIP/artifacts/hp.greengrass.EthernetIP/1.1.0/EthernetIP.py +++ b/EthernetIP/artifacts/hp.greengrass.EthernetIP/1.1.0/EthernetIP.py @@ -56,7 +56,7 @@ def sendData(data,property_alias): time_in_nanos = TimeInNanos( time_in_seconds=calendar.timegm(time.gmtime()) - random.randint(0, 60), offset_in_nanos=random.randint(0, 10000) ) - variant = Variant(double_value=data.value) + variant = Variant(double_value=data) asset = [AssetPropertyValue(value=variant, quality=Quality.GOOD, timestamp=time_in_nanos)] valueEntry = PutAssetPropertyValueEntry(entry_id=str(uuid.uuid4()), property_alias=property_alias, property_values=asset) client.append_message(stream_name, Util.validate_and_serialize_to_json_bytes(valueEntry)) @@ -66,11 +66,11 @@ def sendData(data,property_alias): return False -def sendCheck(data, device): - last_send_time = config["devices"][device]['tag_data'][data.tag]['last_send_time'] - guaranteed_send_time = config["devices"][device]['tag_data'][data.tag]['guaranteed_send_seconds'] - last_send_value = config["devices"][device]['tag_data'][data.tag]['last_send_value'] - change_threshold = config["devices"][device]['tag_data'][data.tag]['change_threshold'] +def sendCheckDevice(data, group, device): + last_send_time = config[group]["devices"][device]['tag_data'][data.tag]['last_send_time'] + guaranteed_send_time = config[group]["devices"][device]['tag_data'][data.tag]['guaranteed_send_seconds'] + last_send_value = config[group]["devices"][device]['tag_data'][data.tag]['last_send_value'] + change_threshold = config[group]["devices"][device]['tag_data'][data.tag]['change_threshold'] if last_send_time == None: return True @@ -83,6 +83,23 @@ def sendCheck(data, device): else: return False +def sendCheckFunction(data,group, func): + last_send_time = config[group]["functions"][func]['last_send_time'] + guaranteed_send_time = config[group]["functions"][func]['guaranteed_send_seconds'] + last_send_value = config[group]["functions"][func]['last_send_value'] + change_threshold = config[group]["functions"][func]['change_threshold'] + + if last_send_time == None: + return True + elif time.time() - last_send_time >= guaranteed_send_time: + return True + elif last_send_value == None: + return True + elif abs(data - last_send_value) >= change_threshold: + return True + else: + return False + def sum(operands:list): return math.fsum(operands) @@ -131,50 +148,53 @@ except ConnectionError or asyncio.TimeoutError: #Main Polling Loop while(True): - values = {} - for device in config["devices"].keys(): - plc_address = config["devices"][device]['source_address'] - tag_data = list(config["devices"][device]['tag_data'].keys()) - if len(tag_data) > 1: - try: - response = read_multiple(plc_address,tag_data) - logging.info(f"Got back: {response}") - for tag in response: - if tag.tag in values.keys(): - values[tag.tag].append(tag.value) + for group in config.keys(): + values = {} + for device in config[group]["devices"].keys(): + plc_address = config[group]["devices"][device]['source_address'] + tag_data = list(config[group]["devices"][device]['tag_data'].keys()) + if len(tag_data) > 1: + try: + response = read_multiple(plc_address,tag_data) + logging.info(f"Got back: {response}") + for tag in response: + #logging.info(f"Processing: {tag.tag}") + if tag.tag in values.keys(): + values[tag.tag].append(tag.value) + else: + values[tag.tag] = [tag.value] + #logging.info(f"Values: {values}") + if sendCheckDevice(tag, group, device): + sendDataResp = sendData(tag.value, config[group]["devices"][device]['tag_data'][tag.tag]['property_alias']) + if sendDataResp: + config[group]["devices"][device]['tag_data'][tag.tag]['last_send_value'] = tag.value + config[group]["devices"][device]['tag_data'][tag.tag]['last_send_time'] = sendDataResp + except Exception as e: + logging.error(e) + else: + try: + response = read_single(plc_address,tag_data[0]) + logging.info(f"Got back: {response}") + if response.tag in values.keys(): + values[response.tag].append(response.value) else: - values[tag.tag] = [tag.value] - if sendCheck(tag, device): - sendDataResp = sendData(tag, config["devices"][device]['tag_data'][response.tag]['property_alias']) + values[response.tag] = [response.value] + if sendCheckDevice(response, group, device): + sendDataResp = sendData(response.value, config[group]["devices"][device]['tag_data'][response.tag]['property_alias']) if sendDataResp: - config["devices"][device]['tag_data'][response.tag]['last_send_value'] = response.value - config["devices"][device]['tag_data'][response.tag]['last_send_time'] = sendDataResp - except Exception as e: - logging.error(e) - else: - try: - response = read_single(plc_address,tag_data[0]) - logging.info(f"Got back: {response}") - if response.tag in values.keys(): - values[response.tag].append(response.value) - else: - values[response.tag] = [response.value] - if sendCheck(response, device): - sendDataResp = sendData(response, config["devices"][device]['tag_data'][response.tag]['property_alias']) - if sendDataResp: - config["devices"][device]['tag_data'][response.tag]['last_send_value'] = response.value - config["devices"][device]['tag_data'][response.tag]['last_send_time'] = sendDataResp - except Exception as e: - logging.error(e) - for func in config["functions"].keys(): - operands = [] - for x in func["operands"]: - operands = operands + values[x] - value = operations[func["operation"]](operands) - #if sendCheck(response, device): - sendDataResp = sendData(value, config["functions"][func]["property_alias"]) - if sendDataResp: - config["functions"][func]["last_send_value"] = value - config["fucntions"][func]["last_send_time"] = sendDataResp + config[group]["devices"][device]['tag_data'][response.tag]['last_send_value'] = response.value + config[group]["devices"][device]['tag_data'][response.tag]['last_send_time'] = sendDataResp + except Exception as e: + logging.error(e) + for func in config[group]["functions"].keys(): + operands = [] + for x in config[group]["functions"][func]["operands"]: + operands = operands + values[x] + value = operations[config[group]["functions"][func]["operation"]](operands) + if sendCheckFunction(value, group, func): + sendDataResp = sendData(value, config[group]["functions"][func]["property_alias"]) + if sendDataResp: + config[group]["functions"][func]["last_send_value"] = value + config[group]["functions"][func]["last_send_time"] = sendDataResp time.sleep(5)