Diff of /branches/FeatureBranches/Debuglogging/SparkplugB/Function Blocks/FB_PrimaryHost/FB_PrimaryHost/svnobj [r815] .. [r816]  Maximize  Restore

Switch to side-by-side view

--- a/branches/FeatureBranches/Debuglogging/SparkplugB/Function Blocks/FB_PrimaryHost/FB_PrimaryHost/svnobj
+++ b/branches/FeatureBranches/Debuglogging/SparkplugB/Function Blocks/FB_PrimaryHost/FB_PrimaryHost/svnobj
@@ -1,5 +1,6 @@
-Gx_l’?!0…jüo`4QÍ
-ó’càSystem.StringL{6f9dac99-8de1-4efc-8465-68ac443b7d08}SpecialFuncL{0db3d7bb-cde0-4416-9a7b-ce49a0124323}NoneImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocument	L{f3878285-8e4f-490b-bb1b-9acbb7eb04db}
-TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}Id
longTagText// Componentsn_MQTT.IASyncPropertyProvider( IASyncPropertyProvider );b_MQTT.ITLSContextProvider( ITLSContextProvider );_MQTT();¸Connected := (NOT _MQTT.ClientError() AND NOT _MQTT.IsConnecting() AND _MQTT.IsConnected());b_SparkplugB( AllmetricsList := _AllMetricsList );RIF _MQTT.SubscriberMessageReceived() THENà    _RecvMesg REF= _MQTT.GetSubscriberMessage(MetricList := THIS^._AllMetricsList, MessageTopic => _RecvTopic );h    onSubscribeMessage( pTopic := ADR( _RecvTopic ),`                        pMessage := _RecvMesg );END_IFv_ExponentialBackOff( Enable := (Connect AND NOT Connected),n                     ConnectionTime := _ConnectionTime,n                     LockTimesArray := _LockTimesArray,R                     Enabled => _Enabled, v                     OutTimeRemaining => _OutTimeRemaining,!~                     LockTimeRemaining => _LockTimeRemaining );"d_StateMachine( Connect := _ExponentialBackOff.out,#b               PrimaryHostConnected := Connected,$J               pMQTT := ADR( _MQTT ),%b               pSparkplugB := ADR( _SparkplugB ),&H               pPrimaryHost := THIS,'\               SessionState => SessionState );(Diag();)Interface*L{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}+(*,*    Primary Host Node-Ö    Allows you to concenrate Edge of Network Data sent by various Edges or other Sparkplug compatible nodes.*)/0{attribute 'reflection'}0jFUNCTION_BLOCK FB_PrimaryHost IMPLEMENTS IPrimaryHost1VAR_INPUT2€    ServerUrl     : STRING;          // eg:'test.mosquitto.org';3`    ServerPort    : UINT    := 1883; // eg: 18834r    PrimaryHostID : WSTRING := "";   // eg:'PrimaryHost';5ˆ    KeepAlive     : UINT    := 60;   // eg: 60 (Value is in seconds)6V    // Persistent Session (FALSE = DEFAULT)7°    //  * The client must get all messages from a certain topic, even if it is offline. 8ò    //  * You want the broker to queue the messages for the client and deliver them as soon as the client is back online.9X    //  * The client has limited resources. :ˆ    //  * You want the broker to store the subscription information of the client and restore the interrupted communication quickly.;È    //  * The client needs to reNumberOfMetricse all QoS 1 and 2 publish messages after a reconnect.<    //  =8    //  Clean session (TRUE)>à    //  * The client needs only to publish messages to topics, the client does not need to subscribe to topics. ?Þ    //  * You don t want the broker to store session information or retry transmission of QoS 1 and 2 messages.@–    //  * The client does not need to get messages that it misses offline. A    //BH    CleanSession : BOOL    := FALSE;C¦    Username     : WSTRING := "";           // specify a username if any (optional)D¾    Password     : WSTRING := "";           // specify the password for the username (optional)Eº    UseTLS       : BOOL;                    // Enables usage of the TLS encryption (optional)FT    hCert        : SysTypes.RTS_IEC_HANDLEGü    ;                                           // Handle to the client certificate (optional) and only used if UseTLS is TRUEH\    ITLSContextProvider : MQTT.NBS.ITLSContextI¢    ; //Encapsulates all the data neccessaray to handle encrypted tcp connectionsJˆ    //Static initialization, as shown in the following code snippet;K    //VARLV    //    commonName : STRING := 'MyRasPi';M¸    //    ciCertInfo : NBS.CERT_INFO := (psInfo:=ADR(commonName), udiSize:=LEN(commonName));NX    //    myTLSContext : NBS.TLSContext := (O`    //        ePurpose:=NBS.PURPOSE.CLIENT_SIDE,PL    //        sUseCaseName:='NBSTest',QB    //        sTLSVersion:='1.3',RJ    //        ciCertInfo:=ciCertInfo,SH    //        udiVerificationMode:=2T    //    );U    //END_VARVš    IASyncPropertyProvider : MQTT.NBS.IAsyncProperty; // Runs the connect process in a own background task. Use this property if the connection setup takes longer than one task cycle (e.g. TLS connections)WEND_VARXVAR_OUTPUTY4    Connected      : BOOL;Z^    SessionState   : SparkplugSessionStateType;[V    itfPrimaryHost : IPrimaryHost := THIS^;\VAR]    _groupIDPool : List;         // OF FB_GroupID - This is blank groupids for dynamic allocation^h    _EdgePool    : List;         // OF FB_RemoteEdge_l    _DevicePool  : List;         // OF FB_RemoteDevice`l    _MetricPool  : List;         // OF FB_RemoteMetricaž    _groupIDs    : List;         // OF FB_GroupID - This is groupIDs with namesb>    Connect      : BOOL := TRUEc˜    ;                            // TRUE: Connects EoN using the configured settings, FALSE: Disconnects EoN from server if it was connectedd´    _cPrimaryHostID : WSTRING;   // Corrected PrimaryHostID, contains no illegal chars    e6    _Enabled        : BOOL;ff    _ConnectionTime : TIME                := T#30S;g\    _LockTimesArray : ARRAY[1..8] OF TIME := [hÔ        4(TIME#30S0MS), 2(TIME#1M0S0MS), TIME#2M0S0MS, TIME#4M0S0MS]; // could be made accessible public  iê    _OutTimeRemaining   : TIME;                                       // Duration of Out Time Period = TRUE remainingj>    _LockTimeRemaining  : TIME;k¾    _ExponentialBackOff : FB_ExponentialBackOffTimer; // Handles the Exponential Backoff timinglj    _StateMachine       : FB_PrimaryHostStateMachine;ml    _TopicProvider      : FB_PrimaryHostTopicProvider;nZ    _MQTT               : FB_PrimaryHostMQTT;oT    _MQTT_eError        : MQTT.MQTT_ERROR;pž    _SparkplugB         : FB_SparkplugBSimple;     // Handles SparkPlugB Stuff qš    _AllMetricsList     : LIST;                    // Of FB_HostStorageMetricr¢    _Blob               : ARRAY[0..65535] OF BYTE; // buffer for encoded messagess¤    _BlobSize           : UDINT;                   // current encoded message sizet|    _LastWillQos        : MQTT.MQTT_QOS := MQTT.MQTT_QOS.QoS0;ub    _LastWillRetain     : BOOL          := FALSE;v’    _LastWillTopic      : WSTRING(GC_Sparkplug.supported_string_lengths);wª    _NDEATH             : FB_SparkplugUInt64;    // contains the current NDEATH BDSeqxº    _NDEATHPayload      : ARRAY[0..255] OF BYTE; // what is the maximum size of this payload?y@    _NDEATHPayloadSize  : UDINT;z~    _RecvMesg           : REFERENCE TO FB_PayloadSimpleDecoder;{’    _RecvTopic          : WSTRING(GC_Sparkplug.supported_string_lengths);|B    _Diag               : STRING;}>    {attribute 'instance-path'}~0    {attribute 'noinit'}$    _POU : STRING;€"UniqueIdGenerator984‚POULevelƒL{8e575c5b-1d37-49c6-941b-5c0ec7874787}„Standard… ChildObjectGuids†8System.Collections.ArrayList‡,AddAttributeSubsequentˆboolÐÐ-ÐÐ	E
-ÐÐ
­¿ÚÐ-ÐÐ
­ÀÚÐ-ÐÐ
­ÁÚÐ-ÐÐ
­ÂÚÐ-ÐÐ
­ÃÚÐ-ÐÐ
­ÄÚÐ-ÐÐ
­ÅÚÐ-ÐÐ
­ÆÚÐ-ÐÐ
­ÇÚÐ-ÐÐ
­ÈÚÐ-ÐÐ
­ÉÚÐ-ÐÐ
­ÊÚÐ-ÐÐ
­ËÚÐ-ÐÐ
­ÌÚÐ-ÐÐ
­ÍÚÐ-ÐÐ
­ÎÚÐ-ÐÐ
­ÏÚÐ- ÐÐ
­ÐÚÐ-!ÐÐ
­ÑÚÐ-ÐÐ
­ÒÚÐ-"ÐÐ
­ÓÚÐ-#ÐÐ
­ÔÚÐ-$ÐÐ
­ÕÚÐ-%ÐÐ
­ÖÚÐ-&ÐÐ
­×ÚÐ-'ÐÐ
­ØÚÐ-ÐÐ
­…ÚÐ-(Ð)*Ð	E
-XÐÐ
­VÚÐ-+ÐÐ
­WÚÐ-,ÐÐ
­XÚÐ--ÐÐ
­YÚÐ-.ÐÐ
­ZÚÐ-/ÐÐ
­[ÚÐ-0ÐÐ
­\ÚÐ-1ÐÐ
­]ÚÐ-2ÐÐ
­^ÚÐ-3ÐÐ
­_ÚÐ-4ÐÐ
­`ÚÐ-5ÐÐ
­aÚÐ-6ÐÐ
­bÚÐ-7ÐÐ
­cÚÐ-8ÐÐ
­dÚÐ-9ÐÐ
­eÚÐ-:ÐÐ
­fÚÐ-;ÐÐ
­gÚÐ-<ÐÐ
­hÚÐ-=ÐÐ
­iÚÐ->ÐÐ
­jÚÐ-?ÐÐ
­kÚÐ-@ÐÐ
­lÚÐ-AÐÐ
­mÚÐ-BÐÐ
­nÚÐ-CÐÐ
­oÚÐ-DÐÐ
­pÚÐ-EÐÐ
­qÚÐ-FÐÐ
­rÚÐ-GÐÐ
­sÚÐ-HÐÐ
­tÚÐ-IÐÐ
­uÚÐ-JÐÐ
­vÚÐ-AÐÐ
­wÚÐ-KÐÐ
­xÚÐ-LÐÐ
­yÚÐ-MÐÐ
­zÚÐ-NÐÐ
­{ÚÐ-OÐÐ
­|ÚÐ-PÐÐ
­}ÚÐ-QÐÐ
­~ÚÐ-RÐÐ
­ÚÐ-SÐÐ
­€ÚÐ-TÐÐ
­ÚÐ-UÐÐ
­‚ÚÐ-VÐÐ
­ƒÚÐ-WÐÐ
­„ÚÐ-XÐÐ
­…ÚÐ-YÐÐ
­†ÚÐ-ZÐÐ
­‡ÚÐ-[ÐÐ
­ˆÚÐ-WÐÐ
­‰ÚÐ-\ÐÐ
­›ÚÐ-]ÐÐ
­œÚÐ-^ÐÐ
­ÚÐ-_ÐÐ
­žÚÐ-`ÐÐ
­ŸÚÐ-aÐÐ
­ ÚÐ-bÐÐ
­¡ÚÐ-cÐÐ
­¢ÚÐ-dÐÐ
­¤ÚÐ-eÐÐ
­¥ÚÐ-fÐÐ
­¦ÚÐ-gÐÐ
­§ÚÐ-hÐÐ
­¨ÚÐ-iÐÐ
­©ÚÐ-jÐÐ
­ªÚÐ-kÐÐ
­«ÚÐ-lÐÐ
­¬ÚÐ-mÐÐ
­­ÚÐ-nÐÐ
­®ÚÐ-oÐÐ
­¯ÚÐ-pÐÐ
­°ÚÐ-qÐÐ
­±ÚÐ-rÐÐ
­²ÚÐ-sÐÐ
­³ÚÐ-tÐÐ
­´ÚÐ-uÐÐ
­µÚÐ-vÐÐ
­¶ÚÐ-wÐÐ
­·ÚÐ-xÐÐ
­¸ÚÐ-yÐÐ
­¹ÚÐ-zÐÐ
­ºÚÐ-{ÐÐ
­»ÚÐ-|ÐÐ
­¼ÚÐ-}ÐÐ
­½ÚÐ-~ÐÐ
­¾ÚÐ-ÐÐ
­kÚÐ-WЀ-Ђƒ-„…†Їˆ­
\ No newline at end of file
+Gx_lo‡!0…jüoi»c4+<LþSystem.StringL{6f9dac99-8de1-4efc-8465-68ac443b7d08}SpecialFuncL{0db3d7bb-cde0-4416-9a7b-ce49a0124323}NoneImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocument	L{f3878285-8e4f-490b-bb1b-9acbb7eb04db}
+TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}Id
longTagText// Componentsn_MQTT.IASyncPropertyProvider( IASyncPropertyProvider );b_MQTT.ITLSContextProvider( ITLSContextProvider );_MQTT();¸Connected := (NOT _MQTT.ClientError() AND NOT _MQTT.IsConnecting() AND _MQTT.IsConnected());b_SparkplugB( AllmetricsList := _AllMetricsList );RIF _MQTT.SubscriberMessageReceived() THEN<	{region "onSubscribeMessage"}à    _RecvMesg REF= _MQTT.GetSubscriberMessage(MetricList := THIS^._AllMetricsList, MessageTopic => _RecvTopic );l    //onSubscribeMessage( pTopic := ADR( _RecvTopic ),d    //                    pMessage := _RecvMesg );‚    _TopicParser( pTopic := ADR(_RecvTopic) ); //parses the topic    ~    WriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),j                    'PrimaryHost Received Topic: %s', x                    TO_STRING( _TopicParser.MessageType ) );!z    CASE _TopicParser.MessageType OF  //SparkplugMessageTypes"š        SparkplugMessageTypes.NBIRTH: //Birth certificate for MQTT EoN nodes.#            _MyEdge REF= THIS^.GetEdge( GroupId := _TopicParser.GroupId,$Œ                                        EdgeId := _TopicParser.EdgeId,%„                                        eError => _HandledError );&B            CASE _HandledError OF'p                ERROR.GroupIDNotFound: // ==> NEW GROUP!(°                    _MyGroupId REF= THIS^.allocGroupId( GroupId := _TopicParser.GroupId,)–                                                        eError => eError );*f                    IF eError = ERROR.NO_ERROR THEN+º                        _MyEdge REF= THIS^.allocEdgetoGroupId( EdgeId := _TopicParser.EdgeId,,Æ                                                               itfGroupID := _MyGroupId.itfGroupID,-¤                                                               eError => eError );.n                        IF eError = ERROR.NO_ERROR THEN/–                            _MyEdge.ProcessNBIRTH( itfPrimaryHost := THIS^,0’                                                   pMessage := _RecvMesg,1ˆ                                                   xError => xError,2Œ                                                   eError => eError );38                        ELSE4V                            xError := TRUE;5^                            //eError := eError;6<                        END_IF70                    ELSE8N                        xError := TRUE;9V                        //eError := eError;:4                    END_IF;l                ERROR.EdgeIDNotFound: // ==> NEW EDGE!<¬                    _MyGroupId REF= THIS^.GetGroupID( GroupId := _TopicParser.GroupId,=’                                                      eError => eError );>v                ERROR.NO_ERROR: // ==> UPDATE EXISTING EDGE?†                    _MyEdge.ProcessNBIRTH( itfPrimaryHost := THIS^,@‚                                           pMessage := _RecvMesg,Ax                                           xError => xError,B|                                           eError => eError );C             ELSEDz                ; //{info 'TODO: maybe some sort of error??'}E(            END_CASEF            Gr        SparkplugMessageTypes.NDATA: //Node data message.H„                    _MyEdge.ProcessNDATA( itfPrimaryHost := THIS^,I€                                          pMessage := _RecvMesg,Jv                                          xError => xError,Kz                                          eError => eError );L>                xError := TRUE;M^                eError := Error.EdgeIDNotFound;N–                WriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),Oš                                'PrimaryHost process NDATA metric error: %s',P~                                TO_STRING( _HandledError ) );  Qb            END_CASE                             Rš        SparkplugMessageTypes.NDEATH: //Death certificate for MQTT EoN nodes.S’                ERROR.NO_ERROR: // ==> UPDATE EXISTING EDGE              TX                    _MyEdge.ProcessNDEATH();U~                eError := Error.OhMy_ThatShouldNotHaveHappened;Vœ                                'PrimaryHost process NDEATH metric error: %s',W*            END_CASE X        YŠ        SparkplugMessageTypes.DBIRTH: //Birth certificate forDevices.Z„            //TODO: Check if edge is online (isQualityOK).  If not OK, DO NOT process the DBIRTH, instead just send a NCMD/Rebirth[ \˜            _MyDevice REF= THIS^.GetDevice( GroupId := _TopicParser.GroupId,]”                                            EdgeId := _TopicParser.EdgeId,^œ                                            DeviceId := _TopicParser.DeviceId,_Œ                                            eError => _HandledError );`ž                ERROR.GroupIDNotFound:  // ==> NEW GROUP! must rebirth the edgeaJ					 eError := ERROR.NotImplemented;b*					 xError := TRUE;c‚					 WriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),dü                                     'DBIRTH Received with no existing groupID, but haven$'t implemented NCMD Rebirth yet %s',eX                                     '' );  fœ                ERROR.EdgeIDNotFound:   // ==> NEW EDGE! must rebirth the edgegö                                     'DBIRTH Received with no existing edge, but haven$'t implemented NCMD Rebirth yet %s',hT                                     '' );it                ERROR.DeviceIDNotFound: // ==> NEW DEVICE!j„					 _MyEdge REF= THIS^.GetEdge( GroupId := _TopicParser.GroupId,kt							                     EdgeId := _TopicParser.EdgeId,lˆ                                                 eError => eError );mÈ                        _MyDevice REF= THIS^.allocDevicetoEdge( DeviceName := _TopicParser.DeviceId,n¾                                                               itfEdge := _MyEdge.itfRemoteEoN,oš                            _MyDevice.ProcessDBIRTH( itfPrimaryHost := THIS^,pŠ                ERROR.NO_ERROR:         // ==> UPDATE EXISTING DEVICEql					_MyDevice.ProcessDBIRTH( itfPrimaryHost := THIS^,r’        SparkplugMessageTypes.DDEATH:    //Death certificate for Devices.s\                    _MyDevice.ProcessDDEATH();tœ                                'PrimaryHost process DDEATH metric error: %s',ux        SparkplugMessageTypes.DDATA: //Device data message. vˆ                    _MyDevice.ProcessDDATA( itfPrimaryHost := THIS^,w„                                            pMessage := _RecvMesg,xz                                            xError => xError,y~                                            eError => eError );zb                eError := Error.DeviceIDNotFound;{š                                'PrimaryHost process DDATA metric error: %s',|€        SparkplugMessageTypes.NCMD,      //Node command message.}|        SparkplugMessageTypes.DCMD,  //Device command message.~’        SparkplugMessageTypes.STATE: //Critical application state message†            ;                            //do nothing, ignore these€    ELSEj        ; //{info 'TODO: maybe some sort of error??'}‚    END_CASEƒ    {endregion}„END_IF…v_ExponentialBackOff( Enable := (Connect AND NOT Connected),†n                     ConnectionTime := _ConnectionTime,‡n                     LockTimesArray := _LockTimesArray,ˆR                     Enabled => _Enabled,‰v                     OutTimeRemaining => _OutTimeRemaining,Š~                     LockTimeRemaining => _LockTimeRemaining );‹d_StateMachine( Connect := _ExponentialBackOff.out,Œb               PrimaryHostConnected := Connected,J               pMQTT := ADR( _MQTT ),Žb               pSparkplugB := ADR( _SparkplugB ),H               pPrimaryHost := THIS,\               SessionState => SessionState );‘Diag();’Interface“L{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}”(*•*    Primary Host Node–Ö    Allows you to concenrate Edge of Network Data sent by various Edges or other Sparkplug compatible nodes—*)˜0{attribute 'reflection'}™jFUNCTION_BLOCK FB_PrimaryHost IMPLEMENTS IPrimaryHostšVAR_INPUT›€    ServerUrl     : STRING;          // eg:'test.mosquitto.org';œ`    ServerPort    : UINT    := 1883; // eg: 1883r    PrimaryHostID : WSTRING := "";   // eg:'PrimaryHost';žˆ    KeepAlive     : UINT    := 60;   // eg: 60 (Value is in seconds)ŸV    // Persistent Session (FALSE = DEFAULT) °    //  * The client must get all messages from a certain topic, even if it is offline. ¡ò    //  * You want the broker to queue the messages for the client and deliver them as soon as the client is back online.¢X    //  * The client has limited resources. £ˆ    //  * You want the broker to store the subscription information of the client and restore the interrupted communication quickly.¤È    //  * The client needs to reNumberOfMetricse all QoS 1 and 2 publish messages after a reconnect.¥    //  ¦8    //  Clean session (TRUE)§à    //  * The client needs only to publish messages to topics, the client does not need to subscribe to topics. ¨Þ    //  * You don t want the broker to store session information or retry transmission of QoS 1 and 2 messages.©–    //  * The client does not need to get messages that it misses offline. ª    //«H    CleanSession : BOOL    := FALSE;¬¦    Username     : WSTRING := "";           // specify a username if any (optional)­¾    Password     : WSTRING := "";           // specify the password for the username (optional)®º    UseTLS       : BOOL;                    // Enables usage of the TLS encryption (optional)¯T    hCert        : SysTypes.RTS_IEC_HANDLE°ü    ;                                           // Handle to the client certificate (optional) and only used if UseTLS is TRUE±\    ITLSContextProvider : MQTT.NBS.ITLSContext²¢    ; //Encapsulates all the data neccessaray to handle encrypted tcp connections³ˆ    //Static initialization, as shown in the following code snippet;´    //VARµV    //    commonName : STRING := 'MyRasPi';¶¸    //    ciCertInfo : NBS.CERT_INFO := (psInfo:=ADR(commonName), udiSize:=LEN(commonName));·X    //    myTLSContext : NBS.TLSContext := (¸`    //        ePurpose:=NBS.PURPOSE.CLIENT_SIDE,¹L    //        sUseCaseName:='NBSTest',ºB    //        sTLSVersion:='1.3',»J    //        ciCertInfo:=ciCertInfo,¼H    //        udiVerificationMode:=2½    //    );¾    //END_VAR¿š    IASyncPropertyProvider : MQTT.NBS.IAsyncProperty; // Runs the connect process in a own background task. Use this property if the connection setup takes longer than one task cycle (e.g. TLS connections)ÀEND_VARÁVAR_OUTPUTÂ4    Connected      : BOOL;Ã^    SessionState   : SparkplugSessionStateType;Ä4    xError         : BOOL;Å6    eError         : ERROR;Æ^    itfPrimaryHost : IPrimaryHost := THIS^;    ÇVARÈÐ    _groupIDPool        : List;         // OF FB_GroupID - This is blank groupids for dynamic allocationÉv    _EdgePool           : List;         // OF FB_RemoteEdgeÊz    _DevicePool         : List;         // OF FB_RemoteDeviceËz    _MetricPool         : List;         // OF FB_RemoteMetric̬    _groupIDs           : List;         // OF FB_GroupID - This is groupIDs with namesͦ    Connect             : BOOL := TRUE; // TRUE: Connects EoN using the configured settings, FALSE: Disconnects EoN from server if it was connectedμ    _cPrimaryHostID     : WSTRING;   // Corrected PrimaryHostID, contains no illegal chars    Ï>    _Enabled            : BOOL;ÐP    _ConnectionTime     : TIME := T#30S;Ѩ    _LockTimesArray     : ARRAY[1..8] OF TIME := [4(TIME#30S0MS), 2(TIME#1M0S0MS), TIME#2M0S0MS, TIME#4M0S0MS]; // could be made accessible public  Òž    _OutTimeRemaining   : TIME; // Duration of Out Time Period = TRUE remainingÓ>    _LockTimeRemaining  : TIME;Ô¾    _ExponentialBackOff : FB_ExponentialBackOffTimer; // Handles the Exponential Backoff timingÕj    _StateMachine       : FB_PrimaryHostStateMachine;Öl    _TopicProvider      : FB_PrimaryHostTopicProvider;×Z    _MQTT               : FB_PrimaryHostMQTT;ØT    _MQTT_eError        : MQTT.MQTT_ERROR;Ùž    _SparkplugB         : FB_SparkplugBSimple;     // Handles SparkPlugB Stuff Úš    _AllMetricsList     : LIST;                    // Of FB_HostStorageMetricÛ¢    _Blob               : ARRAY[0..65535] OF BYTE; // buffer for encoded messagesܤ    _BlobSize           : UDINT;                   // current encoded message sizeÝ|    _LastWillQos        : MQTT.MQTT_QOS := MQTT.MQTT_QOS.QoS0;ÞP    _LastWillRetain     : BOOL := FALSE;ß’    _LastWillTopic      : WSTRING(GC_Sparkplug.supported_string_lengths);ઠ   _NDEATH             : FB_SparkplugUInt64;    // contains the current NDEATH BDSeqẠ   _NDEATHPayload      : ARRAY[0..255] OF BYTE; // what is the maximum size of this payload?â@    _NDEATHPayloadSize  : UDINT;ã~    _RecvMesg           : REFERENCE TO FB_PayloadSimpleDecoder;ä’    _RecvTopic          : WSTRING(GC_Sparkplug.supported_string_lengths);åâ    _HandledError       : ERROR; // an error that will be given back by a function, but we can handle the error. æd    _MyGroupId          : REFERENCE TO FB_GroupId;çj    _MyEdge             : REFERENCE TO FB_RemoteEdge;èn    _MyDevice           : REFERENCE TO FB_RemoteDevice;éR    _TopicParser        : FB_TopicParser;êB    _Diag               : STRING;ë>    {attribute 'instance-path'}ì0    {attribute 'noinit'}í$    _POU : STRING;î"UniqueIdGeneratorï2371ðPOULevelñL{8e575c5b-1d37-49c6-941b-5c0ec7874787}òStandardó ChildObjectGuidsô8System.Collections.ArrayListõ,AddAttributeSubsequentöboolÐÐ-ÐÐ	E
+ÞÐÐ
­CÚÐ-ÐÐ
­DÚÐ-ÐÐ
­EÚÐ-ÐÐ
­FÚÐ-ÐÐ
­GÚÐ-ÐÐ
­HÚÐ-ÐÐ
­õÚÐ-ÐÐ
­ºÚÐ-ÐÐ
­IÚÐ-ÐÐ
­öÚÐ-ÐÐ
­JÚÐ-ÐÐ
­KÚÐ-ÐÐ
­LÚÐ-ÐÐ
­MÚÐ-ÐÐ
­NÚÐ-ÐÐ
­OÚÐ-ÐÐ
­PÚÐ-ÐÐ
­QÚÐ-ÐÐ
­RÚÐ- ÐÐ
­SÚÐ-ÐÐ
­TÚÐ-!ÐÐ
­UÚÐ-"ÐÐ
­VÚÐ-#ÐÐ
­WÚÐ-$ÐÐ
­XÚÐ-%ÐÐ
­ÂÚÐ-ÐÐ
­YÚÐ-&ÐÐ
­ZÚÐ-'ÐÐ
­[ÚÐ-(ÐÐ
­\ÚÐ-)ÐÐ
­]ÚÐ-ÐÐ
­^ÚÐ-*ÐÐ
­_ÚÐ-+ÐÐ
­`ÚÐ-,ÐÐ
­aÚÐ--ÐÐ
­bÚÐ-ÐÐ
­cÚÐ-.ÐÐ
­dÚÐ-/ÐÐ
­eÚÐ-0ÐÐ
­fÚÐ-1ÐÐ
­gÚÐ-2ÐÐ
­hÚÐ-3ÐÐ
­iÚÐ-4ÐÐ
­jÚÐ-5ÐÐ
­kÚÐ-6ÐÐ
­lÚÐ-7ÐÐ
­mÚÐ-8ÐÐ
­nÚÐ-9ÐÐ
­oÚÐ-:ÐÐ
­pÚÐ-;ÐÐ
­qÚÐ-<ÐÐ
­rÚÐ-=ÐÐ
­sÚÐ-ÐÐ
­tÚÐ-*ÐÐ
­uÚÐ-+ÐÐ
­vÚÐ-,ÐÐ
­wÚÐ--ÐÐ
­xÚÐ-ÐÐ
­yÚÐ-.ÐÐ
­zÚÐ-/ÐÐ
­{ÚÐ-0ÐÐ
­|ÚÐ-1ÐÐ
­}ÚÐ-2ÐÐ
­~ÚÐ-3ÐÐ
­ÚÐ-4ÐÐ
­€ÚÐ-5ÐÐ
­ÚÐ-6ÐÐ
­‚ÚÐ-7ÐÐ
­ƒÚÐ-8ÐÐ
­„ÚÐ-9ÐÐ
­…ÚÐ-:ÐÐ
­†ÚÐ->ÐÐ
­‡ÚÐ-?ÐÐ
­ˆÚÐ-@ÐÐ
­‰ÚÐ-AÐÐ
­ŠÚÐ-BÐÐ
­‹ÚÐ-CÐÐ
­ŒÚÐ-DÐÐ
­ÚÐ-EÐÐ
­ÃÚÐ-FÐÐ
­¾ÚÐ-GÐÐ
­ÄÚÐ-#ÐÐ
­ÅÚÐ-$ÐÐ
­ÀÚÐ-%ÐÐ
­ÇÚÐ-&ÐÐ
­ÍÚÐ->ÐÐ
­ÎÚÐ-HÐÐ
­ÏÚÐ-IÐÐ
­ÐÚÐ-JÐÐ
­ÑÚÐ-KÐÐ
­ÒÚÐ-CÐÐ
­ÕÚÐ-LÐÐ
­ÖÚÐ-MÐÐ
­×ÚÐ-NÐÐ
­ØÚÐ-OÐÐ
­ÓÚÐ-PÐÐ
­ÈÚÐ-QÐÐ
­ôÚÐ-ÐÐ
­ŽÚÐ-RÐÐ
­ÜÚÐ-#ÐÐ
­ÝÚÐ-$ÐÐ
­ÞÚÐ-%ÐÐ
­ßÚÐ-&ÐÐ
­íÚÐ-SÐÐ
­áÚÐ-TÐÐ
­åÚÐ-CÐÐ
­æÚÐ-LÐÐ
­çÚÐ-UÐÐ
­èÚÐ-NÐÐ
­éÚÐ-VÐÐ
­êÚÐ-PÐÐ
­ÙÚÐ-WÐÐ
­ÚÐ-XÐÐ
­ÚÐ-YÐÐ
­A	ÚÐ-ZÐÐ
­B	ÚÐ-[ÐÐ
­‘ÚÐ-\ÐÐ
­’ÚÐ-]ÐÐ
­“ÚÐ-^ÐÐ
­”ÚÐ-_ÐÐ
­•ÚÐ-ÐÐ
­–ÚÐ-&ÐÐ
­—ÚÐ-`ÐÐ
­	ÚÐ-aÐÐ
­	ÚÐ-bÐÐ
­	ÚÐ-cÐÐ
­	ÚÐ-dÐÐ
­	ÚÐ-eÐÐ
­˜ÚÐ-fÐÐ
­	ÚÐ-aÐÐ
­	ÚÐ-bÐÐ
­	ÚÐ-cÐÐ
­ 	ÚÐ-gÐÐ
­	ÚÐ-hÐÐ
­™ÚÐ-iÐÐ
­ýÚÐ-jÐÐ
­	ÚÐ-kÐÐ
­þÚÐ-lÐÐ
­	ÚÐ-*ÐÐ
­	ÚÐ-mÐÐ
­	ÚÐ-nÐÐ
­	ÚÐ--ÐÐ
­	ÚÐ-ÐÐ
­	ÚÐ-.ÐÐ
­	ÚÐ-oÐÐ
­	ÚÐ-0ÐÐ
­	ÚÐ-1ÐÐ
­		ÚÐ-2ÐÐ
­
+	ÚÐ-3ÐÐ
­	ÚÐ-4ÐÐ
­	ÚÐ-5ÐÐ
­
	ÚÐ-6ÐÐ
