Diff of /trunk/mqttsparkplugb/mqttsparkplugb/SparkplugB/Function Blocks/FB_Edge_Of_Network_Node/FB_Edge_Of_Network_Node/onNCMDMessage/svnobj [r540] .. [r541]  Maximize  Restore

Switch to side-by-side view

--- a/trunk/mqttsparkplugb/mqttsparkplugb/SparkplugB/Function Blocks/FB_Edge_Of_Network_Node/FB_Edge_Of_Network_Node/onNCMDMessage/svnobj
+++ b/trunk/mqttsparkplugb/mqttsparkplugb/SparkplugB/Function Blocks/FB_Edge_Of_Network_Node/FB_Edge_Of_Network_Node/onNCMDMessage/svnobj
@@ -1,145 +1,311 @@
-Gx_l@!0…jüo&3X*šªA
˜µI»System.StringL{f8a58466-d7f6-439f-bbb8-d4600e41d099}ImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocumentL{f3878285-8e4f-490b-bb1b-9acbb7eb04db}TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}	Id
-longTagText
.onNCMDMessage := FALSE;TpMessage.GetFirstMetric(name=> MetricName,‚						datatype=> , //don't care yet, for now it has to be booleanB						timestamp=> ,  //don't care,						valueString=> , *						valueLreal=> , (						valueReal=> , B						valueVarInt=> MetricValue, B						MetricValid=> MetricValid, –						HasNext=> );  //don't care yet, for now only interested in one metric						R//pMessage.GetNextMetric don't care todayD//pMessage.GetSeq don't care todayP//pMessage.GetTimestamp don't care todayìWriteDeviceLog( UDINT_TO_DWORD(CmpLog.LogClass.LOG_INFO), 'EoN NCMD Received Topic: %s', WSTRING_TO_STRING(pTopic^) );´IF MetricValid AND_THEN (MetricName = "Node Control/Rebirth" AND MetricValue.Boolean) THENh	//We have found that the server wants us to rebirth"	Rebirth := TRUE; ”	WriteDeviceLog( UDINT_TO_DWORD(CmpLog.LogClass.LOG_INFO), 'EoN NCMD Received is a Rebirth Command: %s', TO_STRING(MetricValue.Boolean) );!ELSE"$	Rebirth := FALSE;#END_IF$,onNCMDMessage := TRUE;%P//print("Message arrived: " + msg.topic)&>//tokens = msg.topic.split("/")'//(ˆ//IF tokens[0] == "spBv1.0" AND tokens[1] == myGroupId AND (tokens[2] == "NCMD" OR tokens[2] == "DCMD") AND tokens[3] == myNodeName:)`//    inboundPayload = sparkplug_b_pb2.Payload()*b//    inboundPayload.ParseFromString(msg.payload)+V//    for metric in inboundPayload.metrics:,¾//        if metric.name == "Node Control/Next Server" or metric.alias == AliasMap.Next_Server:-Æ//            # 'Node Control/Next Server' is an NCMD used to tell the device/client application to.Ä//            # disconnect from the current MQTT server and connect to the next MQTT server in the/Ê//            # list of available servers.  This is used for clients that have a pool of MQTT servers0<//            # to connect to.1–//    print "'Node Control/Next Server' is not implemented in this example"2²//        elif metric.name == "Node Control/Rebirth" or metric.alias == AliasMap.Rebirth:3Ì//            # 'Node Control/Rebirth' is an NCMD used to tell the device/client application to resend4Ê//            # its full NBIRTH and DBIRTH again.  MQTT Engine will send this NCMD to a device/client5Ð//            # application if it receives an NDATA or DDATA with a metric that was not published in the6Ì//            # original NBIRTH or DBIRTH.  This is why the application must send all known metrics in7p//            # its original NBIRTH and DBIRTH messages.88//            publishBirth()9®//        elif metric.name == "Node Control/Reboot" or metric.alias == AliasMap.Reboot::Æ//            # 'Node Control/Reboot' is an NCMD used to tell a device/client application to reboot;Ä//            # This can be used for devices that need a full application reset via a soft reboot.<À//            # In this case, we fake a full reboot with a republishing of the NBIRTH and DBIRTH=2//            # messages.>Â//        elif metric.name == "output/Device Metric2" or metric.alias == AliasMap.Device_Metric2:?Â//            # This is a metric we declared in our DBIRTH message and we're emulating an output.@Ä//            # So, on incoming 'writes' to the output we must publish a DDATA with the new outputAÂ//            # value.  If this were a real output we'd write to the output and then read it backBd//            # before publishing a DDATA message.C¨//            # We know this is an Int16 because of how we declated it in the DBIRTHDR//            newValue = metric.int_valueE¸//            print "CMD message for output/Device Metric2 - New Value: {}".format(newValue)F¬//            # Create the DDATA payload - Use the alias because this isn't the DBIRTHGf//            payload = sparkplug.getDdataPayload()H¾//            addMetric(payload, None, AliasMap.Device_Metric2, MetricDataType.Int16, newValue)IL//            # Publish a message dataJ€//            byteArray = bytearray(payload.SerializeToString())Kî//            client.publish("spBv1.0/" + myGroupId + "/DDATA/" + myNodeName + "/" + myDeviceName, byteArray, 0, False)LÂ//        elif metric.name == "output/Device Metric3" or metric.alias == AliasMap.Device_Metric3:M¬//            # We know this is an Boolean because of how we declated it in the DBIRTHNZ//            newValue = metric.boolean_valueO¬//            print "CMD message for output/Device Metric3 - New Value: %r" % newValueP¬//            # Create the DDATA payload - use the alias because this isn't the DBIRTHQÂ//            addMetric(payload, None, AliasMap.Device_Metric3, MetricDataType.Boolean, newValue)R//        else:Sj//            print "Unknown command: " + metric.nameT//else:U@//    print "Unknown command..."V2//print "Done publishing"WInterfaceXL{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}Y(*Z 	At the moment, this only supports the one specific metric, Node Control/Rebirth[.    Node Command (NCMD)\    ]Ê    NCMD messages are used by backend applications to write to EoN node outputs and send Node Control^ª    commands to EoN nodes. Multiple metrics can be supplied in a single NCMD message._˜    The following is a representation of a simple NCMD message on the topic:`l        spBv1.0/Sparkplug"! B Devices/NCMD/Raspberry Pia„        "    The  Group ID  of this device is: Sparkplug"! B Devicesbˆ        "    The host  EoN node ID  of this EoN node is: Raspberry Picd        "    This is an NCMD message to an EoN noded     Consider the following Sparkplug"! B payload in the NCMD message shown above:e
-    {fF        "timestamp": 1486144502122,g*        "metrics": [{h^                "name": "Node Control/Rebirth",iV                "timestamp": 1486144502122,jL                "dataType": "Boolean",k:                "value": truel         }]m
-    }nâ    This NCMD payload tells the EoN node to republish its NBIRTH and DBIRTH(s) messages. This can be requested ifoä    a backend application gets an out of order seq number or if a metric arrives in an NDATA or DDATA message thatp~    was not provided in the original NBIRTH or DBIRTH messages.q*)r${attribute 'hide'}sFMETHOD PRIVATE onNCMDMessage : BOOLtVAR_INPUTuö	pTopic : POINTER TO WSTRING(Constants.supported_string_lengths); // resembles the topic under which the message is posted vEND_VARwVAR_IN_OUTx€	pMessage : FB_PayloadSimpleDecoder; //should already be decodedyVAR_OUTPUTz 	Rebirth : BOOL;{VAR|t	MetricName : WSTRING(Constants.supported_string_lengths);}(	MetricValid : BOOL;~:	MetricValue : DecodedVarInt;ÐÐÐE\ÐÐ	
-­ÚÐ-
ÐÐ	
-­‘ÚÐ-ÐÐ	
-­’ÚÐ-ÐÐ	
-­“ÚÐ-ÐÐ	
-­”ÚÐ-ÐÐ	
-­•ÚÐ-ÐÐ	
-­–ÚÐ-ÐÐ	
-­—ÚÐ-ÐÐ	
-­˜ÚÐ-ÐÐ	
-­™ÚÐ-ÐÐ	
-­šÚÐ-ÐÐ	
-­›ÚÐ-ÐÐ	
-­œÚÐ-ÐÐ	
-­ÚÐ-ÐÐ	
-­žÚÐ-ÐÐ	
-­ŸÚÐ-ÐÐ	
-­ ÚÐ-ÐÐ	
-­¡ÚÐ-ÐÐ	
-­¢ÚÐ-ÐÐ	
-­£ÚÐ- ÐÐ	
-­¤ÚÐ-!ÐÐ	
-­¥ÚÐ-"ÐÐ	
-­¦ÚÐ-#ÐÐ	
-­§ÚÐ-$ÐÐ	
-­¨ÚÐ-ÐÐ	
-­©ÚÐ-ÐÐ	
-­ªÚÐ-%ÐÐ	
-­«ÚÐ-&ÐÐ	
-­¬ÚÐ-'ÐÐ	
-­­ÚÐ-(ÐÐ	
-­®ÚÐ-)ÐÐ	
-­¯ÚÐ-*ÐÐ	
-­°ÚÐ-+ÐÐ	
-­±ÚÐ-,ÐÐ	
-­²ÚÐ--ÐÐ	
-­³ÚÐ-.ÐÐ	
-­´ÚÐ-/ÐÐ	
-­µÚÐ-0ÐÐ	
-­¶ÚÐ-1ÐÐ	
-­·ÚÐ-2ÐÐ	
-­¸ÚÐ-3ÐÐ	
-­¹ÚÐ-4ÐÐ	
-­ºÚÐ-5ÐÐ	
-­»ÚÐ-6ÐÐ	
-­¼ÚÐ-7ÐÐ	
-­½ÚÐ-8ÐÐ	
-­¾ÚÐ-9ÐÐ	
-­¿ÚÐ-:ÐÐ	
-­ÀÚÐ-;ÐÐ	
-­ÁÚÐ-<ÐÐ	
-­ÂÚÐ-=ÐÐ	
-­ÃÚÐ-8ÐÐ	
-­ÄÚÐ->ÐÐ	
-­ÅÚÐ-?ÐÐ	
-­ÆÚÐ-@ÐÐ	
-­ÇÚÐ-AÐÐ	
-­ÈÚÐ-BÐÐ	
-­ÉÚÐ-'ÐÐ	
-­ÊÚÐ-CÐÐ	
-­ËÚÐ-DÐÐ	
-­ÌÚÐ-EÐÐ	
-­ÍÚÐ-'ÐÐ	
-­ÎÚÐ-FÐÐ	
-­ÏÚÐ-GÐÐ	
-­ÐÚÐ-HÐÐ	
-­ÑÚÐ-'ÐÐ	
-­ÒÚÐ-IÐÐ	
-­ÓÚÐ-JÐÐ	
-­ÔÚÐ-KÐÐ	
-­ÕÚÐ-LÐÐ	
-­ÖÚÐ-?ÐÐ	
-­×ÚÐ-@ÐÐ	
-­ØÚÐ-AÐÐ	
-­ÙÚÐ-BÐÐ	
-­ÚÚÐ-'ÐÐ	
-­ÛÚÐ-MÐÐ	
-­ÜÚÐ-NÐÐ	
-­ÝÚÐ-OÐÐ	
-­ÞÚÐ-'ÐÐ	
-­ßÚÐ-PÐÐ	
-­àÚÐ-GÐÐ	
-­áÚÐ-QÐÐ	
-­âÚÐ-'ÐÐ	
-­ãÚÐ-IÐÐ	
-­äÚÐ-JÐÐ	
-­åÚÐ-KÐÐ	
-­æÚÐ-RÐÐ	
-­çÚÐ-SÐÐ	
-­èÚÐ-TÐÐ	
-­éÚÐ-UÐÐ	
-­êÚÐ-'ÐÐ	
-­ÚÐ-VÐWXÐE0ÐÐ	
-­	ÚÐ-YÐÐ	
+Gx_lÁs!0…jüoV;ëÙ·
+Tým|System.StringL{f8a58466-d7f6-439f-bbb8-d4600e41d099}ImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocumentL{f3878285-8e4f-490b-bb1b-9acbb7eb04db}TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}	Id
+longTagText
F//note: pMessage is already decoded.onNCMDMessage := FALSE;&//get first messageTpMessage.GetFirstMetric(name=> MetricName,6						datatype=> datatype, B						timestamp=> ,  //don't careN						valueString=> MetricValueString, J						valueLreal=> MetricValueLreal, F						valueReal=> MetricValueReal, N						valueVarInt=> MetricValueVarInt, B						MetricValid=> MetricValid, 2						HasNext=> HasNext);						ÎREPEAT  //process the metric and grab the next metric until there are no more metrics (hasnext = FALSE)(	IF MetricValid THEN$		CASE datatype OF2    	MetricDataType.Int8:º			FOR i := LOWER_BOUND(THIS^.arSparkplugInt8, 1) TO UPPER_BOUND(THIS^.arSparkplugInt8, 1) DO `				IF MetricName = arSparkplugInt8[i].Name THEN!p					arSparkplugInt8[i].Value := MetricValueVarInt.Int8;"				END_IF#			END_FOR;$4    	MetricDataType.Int16:%¾			FOR i := LOWER_BOUND(THIS^.arSparkplugInt16, 1) TO UPPER_BOUND(THIS^.arSparkplugInt16, 1) DO&b				IF MetricName = arSparkplugInt16[i].Name THEN't					arSparkplugInt16[i].Value := MetricValueVarInt.Int16;(¸			// because cirrus Link MQTT Engine returns the ignition data type not the NBIRTH datatype)¾			FOR i := LOWER_BOUND(THIS^.arSparkplugUInt8, 1) TO UPPER_BOUND(THIS^.arSparkplugUInt8, 1) DO*b				IF MetricName = arSparkplugUInt8[i].Name THEN+t					arSparkplugUInt8[i].Value := MetricValueVarInt.UInt8;,4    	MetricDataType.Int32:-¾			FOR i := LOWER_BOUND(THIS^.arSparkplugInt32, 1) TO UPPER_BOUND(THIS^.arSparkplugInt32, 1) DO.b				IF MetricName = arSparkplugInt32[i].Name THEN/t					arSparkplugInt32[i].Value := MetricValueVarInt.Int32;0Â			FOR i := LOWER_BOUND(THIS^.arSparkplugUInt16, 1) TO UPPER_BOUND(THIS^.arSparkplugUInt16, 1) DO1d				IF MetricName = arSparkplugUInt16[i].Name THEN2x					arSparkplugUInt16[i].Value := MetricValueVarInt.UInt16;34    	MetricDataType.Int64:4¾			FOR i := LOWER_BOUND(THIS^.arSparkplugInt64, 1) TO UPPER_BOUND(THIS^.arSparkplugInt64, 1) DO5b				IF MetricName = arSparkplugInt64[i].Name THEN6t					arSparkplugInt64[i].Value := MetricValueVarInt.Int64;7Â			FOR i := LOWER_BOUND(THIS^.arSparkplugUInt32, 1) TO UPPER_BOUND(THIS^.arSparkplugUInt32, 1) DO8d				IF MetricName = arSparkplugUInt32[i].Name THEN9x					arSparkplugUInt32[i].Value := MetricValueVarInt.UInt32;:¾    		// because cirrus Link MQTT Engine returns the ignition data type not the NBIRTH datatype;Â			FOR i := LOWER_BOUND(THIS^.arSparkplugUint64, 1) TO UPPER_BOUND(THIS^.arSparkplugUint64, 1) DO<d				IF MetricName = arSparkplugUint64[i].Name THEN=x					arSparkplugUint64[i].Value := MetricValueVarInt.Uint64;>4    	MetricDataType.UInt8:?6    	MetricDataType.UInt16:@6    	MetricDataType.UInt32:A6    	MetricDataType.UInt64:B4    	MetricDataType.Float:C¾			FOR i := LOWER_BOUND(THIS^.arSparkplugFloat, 1) TO UPPER_BOUND(THIS^.arSparkplugFloat, 1) DODb				IF MetricName = arSparkplugFloat[i].Name THENEd					arSparkplugFloat[i].Value := MetricValueReal;F6    	MetricDataType.Double:GÂ			FOR i := LOWER_BOUND(THIS^.arSparkplugDouble, 1) TO UPPER_BOUND(THIS^.arSparkplugDouble, 1) DOHd				IF MetricName = arSparkplugDouble[i].Name THENIh					arSparkplugDouble[i].Value := MetricValueLreal;J8    	MetricDataType.Boolean:KN			//Special place for handling RebirthL`			IF (MetricName = "Node Control/Rebirth") THENMn				//We have found that the server wants us to rebirthN(				Rebirth := TRUE;O¦				WriteDeviceLog( UDINT_TO_DWORD(CmpLog.LogClass.LOG_INFO), 'EoN NCMD Received is a Rebirth Command: %s', TO_STRING(MetricValueVarInt.Boolean) );P			END_IFQJ			//normal place for normal booleansRÆ			FOR i := LOWER_BOUND(THIS^.arSparkplugBoolean, 1) TO UPPER_BOUND(THIS^.arSparkplugBoolean, 1) DOSf				IF MetricName = arSparkplugBoolean[i].Name THENT|					arSparkplugBoolean[i].Value := MetricValueVarInt.Boolean;U8    	MetricDataType.String_:VÂ			FOR i := LOWER_BOUND(THIS^.arSparkplugString, 1) TO UPPER_BOUND(THIS^.arSparkplugString, 1) DOWd				IF MetricName = arSparkplugString[i].Name THENXj					arSparkplugString[i].Value := MetricValueString;Yº			FOR i := LOWER_BOUND(THIS^.arSparkplugText, 1) TO UPPER_BOUND(THIS^.arSparkplugText, 1) DOZ`				IF MetricName = arSparkplugText[i].Name THEN[f					arSparkplugText[i].Value := MetricValueString;\º			FOR i := LOWER_BOUND(THIS^.arSparkplugUUID, 1) TO UPPER_BOUND(THIS^.arSparkplugUUID, 1) DO]`				IF MetricName = arSparkplugUUID[i].Name THEN^f					arSparkplugUUID[i].Value := MetricValueString;_:    	MetricDataType.DateTime:`Ê			FOR i := LOWER_BOUND(THIS^.arSparkplugDateTime, 1) TO UPPER_BOUND(THIS^.arSparkplugDateTime, 1) DOah				IF MetricName = arSparkplugDateTime[i].Name THENb†					arSparkplugDateTime[i].Value := MetricValueVarInt.uliDateTime;c2    	MetricDataType.Text:d2    	MetricDataType.UUID:e2		MetricDataType.Unknown,f8    	MetricDataType.DataSet,g4    	MetricDataType.Bytes,h2    	MetricDataType.File,i:    	MetricDataType.Template:jj			;//maybe a log message? in any case, do nothing.  kÀ			//It might be posible that someone sends a NCMD without a datatype but that would be so weirdl		ELSEm			;n		END_CASEo	END_IFp	q,	//get the next metricrT	pMessage.GetNextMetric(name=> MetricName,s*UNTIL HasNext = FALSEtEND_REPEAT;uR//pMessage.GetNextMetric don't care todayvD//pMessage.GetSeq don't care todaywP//pMessage.GetTimestamp don't care todayxìWriteDeviceLog( UDINT_TO_DWORD(CmpLog.LogClass.LOG_INFO), 'EoN NCMD Received Topic: %s', WSTRING_TO_STRING(pTopic^) );y,onNCMDMessage := TRUE;zP//print("Message arrived: " + msg.topic){>//tokens = msg.topic.split("/")|//}ˆ//IF tokens[0] == "spBv1.0" AND tokens[1] == myGroupId AND (tokens[2] == "NCMD" OR tokens[2] == "DCMD") AND tokens[3] == myNodeName:~`//    inboundPayload = sparkplug_b_pb2.Payload()b//    inboundPayload.ParseFromString(msg.payload)€V//    for metric in inboundPayload.metrics:¾//        if metric.name == "Node Control/Next Server" or metric.alias == AliasMap.Next_Server:‚Æ//            # 'Node Control/Next Server' is an NCMD used to tell the device/client application toƒÄ//            # disconnect from the current MQTT server and connect to the next MQTT server in the„Ê//            # list of available servers.  This is used for clients that have a pool of MQTT servers…<//            # to connect to.†–//    print "'Node Control/Next Server' is not implemented in this example"‡²//        elif metric.name == "Node Control/Rebirth" or metric.alias == AliasMap.Rebirth:ˆÌ//            # 'Node Control/Rebirth' is an NCMD used to tell the device/client application to resend‰Ê//            # its full NBIRTH and DBIRTH again.  MQTT Engine will send this NCMD to a device/clientŠÐ//            # application if it receives an NDATA or DDATA with a metric that was not published in the‹Ì//            # original NBIRTH or DBIRTH.  This is why the application must send all known metrics inŒp//            # its original NBIRTH and DBIRTH messages.8//            publishBirth()Ž®//        elif metric.name == "Node Control/Reboot" or metric.alias == AliasMap.Reboot:Æ//            # 'Node Control/Reboot' is an NCMD used to tell a device/client application to rebootÄ//            # This can be used for devices that need a full application reset via a soft reboot.‘À//            # In this case, we fake a full reboot with a republishing of the NBIRTH and DBIRTH’2//            # messages.“Â//        elif metric.name == "output/Device Metric2" or metric.alias == AliasMap.Device_Metric2:”Â//            # This is a metric we declared in our DBIRTH message and we're emulating an output.•Ä//            # So, on incoming 'writes' to the output we must publish a DDATA with the new output–Â//            # value.  If this were a real output we'd write to the output and then read it back—d//            # before publishing a DDATA message.˜¨//            # We know this is an Int16 because of how we declated it in the DBIRTH™R//            newValue = metric.int_valueš¸//            print "CMD message for output/Device Metric2 - New Value: {}".format(newValue)›¬//            # Create the DDATA payload - Use the alias because this isn't the DBIRTHœf//            payload = sparkplug.getDdataPayload()¾//            addMetric(payload, None, AliasMap.Device_Metric2, MetricDataType.Int16, newValue)žL//            # Publish a message dataŸ€//            byteArray = bytearray(payload.SerializeToString()) î//            client.publish("spBv1.0/" + myGroupId + "/DDATA/" + myNodeName + "/" + myDeviceName, byteArray, 0, False)¡Â//        elif metric.name == "output/Device Metric3" or metric.alias == AliasMap.Device_Metric3:¢¬//            # We know this is an Boolean because of how we declated it in the DBIRTH£Z//            newValue = metric.boolean_value¤¬//            print "CMD message for output/Device Metric3 - New Value: %r" % newValue¥¬//            # Create the DDATA payload - use the alias because this isn't the DBIRTH¦Â//            addMetric(payload, None, AliasMap.Device_Metric3, MetricDataType.Boolean, newValue)§//        else:¨j//            print "Unknown command: " + metric.name©//else:ª@//    print "Unknown command..."«2//print "Done publishing"¬Interface­L{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}®(*¯ 	At the moment, this only supports the one specific metric, Node Control/Rebirth°.    Node Command (NCMD)±    ²Ê    NCMD messages are used by backend applications to write to EoN node outputs and send Node Control³ª    commands to EoN nodes. Multiple metrics can be supplied in a single NCMD message.´˜    The following is a representation of a simple NCMD message on the topic:µl        spBv1.0/Sparkplug"! B Devices/NCMD/Raspberry Pi¶„        "    The  Group ID  of this device is: Sparkplug"! B Devices·ˆ        "    The host  EoN node ID  of this EoN node is: Raspberry Pi¸d        "    This is an NCMD message to an EoN node¹     Consider the following Sparkplug"! B payload in the NCMD message shown above:º
+    {»F        "timestamp": 1486144502122,¼*        "metrics": [{½^                "name": "Node Control/Rebirth",¾V                "timestamp": 1486144502122,¿L                "dataType": "Boolean",À:                "value": trueÁ         }]Â
+    }Ãâ    This NCMD payload tells the EoN node to republish its NBIRTH and DBIRTH(s) messages. This can be requested ifÄä    a backend application gets an out of order seq number or if a metric arrives in an NDATA or DDATA message thatÅ~    was not provided in the original NBIRTH or DBIRTH messages.Æ*)Ç${attribute 'hide'}ÈFMETHOD PRIVATE onNCMDMessage : BOOLÉVAR_INPUTÊö	pTopic : POINTER TO WSTRING(Constants.supported_string_lengths); // resembles the topic under which the message is posted ËEND_VARÌVAR_IN_OUTÍ€	pMessage : FB_PayloadSimpleDecoder; //should already be decodedÎVAR_OUTPUTÏ2	Rebirth : BOOL := FALSE;ÐVARÑt	MetricName : WSTRING(Constants.supported_string_lengths);Ò(	MetricValid : BOOL;ÓF	MetricValueVarInt : DecodedVarInt;Ô:	MetricValueString : WSTRING;Õ6	MetricValueLreal  : LREAL;Ö4	MetricValueReal   : REAL;× 	HasNext : BOOL;Ø6	datatype : MetricDataType;Ù	i : DINT;ÐÐÐEùÐÐ	
+­ìÚÐ-
ÐÐ	
+­ÚÐ-ÐÐ	
+­~ÚÐ-ÐÐ	
+­‘ÚÐ-ÐÐ	
+­’ÚÐ-ÐÐ	
+­“ÚÐ-ÐÐ	
+­”ÚÐ-ÐÐ	
+­•ÚÐ-ÐÐ	
+­–ÚÐ-ÐÐ	
+­—ÚÐ-ÐÐ	
+­˜ÚÐ-ÐÐ	
+­™ÚÐ-ÐÐ	
+­šÚÐ-ÐÐ	
+­îÚÐ-ÐÐ	
+­ïÚÐ-ÐÐ	
+­ñÚÐ-ÐÐ	
+­ôÚÐ-ÐÐ	
+­úÚÐ-ÐÐ	
+­ÚÐ-ÐÐ	
+­4ÚÐ- ÐÐ	
+­9ÚÐ-!ÐÐ	
+­:ÚÐ-"ÐÐ	
+­5ÚÐ-#ÐÐ	
+­ûÚÐ-$ÐÐ	
+­EÚÐ-%ÐÐ	
+­FÚÐ-&ÐÐ	
+­GÚÐ-'ÐÐ	
+­HÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­…ÚÐ-(ÐÐ	
+­ÚÐ-)ÐÐ	
+­‚ÚÐ-*ÐÐ	
+­ƒÚÐ-+ÐÐ	
+­„ÚÐ-"ÐÐ	
+­€ÚÐ-#ÐÐ	
+­üÚÐ-,ÐÐ	
+­IÚÐ--ÐÐ	
+­JÚÐ-.ÐÐ	
+­KÚÐ-/ÐÐ	
+­LÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­‹ÚÐ-(ÐÐ	
+­‡ÚÐ-0ÐÐ	
+­ˆÚÐ-1ÐÐ	
+­‰ÚÐ-2ÐÐ	
+­ŠÚÐ-"ÐÐ	
+­†ÚÐ-#ÐÐ	
+­ýÚÐ-3ÐÐ	
+­MÚÐ-4ÐÐ	
+­NÚÐ-5ÐÐ	
+­OÚÐ-6ÐÐ	
+­PÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ŒÚÐ-(ÐÐ	
+­ŽÚÐ-7ÐÐ	
+­ÚÐ-8ÐÐ	
+­ÚÐ-9ÐÐ	
+­‘ÚÐ-"ÐÐ	
+­’ÚÐ-#ÐÐ	
+­“ÚÐ-:ÐÐ	
+­”ÚÐ-;ÐÐ	
+­•ÚÐ-<ÐÐ	
+­–ÚÐ-=ÐÐ	
+­—ÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­þÚÐ->ÐÐ	
+­QÚÐ-)ÐÐ	
+­RÚÐ-*ÐÐ	
+­SÚÐ-+ÐÐ	
+­TÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ÿÚÐ-?ÐÐ	
+­UÚÐ-0ÐÐ	
+­VÚÐ-1ÐÐ	
+­WÚÐ-2ÐÐ	
+­XÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ÚÐ-@ÐÐ	
+­YÚÐ-7ÐÐ	
+­ZÚÐ-8ÐÐ	
+­[ÚÐ-9ÐÐ	
+­\ÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ÚÐ-AÐÐ	
+­]ÚÐ-;ÐÐ	
+­^ÚÐ-<ÐÐ	
+­_ÚÐ-=ÐÐ	
+­`ÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ÚÐ-BÐÐ	
+­aÚÐ-CÐÐ	
+­bÚÐ-DÐÐ	
+­cÚÐ-EÐÐ	
+­dÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ÚÐ-FÐÐ	
+­eÚÐ-GÐÐ	
+­fÚÐ-HÐÐ	
+­gÚÐ-IÐÐ	
+­hÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ÚÐ-JÐÐ	
+­-ÚÐ-KÐÐ	
+­.ÚÐ-LÐÐ	
+­/ÚÐ-MÐÐ	
+­0ÚÐ-NÐÐ	
+­1ÚÐ-OÐÐ	
+­2ÚÐ-PÐÐ	
+­ ÚÐ-QÐÐ	
+­iÚÐ-RÐÐ	
+­jÚÐ-SÐÐ	
+­kÚÐ-TÐÐ	
+­lÚÐ-"ÐÐ	
+­&ÚÐ-#ÐÐ	
+­ÚÐ-UÐÐ	
+­mÚÐ-VÐÐ	
+­nÚÐ-WÐÐ	
+­oÚÐ-XÐÐ	
+­pÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­™ÚÐ-(ÐÐ	
+­šÚÐ-YÐÐ	
+­›ÚÐ-ZÐÐ	
+­œÚÐ-[ÐÐ	
+­ÚÐ-"ÐÐ	
+­žÚÐ-#ÐÐ	
+­ŸÚÐ-:ÐÐ	
+­ ÚÐ-\ÐÐ	
+­¡ÚÐ-]ÐÐ	
+­¢ÚÐ-^ÐÐ	
+­£ÚÐ-"ÐÐ	
+­˜ÚÐ-#ÐÐ	
+­ÚÐ-_ÐÐ	
+­qÚÐ-`ÐÐ	
+­rÚÐ-aÐÐ	
+­sÚÐ-bÐÐ	
+­tÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ÚÐ-cÐÐ	
+­uÚÐ-YÐÐ	
+­vÚÐ-ZÐÐ	
+­wÚÐ-[ÐÐ	
+­xÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­	ÚÐ-dÐÐ	
+­yÚÐ-\ÐÐ	
+­zÚÐ-]ÐÐ	
+­{ÚÐ-^ÐÐ	
+­|ÚÐ-"ÐÐ	
+­ÚÐ-#ÐÐ	
+­ÚÐ-eÐÐ	
 ­
-ÚÐ-ZÐÐ	
-­ÚÐ-[ÐÐ	
-­ÚÐ-\ÐÐ	

ÚÐ-]ÐÐ	
-­ÚÐ-^ÐÐ	
-­ÚÐ-_ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-`ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-aÐÐ	
-­ÚÐ-bÐÐ	
-­ÚÐ-cÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-dÐÐ	
-­ÚÐ-\ÐÐ	
-­ÚÐ-eÐÐ	
-­ÚÐ-fÐÐ	
-­ÚÐ-gÐÐ	
-­ÚÐ-hÐÐ	
-­ÚÐ-iÐÐ	
-­ÚÐ-jÐÐ	
-­ÚÐ-kÐÐ	
-­ ÚÐ-lÐÐ	
-­!ÚÐ-mÐÐ	
-­"ÚÐ-\ÐÐ	
-­#ÚÐ-nÐÐ	
-­$ÚÐ-oÐÐ	
-­%ÚÐ-pÐÐ	
-­&ÚÐ-ÐÐ	
-­'ÚÐ-qÐÐ	
-­ëÚÐ-rÐÐ	
-­(ÚÐ-sÐÐ	
-­)ÚÐ-tÐÐ	
-­*ÚÐ-uÐÐ	
-­+ÚÐ-vÐÐ	
-­,ÚÐ-wÐÐ	
-­-ÚÐ-xÐÐ	
-­.ÚÐ-vÐÐ	
-­/ÚÐ-yÐÐ	
-­0ÚÐ-zÐÐ	
-­1ÚÐ-vÐÐ	
-­2ÚÐ-{ÐÐ	
-­3ÚÐ-|ÐÐ	
-­4ÚÐ-}ÐÐ	
-­5ÚÐ-~ÐÐ	
-­6ÚÐ-vÐÐ	
-­ÚÐ-
\ No newline at end of file
+ÚÐ-fÐÐ	
+­ÚÐ-gÐÐ	
+­ÚÐ-hÐÐ	
+­öÚÐ-iÐÐ	
+­ÚÐ-jÐÐ	
+­ÚÐ-kÐÐ	
+­ÚÐ-lÐÐ	
+­ÚÐ-mÐÐ	
+­÷ÚÐ-nÐÐ	
+­õÚÐ-oÐÐ	
+­DÚÐ-pÐÐ	
+­}ÚÐ-qÐÐ	
+­<ÚÐ-rÐÐ	
+­=ÚÐ-ÐÐ	
+­>ÚÐ-ÐÐ	
+­?ÚÐ-ÐÐ	
+­@ÚÐ-ÐÐ	
+­AÚÐ-ÐÐ	
+­BÚÐ-ÐÐ	
+­CÚÐ-ÐÐ	
+­;ÚÐ-ÐÐ	
+­óÚÐ-sÐÐ	
+­òÚÐ-tÐÐ	
+­›ÚÐ-ÐÐ	
+­œÚÐ-uÐÐ	
+­ÚÐ-vÐÐ	
+­žÚÐ-wÐÐ	
+­ŸÚÐ-xÐÐ	
+­¦ÚÐ-ÐÐ	
+­§ÚÐ-yÐÐ	
+­¨ÚÐ-ÐÐ	
+­©ÚÐ-ÐÐ	
+­ªÚÐ-zÐÐ	
+­«ÚÐ-{ÐÐ	
+­¬ÚÐ-|ÐÐ	
+­­ÚÐ-}ÐÐ	
+­®ÚÐ-~ÐÐ	
+­¯ÚÐ-ÐÐ	
+­°ÚÐ-€ÐÐ	
+­±ÚÐ-ÐÐ	
+­²ÚÐ-‚ÐÐ	
+­³ÚÐ-ƒÐÐ	
+­´ÚÐ-„ÐÐ	
+­µÚÐ-…ÐÐ	
+­¶ÚÐ-†ÐÐ	
+­·ÚÐ-‡ÐÐ	
+­¸ÚÐ-ˆÐÐ	
+­¹ÚÐ-‰ÐÐ	
+­ºÚÐ-ŠÐÐ	
+­»ÚÐ-‹ÐÐ	
+­¼ÚÐ-ŒÐÐ	
+­½ÚÐ-ÐÐ	
+­¾ÚÐ-ŽÐÐ	
+­¿ÚÐ-ÐÐ	
+­ÀÚÐ-ÐÐ	
+­ÁÚÐ-‘ÐÐ	
+­ÂÚÐ-’ÐÐ	
+­ÃÚÐ-ÐÐ	
+­ÄÚÐ-“ÐÐ	
+­ÅÚÐ-”ÐÐ	
+­ÆÚÐ-•ÐÐ	
+­ÇÚÐ-–ÐÐ	
+­ÈÚÐ-—ÐÐ	
+­ÉÚÐ-|ÐÐ	
+­ÊÚÐ-˜ÐÐ	
+­ËÚÐ-™ÐÐ	
+­ÌÚÐ-šÐÐ	
+­ÍÚÐ-|ÐÐ	
+­ÎÚÐ-›ÐÐ	
+­ÏÚÐ-œÐÐ	
+­ÐÚÐ-ÐÐ	
+­ÑÚÐ-|ÐÐ	
+­ÒÚÐ-žÐÐ	
+­ÓÚÐ-ŸÐÐ	
+­ÔÚÐ- ÐÐ	
+­ÕÚÐ-¡ÐÐ	
+­ÖÚÐ-”ÐÐ	
+­×ÚÐ-•ÐÐ	
+­ØÚÐ-–ÐÐ	
+­ÙÚÐ-—ÐÐ	
+­ÚÚÐ-|ÐÐ	
+­ÛÚÐ-¢ÐÐ	
+­ÜÚÐ-£ÐÐ	
+­ÝÚÐ-¤ÐÐ	
+­ÞÚÐ-|ÐÐ	
+­ßÚÐ-¥ÐÐ	
+­àÚÐ-œÐÐ	
+­áÚÐ-¦ÐÐ	
+­âÚÐ-|ÐÐ	
+­ãÚÐ-žÐÐ	
+­äÚÐ-ŸÐÐ	
+­åÚÐ- ÐÐ	
+­æÚÐ-§ÐÐ	
+­çÚÐ-¨ÐÐ	
+­èÚÐ-©ÐÐ	
+­éÚÐ-ªÐÐ	
+­êÚÐ-|ÐÐ	
+­ÚÐ-«Ь­ÐE7ÐÐ	
+­	ÚÐ-®ÐÐ	

+ÚÐ-¯ÐÐ	
+­ÚÐ-°ÐÐ	
+­ÚÐ-±ÐÐ	

ÚÐ-²ÐÐ	
+­ÚÐ-³ÐÐ	
+­ÚÐ-´ÐÐ	
+­ÚÐ-ÐÐ	
+­ÚÐ-µÐÐ	
+­ÚÐ-ÐÐ	
+­ÚÐ-¶ÐÐ	
+­ÚÐ-·ÐÐ	
+­ÚÐ-¸ÐÐ	
+­ÚÐ-ÐÐ	
+­ÚÐ-¹ÐÐ	
+­ÚÐ-±ÐÐ	
+­ÚÐ-ºÐÐ	
+­ÚÐ-»ÐÐ	
+­ÚÐ-¼ÐÐ	
+­ÚÐ-½ÐÐ	
+­ÚÐ-¾ÐÐ	
+­ÚÐ-¿ÐÐ	
+­ÚÐ-ÀÐÐ	
+­ ÚÐ-ÁÐÐ	
+­!ÚÐ-ÂÐÐ	
+­"ÚÐ-±ÐÐ	
+­#ÚÐ-ÃÐÐ	
+­$ÚÐ-ÄÐÐ	
+­%ÚÐ-ÅÐÐ	
+­&ÚÐ-ÐÐ	
+­'ÚÐ-ÆÐÐ	
+­ëÚÐ-ÇÐÐ	
+­(ÚÐ-ÈÐÐ	
+­)ÚÐ-ÉÐÐ	
+­*ÚÐ-ÊÐÐ	
+­+ÚÐ-ËÐÐ	
+­,ÚÐ-ÌÐÐ	
+­-ÚÐ-ÍÐÐ	
+­íÚÐ-pÐÐ	
+­.ÚÐ-ËÐÐ	
+­/ÚÐ-ÎÐÐ	
+­0ÚÐ-ÏÐÐ	
+­1ÚÐ-ËÐÐ	
+­2ÚÐ-ÐÐÐ	
+­3ÚÐ-ÑÐÐ	
+­4ÚÐ-ÒÐÐ	
+­5ÚÐ-ÓÐÐ	
+­6ÚÐ-ÔÐÐ	
+­7ÚÐ-ÕÐÐ	
+­8ÚÐ-ÖÐÐ	
+­ðÚÐ-×ÐÐ	
+­øÚÐ-ØÐÐ	
+­3ÚÐ-ÙÐÐ	
+­6ÚÐ-ËÐÐ	
+­ÚÐ-
\ No newline at end of file