­	ÚÐ-7ÐÐ
­	ÚÐ-8ÐÐ
­	ÚÐ-9ÐÐ
­÷ÚÐ-:ÐÐ
­šÚÐ-pÐÐ
­	ÚÐ-qÐÐ
­	ÚÐ-@ÐÐ
­	ÚÐ-AÐÐ
­	ÚÐ-BÐÐ
­›ÚÐ-CÐÐ
­œÚÐ-DÐÐ
­ÚÐ-EÐÐ
­žÚÐ-rÐÐ
­"	ÚÐ-\ÐÐ
­#	ÚÐ-]ÐÐ
­.	ÚÐ-^ÐÐ
­$	ÚÐ-_ÐÐ
­%	ÚÐ-&ÐÐ
­&	ÚÐ-SÐÐ
­'	ÚÐ-sÐÐ
­(	ÚÐ-CÐÐ
­)	ÚÐ-LÐÐ
­*	ÚÐ-UÐÐ
­+	ÚÐ-NÐÐ
­,	ÚÐ-tÐÐ
­-	ÚÐ-PÐÐ
­!	ÚÐ-WÐÐ
­ ÚÐ-uÐÐ
­>	ÚÐ-\ÐÐ
­?	ÚÐ-]ÐÐ
­@	ÚÐ-^ÐÐ
­1	ÚÐ-_ÐÐ
­2	ÚÐ-&ÐÐ
­3	ÚÐ->ÐÐ
­4	ÚÐ-vÐÐ
­5	ÚÐ-wÐÐ
­6	ÚÐ-xÐÐ
­7	ÚÐ-yÐÐ
­8	ÚÐ-CÐÐ
­9	ÚÐ-LÐÐ
­:	ÚÐ-zÐÐ
­;	ÚÐ-NÐÐ
­<	ÚÐ-{ÐÐ
­=	ÚÐ-PÐÐ
­¡ÚÐ-QÐÐ
­¢ÚÐ-|ÐÐ
­£ÚÐ-}ÐÐ
­¤ÚÐ-~ÐÐ
­¥ÚÐ-ÐÐ
­¦ÚÐ-€ÐÐ
­§ÚÐ-ÐÐ
­¨ÚÐ-‚ÐÐ
­©ÚÐ-ƒÐÐ
­ªÚÐ-„ÐÐ
­«ÚÐ-ÐÐ
­¬ÚÐ-…ÐÐ
­­ÚÐ-†ÐÐ
­®ÚÐ-‡ÐÐ
­¯ÚÐ-ˆÐÐ
­°ÚÐ-‰ÐÐ
­±ÚÐ-ŠÐÐ
­²ÚÐ-ÐÐ
­³ÚÐ-‹ÐÐ
­´ÚÐ-ŒÐÐ
­µÚÐ-ÐÐ
­¶ÚÐ-ŽÐÐ
­·ÚÐ-ÐÐ
­¸ÚÐ-ÐÐ
­¹ÚÐ-ÐÐ
­…ÚÐ-‘В“Ð	E
+]ÐÐ
­ÚÚÐ-”ÐÐ
­ÛÚÐ-•ÐÐ
­ÜÚÐ-–ÐÐ
­ÝÚÐ-—ÐÐ
­ÞÚÐ-˜ÐÐ
­ßÚÐ-™ÐÐ
­àÚÐ-šÐÐ
­áÚÐ-›ÐÐ
­âÚÐ-œÐÐ
­ãÚÐ-ÐÐ
­äÚÐ-žÐÐ
­åÚÐ-ŸÐÐ
­æÚÐ- ÐÐ
­çÚÐ-¡ÐÐ
­èÚÐ-¢ÐÐ
­éÚÐ-£ÐÐ
­êÚÐ-¤ÐÐ
­ëÚÐ-¥ÐÐ
­ìÚÐ-¦ÐÐ
­íÚÐ-§ÐÐ
­îÚÐ-¨ÐÐ
­ïÚÐ-©ÐÐ
­ðÚÐ-ªÐÐ
­ñÚÐ-«ÐÐ
­òÚÐ-¬ÐÐ
­óÚÐ-­ÐÐ
­ôÚÐ-®ÐÐ
­õÚÐ-¯ÐÐ
­öÚÐ-°ÐÐ
­÷ÚÐ-±ÐÐ
­øÚÐ-²ÐÐ
­ùÚÐ-³ÐÐ
­úÚÐ-ªÐÐ
­ûÚÐ-´ÐÐ
­üÚÐ-µÐÐ
­ýÚÐ-¶ÐÐ
­þÚÐ-·ÐÐ
­ÿÚÐ-¸ÐÐ
­ÚÐ-¹ÐÐ
­ÚÐ-ºÐÐ
­ÚÐ-»ÐÐ
­ÚÐ-¼ÐÐ
­ÚÐ-½ÐÐ
­ÚÐ-¾ÐÐ
­ÚÐ-¿ÐÐ
­ÚÐ-ÀÐÐ
­ÚÐ-ÁÐÐ
­	ÚÐ-ÂÐÐ
­
+ÚÐ-ÃÐÐ
­ÚÐ-ÄÐÐ
­ÚÐ-ÅÐÐ
­
ÚÐ-ÆÐÐ
­ÚÐ-ÀÐÐ
­ÚÐ-ÇÐÐ
­ÚÐ-ÈÐÐ
­ÚÐ-ÉÐÐ
­ÚÐ-ÊÐÐ
­ÚÐ-ËÐÐ
­ÚÐ-ÌÐÐ
­ÚÐ-ÍÐÐ
­ÚÐ-ÎÐÐ
­ÚÐ-ÏÐÐ
­ÚÐ-ÐÐÐ
­ÚÐ-ÑÐÐ
­ÚÐ-ÒÐÐ
­ÚÐ-ÓÐÐ
­ÚÐ-ÔÐÐ
­ÚÐ-ÕÐÐ
­ÚÐ-ÖÐÐ
­ÚÐ-×ÐÐ
­ ÚÐ-ØÐÐ
­!ÚÐ-ÙÐÐ
­"ÚÐ-ÚÐÐ
­#ÚÐ-ÛÐÐ
­$ÚÐ-ÜÐÐ
­%ÚÐ-ÝÐÐ
­&ÚÐ-ÞÐÐ
­'ÚÐ-ßÐÐ
­(ÚÐ-àÐÐ
­)ÚÐ-áÐÐ
­*ÚÐ-âÐÐ
­+ÚÐ-ãÐÐ
­,ÚÐ-äÐÐ
­7ÚÐ-åÐÐ
­8ÚÐ-æÐÐ
­9ÚÐ-çÐÐ
­:ÚÐ-èÐÐ
­;ÚÐ-éÐÐ
­?ÚÐ-êÐÐ
­@ÚÐ-ëÐÐ
­AÚÐ-ìÐÐ
­BÚÐ-íÐÐ
­kÚÐ-ÀÐî-ïÐðñ-òóôÐõö­
\ No newline at end of file