True 8fc52b24-7436-4d4a-8b03-aa43d42302d0 00000000-0000-0000-0000-000000000000 ModbusMaster 738bea1e-99bb-4f04-90bb-a7a567e74e3a 639263803013698353 21af5390-2942-461a-bf89-951aaf6999f1 00000000-0000-0000-0000-000000000000 -1 True cb2ee488-e770-4060-ad57-9a6caeef450c 00000000-0000-0000-0000-000000000000 ModbusSlave 738bea1e-99bb-4f04-90bb-a7a567e74e3a 639263803015206171 21af5390-2942-461a-bf89-951aaf6999f1 00000000-0000-0000-0000-000000000000 -1 True 5182900e-ef44-42ef-8ec1-0358264d5e8e 00000000-0000-0000-0000-000000000000 Library Manager adb5cb65-8e1d-4a00-b70a-375ea27582f3 639263822537619627 False SysTime, 3.5.17.0 (System) 3874980378 SysTime False False False False False Standard, * (System) False Standard b303f5ce-75ff-4668-a777-7da8debb449c 1258623516 Standard False False False False False SysTimeCore SysTimeCore, 3.5.17.0 (System) Standard Standard, 3.5.22.0 (System) SysTimeRtc SysTimeRtc, 3.5.22.0 (System) 00000000-0000-0000-0000-000000000000 -1 True 77db7c73-f583-4d0f-8ab3-e15efde2ea24 00000000-0000-0000-0000-000000000000 atMbCall_cext 24568a24-c491-472c-a21f-ee5d33859fab 0 False True False False 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822567818370 None 77db7c73-f583-4d0f-8ab3-e15efde2ea24_Impl_LineIds (* Fixed external C entry point. Preserve parameter order/types and External implementation setting. Use FBs for application logic. *) FUNCTION atMbCall_cext : UDINT VAR_INPUT command : UDINT; handle : UDINT; ipAddress : DWORD; port : UINT; unitId : BYTE; functionCode : BYTE; startAddress : UINT; quantity : UINT; pData : POINTER TO WORD; dataCapacity : UDINT; pStatus : POINTER TO UDINT; statusCapacity : UDINT; nowMs : ULINT; connectTimeoutMs : UDINT; responseTimeoutMs : UDINT; retryDelayMs : UDINT; END_VAR 77db7c73-f583-4d0f-8ab3-e15efde2ea24_Decl_LineIds 99 Standard False 00000000-0000-0000-0000-000000000000 -1 True 11c0fc3a-9bcf-4dd8-ac38-efb93363e521 00000000-0000-0000-0000-000000000000 Project Information 085afe48-c5d8-4ea5-ab0d-b35701fa6009 639264524057351083 Version 0.8.0.0 Title CmpAtomModbus DefaultNamespace atMb LibraryCategoryIds LibraryCategories Company Atom Automation IsStorageFormatPinned False Project 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 -1 True 6470a90f-b7cb-43ac-9ae5-94b2338b4573 00000000-0000-0000-0000-000000000000 Project Settings 8753fe6f-4a22-4320-8103-e553c4fc8e04 639263822537689790 //48AD8AeABtAGwAIAB2AGUAcgBzAGkAbwBuAD0AIgAxAC4AMAAiACAAZQBuAGMAbwBkAGkAbgBnAD0AIgB1AHQAZgAtADEANgAiAD8APgANAAoAPABTAGkAbgBnAGwAZQAgAHgAbQBsADoAcwBwAGEAYwBlAD0AIgBwAHIAZQBzAGUAcgB2AGUAIgAgAFQAeQBwAGUAPQAiAHsANQA0AGQAZAAwAGUAYQBjAC0AYQA2AGQAOAAtADQANgBmADIALQA4AGMAMgA3AC0AMgBmADQAMwBjADcAZQA0ADkAOAA2ADEAfQAiACAATQBlAHQAaABvAGQAPQAiAEkAQQByAGMAaABpAHYAYQBiAGwAZQAiAD4ADQAKACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIATgBhAG0AZQAiACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+ACYAbAB0ADsAUAByAG8AagBlAGMAdABSAG8AbwB0ACYAZwB0ADsAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAA8AEQAaQBjAHQAaQBvAG4AYQByAHkAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACIAIABOAGEAbQBlAD0AIgBTAHUAYgBLAGUAeQBzACIAPgANAAoAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AHsAMAAxADkANwA2AEIAQwAxAC0AQgBBADkAOAAtADQAQQA0AEQALQA5ADgAQQA4AC0ARQBBAEQAQwAzAEMAOQA0ADkAQwBGADgAfQB9ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAA8AC8ASwBlAHkAPgANAAoAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgB7ADUANABkAGQAMABlAGEAYwAtAGEANgBkADgALQA0ADYAZgAyAC0AOABjADIANwAtADIAZgA0ADMAYwA3AGUANAA5ADgANgAxAH0AIgAgAE0AZQB0AGgAbwBkAD0AIgBJAEEAcgBjAGgAaQB2AGEAYgBsAGUAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBOAGEAbQBlACIAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AewAwADEAOQA3ADYAQgBDADEALQBCAEEAOQA4AC0ANABBADQARAAtADkAOABBADgALQBFAEEARABDADMAQwA5ADQAOQBDAEYAOAB9AH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAUwB1AGIASwBlAHkAcwAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFYAYQBsAHUAZQBzACIAIAAvAD4ADQAKACAAIAAgACAAIAAgACAAIAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgADwALwBFAG4AdAByAHkAPgANAAoAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AHsARQA3ADAAOQBCADAAOABCAC0AQgA2AEUANAAtADQAOQA2ADYALQA4AEUARQBEAC0ARAA3ADkAMwBBADEAMwAxADEANABDADYAfQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAPAAvAEsAZQB5AD4ADQAKACAAIAAgACAAIAAgADwAVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAewA1ADQAZABkADAAZQBhAGMALQBhADYAZAA4AC0ANAA2AGYAMgAtADgAYwAyADcALQAyAGYANAAzAGMANwBlADQAOQA4ADYAMQB9ACIAIABNAGUAdABoAG8AZAA9ACIASQBBAHIAYwBoAGkAdgBhAGIAbABlACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIATgBhAG0AZQAiACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AHsARQA3ADAAOQBCADAAOABCAC0AQgA2AEUANAAtADQAOQA2ADYALQA4AEUARQBEAC0ARAA3ADkAMwBBADEAMwAxADEANABDADYAfQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AEQAaQBjAHQAaQBvAG4AYQByAHkAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACIAIABOAGEAbQBlAD0AIgBTAHUAYgBLAGUAeQBzACIAIAAvAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAVgBhAGwAdQBlAHMAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AUgBlAHAAbABhAGMAZQBDAG8AbgBzAHQAYQBuAHQAcwA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAYgBvAG8AbAAiAD4AVAByAHUAZQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AVQBuAGkAYwBvAGQAZQBJAGQAZQBuAHQAaQBmAGkAZQByAHMAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAGIAbwBvAGwAIgA+AEYAYQBsAHMAZQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4ARQBuAGEAYgBsAGUAQgByAGUAYQBrAHAAbwBpAG4AdABMAG8AZwBnAGkAbgBnADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBiAG8AbwBsACIAPgBUAHIAdQBlADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgBVAHQAZgA4AEUAbgBjAG8AZABpAG4AZwA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAYgBvAG8AbAAiAD4AVAByAHUAZQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4ATQBhAHgAQwBvAG0AcABpAGwAZQByAFcAYQByAG4AaQBuAGcAcwA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAaQBuAHQAIgA+ADEAMAAwADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEQAaQBjAHQAaQBvAG4AYQByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAA8AC8AVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgADwARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgADwASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AewBGAEUAOQBGADYAMwBEADQALQA5AEUAMwA0AC0ANAAzAGMAZQAtADkAMwAyADIALQBEADQANgA3ADQANwBBADAAMABGADMAMwB9ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAA8AC8ASwBlAHkAPgANAAoAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgB7ADUANABkAGQAMABlAGEAYwAtAGEANgBkADgALQA0ADYAZgAyAC0AOABjADIANwAtADIAZgA0ADMAYwA3AGUANAA5ADgANgAxAH0AIgAgAE0AZQB0AGgAbwBkAD0AIgBJAEEAcgBjAGgAaQB2AGEAYgBsAGUAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBOAGEAbQBlACIAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AewBGAEUAOQBGADYAMwBEADQALQA5AEUAMwA0AC0ANAAzAGMAZQAtADkAMwAyADIALQBEADQANgA3ADQANwBBADAAMABGADMAMwB9ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFMAdQBiAEsAZQB5AHMAIgAgAC8APgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AEQAaQBjAHQAaQBvAG4AYQByAHkAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACIAIABOAGEAbQBlAD0AIgBWAGEAbAB1AGUAcwAiAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgBTAG8AdQByAGMAZQBEAG8AdwBuAGwAbwBhAGQAQwBvAG4AdABlAG4AdAAyADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAQQByAHIAYQB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBHAHUAaQBkACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4ARwB1AGkAZAAiAD4AYgAwAGIANQAzAGYAOAAzAC0AYQBmADcAOAAtADQAOQBhAGEALQA4ADEAMwAzAC0AMAAwADYAMwBmADQANwA2AGIAZAA3AGMAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEEAcgByAGEAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgBTAG8AdQByAGMAZQBEAG8AdwBuAGwAbwBhAGQAQwBvAG4AdABlAG4AdAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAaQBuAHQAIgA+ADEAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8AVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARABpAGMAdABpAG8AbgBhAHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAPABFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgB7AEEAMwBCAEIAQQA3ADEAMwAtADYAMwBEADcALQA0AGQAZQA2AC0AQgBFAEMAMgAtAEUAMwBCAEEAQQBEADgANwA4ADkARgA4AH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAA8AFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHsANQA0AGQAZAAwAGUAYQBjAC0AYQA2AGQAOAAtADQANgBmADIALQA4AGMAMgA3AC0AMgBmADQAMwBjADcAZQA0ADkAOAA2ADEAfQAiACAATQBlAHQAaABvAGQAPQAiAEkAQQByAGMAaABpAHYAYQBiAGwAZQAiAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAE4AYQBtAGUAPQAiAE4AYQBtAGUAIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgB7AEEAMwBCAEIAQQA3ADEAMwAtADYAMwBEADcALQA0AGQAZQA2AC0AQgBFAEMAMgAtAEUAMwBCAEEAQQBEADgANwA4ADkARgA4AH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAUwB1AGIASwBlAHkAcwAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFYAYQBsAHUAZQBzACIAIAAvAD4ADQAKACAAIAAgACAAIAAgACAAIAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgADwALwBFAG4AdAByAHkAPgANAAoAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AHsANAAwADQANQAwAEYANQA3AC0AMABBAEEAMwAtADQAMgAxADYALQA5ADYARgAzAC0ANQA0ADQANABFAEMAQgAyADkANwA2ADMAfQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAPAAvAEsAZQB5AD4ADQAKACAAIAAgACAAIAAgADwAVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAewA1ADQAZABkADAAZQBhAGMALQBhADYAZAA4AC0ANAA2AGYAMgAtADgAYwAyADcALQAyAGYANAAzAGMANwBlADQAOQA4ADYAMQB9ACIAIABNAGUAdABoAG8AZAA9ACIASQBBAHIAYwBoAGkAdgBhAGIAbABlACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIATgBhAG0AZQAiACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AHsANAAwADQANQAwAEYANQA3AC0AMABBAEEAMwAtADQAMgAxADYALQA5ADYARgAzAC0ANQA0ADQANABFAEMAQgAyADkANwA2ADMAfQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AEQAaQBjAHQAaQBvAG4AYQByAHkAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACIAIABOAGEAbQBlAD0AIgBTAHUAYgBLAGUAeQBzACIAIAAvAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAVgBhAGwAdQBlAHMAIgAgAC8APgANAAoAIAAgACAAIAAgACAAIAAgADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAA8AC8AVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgADwARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgADwASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AewAyADkAQgBEADgARAAwAEMALQAzADUAOAA2AC0ANAA1ADQAOAAtAEIAQgA0ADgALQA0ADkANwBCADkAQQAwADEANgA5ADMARgB9ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAA8AC8ASwBlAHkAPgANAAoAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgB7ADUANABkAGQAMABlAGEAYwAtAGEANgBkADgALQA0ADYAZgAyAC0AOABjADIANwAtADIAZgA0ADMAYwA3AGUANAA5ADgANgAxAH0AIgAgAE0AZQB0AGgAbwBkAD0AIgBJAEEAcgBjAGgAaQB2AGEAYgBsAGUAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBOAGEAbQBlACIAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AewAyADkAQgBEADgARAAwAEMALQAzADUAOAA2AC0ANAA1ADQAOAAtAEIAQgA0ADgALQA0ADkANwBCADkAQQAwADEANgA5ADMARgB9ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFMAdQBiAEsAZQB5AHMAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AUgB1AGwAZQBzADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgB7ADUANABkAGQAMABlAGEAYwAtAGEANgBkADgALQA0ADYAZgAyAC0AOABjADIANwAtADIAZgA0ADMAYwA3AGUANAA5ADgANgAxAH0AIgAgAE0AZQB0AGgAbwBkAD0AIgBJAEEAcgBjAGgAaQB2AGEAYgBsAGUAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIATgBhAG0AZQAiACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AFIAdQBsAGUAcwA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAUwB1AGIASwBlAHkAcwAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEQAaQBjAHQAaQBvAG4AYQByAHkAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACIAIABOAGEAbQBlAD0AIgBWAGEAbAB1AGUAcwAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEQAaQBjAHQAaQBvAG4AYQByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AEQAaQBjAHQAaQBvAG4AYQByAHkAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACIAIABOAGEAbQBlAD0AIgBWAGEAbAB1AGUAcwAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAPABFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgB7ADUAMwA1ADYANQA4AEMAMAAtADUAQQBGADUALQA0ADYAMABkAC0AOQA5AEEANAAtAEIARgBGAEIAOQA4ADQAQQA4ADIAOQBBAH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAA8AFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHsANQA0AGQAZAAwAGUAYQBjAC0AYQA2AGQAOAAtADQANgBmADIALQA4AGMAMgA3AC0AMgBmADQAMwBjADcAZQA0ADkAOAA2ADEAfQAiACAATQBlAHQAaABvAGQAPQAiAEkAQQByAGMAaABpAHYAYQBiAGwAZQAiAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAE4AYQBtAGUAPQAiAE4AYQBtAGUAIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgB7ADUAMwA1ADYANQA4AEMAMAAtADUAQQBGADUALQA0ADYAMABkAC0AOQA5AEEANAAtAEIARgBGAEIAOQA4ADQAQQA4ADIAOQBBAH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAUwB1AGIASwBlAHkAcwAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFYAYQBsAHUAZQBzACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AFYAZQByAHMAaQBvAG4AQwBvAG4AcwB0AHIAYQBpAG4AdAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAewBmADkAMAA3ADkAMQAxADUALQBhADQAYgBhAC0ANABmADMAMAAtAGIAZgA3AGMALQA5AGUANwA2ADYAMQAzADEANAA2AGYAYwB9ACIAIABNAGUAdABoAG8AZAA9ACIASQBBAHIAYwBoAGkAdgBhAGIAbABlACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAE4AYQBtAGUAPQAiAFQAaABlAFYAZQByAHMAaQBvAG4AIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgAzAC4ANQAuADIAMgAuADAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8AVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARABpAGMAdABpAG8AbgBhAHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAPABFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgB7AEMANwAwAEIANwA4ADQANQAtADIANwAyADIALQA0AGEAOQBiAC0AQQAwAEUAQQAtADgAOABDADgANwA3AEEANABCADMANgBGAH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAA8AFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHsANQA0AGQAZAAwAGUAYQBjAC0AYQA2AGQAOAAtADQANgBmADIALQA4AGMAMgA3AC0AMgBmADQAMwBjADcAZQA0ADkAOAA2ADEAfQAiACAATQBlAHQAaABvAGQAPQAiAEkAQQByAGMAaABpAHYAYQBiAGwAZQAiAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAE4AYQBtAGUAPQAiAE4AYQBtAGUAIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgB7AEMANwAwAEIANwA4ADQANQAtADIANwAyADIALQA0AGEAOQBiAC0AQQAwAEUAQQAtADgAOABDADgANwA3AEEANABCADMANgBGAH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAUwB1AGIASwBlAHkAcwAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFYAYQBsAHUAZQBzACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AE0AYQB4AEEAdQB0AGgAZQBuAHQAaQBjAGEAdABpAG8AbgBUAHIAaQBhAGwAcwA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAaQBuAHQAIgA+ADMAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8AVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AEUAbgBhAGIAbABlAE0AYQB4AEEAdQB0AGgAZQBuAHQAaQBjAGEAdABpAG8AbgBUAHIAaQBhAGwAcwA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAYgBvAG8AbAAiAD4AVAByAHUAZQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4ARQBuAGEAYgBsAGUATQBhAHgAVABpAG0AZQBPAGYASQBuAGEAYwB0AGkAdgBpAHQAeQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAYgBvAG8AbAAiAD4AVAByAHUAZQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AVQBzAGUAcgBMAGkAcwB0ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgB7ADkAZgBlADYAYgA1ADQANwAtADYAYgBjADgALQA0AGYAMQAxAC0AYgA1ADgAOQAtAGIANQAxADcAOAA2ADAAYwA1ADgAOQAxAH0AIgAgAE0AZQB0AGgAbwBkAD0AIgBJAEEAcgBjAGgAaQB2AGEAYgBsAGUAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEEAcgByAGEAeQAgAE4AYQBtAGUAPQAiAFUAcwBlAHIAcwAiACAAVAB5AHAAZQA9ACIAewBjAGQAOAAzADAAMgA5AGUALQAxADMAYgAwAC0ANAA5ADEAZQAtADkAZQA0AGIALQA5ADIAMQBhAGQAZABhADAAZAA4ADYAYgB9ACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgB7AGMAZAA4ADMAMAAyADkAZQAtADEAMwBiADAALQA0ADkAMQBlAC0AOQBlADQAYgAtADkAMgAxAGEAZABkAGEAMABkADgANgBiAH0AIgAgAE0AZQB0AGgAbwBkAD0AIgBJAEEAcgBjAGgAaQB2AGEAYgBsAGUAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBJAGQAIgAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4ARwB1AGkAZAAiAD4AYwBhADcANwA3ADIAMwA1AC0AYwA1AGMAZQAtADQAZgBlADcALQBhADIANwA2AC0ANABiADUAZgBiADEANQA1ADAAYQBkAGEAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAE4AYQBtAGUAPQAiAE4AYQBtAGUAIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgBPAHcAbgBlAHIAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAE4AYQBtAGUAPQAiAEYAdQBsAGwATgBhAG0AZQAiACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBEAGUAcwBjAHIAaQBwAHQAaQBvAG4AIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIAQQBjAHQAaQB2AGUAIgAgAFQAeQBwAGUAPQAiAGIAbwBvAGwAIgA+AFQAcgB1AGUAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEEAcgByAGEAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgBVAHMAZQByAEEAdQB0AGgAZQBuAHQAaQBjAGEAdABpAG8AbgA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAewAzADYAMwA1AGEANgA3ADEALQA5ADcAZgA1AC0ANAAxAGIAYgAtADkAZQAyADkALQAwAGUAYgBiADkANwA5ADUAOQA3ADUAYwB9ACIAIABNAGUAdABoAG8AZAA9ACIASQBBAHIAYwBoAGkAdgBhAGIAbABlACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAVQBzAGUAcgBUAG8AUABhAHMAcwB3AG8AcgBkAEgAYQBzAGgAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEcAdQBpAGQAIgA+AGMAYQA3ADcANwAyADMANQAtAGMANQBjAGUALQA0AGYAZQA3AC0AYQAyADcANgAtADQAYgA1AGYAYgAxADUANQAwAGEAZABhADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AZAA0ADEAZAA4AGMAZAA5ADgAZgAwADAAYgAyADAANABlADkAOAAwADAAOQA5ADgAZQBjAGYAOAA0ADIANwBlADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEQAaQBjAHQAaQBvAG4AYQByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4ATQBhAHgAVABpAG0AZQBPAGYASQBuAGEAYwB0AGkAdgBpAHQAeQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAaQBuAHQAIgA+ADEAMAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4ARwByAG8AdQBwAEwAaQBzAHQAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHsAYgBmADQAZABmAGYAZABhAC0AZgAwADUANQAtADQANAA2AGQALQA5AGQANwBhAC0ANQBmADEAMgA2ADcAMgAwADgAOQA2AGIAfQAiACAATQBlAHQAaABvAGQAPQAiAEkAQQByAGMAaABpAHYAYQBiAGwAZQAiAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAQQByAHIAYQB5ACAATgBhAG0AZQA9ACIARwByAG8AdQBwAHMAIgAgAFQAeQBwAGUAPQAiAHsAZABhAGUAYwBkADQAYgBlAC0AMQBlADIAYgAtADQAMwAzADUALQBhADEAMgA1AC0ANABhADEAYQBjADgAMwBlAGEANAA5AGYAfQAiAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAewBkAGEAZQBjAGQANABiAGUALQAxAGUAMgBiAC0ANAAzADMANQAtAGEAMQAyADUALQA0AGEAMQBhAGMAOAAzAGUAYQA0ADkAZgB9ACIAIABNAGUAdABoAG8AZAA9ACIASQBBAHIAYwBoAGkAdgBhAGIAbABlACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIASQBkACIAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEcAdQBpAGQAIgA+AGYAZAA0AGYAZAAyADMAMgAtAGEAMAA0AGIALQA0ADgAOAA4AC0AOAA1ADIAOAAtADUAYgA3ADQAZQAxADcAMgA4ADIANAAxADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBOAGEAbQBlACIAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4ATwB3AG4AZQByADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBEAGUAcwBjAHIAaQBwAHQAaQBvAG4AIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIASQBzAEUAdgBlAHIAeQBvAG4AZQBHAHIAbwB1AHAAIgAgAFQAeQBwAGUAPQAiAGIAbwBvAGwAIgA+AEYAYQBsAHMAZQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIASQBzAE8AdwBuAGUAcgBHAHIAbwB1AHAAIgAgAFQAeQBwAGUAPQAiAGIAbwBvAGwAIgA+AFQAcgB1AGUAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABMAGkAcwB0ACAATgBhAG0AZQA9ACIAVQBzAGUAcgBNAGUAbQBiAGUAcgBzACIAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEEAcgByAGEAeQBMAGkAcwB0ACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4ARwB1AGkAZAAiAD4AYwBhADcANwA3ADIAMwA1AC0AYwA1AGMAZQAtADQAZgBlADcALQBhADIANwA2AC0ANABiADUAZgBiADEANQA1ADAAYQBkAGEAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEwAaQBzAHQAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEwAaQBzAHQAIABOAGEAbQBlAD0AIgBHAHIAbwB1AHAATQBlAG0AYgBlAHIAcwAiACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBBAHIAcgBhAHkATABpAHMAdAAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAewBkAGEAZQBjAGQANABiAGUALQAxAGUAMgBiAC0ANAAzADMANQAtAGEAMQAyADUALQA0AGEAMQBhAGMAOAAzAGUAYQA0ADkAZgB9ACIAIABNAGUAdABoAG8AZAA9ACIASQBBAHIAYwBoAGkAdgBhAGIAbABlACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIASQBkACIAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEcAdQBpAGQAIgA+ADIANABhADgAYwAxADIAYwAtADkANAA3ADIALQA0AGIAMgBjAC0AOQA0AGMAOQAtADgAOQBjAGMAMAA1AGUANABlAGEAYwA0ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBOAGEAbQBlACIAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4ARQB2AGUAcgB5AG8AbgBlADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBEAGUAcwBjAHIAaQBwAHQAaQBvAG4AIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIASQBzAEUAdgBlAHIAeQBvAG4AZQBHAHIAbwB1AHAAIgAgAFQAeQBwAGUAPQAiAGIAbwBvAGwAIgA+AFQAcgB1AGUAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAE4AYQBtAGUAPQAiAEkAcwBPAHcAbgBlAHIARwByAG8AdQBwACIAIABUAHkAcABlAD0AIgBiAG8AbwBsACIAPgBGAGEAbABzAGUAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABMAGkAcwB0ACAATgBhAG0AZQA9ACIAVQBzAGUAcgBNAGUAbQBiAGUAcgBzACIAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEEAcgByAGEAeQBMAGkAcwB0ACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4ARwB1AGkAZAAiAD4AYwBhADcANwA3ADIAMwA1AC0AYwA1AGMAZQAtADQAZgBlADcALQBhADIANwA2AC0ANABiADUAZgBiADEANQA1ADAAYQBkAGEAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEwAaQBzAHQAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEwAaQBzAHQAIABOAGEAbQBlAD0AIgBHAHIAbwB1AHAATQBlAG0AYgBlAHIAcwAiACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBBAHIAcgBhAHkATABpAHMAdAAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBBAHIAcgBhAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4ARQBuAGEAYgBsAGUATgBlAHcASABhAHMAaABGAG8AcgBtAGEAdAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAYgBvAG8AbAAiAD4ARgBhAGwAcwBlADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPAAvAEQAaQBjAHQAaQBvAG4AYQByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAA8AC8AVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgADwARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgADwASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AewBBAEQARgBCAEUAOAA4AEQALQAxAEMANQBDAC0ANAA1ADkAQwAtAEEANgA0AEUALQA0ADgAQgBBAEIAOAA5ADAARgBBAEEAMAB9ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAA8AC8ASwBlAHkAPgANAAoAIAAgACAAIAAgACAAPABWAGEAbAB1AGUAPgANAAoAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABUAHkAcABlAD0AIgB7ADUANABkAGQAMABlAGEAYwAtAGEANgBkADgALQA0ADYAZgAyAC0AOABjADIANwAtADIAZgA0ADMAYwA3AGUANAA5ADgANgAxAH0AIgAgAE0AZQB0AGgAbwBkAD0AIgBJAEEAcgBjAGgAaQB2AGEAYgBsAGUAIgA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwAUwBpAG4AZwBsAGUAIABOAGEAbQBlAD0AIgBOAGEAbQBlACIAIABUAHkAcABlAD0AIgBzAHQAcgBpAG4AZwAiAD4AewBBAEQARgBCAEUAOAA4AEQALQAxAEMANQBDAC0ANAA1ADkAQwAtAEEANgA0AEUALQA0ADgAQgBBAEIAOAA5ADAARgBBAEEAMAB9ADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFMAdQBiAEsAZQB5AHMAIgAgAC8APgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AEQAaQBjAHQAaQBvAG4AYQByAHkAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACIAIABOAGEAbQBlAD0AIgBWAGEAbAB1AGUAcwAiAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgBTAG8AZgB0AE0AbwB0AGkAbwBuAFYAZQByAHMAaQBvAG4APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ASwBlAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwAVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgA0AC4AMgAwAC4AMgAuADAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAA8AC8AVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgADwALwBFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AC8ARABpAGMAdABpAG8AbgBhAHIAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAPAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgADwALwBWAGEAbAB1AGUAPgANAAoAIAAgACAAIAA8AC8ARQBuAHQAcgB5AD4ADQAKACAAIAAgACAAPABFAG4AdAByAHkAPgANAAoAIAAgACAAIAAgACAAPABLAGUAeQA+AA0ACgAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgB7ADIANAA2ADAAMAAxAEYANAAtADIANwA5AEQALQA0ADMAQQBDAC0AQgAyADQAMQAtADkANAA4AEUAQgAzADEAMQAyADAARQAxAH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgADwALwBLAGUAeQA+AA0ACgAgACAAIAAgACAAIAA8AFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAFQAeQBwAGUAPQAiAHsANQA0AGQAZAAwAGUAYQBjAC0AYQA2AGQAOAAtADQANgBmADIALQA4AGMAMgA3AC0AMgBmADQAMwBjADcAZQA0ADkAOAA2ADEAfQAiACAATQBlAHQAaABvAGQAPQAiAEkAQQByAGMAaABpAHYAYQBiAGwAZQAiAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABTAGkAbgBnAGwAZQAgAE4AYQBtAGUAPQAiAE4AYQBtAGUAIgAgAFQAeQBwAGUAPQAiAHMAdAByAGkAbgBnACIAPgB7ADIANAA2ADAAMAAxAEYANAAtADIANwA5AEQALQA0ADMAQQBDAC0AQgAyADQAMQAtADkANAA4AEUAQgAzADEAMQAyADAARQAxAH0APAAvAFMAaQBuAGcAbABlAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAUwB1AGIASwBlAHkAcwAiACAALwA+AA0ACgAgACAAIAAgACAAIAAgACAAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFYAYQBsAHUAZQBzACIAIAAvAD4ADQAKACAAIAAgACAAIAAgACAAIAA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAPAAvAFYAYQBsAHUAZQA+AA0ACgAgACAAIAAgADwALwBFAG4AdAByAHkAPgANAAoAIAAgACAAIAA8AEUAbgB0AHIAeQA+AA0ACgAgACAAIAAgACAAIAA8AEsAZQB5AD4ADQAKACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AHsAOABGADkAOQBBADgAMQA2AC0ARQA0ADgAOAAtADQAMQBFADQALQA5AEYAQQAzAC0AOAA0ADYANQAzADYAMAAxADIAMgA4ADQAfQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAPAAvAEsAZQB5AD4ADQAKACAAIAAgACAAIAAgADwAVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAAVAB5AHAAZQA9ACIAewA1ADQAZABkADAAZQBhAGMALQBhADYAZAA4AC0ANAA2AGYAMgAtADgAYwAyADcALQAyAGYANAAzAGMANwBlADQAOQA4ADYAMQB9ACIAIABNAGUAdABoAG8AZAA9ACIASQBBAHIAYwBoAGkAdgBhAGIAbABlACIAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AFMAaQBuAGcAbABlACAATgBhAG0AZQA9ACIATgBhAG0AZQAiACAAVAB5AHAAZQA9ACIAcwB0AHIAaQBuAGcAIgA+AHsAOABGADkAOQBBADgAMQA2AC0ARQA0ADgAOAAtADQAMQBFADQALQA5AEYAQQAzAC0AOAA0ADYANQAzADYAMAAxADIAMgA4ADQAfQA8AC8AUwBpAG4AZwBsAGUAPgANAAoAIAAgACAAIAAgACAAIAAgACAAIAA8AEQAaQBjAHQAaQBvAG4AYQByAHkAIABUAHkAcABlAD0AIgBTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACIAIABOAGEAbQBlAD0AIgBTAHUAYgBLAGUAeQBzACIAIAAvAD4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAPABEAGkAYwB0AGkAbwBuAGEAcgB5ACAAVAB5AHAAZQA9ACIAUwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAiACAATgBhAG0AZQA9ACIAVgBhAGwAdQBlAHMAIgAgAC8APgANAAoAIAAgACAAIAAgACAAIAAgADwALwBTAGkAbgBnAGwAZQA+AA0ACgAgACAAIAAgACAAIAA8AC8AVgBhAGwAdQBlAD4ADQAKACAAIAAgACAAPAAvAEUAbgB0AHIAeQA+AA0ACgAgACAAPAAvAEQAaQBjAHQAaQBvAG4AYQByAHkAPgANAAoAIAAgADwARABpAGMAdABpAG8AbgBhAHIAeQAgAFQAeQBwAGUAPQAiAFMAeQBzAHQAZQBtAC4AQwBvAGwAbABlAGMAdABpAG8AbgBzAC4ASABhAHMAaAB0AGEAYgBsAGUAIgAgAE4AYQBtAGUAPQAiAFYAYQBsAHUAZQBzACIAIAAvAD4ADQAKADwALwBTAGkAbgBnAGwAZQA+AA== 00000000-0000-0000-0000-000000000000 -1 False f228f401-6c74-4359-8ff1-b15b675180a4 00000000-0000-0000-0000-000000000000 ClientStatus 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 2db5746d-d284-4425-9f7f-2663a34b0ebc a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568449410 (* Retained legacy enum; clients now monitor a STRING through toString. *) {attribute 'qualified_only'} {attribute 'strict'} TYPE ClientStatus : ( noneOk := 0, someOk := 1, allOk := 2 ); END_TYPE f228f401-6c74-4359-8ff1-b15b675180a4_Decl_LineIds 11 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 8fbb076f-33b8-53c3-9f2e-cb38bcc332e3 00000000-0000-0000-0000-000000000000 Error 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 2db5746d-d284-4425-9f7f-2663a34b0ebc a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568509412 (* IEC result classification. TCP socket names also classify RTU OS failures. See out_errorCode for exact C result. *) {attribute 'qualified_only'} TYPE Error : ( OK := 0, RequestParameterError := 1, TcpSocketError := 4, TcpConnectTimeout := 5, ReplyTimeout := 6, InvalidReply := 8, RequestException := 9, RequestCancelled := 10, InternalError := 255 ); END_TYPE 8fbb076f-33b8-53c3-9f2e-cb38bcc332e3_Decl_LineIds 78 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 43f52a7a-cd45-4c0a-8652-9b18c69324d7 00000000-0000-0000-0000-000000000000 ExceptionCodes 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 2db5746d-d284-4425-9f7f-2663a34b0ebc a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568519411 (* Standard Modbus exception values and local TIMEOUT=-1. Only true timeout results set timeoutCnt in this version. *) {attribute 'qualified_only'} TYPE ExceptionCodes : ( TIMEOUT := -1, RESPONSE_SUCCESS := 16#00, ILLEGAL_FUNCTION := 16#01, ILLEGAL_DATA_ADDRESS := 16#02, ILLEGAL_DATA_VALUE := 16#03, SLAVE_DEVICE_FAILURE := 16#04, ACKNOWLEDGE := 16#05, SLAVE_DEVICE_BUSY := 16#06, MEMORY_PARITY_ERROR := 16#08, GATEWAY_PATH_UNAVAILABLE := 16#0A, GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND := 16#0B ); END_TYPE 43f52a7a-cd45-4c0a-8652-9b18c69324d7_Decl_LineIds 78 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa 00000000-0000-0000-0000-000000000000 ClientBase 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822567878390 None engineMode := TRUE; processCycle(); bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa_Impl_LineIds (* Shared abstract client scheduler and registry. Call concrete client every scan; worker handles transaction progress. Exposes aggregated stats and toString. *) {attribute 'monitoring_display' := 'toString'} {attribute 'no_assign'} FUNCTION_BLOCK ABSTRACT ClientBase VAR_INPUT {attribute 'symbol' := 'none'} in_timeout: TIME := T#0MS; {attribute 'symbol' := 'none'} in_resetStats: BOOL; END_VAR VAR_OUTPUT {attribute 'symbol' := 'none'} msgLastSecondCnt: UDINT; {attribute 'symbol' := 'none'} msgLastSecondTime: UDINT; {attribute 'symbol' := 'none'} numMsgSent: UDINT; {attribute 'symbol' := 'none'} numMsgReply: UDINT; {attribute 'symbol' := 'none'} allRequestsOnline: BOOL; reqStats: ARRAY[0..99] OF POINTER TO RequestStats; END_VAR VAR dataRate : DINT; requests : ARRAY[0..99] OF POINTER TO RequestBase; requestCnt : UINT; allRequestsOffline : BOOL; END_VAR VAR engineMode : BOOL; engineHandle : UDINT; engineIP : DWORD; enginePort : UINT; engineNowMicroseconds : SYSTIME; engineNowMilliseconds : ULINT; engineStatus : ARRAY[0..23] OF UDINT; engineActiveIndex : DINT := -1; engineSelected : POINTER TO RequestBase; engineResultReady : BOOL; engineFinishedIndex : DINT := -1; engineWindowStartMilliseconds : ULINT; engineWasConnected : BOOL; engineEnable : BOOL := TRUE; engineConnectTimeoutMilliseconds : UDINT := 2000; engineRetryDelayMilliseconds : UDINT := 100; engineHoldUncertainWrites : BOOL := FALSE; END_VAR VAR_INPUT {attribute 'symbol' := 'none'} engineIO : ARRAY[0..1999] OF WORD; {attribute 'symbol' := 'none'} engineActiveRequest : POINTER TO RequestBase; {attribute 'symbol' := 'none'} engineArgUnit : BYTE; {attribute 'symbol' := 'none'} engineArgFunction : BYTE; {attribute 'symbol' := 'none'} engineArgAddress : UINT; {attribute 'symbol' := 'none'} engineArgQuantity : UINT; {attribute 'symbol' := 'none'} engineArgTimeout : UDINT := 1000; {attribute 'symbol' := 'none'} engineSent : UDINT; {attribute 'symbol' := 'none'} engineReplied : UDINT; {attribute 'symbol' := 'none'} engineWindowCount : UDINT; {attribute 'symbol' := 'none'} engineWindowTime : UDINT; END_VAR VAR_OUTPUT out_connected : BOOL; out_connectionState : UDINT; out_lastErrorCode : UDINT; out_socketError : UDINT; out_reconnectCount : UDINT; out_registrationFull : BOOL; END_VAR VAR CONSTANT CMD_OPEN : UDINT := 1; CMD_CLOSE : UDINT := 2; CMD_ENABLE : UDINT := 3; CMD_TICK : UDINT := 5; CMD_SUBMIT : UDINT := 6; CMD_COPY_READ : UDINT := 7; CMD_CONFIGURE : UDINT := 9; CMD_ACKNOWLEDGE : UDINT := 10; CMD_REQUEST_TIMEOUT : UDINT := 11; STATE_DISABLED : UDINT := 0; STATE_READY : UDINT := 3; STATE_RECEIVING : UDINT := 5; ERROR_INVALID_HANDLE : UDINT := 256; ERROR_CANCELLED : UDINT := 10; STATUS_HANDLE : UDINT := 0; STATUS_STATE : UDINT := 1; STATUS_DONE : UDINT := 3; STATUS_ERROR : UDINT := 4; STATUS_RESULT : UDINT := 5; STATUS_LAST_ERROR : UDINT := 6; STATUS_SOCKET_ERROR : UDINT := 7; STATUS_EXCEPTION : UDINT := 8; STATUS_WRITE_UNCERTAIN : UDINT := 9; STATUS_RECONNECTS : UDINT := 11; STATUS_FUNCTION : UDINT := 18; END_VAR VAR engineOpenCommand : UDINT := 1; engineDevice : STRING(127); engineSerialBaud : UDINT; engineSerialParity : BYTE; engineSerialBits : BYTE; engineSerialStops : BYTE; engineSerialRs485 : UDINT; END_VAR VAR_INPUT in_enable : BOOL := TRUE; END_VAR VAR_OUTPUT stats : ClientStats; END_VAR bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa_Decl_LineIds 3369 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 17c2ab7a-4d60-48ec-966f-339ec83a75e9 00000000-0000-0000-0000-000000000000 ClientRTU 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568384009 None engineMode := TRUE; IF engineHandle <> 0 AND ((lastDevice <> in_device) OR (lastBaud <> in_baudRate) OR (lastParity <> in_parity) OR (lastBits <> in_dataBits) OR (lastStops <> in_stopBits) OR (lastRs485 <> in_rs485) OR (lastRetry <> in_reconnectDelay) OR NOT in_enable) THEN releaseContext(); END_IF; engineOpenCommand := 20; engineDevice := in_device; engineSerialBaud := in_baudRate; engineSerialParity := in_parity; engineSerialBits := in_dataBits; engineSerialStops := in_stopBits; engineSerialRs485 := BOOL_TO_UDINT(in_rs485); engineRetryDelayMilliseconds := MAX(UDINT#1,TIME_TO_UDINT(in_reconnectDelay)); engineHoldUncertainWrites := in_holdUncertainWrites; engineEnable := in_enable; dataRate := UDINT_TO_DINT(in_baudRate); lastDevice := in_device; lastBaud := in_baudRate; lastParity := in_parity; lastBits := in_dataBits; lastStops := in_stopBits; lastRs485 := in_rs485; lastRetry := in_reconnectDelay; SUPER^(); 17c2ab7a-4d60-48ec-966f-339ec83a75e9_Impl_LineIds (* Linux serial/RTU configuration. Changing serial parameters recreates the context. Explicit unit ID 1..247 is required on requests. *) {attribute 'monitoring_display' := 'toString'} {attribute 'no_assign'} FUNCTION_BLOCK ClientRTU EXTENDS ClientBase VAR_INPUT in_device : STRING(127) := '/dev/ttyUSB0'; in_baudRate : UDINT := 9600; in_parity : BYTE := 0; in_dataBits : BYTE := 8; in_stopBits : BYTE := 1; in_rs485 : BOOL; in_reconnectDelay : TIME := T#100MS; in_holdUncertainWrites : BOOL := FALSE; END_VAR VAR lastDevice : STRING(127); lastBaud : UDINT; lastParity : BYTE; lastBits : BYTE; lastStops : BYTE; lastRs485 : BOOL; lastRetry : TIME; END_VAR 17c2ab7a-4d60-48ec-966f-339ec83a75e9_Decl_LineIds 607 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 269ad87c-8ffe-4a28-9e12-2f2da3f7c570 00000000-0000-0000-0000-000000000000 ClientTCP 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568469412 None engineOpenCommand := 1; engineMode := TRUE; engineIP := SHL(BYTE_TO_DWORD(in_ipAddress[0]),24) OR SHL(BYTE_TO_DWORD(in_ipAddress[1]),16) OR SHL(BYTE_TO_DWORD(in_ipAddress[2]),8) OR BYTE_TO_DWORD(in_ipAddress[3]); enginePort := in_port; engineConnectTimeoutMilliseconds := MAX(UDINT#1,TIME_TO_UDINT(in_connectTimeout)); engineRetryDelayMilliseconds := MAX(UDINT#1,TIME_TO_UDINT(in_reconnectDelay)); engineHoldUncertainWrites := in_holdUncertainWrites; IF engineHandle <> 0 AND ((engineEndpointIP <> engineIP) OR (engineEndpointPort <> enginePort) OR (engineConfigConnect <> engineConnectTimeoutMilliseconds) OR (engineConfigRetry <> engineRetryDelayMilliseconds) OR NOT in_enable) THEN releaseContext(); END_IF; engineEndpointIP := engineIP; engineEndpointPort := enginePort; engineConfigConnect := engineConnectTimeoutMilliseconds; engineConfigRetry := engineRetryDelayMilliseconds; engineEnable := in_enable; IF in_baudrate <> 0 THEN dataRate := in_baudrate; ELSE dataRate := 105200; END_IF; SUPER^(); 269ad87c-8ffe-4a28-9e12-2f2da3f7c570_Impl_LineIds (* TCP connection configuration. Changing endpoint, connect timeout or retry delay recreates its context. Inherits ClientBase statistics and monitoring string. *) {attribute 'monitoring_display' := 'toString'} {attribute 'no_assign'} FUNCTION_BLOCK ClientTCP EXTENDS ClientBase VAR_INPUT {attribute 'symbol' := 'none'} in_ipAddress: ARRAY[0..3] OF BYTE; {attribute 'symbol' := 'none'} in_port: UINT := 502; {attribute 'symbol' := 'none'} in_baudrate: UINT := 0; END_VAR VAR_INPUT in_connectTimeout : TIME := T#2S; in_reconnectDelay : TIME := T#100MS; in_holdUncertainWrites : BOOL := FALSE; END_VAR VAR engineEndpointIP : DWORD; engineEndpointPort : UINT; engineConfigConnect : UDINT; engineConfigRetry : UDINT; END_VAR 269ad87c-8ffe-4a28-9e12-2f2da3f7c570_Decl_LineIds 1191 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False a77a90fd-541d-4ce9-ad97-7024224bbab4 00000000-0000-0000-0000-000000000000 ReqReadCoil 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568539386 None engineFunction := 1; IF __ISVALIDREF(client) AND_THEN client.engineMode THEN out_parameterError := (UINT_TO_DINT(in_dataOffset) < LOWER_BOUND(data,1)) OR (UINT_TO_DINT(in_dataOffset) > UPPER_BOUND(data,1)); IF out_parameterError THEN dataCapacity := 0; ELSE dataCapacity := DINT_TO_UINT(UPPER_BOUND(data,1) - UINT_TO_DINT(in_dataOffset) + 1); END_IF; SUPER^(); RETURN; END_IF; a77a90fd-541d-4ce9-ad97-7024224bbab4_Impl_LineIds (* Read request using the indicated BOOL/UINT array and shared RequestBase inputs. Successful replies update only the selected slice; inspect out_validData/out_stale. *) {attribute 'no_assign'} FUNCTION_BLOCK ReqReadCoil EXTENDS RequestBase VAR_IN_OUT {attribute 'symbol' := 'none'} data: ARRAY[*] OF BOOL; END_VAR a77a90fd-541d-4ce9-ad97-7024224bbab4_Decl_LineIds 193 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 1a3278f4-a658-407c-968a-21aa53361562 00000000-0000-0000-0000-000000000000 ReqReadDiscrete 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568579407 None engineFunction := 2; IF __ISVALIDREF(client) AND_THEN client.engineMode THEN out_parameterError := (UINT_TO_DINT(in_dataOffset) < LOWER_BOUND(data,1)) OR (UINT_TO_DINT(in_dataOffset) > UPPER_BOUND(data,1)); IF out_parameterError THEN dataCapacity := 0; ELSE dataCapacity := DINT_TO_UINT(UPPER_BOUND(data,1) - UINT_TO_DINT(in_dataOffset) + 1); END_IF; SUPER^(); RETURN; END_IF; 1a3278f4-a658-407c-968a-21aa53361562_Impl_LineIds (* Read request using the indicated BOOL/UINT array and shared RequestBase inputs. Successful replies update only the selected slice; inspect out_validData/out_stale. *) {attribute 'no_assign'} FUNCTION_BLOCK ReqReadDiscrete EXTENDS RequestBase VAR_IN_OUT {attribute 'symbol' := 'none'} data: ARRAY[*] OF BOOL; END_VAR 1a3278f4-a658-407c-968a-21aa53361562_Decl_LineIds 184 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 73b10819-9112-4811-9583-e2735d2b13ea 00000000-0000-0000-0000-000000000000 ReqReadHolding 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568619598 None engineFunction := 3; IF __ISVALIDREF(client) AND_THEN client.engineMode THEN out_parameterError := (UINT_TO_DINT(in_dataOffset) < LOWER_BOUND(data,1)) OR (UINT_TO_DINT(in_dataOffset) > UPPER_BOUND(data,1)); IF out_parameterError THEN dataCapacity := 0; ELSE dataCapacity := DINT_TO_UINT(UPPER_BOUND(data,1) - UINT_TO_DINT(in_dataOffset) + 1); END_IF; SUPER^(); RETURN; END_IF; 73b10819-9112-4811-9583-e2735d2b13ea_Impl_LineIds (* Read request using the indicated BOOL/UINT array and shared RequestBase inputs. Successful replies update only the selected slice; inspect out_validData/out_stale. *) {attribute 'no_assign'} FUNCTION_BLOCK ReqReadHolding EXTENDS RequestBase VAR_IN_OUT {attribute 'symbol' := 'none'} data: ARRAY[*] OF UINT; END_VAR 73b10819-9112-4811-9583-e2735d2b13ea_Decl_LineIds 173 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False a5dbc9b0-a1a1-4281-a685-ec85b35bb866 00000000-0000-0000-0000-000000000000 ReqReadInput 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568679576 None engineFunction := 4; IF __ISVALIDREF(client) AND_THEN client.engineMode THEN out_parameterError := (UINT_TO_DINT(in_dataOffset) < LOWER_BOUND(data,1)) OR (UINT_TO_DINT(in_dataOffset) > UPPER_BOUND(data,1)); IF out_parameterError THEN dataCapacity := 0; ELSE dataCapacity := DINT_TO_UINT(UPPER_BOUND(data,1) - UINT_TO_DINT(in_dataOffset) + 1); END_IF; SUPER^(); RETURN; END_IF; a5dbc9b0-a1a1-4281-a685-ec85b35bb866_Impl_LineIds (* Read request using the indicated BOOL/UINT array and shared RequestBase inputs. Successful replies update only the selected slice; inspect out_validData/out_stale. *) {attribute 'no_assign'} FUNCTION_BLOCK ReqReadInput EXTENDS RequestBase VAR_IN_OUT {attribute 'symbol' := 'none'} data: ARRAY[*] OF UINT; END_VAR a5dbc9b0-a1a1-4281-a685-ec85b35bb866_Decl_LineIds 167 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 00000000-0000-0000-0000-000000000000 RequestBase 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568734792 None IF NOT __ISVALIDREF(client) THEN RETURN; END_IF; client.addRequest(THIS); stats.reqLength := MIN(in_quantity, dataCapacity); 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37_Impl_LineIds (* Abstract registered request. Quantity is clamped to available data capacity; zero disables scheduling. Concrete blocks supply data type and function code. *) {attribute 'no_assign'} FUNCTION_BLOCK ABSTRACT RequestBase VAR_INPUT {attribute 'symbol' := 'none'} client: REFERENCE TO ClientBase; {attribute 'symbol' := 'none'} in_startAddr: UINT; {attribute 'symbol' := 'none'} in_quantity: UINT; {attribute 'symbol' := 'none'} in_dataOffset: UINT; {attribute 'symbol' := 'none'} in_unitId: BYTE := 0; {attribute 'symbol' := 'none'} in_timeout: SYSTIME := 0; {attribute 'symbol' := 'none'} in_minDelay: TIME := T#10MS; {attribute 'symbol' := 'none'} in_prioritySetpoint: INT := 50; {attribute 'symbol' := 'none'} in_priorityCurrent: INT; {attribute 'symbol' := 'none'} stats: RequestStats; END_VAR VAR {attribute 'symbol' := 'none'} dataCapacity: UINT; END_VAR VAR engineFunction : BYTE; engineTransactionQuantity : UINT; engineTransactionDataIndex : UINT; engineInFlight : BOOL; engineReadComplete : BOOL; engineCopyAllowed : BOOL; engineWriteHold : BOOL; engineRequestStartMilliseconds : ULINT; engineDataIndex : DINT; engineCallResult : UDINT; END_VAR VAR_OUTPUT out_errorCode : UDINT; out_socketError : UDINT; out_writeUncertain : BOOL; out_validData : BOOL; out_dataAgeMs : ULINT; out_stale : BOOL := TRUE; out_parameterError : BOOL; END_VAR VAR_INPUT in_staleAfter : TIME := T#2S; END_VAR 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37_Decl_LineIds 3210 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 48b508fd-2131-484c-ba4a-20e61e66a5b2 00000000-0000-0000-0000-000000000000 RequestStats 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568915046 None SysTimeGetUs(currentTimeMicroseconds); IF (reqLength = 0) AND NOT reqBusy AND NOT execute THEN active := FALSE; execute := FALSE; online := FALSE; offline := FALSE; reqDone := FALSE; reqBusy := FALSE; reqError := FALSE; sinceLastExec := 0; previousOnline := FALSE; setToString(); RETURN; END_IF active := reqLength > 0; doneIndicatorDelay(IN := reqDone, PT := INDICATOR_HOLD_TIME); reqDoneLight := doneIndicatorDelay.Q; busyIndicatorDelay(IN := reqBusy, PT := INDICATOR_HOLD_TIME); reqBusyLight := busyIndicatorDelay.Q; errorIndicatorDelay(IN := reqError, PT := INDICATOR_HOLD_TIME); reqErrorLight := errorIndicatorDelay.Q; executeIndicatorDelay(IN := _execute, PT := INDICATOR_HOLD_TIME); executeLight := executeIndicatorDelay.Q; IF engineResponseSeen OR doneCntRst >=3 THEN online := TRUE; offline := FALSE; END_IF IF NOT engineResponseSeen AND errorCntRst >= 3 THEN online := FALSE; offline := TRUE; END_IF executeTrig(CLK := execute); IF executeTrig.Q THEN interval := ULINT_TO_UDINT((currentTimeMicroseconds - lastRequestStartMicroseconds)/1000); lastRequestStartMicroseconds := currentTimeMicroseconds; END_IF IF previousOnline AND NOT online THEN IF offlineCnt < 65535 THEN offlineCnt := offlineCnt + 1; END_IF; END_IF IF currentTimeMicroseconds >= lastRequestStartMicroseconds THEN IF currentTimeMicroseconds - lastRequestStartMicroseconds > 60000000 THEN lastRequestStartMicroseconds := currentTimeMicroseconds - 60000000; END_IF; ELSE lastRequestStartMicroseconds := currentTimeMicroseconds; END_IF; sinceLastExec := ULINT_TO_UDINT((currentTimeMicroseconds - lastRequestStartMicroseconds)/1000); previousOnline := online; setToString(); 48b508fd-2131-484c-ba4a-20e61e66a5b2_Impl_LineIds (* Per-request history, communication flags and 100 ms display indicators. Maintained by request processing; temporary disable retains historical counters. *) {attribute 'monitoring_display' := 'toString'} {attribute 'no_assign'} FUNCTION_BLOCK RequestStats VAR_INPUT lastErrorId: Error; lastExceptionCode: ExceptionCodes; lastValidDuration: UDINT; longestValidDuration: UDINT; interval: UDINT; offlineCnt: UINT; doneCnt: UDINT; errorCnt: UDINT; doneCntRst: UDINT; errorCntRst: UDINT; sinceLastExec: UDINT; timeoutCnt: UDINT; reqLength: UINT; END_VAR VAR_OUTPUT executeLight: BOOL; reqDoneLight: BOOL; reqErrorLight: BOOL; reqBusyLight: BOOL; online: BOOL; offline: BOOL; active: BOOL; executeMbFb: BOOL; END_VAR VAR {attribute 'symbol' := 'none'} doneIndicatorDelay: TOF; {attribute 'symbol' := 'none'} errorIndicatorDelay: TOF; {attribute 'symbol' := 'none'} busyIndicatorDelay: TOF; {attribute 'symbol' := 'none'} executeIndicatorDelay: TOF; toString: STRING(64); {attribute 'symbol' := 'none'} executeTrig: R_TRIG; {attribute 'symbol' := 'none'} offlineTrig: R_TRIG; {attribute 'symbol' := 'none'} lastRequestStartMicroseconds: SYSTIME; {attribute 'symbol' := 'none'} currentTimeMicroseconds: SYSTIME; _execute: BOOL; _reqDone: BOOL; _reqBusy: BOOL; _reqError: BOOL; END_VAR VAR CONSTANT {attribute 'symbol' := 'none'} INDICATOR_HOLD_TIME: TIME:= T#100MS; END_VAR VAR_INPUT engineResponseSeen : BOOL; engineLastSuccessMs : ULINT; END_VAR VAR_INPUT sentCnt : UDINT; replyCnt : UDINT; exceptionCnt : UDINT; totalValidDuration : ULINT; // Sum of successful worker transaction durations, milliseconds. END_VAR VAR previousOnline : BOOL; END_VAR 48b508fd-2131-484c-ba4a-20e61e66a5b2_Decl_LineIds 286 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False f6ee860b-0951-41d0-93d8-6436c681d8f1 00000000-0000-0000-0000-000000000000 ReqWriteCoil 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569190417 None engineFunction := 15; IF __ISVALIDREF(client) AND_THEN client.engineMode THEN out_parameterError := (UINT_TO_DINT(in_dataOffset) < LOWER_BOUND(data,1)) OR (UINT_TO_DINT(in_dataOffset) > UPPER_BOUND(data,1)); IF out_parameterError THEN dataCapacity := 0; ELSE dataCapacity := DINT_TO_UINT(UPPER_BOUND(data,1) - UINT_TO_DINT(in_dataOffset) + 1); END_IF; SUPER^(); RETURN; END_IF; f6ee860b-0951-41d0-93d8-6436c681d8f1_Impl_LineIds (* Cyclic write request. Values are copied at submission; writeNow changes eligibility/hold state. See uncertain-write policy in USER-GUIDE.md. *) {attribute 'no_assign'} FUNCTION_BLOCK ReqWriteCoil EXTENDS RequestBase VAR_IN_OUT {attribute 'symbol' := 'none'} data: ARRAY[*] OF BOOL; END_VAR f6ee860b-0951-41d0-93d8-6436c681d8f1_Decl_LineIds 206 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False bb7e18ba-2018-4681-875e-de1f291019ef 00000000-0000-0000-0000-000000000000 ReqWriteHolding 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569250556 None engineFunction := 16; IF __ISVALIDREF(client) AND_THEN client.engineMode THEN out_parameterError := (UINT_TO_DINT(in_dataOffset) < LOWER_BOUND(data,1)) OR (UINT_TO_DINT(in_dataOffset) > UPPER_BOUND(data,1)); IF out_parameterError THEN dataCapacity := 0; ELSE dataCapacity := DINT_TO_UINT(UPPER_BOUND(data,1) - UINT_TO_DINT(in_dataOffset) + 1); END_IF; SUPER^(); RETURN; END_IF; bb7e18ba-2018-4681-875e-de1f291019ef_Impl_LineIds (* Cyclic write request. Values are copied at submission; writeNow changes eligibility/hold state. See uncertain-write policy in USER-GUIDE.md. *) {attribute 'no_assign'} FUNCTION_BLOCK ReqWriteHolding EXTENDS RequestBase VAR_IN_OUT {attribute 'symbol' := 'none'} data: ARRAY[*] OF UINT; END_VAR bb7e18ba-2018-4681-875e-de1f291019ef_Decl_LineIds 164 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False 9499c60e-03a2-49d0-b086-43990a018e20 00000000-0000-0000-0000-000000000000 To_IPAddress 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569300557 None To_IPAddress[0] := byte1; To_IPAddress[1] := byte2; To_IPAddress[2] := byte3; To_IPAddress[3] := byte4; 9499c60e-03a2-49d0-b086-43990a018e20_Impl_LineIds (* Return four BYTE IPv4 octets as the ClientTCP address array. *) FUNCTION To_IPAddress : ARRAY[0..3] OF BYTE VAR_INPUT byte1: BYTE; byte2: BYTE; byte3: BYTE; byte4: BYTE; END_VAR 9499c60e-03a2-49d0-b086-43990a018e20_Decl_LineIds 168 Standard False 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 False bc332406-19bf-513a-a6ae-57ad0254c3d3 00000000-0000-0000-0000-000000000000 ModbusSlave 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 cb2ee488-e770-4060-ad57-9a6caeef450c 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569320582 None SysTimeGetUs(nowUs); nowMs := nowUs / 1000; out_parameterError := (port = 0) OR (interfaceName <> ""); out_parameterError := out_parameterError OR (LOWER_BOUND(aCoilsMemory,1) < 0) OR (UPPER_BOUND(aCoilsMemory,1) > 65535) OR (UPPER_BOUND(aCoilsMemory,1) - LOWER_BOUND(aCoilsMemory,1) + 1 > 2000); out_parameterError := out_parameterError OR (LOWER_BOUND(aDiscreteInputsMemory,1) < 0) OR (UPPER_BOUND(aDiscreteInputsMemory,1) > 65535) OR (UPPER_BOUND(aDiscreteInputsMemory,1) - LOWER_BOUND(aDiscreteInputsMemory,1) + 1 > 2000); out_parameterError := out_parameterError OR (LOWER_BOUND(aHoldingRegistersMemory,1) < 0) OR (UPPER_BOUND(aHoldingRegistersMemory,1) > 65535) OR (UPPER_BOUND(aHoldingRegistersMemory,1) - LOWER_BOUND(aHoldingRegistersMemory,1) + 1 > 2000); out_parameterError := out_parameterError OR (LOWER_BOUND(aInputRegistersMemory,1) < 0) OR (UPPER_BOUND(aInputRegistersMemory,1) > 65535) OR (UPPER_BOUND(aInputRegistersMemory,1) - LOWER_BOUND(aInputRegistersMemory,1) + 1 > 2000); IF serverHandle <> 0 AND (NOT in_enable OR in_reset OR out_parameterError OR lastIP <> in_ipAddress OR lastPort <> port OR lastRetry <> in_reconnectDelay) THEN serverCall(31); serverHandle := 0; END_IF; in_reset := FALSE; lastIP := in_ipAddress; lastPort := port; lastRetry := in_reconnectDelay; IF NOT in_enable OR out_parameterError THEN out_running := FALSE; out_error := out_parameterError; IF out_parameterError THEN out_errorId := Error.RequestParameterError; END_IF; RETURN; END_IF; IF serverHandle = 0 THEN callResult := serverCall(30); IF callResult <> 0 THEN out_running := FALSE; out_error := TRUE; out_errorId := Error.InternalError; RETURN; END_IF; serverHandle := serverStatus[0]; serverCall(32); END_IF; tableIndex := 0; tableStart := DINT_TO_UINT(LOWER_BOUND(aCoilsMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aCoilsMemory,1)-LOWER_BOUND(aCoilsMemory,1)+1); FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO serverIO[itemIndex] := BOOL_TO_WORD(aCoilsMemory[LOWER_BOUND(aCoilsMemory,1)+itemIndex]); END_FOR; callResult := serverCall(35); IF callResult <> 0 THEN serverCall(31); serverHandle := 0; out_error := TRUE; out_errorId := Error.RequestParameterError; RETURN; END_IF; tableIndex := 1; tableStart := DINT_TO_UINT(LOWER_BOUND(aDiscreteInputsMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aDiscreteInputsMemory,1)-LOWER_BOUND(aDiscreteInputsMemory,1)+1); FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO serverIO[itemIndex] := BOOL_TO_WORD(aDiscreteInputsMemory[LOWER_BOUND(aDiscreteInputsMemory,1)+itemIndex]); END_FOR; callResult := serverCall(35); IF callResult <> 0 THEN serverCall(31); serverHandle := 0; out_error := TRUE; out_errorId := Error.RequestParameterError; RETURN; END_IF; tableIndex := 2; tableStart := DINT_TO_UINT(LOWER_BOUND(aHoldingRegistersMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aHoldingRegistersMemory,1)-LOWER_BOUND(aHoldingRegistersMemory,1)+1); FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO serverIO[itemIndex] := UINT_TO_WORD(aHoldingRegistersMemory[LOWER_BOUND(aHoldingRegistersMemory,1)+itemIndex]); END_FOR; callResult := serverCall(35); IF callResult <> 0 THEN serverCall(31); serverHandle := 0; out_error := TRUE; out_errorId := Error.RequestParameterError; RETURN; END_IF; tableIndex := 3; tableStart := DINT_TO_UINT(LOWER_BOUND(aInputRegistersMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aInputRegistersMemory,1)-LOWER_BOUND(aInputRegistersMemory,1)+1); FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO serverIO[itemIndex] := UINT_TO_WORD(aInputRegistersMemory[LOWER_BOUND(aInputRegistersMemory,1)+itemIndex]); END_FOR; callResult := serverCall(35); IF callResult <> 0 THEN serverCall(31); serverHandle := 0; out_error := TRUE; out_errorId := Error.RequestParameterError; RETURN; END_IF; callResult := serverCall(34); IF callResult = 256 THEN serverHandle := 0; out_running := FALSE; out_error := TRUE; RETURN; END_IF; tableIndex := 0; tableStart := DINT_TO_UINT(LOWER_BOUND(aCoilsMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aCoilsMemory,1)-LOWER_BOUND(aCoilsMemory,1)+1); callResult := serverCall(36); IF callResult = 0 THEN FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO aCoilsMemory[LOWER_BOUND(aCoilsMemory,1)+itemIndex] := serverIO[itemIndex] <> 0; END_FOR; END_IF; tableIndex := 1; tableStart := DINT_TO_UINT(LOWER_BOUND(aDiscreteInputsMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aDiscreteInputsMemory,1)-LOWER_BOUND(aDiscreteInputsMemory,1)+1); callResult := serverCall(36); IF callResult = 0 THEN FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO aDiscreteInputsMemory[LOWER_BOUND(aDiscreteInputsMemory,1)+itemIndex] := serverIO[itemIndex] <> 0; END_FOR; END_IF; tableIndex := 2; tableStart := DINT_TO_UINT(LOWER_BOUND(aHoldingRegistersMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aHoldingRegistersMemory,1)-LOWER_BOUND(aHoldingRegistersMemory,1)+1); callResult := serverCall(36); IF callResult = 0 THEN FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO aHoldingRegistersMemory[LOWER_BOUND(aHoldingRegistersMemory,1)+itemIndex] := WORD_TO_UINT(serverIO[itemIndex]); END_FOR; END_IF; tableIndex := 3; tableStart := DINT_TO_UINT(LOWER_BOUND(aInputRegistersMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aInputRegistersMemory,1)-LOWER_BOUND(aInputRegistersMemory,1)+1); callResult := serverCall(36); IF callResult = 0 THEN FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO aInputRegistersMemory[LOWER_BOUND(aInputRegistersMemory,1)+itemIndex] := WORD_TO_UINT(serverIO[itemIndex]); END_FOR; END_IF; out_running := serverStatus[1] <> 0; out_error := serverStatus[2] <> 0; IF out_error THEN out_errorId := Error.TcpSocketError; ELSE out_errorId := Error.OK; END_IF; out_socketError := serverStatus[4]; out_connectedClients := UDINT_TO_UINT(serverStatus[5]); out_requestsReceived := serverStatus[6]; out_repliesSent := serverStatus[7]; out_exceptionReplies := serverStatus[8]; bc332406-19bf-513a-a6ae-57ad0254c3d3_Impl_LineIds (* TCP server: four memory arrays, eight peers, up to 2000 entries/table. Array bounds define protocol addresses. Dirty remote writes are protected until PLC pull. Mapping changes require in_reset. No RTU server is provided. *) {attribute 'no_assign'} FUNCTION_BLOCK ModbusSlave VAR_IN_OUT aDiscreteInputsMemory : ARRAY[*] OF BOOL; aCoilsMemory : ARRAY[*] OF BOOL; aInputRegistersMemory : ARRAY[*] OF UINT; aHoldingRegistersMemory : ARRAY[*] OF UINT; END_VAR VAR_INPUT in_enable : BOOL := TRUE; in_reset : BOOL; in_reconnectDelay : TIME := T#100MS; interfaceName : WSTRING; in_ipAddress : DWORD; port : UINT := 502; END_VAR VAR_OUTPUT out_running : BOOL; out_error : BOOL; out_errorId : Error; out_parameterError : BOOL; out_socketError : UDINT; out_connectedClients : UINT; out_requestsReceived : UDINT; out_repliesSent : UDINT; out_exceptionReplies : UDINT; END_VAR VAR serverHandle : UDINT; serverStatus : ARRAY[0..23] OF UDINT; serverIO : ARRAY[0..1999] OF WORD; nowUs : SYSTIME; nowMs : ULINT; lastIP : DWORD; lastPort : UINT; lastRetry : TIME; callResult : UDINT; tableIndex : BYTE; itemIndex : DINT; tableStart : UINT; tableCount : UINT; END_VAR bc332406-19bf-513a-a6ae-57ad0254c3d3_Decl_LineIds 1833 Standard False cb2ee488-e770-4060-ad57-9a6caeef450c ModbusSlave -1 False 69cd625a-3b8c-4dca-bb1e-eaefa064964f 00000000-0000-0000-0000-000000000000 SlaveTCP 24568a24-c491-472c-a21f-ee5d33859fab 1024 False False False False 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 cb2ee488-e770-4060-ad57-9a6caeef450c 6f9dac99-8de1-4efc-8465-68ac443b7d08 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569386026 None SysTimeGetUs(nowUs); nowMs := nowUs / 1000; out_parameterError := (port = 0) OR (interfaceName <> ""); out_parameterError := out_parameterError OR (LOWER_BOUND(aCoilsMemory,1) < 0) OR (UPPER_BOUND(aCoilsMemory,1) > 65535) OR (UPPER_BOUND(aCoilsMemory,1) - LOWER_BOUND(aCoilsMemory,1) + 1 > 2000); out_parameterError := out_parameterError OR (LOWER_BOUND(aDiscreteInputsMemory,1) < 0) OR (UPPER_BOUND(aDiscreteInputsMemory,1) > 65535) OR (UPPER_BOUND(aDiscreteInputsMemory,1) - LOWER_BOUND(aDiscreteInputsMemory,1) + 1 > 2000); out_parameterError := out_parameterError OR (LOWER_BOUND(aHoldingRegistersMemory,1) < 0) OR (UPPER_BOUND(aHoldingRegistersMemory,1) > 65535) OR (UPPER_BOUND(aHoldingRegistersMemory,1) - LOWER_BOUND(aHoldingRegistersMemory,1) + 1 > 2000); out_parameterError := out_parameterError OR (LOWER_BOUND(aInputRegistersMemory,1) < 0) OR (UPPER_BOUND(aInputRegistersMemory,1) > 65535) OR (UPPER_BOUND(aInputRegistersMemory,1) - LOWER_BOUND(aInputRegistersMemory,1) + 1 > 2000); IF serverHandle <> 0 AND (NOT in_enable OR in_reset OR out_parameterError OR lastIP <> in_ipAddress OR lastPort <> port OR lastRetry <> in_reconnectDelay) THEN serverCall(31); serverHandle := 0; END_IF; in_reset := FALSE; lastIP := in_ipAddress; lastPort := port; lastRetry := in_reconnectDelay; IF NOT in_enable OR out_parameterError THEN out_running := FALSE; out_error := out_parameterError; IF out_parameterError THEN out_errorId := Error.RequestParameterError; END_IF; RETURN; END_IF; IF serverHandle = 0 THEN callResult := serverCall(30); IF callResult <> 0 THEN out_running := FALSE; out_error := TRUE; out_errorId := Error.InternalError; RETURN; END_IF; serverHandle := serverStatus[0]; serverCall(32); END_IF; tableIndex := 0; tableStart := DINT_TO_UINT(LOWER_BOUND(aCoilsMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aCoilsMemory,1)-LOWER_BOUND(aCoilsMemory,1)+1); FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO serverIO[itemIndex] := BOOL_TO_WORD(aCoilsMemory[LOWER_BOUND(aCoilsMemory,1)+itemIndex]); END_FOR; callResult := serverCall(35); IF callResult <> 0 THEN serverCall(31); serverHandle := 0; out_error := TRUE; out_errorId := Error.RequestParameterError; RETURN; END_IF; tableIndex := 1; tableStart := DINT_TO_UINT(LOWER_BOUND(aDiscreteInputsMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aDiscreteInputsMemory,1)-LOWER_BOUND(aDiscreteInputsMemory,1)+1); FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO serverIO[itemIndex] := BOOL_TO_WORD(aDiscreteInputsMemory[LOWER_BOUND(aDiscreteInputsMemory,1)+itemIndex]); END_FOR; callResult := serverCall(35); IF callResult <> 0 THEN serverCall(31); serverHandle := 0; out_error := TRUE; out_errorId := Error.RequestParameterError; RETURN; END_IF; tableIndex := 2; tableStart := DINT_TO_UINT(LOWER_BOUND(aHoldingRegistersMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aHoldingRegistersMemory,1)-LOWER_BOUND(aHoldingRegistersMemory,1)+1); FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO serverIO[itemIndex] := UINT_TO_WORD(aHoldingRegistersMemory[LOWER_BOUND(aHoldingRegistersMemory,1)+itemIndex]); END_FOR; callResult := serverCall(35); IF callResult <> 0 THEN serverCall(31); serverHandle := 0; out_error := TRUE; out_errorId := Error.RequestParameterError; RETURN; END_IF; tableIndex := 3; tableStart := DINT_TO_UINT(LOWER_BOUND(aInputRegistersMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aInputRegistersMemory,1)-LOWER_BOUND(aInputRegistersMemory,1)+1); FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO serverIO[itemIndex] := UINT_TO_WORD(aInputRegistersMemory[LOWER_BOUND(aInputRegistersMemory,1)+itemIndex]); END_FOR; callResult := serverCall(35); IF callResult <> 0 THEN serverCall(31); serverHandle := 0; out_error := TRUE; out_errorId := Error.RequestParameterError; RETURN; END_IF; callResult := serverCall(34); IF callResult = 256 THEN serverHandle := 0; out_running := FALSE; out_error := TRUE; RETURN; END_IF; tableIndex := 0; tableStart := DINT_TO_UINT(LOWER_BOUND(aCoilsMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aCoilsMemory,1)-LOWER_BOUND(aCoilsMemory,1)+1); callResult := serverCall(36); IF callResult = 0 THEN FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO aCoilsMemory[LOWER_BOUND(aCoilsMemory,1)+itemIndex] := serverIO[itemIndex] <> 0; END_FOR; END_IF; tableIndex := 1; tableStart := DINT_TO_UINT(LOWER_BOUND(aDiscreteInputsMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aDiscreteInputsMemory,1)-LOWER_BOUND(aDiscreteInputsMemory,1)+1); callResult := serverCall(36); IF callResult = 0 THEN FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO aDiscreteInputsMemory[LOWER_BOUND(aDiscreteInputsMemory,1)+itemIndex] := serverIO[itemIndex] <> 0; END_FOR; END_IF; tableIndex := 2; tableStart := DINT_TO_UINT(LOWER_BOUND(aHoldingRegistersMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aHoldingRegistersMemory,1)-LOWER_BOUND(aHoldingRegistersMemory,1)+1); callResult := serverCall(36); IF callResult = 0 THEN FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO aHoldingRegistersMemory[LOWER_BOUND(aHoldingRegistersMemory,1)+itemIndex] := WORD_TO_UINT(serverIO[itemIndex]); END_FOR; END_IF; tableIndex := 3; tableStart := DINT_TO_UINT(LOWER_BOUND(aInputRegistersMemory,1)); tableCount := DINT_TO_UINT(UPPER_BOUND(aInputRegistersMemory,1)-LOWER_BOUND(aInputRegistersMemory,1)+1); callResult := serverCall(36); IF callResult = 0 THEN FOR itemIndex := 0 TO UINT_TO_DINT(tableCount)-1 DO aInputRegistersMemory[LOWER_BOUND(aInputRegistersMemory,1)+itemIndex] := WORD_TO_UINT(serverIO[itemIndex]); END_FOR; END_IF; out_running := serverStatus[1] <> 0; out_error := serverStatus[2] <> 0; IF out_error THEN out_errorId := Error.TcpSocketError; ELSE out_errorId := Error.OK; END_IF; out_socketError := serverStatus[4]; out_connectedClients := UDINT_TO_UINT(serverStatus[5]); out_requestsReceived := serverStatus[6]; out_repliesSent := serverStatus[7]; out_exceptionReplies := serverStatus[8]; 69cd625a-3b8c-4dca-bb1e-eaefa064964f_Impl_LineIds (* TCP server: four memory arrays, eight peers, up to 2000 entries/table. Array bounds define protocol addresses. Dirty remote writes are protected until PLC pull. Mapping changes require in_reset. No RTU server is provided. *) {attribute 'no_assign'} FUNCTION_BLOCK SlaveTCP VAR_IN_OUT aDiscreteInputsMemory : ARRAY[*] OF BOOL; aCoilsMemory : ARRAY[*] OF BOOL; aInputRegistersMemory : ARRAY[*] OF UINT; aHoldingRegistersMemory : ARRAY[*] OF UINT; END_VAR VAR_INPUT in_enable : BOOL := TRUE; in_reset : BOOL; in_reconnectDelay : TIME := T#100MS; interfaceName : WSTRING; in_ipAddress : DWORD; port : UINT := 502; END_VAR VAR_OUTPUT out_running : BOOL; out_error : BOOL; out_errorId : Error; out_parameterError : BOOL; out_socketError : UDINT; out_connectedClients : UINT; out_requestsReceived : UDINT; out_repliesSent : UDINT; out_exceptionReplies : UDINT; END_VAR VAR serverHandle : UDINT; serverStatus : ARRAY[0..23] OF UDINT; serverIO : ARRAY[0..1999] OF WORD; nowUs : SYSTIME; nowMs : ULINT; lastIP : DWORD; lastPort : UINT; lastRetry : TIME; callResult : UDINT; tableIndex : BYTE; itemIndex : DINT; tableStart : UINT; tableCount : UINT; END_VAR 69cd625a-3b8c-4dca-bb1e-eaefa064964f_Decl_LineIds 1833 Standard False cb2ee488-e770-4060-ad57-9a6caeef450c ModbusSlave -1 False 9e99e368-853f-485b-911f-d9a2a4e46434 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa addRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568018539 IF request = 0 THEN RETURN; END_IF; IF requestCnt > 100 THEN out_registrationFull := TRUE; RETURN; END_IF; IF requestCnt > 0 THEN FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF request = requests[requestIndex] THEN RETURN; END_IF; END_FOR; END_IF; IF requestCnt >= 100 THEN out_registrationFull := TRUE; RETURN; END_IF; requests[requestCnt] := request; requestCnt := requestCnt + 1; 9e99e368-853f-485b-911f-d9a2a4e46434_Impl_LineIds (* Register unique non-null request pointer, max 100. Duplicate registration is ignored. Overflow sets registrationFull. *) METHOD PUBLIC addRequest VAR_INPUT request: POINTER TO RequestBase; END_VAR VAR requestIndex : DINT := 0; END_VAR 9e99e368-853f-485b-911f-d9a2a4e46434_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False b2fda51f-6f2a-5b12-bc9c-2985dd3a44b4 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa FB_exit f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568058542 FB_exit := releaseContext(); b2fda51f-6f2a-5b12-bc9c-2985dd3a44b4_Impl_LineIds (* Lifecycle resource release. context hooks close their owned handle. Use public release for application shutdown. *) METHOD FB_exit : BOOL VAR_INPUT bInCopyCode : BOOL; END_VAR b2fda51f-6f2a-5b12-bc9c-2985dd3a44b4_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 7568f58a-e795-5d22-a622-3f070deb32b0 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa FB_reinit f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568088533 IF engineHandle <> 0 THEN callEngine(CMD_CLOSE); END_IF; engineHandle := 0; engineActiveRequest := 0; engineSelected := 0; engineActiveIndex := -1; engineResultReady := FALSE; engineWasConnected := FALSE; requestCnt := 0; out_registrationFull := FALSE; FOR requestIndex := 0 TO 99 DO requests[requestIndex] := 0; reqStats[requestIndex] := 0; END_FOR; FB_reinit := TRUE; 7568f58a-e795-5d22-a622-3f070deb32b0_Impl_LineIds (* Clear handles/registry or request execution state after instance reinitialization. Does not guarantee online-change correctness. *) METHOD FB_reinit : BOOL VAR requestIndex : DINT; END_VAR 7568f58a-e795-5d22-a622-3f070deb32b0_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False f0be8440-a307-5b71-82c8-af27d8852e42 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa callEngine f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568103734 IF command = 20 THEN deviceBytes := ADR(engineDevice); deviceLength := TO_UINT(LEN(engineDevice)); FOR deviceIndex := 0 TO UINT_TO_DINT(deviceLength)-1 DO engineIO[deviceIndex] := BYTE_TO_WORD(deviceBytes[deviceIndex]); END_FOR; callEngine := atMbCall_cext( command := 20, handle := 0, ipAddress := engineSerialBaud, port := 0, unitId := engineSerialParity, functionCode := engineSerialBits, startAddress := engineSerialStops, quantity := deviceLength, pData := ADR(engineIO[0]), dataCapacity := 2000, pStatus := ADR(engineStatus[0]), statusCapacity := 24, nowMs := engineNowMilliseconds, connectTimeoutMs := engineSerialRs485, responseTimeoutMs := 0, retryDelayMs := 0); RETURN; END_IF; callEngine := atMbCall_cext( command := command, handle := engineHandle, ipAddress := engineIP, port := enginePort, unitId := engineArgUnit, functionCode := engineArgFunction, startAddress := engineArgAddress, quantity := engineArgQuantity, pData := ADR(engineIO[0]), dataCapacity := 2000, pStatus := ADR(engineStatus[STATUS_HANDLE]), statusCapacity := 24, nowMs := engineNowMilliseconds, connectTimeoutMs := engineConnectTimeoutMilliseconds, responseTimeoutMs := engineArgTimeout, retryDelayMs := engineRetryDelayMilliseconds); f0be8440-a307-5b71-82c8-af27d8852e42_Impl_LineIds (* Internal synchronous ABI adapter with WORD transfer buffer and 24-word status storage. RTU open repurposes fields to pass serial path/configuration. *) METHOD callEngine : UDINT VAR_INPUT command : UDINT; END_VAR VAR deviceBytes : POINTER TO BYTE; deviceLength : UINT; deviceIndex : DINT; END_VAR f0be8440-a307-5b71-82c8-af27d8852e42_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 1233447d-8796-56cf-9291-c959801d2a63 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa processCycle f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568123871 SysTimeGetUs(engineNowMicroseconds); engineNowMilliseconds := engineNowMicroseconds / 1000; IF in_resetStats THEN resetStats(); in_resetStats := FALSE; END_IF; IF requestCnt > 100 THEN out_registrationFull := TRUE; updateStatistics(); RETURN; END_IF; IF NOT ensureContext() THEN out_connected := FALSE; out_connectionState := STATE_DISABLED; updateStatistics(); RETURN; END_IF; callResult := callEngine(CMD_TICK); IF callResult = ERROR_INVALID_HANDLE THEN IF engineActiveRequest <> 0 THEN engineActiveRequest^.finishRequest(ERROR_CANCELLED); END_IF; engineHandle := 0; engineActiveRequest := 0; engineSelected := 0; engineActiveIndex := -1; engineResultReady := FALSE; out_connected := FALSE; out_connectionState := STATE_DISABLED; setAllRequestsOffline(); engineWasConnected := FALSE; updateStatistics(); RETURN; ELSIF callResult <> 0 THEN out_lastErrorCode := callResult; updateStatistics(); RETURN; END_IF; updateDiagnostics(); engineFinishedIndex := -1; engineResultReady := (engineActiveRequest <> 0) AND ((engineStatus[STATUS_DONE] <> 0) OR (engineStatus[STATUS_ERROR] <> 0)); IF engineResultReady AND (engineStatus[STATUS_DONE] <> 0) AND (engineStatus[STATUS_FUNCTION] <= 4) THEN callResult := callEngine(CMD_COPY_READ); IF callResult <> 0 THEN engineStatus[STATUS_DONE] := 0; engineStatus[STATUS_ERROR] := 1; engineStatus[STATUS_RESULT] := callResult; END_IF; END_IF; processAllRequests(); IF engineResultReady THEN engineFinishedIndex := engineActiveIndex; callEngine(CMD_ACKNOWLEDGE); engineActiveRequest := 0; engineActiveIndex := -1; engineSelected := 0; engineResultReady := FALSE; END_IF; selectNextRequest(); updateStatistics(); 1233447d-8796-56cf-9291-c959801d2a63_Impl_LineIds (* Refresh scan lease, read completed results, process request completions, acknowledge result and select next transaction. Transport I/O progresses during the owning PLC call. *) METHOD processCycle VAR callResult : UDINT; END_VAR 1233447d-8796-56cf-9291-c959801d2a63_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False cd589427-461e-5ddd-ac58-1b10574ff50f bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ensureContext f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568133898 ensureContext := FALSE; IF engineHandle <> 0 THEN ensureContext := TRUE; RETURN; END_IF; IF NOT engineEnable THEN RETURN; END_IF; callResult := callEngine(engineOpenCommand); IF callResult <> 0 THEN out_lastErrorCode := callResult; RETURN; END_IF; engineHandle := engineStatus[STATUS_HANDLE]; engineArgTimeout := 1000; callResult := callEngine(CMD_CONFIGURE); IF callResult = 0 THEN callResult := callEngine(CMD_ENABLE); END_IF; IF callResult <> 0 THEN out_lastErrorCode := callResult; callEngine(CMD_CLOSE); engineHandle := 0; RETURN; END_IF; ensureContext := TRUE; cd589427-461e-5ddd-ac58-1b10574ff50f_Impl_LineIds (* Check 0.4 worker capability, allocate/configure/enable a context. A nonzero handle does not imply connectivity. Old components are rejected with error 259. *) METHOD PROTECTED ensureContext : BOOL VAR callResult : UDINT; END_VAR cd589427-461e-5ddd-ac58-1b10574ff50f_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False c08712ba-3cf5-54e9-89a1-76a1c3183975 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa releaseContext f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568153866 IF engineHandle <> 0 THEN callEngine(CMD_CLOSE); IF engineActiveRequest <> 0 THEN engineActiveRequest^.finishRequest(10); END_IF; engineHandle := 0; END_IF; engineActiveRequest := 0; engineSelected := 0; engineActiveIndex := -1; engineResultReady := FALSE; out_connected := FALSE; out_connectionState := 0; setAllRequestsOffline(); FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 THEN requests[requestIndex]^.invalidateData(); END_IF; END_FOR; releaseContext := TRUE; c08712ba-3cf5-54e9-89a1-76a1c3183975_Impl_LineIds (* Close context, cancel active request, mark requests offline and invalidate cached read data. Returns TRUE. Does not disable in_enable; an enabled client can reopen. *) METHOD releaseContext : BOOL VAR requestIndex : DINT; END_VAR c08712ba-3cf5-54e9-89a1-76a1c3183975_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False c63811c3-610b-5c8e-9b5b-66c21ebad08d bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa selectNextRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568173874 IF engineEnable AND engineStatus[STATUS_STATE] = STATE_READY AND engineActiveRequest = 0 THEN selectedRequestIndex := -1; selectedPriority := 32767; oldestRequestAgeMilliseconds := 0; FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 AND_THEN requests[requestIndex]^.stats.active AND NOT requests[requestIndex]^.engineWriteHold AND requestIndex <> engineFinishedIndex THEN IF requests[requestIndex]^.stats.sinceLastExec >= TIME_TO_UDINT(requests[requestIndex]^.in_minDelay) THEN IF (requests[requestIndex]^.in_priorityCurrent < selectedPriority) OR ((requests[requestIndex]^.in_priorityCurrent = selectedPriority) AND (requests[requestIndex]^.stats.sinceLastExec > oldestRequestAgeMilliseconds)) THEN selectedRequestIndex := requestIndex; selectedPriority := requests[requestIndex]^.in_priorityCurrent; oldestRequestAgeMilliseconds := requests[requestIndex]^.stats.sinceLastExec; END_IF; END_IF; END_IF; END_FOR; IF selectedRequestIndex >= 0 THEN IF selectedPriority > 0 THEN FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 AND_THEN requests[requestIndex]^.in_priorityCurrent > 0 THEN requests[requestIndex]^.in_priorityCurrent := requests[requestIndex]^.in_priorityCurrent - 1; END_IF; END_FOR; END_IF; engineSelected := requests[selectedRequestIndex]; engineActiveIndex := selectedRequestIndex; engineSelected^.stats.execute := TRUE; engineSelected^.processRequest(); IF engineActiveRequest = 0 THEN engineActiveIndex := -1; engineSelected := 0; END_IF; END_IF; END_IF; c63811c3-610b-5c8e-9b5b-66c21ebad08d_Impl_LineIds (* Select lowest current priority among eligible unheld requests; oldest age breaks ties. Minimum start delay applies. No zero-priority prerequisite. *) METHOD PROTECTED selectNextRequest VAR requestIndex : DINT; selectedRequestIndex : DINT; selectedPriority : INT; oldestRequestAgeMilliseconds : UDINT; END_VAR c63811c3-610b-5c8e-9b5b-66c21ebad08d_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False ddfa0079-2d7b-5a8c-9442-141403f42b8a bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa updateDiagnostics f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568193864 out_connectionState := engineStatus[STATUS_STATE]; out_connected := (out_connectionState >= STATE_READY) AND (out_connectionState <= STATE_RECEIVING); out_lastErrorCode := engineStatus[STATUS_LAST_ERROR]; out_socketError := engineStatus[STATUS_SOCKET_ERROR]; out_reconnectCount := engineStatus[STATUS_RECONNECTS]; engineWasConnected := out_connected; ddfa0079-2d7b-5a8c-9442-141403f42b8a_Impl_LineIds (* Publish transport state, errno, last result history and reconnect-attempt count. A transient disconnect is not enough to mark requests offline; each request still requires three consecutive failed attempts. *) METHOD PROTECTED updateDiagnostics ddfa0079-2d7b-5a8c-9442-141403f42b8a_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False c9996f9e-0ab8-5939-9dac-0df2def19b84 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa updateStatistics f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568213885 stats.doneCnt := 0; stats.errorCnt := 0; stats.sentCnt := 0; stats.replyCnt := 0; stats.exceptionCnt := 0; stats.timeoutCnt := 0; stats.offlineCnt := 0; stats.activeCount := 0; stats.onlineCount := 0; stats.offlineCount := 0; stats.unknownCount := 0; stats.busyCount := 0; stats.staleCount := 0; stats.heldWriteCount := 0; stats.totalValidDuration := 0; stats.longestValidDuration := 0; stats.requestCount := MIN(requestCnt,UINT#100); FOR requestIndex := 0 TO UINT_TO_DINT(stats.requestCount)-1 DO IF requests[requestIndex] <> 0 THEN reqStats[requestIndex] := ADR(requests[requestIndex]^.stats); stats.doneCnt := stats.doneCnt + UDINT_TO_ULINT(reqStats[requestIndex]^.doneCnt); stats.errorCnt := stats.errorCnt + UDINT_TO_ULINT(reqStats[requestIndex]^.errorCnt); stats.sentCnt := stats.sentCnt + UDINT_TO_ULINT(reqStats[requestIndex]^.sentCnt); stats.replyCnt := stats.replyCnt + UDINT_TO_ULINT(reqStats[requestIndex]^.replyCnt); stats.exceptionCnt := stats.exceptionCnt + UDINT_TO_ULINT(reqStats[requestIndex]^.exceptionCnt); stats.timeoutCnt := stats.timeoutCnt + UDINT_TO_ULINT(reqStats[requestIndex]^.timeoutCnt); stats.offlineCnt := stats.offlineCnt + UINT_TO_ULINT(reqStats[requestIndex]^.offlineCnt); stats.totalValidDuration := stats.totalValidDuration + reqStats[requestIndex]^.totalValidDuration; stats.longestValidDuration := MAX(stats.longestValidDuration, reqStats[requestIndex]^.longestValidDuration); IF reqStats[requestIndex]^.active THEN stats.activeCount := stats.activeCount + 1; IF reqStats[requestIndex]^.online THEN stats.onlineCount := stats.onlineCount + 1; ELSIF reqStats[requestIndex]^.offline THEN stats.offlineCount := stats.offlineCount + 1; ELSE stats.unknownCount := stats.unknownCount + 1; END_IF; IF reqStats[requestIndex]^.reqBusy THEN stats.busyCount := stats.busyCount + 1; END_IF; IF requests[requestIndex]^.engineFunction <= 4 AND requests[requestIndex]^.out_stale THEN stats.staleCount := stats.staleCount + 1; END_IF; IF requests[requestIndex]^.engineWriteHold THEN stats.heldWriteCount := stats.heldWriteCount + 1; END_IF; END_IF; ELSE reqStats[requestIndex] := 0; END_IF; END_FOR; stats.averageValidDuration := 0; IF stats.doneCnt > 0 THEN stats.averageValidDuration := stats.totalValidDuration / stats.doneCnt; END_IF; stats.active := stats.activeCount > 0; stats.online := stats.active AND stats.onlineCount = stats.activeCount; stats.offline := stats.active AND stats.offlineCount = stats.activeCount; stats.toString := CONCAT('OK:',CONCAT(ULINT_TO_STRING(stats.doneCnt),CONCAT('/Er:',ULINT_TO_STRING(stats.errorCnt)))); allRequestsOnline := stats.online; allRequestsOffline := stats.offline; numMsgSent := ULINT_TO_UDINT(MIN(stats.sentCnt,ULINT#4294967295)); numMsgReply := ULINT_TO_UDINT(MIN(stats.replyCnt,ULINT#4294967295)); IF engineWindowStartMilliseconds = 0 THEN engineWindowStartMilliseconds := engineNowMilliseconds; END_IF; IF engineNowMilliseconds - engineWindowStartMilliseconds >= 1000 THEN msgLastSecondCnt := engineWindowCount; msgLastSecondTime := engineWindowTime; engineWindowCount := 0; engineWindowTime := 0; engineWindowStartMilliseconds := engineNowMilliseconds; END_IF; c9996f9e-0ab8-5939-9dac-0df2def19b84_Impl_LineIds (* Rebuild the client summary from each registered RequestStats. State counts are restricted to active requests; historic counters include inactive ones. Publish the common monitoring string and compatibility counters. *) METHOD PROTECTED updateStatistics VAR requestIndex : DINT; END_VAR c9996f9e-0ab8-5939-9dac-0df2def19b84_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 685f7c69-c46a-4b34-b5e2-fb848c593f3e bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa processAllRequests f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568263864 IF requestCnt = 0 OR requestCnt > 100 THEN RETURN; END_IF; FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 THEN requests[requestIndex]^.processRequest(); END_IF; END_FOR; 685f7c69-c46a-4b34-b5e2-fb848c593f3e_Impl_LineIds (* Dispatch all registered non-null request methods; guarded against empty/invalid count. *) METHOD processAllRequests VAR_INPUT END_VAR VAR requestIndex: DINT; END_VAR 685f7c69-c46a-4b34-b5e2-fb848c593f3e_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 60fd3bf3-849f-4af3-a1a5-18a73fd7b7fc bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa recreateClient f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568284030 60fd3bf3-849f-4af3-a1a5-18a73fd7b7fc_Impl_LineIds (* Release current context so next enabled scan reopens with current settings. Affects every request using that connection. *) METHOD ABSTRACT recreateClient VAR_INPUT END_VAR 60fd3bf3-849f-4af3-a1a5-18a73fd7b7fc_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 2a6d360f-01c4-5b27-81fa-337b6b33a1b6 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa release f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568294043 in_enable := FALSE; engineEnable := FALSE; release := releaseContext(); 2a6d360f-01c4-5b27-81fa-337b6b33a1b6_Impl_LineIds (* Disable client input and release its context. Passing in_enable TRUE on a subsequent call resumes it. *) METHOD release : BOOL 2a6d360f-01c4-5b27-81fa-337b6b33a1b6_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False a7e27967-573f-4f9f-86e7-dd569b8cd943 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa resetStats f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568334027 engineSent := 0; engineReplied := 0; engineWindowCount := 0; engineWindowTime := 0; msgLastSecondCnt := 0; msgLastSecondTime := 0; numMsgSent := 0; numMsgReply := 0; FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 THEN requests[requestIndex]^.stats.resetStats(); END_IF; END_FOR; engineWindowStartMilliseconds := engineNowMilliseconds; updateStatistics(); a7e27967-573f-4f9f-86e7-dd569b8cd943_Impl_LineIds (* Clear success/error/send/reply/timeout/exception/offline counters and successful-duration history. Client version delegates to each request and refreshes totals. Connection state and data freshness are preserved. *) METHOD resetStats VAR requestIndex : DINT; END_VAR a7e27967-573f-4f9f-86e7-dd569b8cd943_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False ca1dfc70-ad93-43de-886d-39e56897aa6d bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa setAllRequestsOffline f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568354008 IF requestCnt = 0 OR requestCnt > 100 THEN RETURN; END_IF; FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 THEN requests[requestIndex]^.stats.setClientOffline(); END_IF; END_FOR; setAllRequestsOffline := TRUE; ca1dfc70-ad93-43de-886d-39e56897aa6d_Impl_LineIds (* Force registered request statistics offline. Used when connection disappears or context is released. *) METHOD PROTECTED setAllRequestsOffline : BOOL VAR_INPUT END_VAR VAR requestIndex: DINT; END_VAR ca1dfc70-ad93-43de-886d-39e56897aa6d_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False d12c9bf2-320f-4e95-badb-68a2357c5783 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa setupClient f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568364018 setupClient := engineHandle <> 0; d12c9bf2-320f-4e95-badb-68a2357c5783_Impl_LineIds (* Return whether a context handle exists. Does not open a context or prove connection success. *) METHOD setupClient : BOOL VAR_INPUT END_VAR d12c9bf2-320f-4e95-badb-68a2357c5783_Decl_LineIds bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 5cc2fe1e-bdb2-429a-84e1-63e783ea3b32 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa activeIndex 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822567938370 (* Read active registry index or -1. Setting valid index flags that request execute; it does not bypass scheduler eligibility. *) PROPERTY activeIndex : DINT 5cc2fe1e-bdb2-429a-84e1-63e783ea3b32_Decl_LineIds 1 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 456b4953-57c9-4f76-ab5b-0db456dd9b58 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa activeReqCnt 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822567988525 (* Private count of active registered requests. *) PROPERTY PRIVATE activeReqCnt : UINT 456b4953-57c9-4f76-ab5b-0db456dd9b58_Decl_LineIds 1 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 4d9d378a-f256-4f23-b835-539ee9e287c3 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa allRequestsComplete 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568038555 (* Legacy private flag check: FALSE for no requests or any execution/completion/error flag present. *) {attribute 'symbol' := 'none'} PROPERTY PRIVATE allRequestsComplete : BOOL 4d9d378a-f256-4f23-b835-539ee9e287c3_Decl_LineIds 2 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 89742962-f9b6-46c2-b9a5-b7e298f8495d bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa onlineCnt 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568233885 (* Legacy count of registered online flags. Client.stats.onlineCount uses active requests only. *) {attribute 'symbol' := 'none'} PROPERTY onlineCnt : DINT 89742962-f9b6-46c2-b9a5-b7e298f8495d_Decl_LineIds 3 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 27292866-0bc0-4848-a965-64c51a0bf960 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa requestExecuting 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568314022 (* Private activeIndex <> -1 test. *) {attribute 'symbol' := 'none'} PROPERTY PRIVATE requestExecuting : BOOL 27292866-0bc0-4848-a965-64c51a0bf960_Decl_LineIds 3 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 4950a3a1-f54f-434d-9252-b61a6cb4663d 17c2ab7a-4d60-48ec-966f-339ec83a75e9 recreateClient f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568394034 releaseContext(); 4950a3a1-f54f-434d-9252-b61a6cb4663d_Impl_LineIds (* Release current context so next enabled scan reopens with current settings. Affects every request using that connection. *) METHOD recreateClient 4950a3a1-f54f-434d-9252-b61a6cb4663d_Decl_LineIds 17c2ab7a-4d60-48ec-966f-339ec83a75e9 ModbusMaster ClientRTU -1 False e8c6c80b-7bdb-4108-987e-4af107de4377 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa toString 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568414085 (* Shared client string property returning stats.toString. Used by both concrete client monitoring displays. *) PROPERTY toString : STRING(64) e8c6c80b-7bdb-4108-987e-4af107de4377_Decl_LineIds 3 bc7fa96e-8ba3-4e3e-9cec-4d50ab57e6fa ModbusMaster ClientBase -1 False 79dfe91d-6dbc-46b0-866c-4b880e44e02b 269ad87c-8ffe-4a28-9e12-2f2da3f7c570 recreateClient f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568489405 releaseContext(); 79dfe91d-6dbc-46b0-866c-4b880e44e02b_Impl_LineIds (* Release current context so next enabled scan reopens with current settings. Affects every request using that connection. *) METHOD recreateClient 79dfe91d-6dbc-46b0-866c-4b880e44e02b_Decl_LineIds 269ad87c-8ffe-4a28-9e12-2f2da3f7c570 ModbusMaster ClientTCP -1 False ea5277e9-2ae8-417f-a88d-b571902c7d71 a77a90fd-541d-4ce9-ad97-7024224bbab4 processRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568549397 IF __ISVALIDREF(client) AND_THEN client.engineMode THEN engineCopyAllowed := (UINT_TO_DINT(engineTransactionDataIndex) >= LOWER_BOUND(data,1)) AND (UINT_TO_DINT(engineTransactionDataIndex) + UINT_TO_DINT(engineTransactionQuantity) - 1 <= UPPER_BOUND(data,1)); processTransaction(1); IF engineReadComplete AND engineCopyAllowed THEN FOR engineDataIndex := 0 TO UINT_TO_DINT(engineTransactionQuantity)-1 DO data[UINT_TO_DINT(engineTransactionDataIndex)+engineDataIndex] := client.engineIO[engineDataIndex] <> 0; END_FOR; END_IF; RETURN; END_IF; ea5277e9-2ae8-417f-a88d-b571902c7d71_Impl_LineIds (* Concrete request adapter performs bounds validation and transfers its typed slice through processTransaction; abstract on RequestBase. Called by scheduler. *) METHOD processRequest ea5277e9-2ae8-417f-a88d-b571902c7d71_Decl_LineIds a77a90fd-541d-4ce9-ad97-7024224bbab4 ModbusMaster ReqReadCoil -1 False 2c4e80c5-f4e7-4d01-97ec-5317c7e780b3 a77a90fd-541d-4ce9-ad97-7024224bbab4 recreateRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568559414 IF __ISVALIDREF(client) AND_THEN client.engineActiveRequest = THIS THEN client.recreateClient(); END_IF; engineInFlight := FALSE; recreateRequest := TRUE; 2c4e80c5-f4e7-4d01-97ec-5317c7e780b3_Impl_LineIds (* Clear request in-flight state; if it owns the active transaction, recreates the client connection. Returns TRUE. *) METHOD recreateRequest : BOOL 2c4e80c5-f4e7-4d01-97ec-5317c7e780b3_Decl_LineIds a77a90fd-541d-4ce9-ad97-7024224bbab4 ModbusMaster ReqReadCoil -1 False 9df094f9-a173-4520-816f-7badcbb1bd34 1a3278f4-a658-407c-968a-21aa53361562 processRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568599604 IF __ISVALIDREF(client) AND_THEN client.engineMode THEN engineCopyAllowed := (UINT_TO_DINT(engineTransactionDataIndex) >= LOWER_BOUND(data,1)) AND (UINT_TO_DINT(engineTransactionDataIndex) + UINT_TO_DINT(engineTransactionQuantity) - 1 <= UPPER_BOUND(data,1)); processTransaction(2); IF engineReadComplete AND engineCopyAllowed THEN FOR engineDataIndex := 0 TO UINT_TO_DINT(engineTransactionQuantity)-1 DO data[UINT_TO_DINT(engineTransactionDataIndex)+engineDataIndex] := client.engineIO[engineDataIndex] <> 0; END_FOR; END_IF; RETURN; END_IF; 9df094f9-a173-4520-816f-7badcbb1bd34_Impl_LineIds (* Concrete request adapter performs bounds validation and transfers its typed slice through processTransaction; abstract on RequestBase. Called by scheduler. *) METHOD processRequest 9df094f9-a173-4520-816f-7badcbb1bd34_Decl_LineIds 1a3278f4-a658-407c-968a-21aa53361562 ModbusMaster ReqReadDiscrete -1 False d34866d4-1134-4650-b3d6-2e19d2fd09d1 1a3278f4-a658-407c-968a-21aa53361562 recreateRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568609599 IF __ISVALIDREF(client) AND_THEN client.engineActiveRequest = THIS THEN client.recreateClient(); END_IF; engineInFlight := FALSE; recreateRequest := TRUE; d34866d4-1134-4650-b3d6-2e19d2fd09d1_Impl_LineIds (* Clear request in-flight state; if it owns the active transaction, recreates the client connection. Returns TRUE. *) METHOD recreateRequest : BOOL d34866d4-1134-4650-b3d6-2e19d2fd09d1_Decl_LineIds 1a3278f4-a658-407c-968a-21aa53361562 ModbusMaster ReqReadDiscrete -1 False 7b978176-d206-4509-b9d8-7908d33a9a74 73b10819-9112-4811-9583-e2735d2b13ea processRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568639616 IF __ISVALIDREF(client) AND_THEN client.engineMode THEN engineCopyAllowed := (UINT_TO_DINT(engineTransactionDataIndex) >= LOWER_BOUND(data,1)) AND (UINT_TO_DINT(engineTransactionDataIndex) + UINT_TO_DINT(engineTransactionQuantity) - 1 <= UPPER_BOUND(data,1)); processTransaction(3); IF engineReadComplete AND engineCopyAllowed THEN FOR engineDataIndex := 0 TO UINT_TO_DINT(engineTransactionQuantity)-1 DO data[UINT_TO_DINT(engineTransactionDataIndex)+engineDataIndex] := WORD_TO_UINT(client.engineIO[engineDataIndex]); END_FOR; END_IF; RETURN; END_IF; 7b978176-d206-4509-b9d8-7908d33a9a74_Impl_LineIds (* Concrete request adapter performs bounds validation and transfers its typed slice through processTransaction; abstract on RequestBase. Called by scheduler. *) METHOD processRequest 7b978176-d206-4509-b9d8-7908d33a9a74_Decl_LineIds 73b10819-9112-4811-9583-e2735d2b13ea ModbusMaster ReqReadHolding -1 False 52ffdba7-bf4a-4746-924c-8b86df6d9a83 73b10819-9112-4811-9583-e2735d2b13ea recreateRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568659572 IF __ISVALIDREF(client) AND_THEN client.engineActiveRequest = THIS THEN client.recreateClient(); END_IF; engineInFlight := FALSE; recreateRequest := TRUE; 52ffdba7-bf4a-4746-924c-8b86df6d9a83_Impl_LineIds (* Clear request in-flight state; if it owns the active transaction, recreates the client connection. Returns TRUE. *) METHOD recreateRequest : BOOL 52ffdba7-bf4a-4746-924c-8b86df6d9a83_Decl_LineIds 73b10819-9112-4811-9583-e2735d2b13ea ModbusMaster ReqReadHolding -1 False 1004c837-fbef-45ee-986d-977343f4bd8f a5dbc9b0-a1a1-4281-a685-ec85b35bb866 processRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568689587 IF __ISVALIDREF(client) AND_THEN client.engineMode THEN engineCopyAllowed := (UINT_TO_DINT(engineTransactionDataIndex) >= LOWER_BOUND(data,1)) AND (UINT_TO_DINT(engineTransactionDataIndex) + UINT_TO_DINT(engineTransactionQuantity) - 1 <= UPPER_BOUND(data,1)); processTransaction(4); IF engineReadComplete AND engineCopyAllowed THEN FOR engineDataIndex := 0 TO UINT_TO_DINT(engineTransactionQuantity)-1 DO data[UINT_TO_DINT(engineTransactionDataIndex)+engineDataIndex] := WORD_TO_UINT(client.engineIO[engineDataIndex]); END_FOR; END_IF; RETURN; END_IF; 1004c837-fbef-45ee-986d-977343f4bd8f_Impl_LineIds (* Concrete request adapter performs bounds validation and transfers its typed slice through processTransaction; abstract on RequestBase. Called by scheduler. *) METHOD processRequest 1004c837-fbef-45ee-986d-977343f4bd8f_Decl_LineIds a5dbc9b0-a1a1-4281-a685-ec85b35bb866 ModbusMaster ReqReadInput -1 False 9903b949-e1b9-4e0b-a98f-b6f745ad3605 a5dbc9b0-a1a1-4281-a685-ec85b35bb866 recreateRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568709683 IF __ISVALIDREF(client) AND_THEN client.engineActiveRequest = THIS THEN client.recreateClient(); END_IF; engineInFlight := FALSE; recreateRequest := TRUE; 9903b949-e1b9-4e0b-a98f-b6f745ad3605_Impl_LineIds (* Clear request in-flight state; if it owns the active transaction, recreates the client connection. Returns TRUE. *) METHOD recreateRequest : BOOL 9903b949-e1b9-4e0b-a98f-b6f745ad3605_Decl_LineIds a5dbc9b0-a1a1-4281-a685-ec85b35bb866 ModbusMaster ReqReadInput -1 False a77f3143-e2cf-48a4-bafd-a0c18a11faeb 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 busy f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568754910 stats.reqBusy := in; busy := in; a77f3143-e2cf-48a4-bafd-a0c18a11faeb_Impl_LineIds (* Set stats.reqBusy and return the assigned flag. *) METHOD busy : BOOL VAR_INPUT in: BOOL; END_VAR a77f3143-e2cf-48a4-bafd-a0c18a11faeb_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False 3bfc4f72-6ee6-4e83-9bf3-99339b388eac 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 done f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568774896 stats.reqDone := in; IF NOT in THEN RETURN; END_IF in_priorityCurrent := in_prioritySetpoint; 3bfc4f72-6ee6-4e83-9bf3-99339b388eac_Impl_LineIds (* Set stats.reqDone and restore configured priority on success. *) METHOD done VAR_INPUT in: BOOL; END_VAR 3bfc4f72-6ee6-4e83-9bf3-99339b388eac_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False d7c69d5d-5192-4bf1-96fc-9ef0da66a62c 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 err f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568784935 IF in THEN stats.lastErrorId := errorId; stats.lastExceptionCode := exceptionCode; END_IF; stats.reqError := in; IF NOT in THEN RETURN; END_IF; priorityMultiplier := UDINT_TO_INT(MIN(stats.errorCntRst,UDINT#3)); in_priorityCurrent := 10 * priorityMultiplier * priorityMultiplier; d7c69d5d-5192-4bf1-96fc-9ef0da66a62c_Impl_LineIds (* Set error identity before triggering counter update; apply 10/40/90 consecutive-error priority backoff. *) METHOD err VAR_INPUT in: BOOL; errorId: Error; exceptionCode: ExceptionCodes; END_VAR VAR priorityMultiplier: INT; END_VAR d7c69d5d-5192-4bf1-96fc-9ef0da66a62c_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False 9ee1081f-903d-595c-ab0c-17c64f4fbe75 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 FB_reinit f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568794938 engineInFlight := FALSE; stats.execute := FALSE; stats.reqBusy := FALSE; stats.reqDone := FALSE; stats.reqError := FALSE; FB_reinit := TRUE; 9ee1081f-903d-595c-ab0c-17c64f4fbe75_Impl_LineIds (* Clear handles/registry or request execution state after instance reinitialization. Does not guarantee online-change correctness. *) METHOD FB_reinit : BOOL 9ee1081f-903d-595c-ab0c-17c64f4fbe75_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False 28ccddd0-4531-5168-aa3e-ac56dddcb68d 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 invalidateData f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568804932 out_validData := FALSE; out_stale := TRUE; 28ccddd0-4531-5168-aa3e-ac56dddcb68d_Impl_LineIds (* Invalidate/stale cached read data without clearing its application array. *) METHOD PUBLIC invalidateData 28ccddd0-4531-5168-aa3e-ac56dddcb68d_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False 1c14b96c-a77e-5cd3-b853-c18bf9b5ea87 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 finishRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568835020 out_errorCode := result; out_socketError := client.engineStatus[client.STATUS_SOCKET_ERROR]; out_writeUncertain := engineInFlight AND (client.engineStatus[client.STATUS_WRITE_UNCERTAIN] <> 0); IF (result = 10) AND engineInFlight AND (engineFunction >= 15) THEN out_writeUncertain := TRUE; END_IF; IF out_writeUncertain AND client.engineHoldUncertainWrites THEN engineWriteHold := TRUE; END_IF; stats.reqBusy := FALSE; IF result = 0 THEN engineCallResult := client.callEngine(12); duration := client.engineStatus[21]; IF stats.doneCnt < UDINT#4294967295 THEN stats.totalValidDuration := stats.totalValidDuration + UDINT_TO_ULINT(duration); END_IF; IF stats.replyCnt < UDINT#4294967295 THEN stats.replyCnt := stats.replyCnt + 1; END_IF; stats.lastValidDuration := duration; IF duration > stats.longestValidDuration THEN stats.longestValidDuration := duration; END_IF; client.engineReplied := client.engineReplied + 1; client.engineWindowTime := client.engineWindowTime + duration; stats.engineResponseSeen := TRUE; IF engineFunction <= 4 THEN engineReadComplete := TRUE; out_dataAgeMs := UDINT_TO_ULINT(client.engineStatus[22]); IF out_dataAgeMs <= client.engineNowMilliseconds THEN stats.engineLastSuccessMs := client.engineNowMilliseconds - out_dataAgeMs; ELSE stats.engineLastSuccessMs := 0; END_IF; out_stale := out_dataAgeMs > TIME_TO_UDINT(in_staleAfter); out_validData := TRUE; END_IF; done(TRUE); ELSE CASE result OF 1,258: mapped := Error.RequestParameterError; 4,7: mapped := Error.TcpSocketError; 5: mapped := Error.TcpConnectTimeout; 6: mapped := Error.ReplyTimeout; 8: mapped := Error.InvalidReply; 9: mapped := Error.RequestException; 10: mapped := Error.RequestCancelled; ELSE mapped := Error.InternalError; END_CASE; ex := ExceptionCodes.RESPONSE_SUCCESS; IF result = 5 OR result = 6 THEN ex := ExceptionCodes.TIMEOUT; IF stats.timeoutCnt < UDINT#4294967295 THEN stats.timeoutCnt := stats.timeoutCnt + 1; END_IF; END_IF; IF result = 9 THEN IF stats.replyCnt < UDINT#4294967295 THEN stats.replyCnt := stats.replyCnt + 1; END_IF; IF stats.exceptionCnt < UDINT#4294967295 THEN stats.exceptionCnt := stats.exceptionCnt + 1; END_IF; CASE client.engineStatus[client.STATUS_EXCEPTION] OF 1: ex := ExceptionCodes.ILLEGAL_FUNCTION; 2: ex := ExceptionCodes.ILLEGAL_DATA_ADDRESS; 3: ex := ExceptionCodes.ILLEGAL_DATA_VALUE; 4: ex := ExceptionCodes.SLAVE_DEVICE_FAILURE; 5: ex := ExceptionCodes.ACKNOWLEDGE; 6: ex := ExceptionCodes.SLAVE_DEVICE_BUSY; 8: ex := ExceptionCodes.MEMORY_PARITY_ERROR; 10: ex := ExceptionCodes.GATEWAY_PATH_UNAVAILABLE; 11: ex := ExceptionCodes.GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND; END_CASE; client.engineReplied := client.engineReplied + 1; stats.engineResponseSeen := TRUE; ELSE stats.engineResponseSeen := FALSE; END_IF; err(in := TRUE,errorId := mapped,exceptionCode := ex); END_IF; engineInFlight := FALSE; stats(); 1c14b96c-a77e-5cd3-b853-c18bf9b5ea87_Impl_LineIds (* Map a completed result and write uncertainty, collect worker timing/read age, update reply/exception/timeout counters and completion flags. Successful reads become valid; errors retain old array values. *) METHOD finishRequest VAR_INPUT result : UDINT; END_VAR VAR mapped : Error; ex : ExceptionCodes; duration : UDINT; END_VAR 1c14b96c-a77e-5cd3-b853-c18bf9b5ea87_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False fd4b7cdb-3c7f-5110-af32-341f71321132 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 processTransaction f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568844902 engineReadComplete := FALSE; stats.reqDone := FALSE; stats.reqError := FALSE; stats(); IF client.engineActiveRequest = THIS AND client.engineResultReady THEN IF (client.engineStatus[client.STATUS_DONE] <> 0) AND (engineFunction <= 4) AND NOT engineCopyAllowed THEN finishRequest(1); ELSE finishRequest(client.engineStatus[client.STATUS_RESULT]); END_IF; RETURN; END_IF; IF stats.execute AND NOT engineInFlight AND client.engineSelected = THIS THEN engineFunction := functionCode; engineTransactionQuantity := stats.reqLength; engineTransactionDataIndex := in_dataOffset; engineRequestStartMilliseconds := client.engineNowMilliseconds; IF out_parameterError OR engineTransactionQuantity = 0 THEN finishRequest(1); RETURN; END_IF; client.engineArgUnit := in_unitId; client.engineArgFunction := functionCode; client.engineArgAddress := in_startAddr; client.engineArgQuantity := engineTransactionQuantity; client.engineArgTimeout := MAX(UDINT#1,(replyTimeout + 999)/1000); engineCallResult := client.callEngine(client.CMD_REQUEST_TIMEOUT); IF engineCallResult = 0 THEN engineCallResult := client.callEngine(client.CMD_SUBMIT); END_IF; IF engineCallResult = 0 THEN client.engineActiveRequest := THIS; engineInFlight := TRUE; stats.reqBusy := TRUE; client.engineSent := client.engineSent + 1; IF stats.sentCnt < UDINT#4294967295 THEN stats.sentCnt := stats.sentCnt + 1; END_IF; client.engineWindowCount := client.engineWindowCount + 1; ELSE finishRequest(engineCallResult); END_IF; stats(); END_IF; IF out_validData THEN out_dataAgeMs := client.engineNowMilliseconds - stats.engineLastSuccessMs; out_stale := out_dataAgeMs > TIME_TO_UDINT(in_staleAfter); ELSE out_stale := TRUE; END_IF; fd4b7cdb-3c7f-5110-af32-341f71321132_Impl_LineIds (* Submit the selected request or consume its buffered result. Record accepted-send counter and refresh data freshness. Normally invoked by the client through concrete processRequest. *) METHOD processTransaction VAR_INPUT functionCode : BYTE; END_VAR fd4b7cdb-3c7f-5110-af32-341f71321132_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False 109d8e00-bf23-4306-a8d5-764aa6a03235 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 processRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568854953 109d8e00-bf23-4306-a8d5-764aa6a03235_Impl_LineIds (* Concrete request adapter performs bounds validation and transfers its typed slice through processTransaction; abstract on RequestBase. Called by scheduler. *) METHOD ABSTRACT processRequest VAR_INPUT END_VAR 109d8e00-bf23-4306-a8d5-764aa6a03235_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False f64e9d26-0b0d-4e83-b6b3-1cfb43d906f8 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 recreateRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568864923 f64e9d26-0b0d-4e83-b6b3-1cfb43d906f8_Impl_LineIds (* Clear request in-flight state; if it owns the active transaction, recreates the client connection. Returns TRUE. *) METHOD ABSTRACT recreateRequest : BOOL f64e9d26-0b0d-4e83-b6b3-1cfb43d906f8_Decl_LineIds 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False 4f361885-f95c-4244-84d6-8c3b6b9b8a18 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 replyTimeout 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568884919 (* Internal microsecond timeout calculation. Request milliseconds override client TIME, then baud/data-rate formula. C submission rounds to milliseconds. *) PROPERTY PROTECTED replyTimeout : UDINT 4f361885-f95c-4244-84d6-8c3b6b9b8a18_Decl_LineIds 2 3ad7cda5-e8b7-44c8-b264-165eb4cd7d37 ModbusMaster RequestBase -1 False 94cb9a26-304d-46fc-a18d-a8ce0f1931ec 48b508fd-2131-484c-ba4a-20e61e66a5b2 resetStats f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569120444 doneCnt := 0; doneCntRst := 0; errorCnt := 0; errorCntRst := 0; sentCnt := 0; replyCnt := 0; exceptionCnt := 0; timeoutCnt := 0; offlineCnt := 0; lastValidDuration := 0; longestValidDuration := 0; totalValidDuration := 0; lastErrorId := Error.OK; lastExceptionCode := ExceptionCodes.RESPONSE_SUCCESS; previousOnline := online; setToString(); 94cb9a26-304d-46fc-a18d-a8ce0f1931ec_Impl_LineIds (* Clear success/error/send/reply/timeout/exception/offline counters and successful-duration history. Client version delegates to each request and refreshes totals. Connection state and data freshness are preserved. *) METHOD resetStats VAR_INPUT END_VAR 94cb9a26-304d-46fc-a18d-a8ce0f1931ec_Decl_LineIds 48b508fd-2131-484c-ba4a-20e61e66a5b2 ModbusMaster RequestStats -1 False b1508d1f-b7a7-40b5-b74f-3091afc5b834 48b508fd-2131-484c-ba4a-20e61e66a5b2 setClientOffline f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569150402 IF online AND offlineCnt < 65535 THEN offlineCnt := offlineCnt + 1; END_IF; previousOnline := FALSE; engineResponseSeen := FALSE; doneCntRst := 0; online := FALSE; offline := TRUE; setClientOffline := TRUE; b1508d1f-b7a7-40b5-b74f-3091afc5b834_Impl_LineIds (* Count a real online-to-offline transition, clear response evidence and force offline. Returns TRUE. *) METHOD setClientOffline : BOOL VAR_INPUT END_VAR b1508d1f-b7a7-40b5-b74f-3091afc5b834_Decl_LineIds 48b508fd-2131-484c-ba4a-20e61e66a5b2 ModbusMaster RequestStats -1 False 1c6ab99e-dc71-45a2-a024-45cf65b9af99 48b508fd-2131-484c-ba4a-20e61e66a5b2 setToString f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569170435 toString := CONCAT('OK:', CONCAT(TO_STRING(doneCnt), CONCAT('/Er:', TO_STRING(errorCnt)))); setToString := TRUE; 1c6ab99e-dc71-45a2-a024-45cf65b9af99_Impl_LineIds (* Update OK:<doneCnt>/Er:<errorCnt> monitoring text, returning TRUE. *) METHOD PRIVATE setToString : BOOL VAR_INPUT END_VAR 1c6ab99e-dc71-45a2-a024-45cf65b9af99_Decl_LineIds 48b508fd-2131-484c-ba4a-20e61e66a5b2 ModbusMaster RequestStats -1 False 89434b6a-7e3b-4095-9220-0a6fc3789a25 48b508fd-2131-484c-ba4a-20e61e66a5b2 execute 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568925048 (* Execution state property. Setter refuses execution while completion/error flags remain set. *) PROPERTY execute : BOOL 89434b6a-7e3b-4095-9220-0a6fc3789a25_Decl_LineIds 1 48b508fd-2131-484c-ba4a-20e61e66a5b2 ModbusMaster RequestStats -1 False 13e3ae42-bdd9-49ee-b8c0-74b8339469cb 48b508fd-2131-484c-ba4a-20e61e66a5b2 reqBusy 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568965047 (* Underlying request busy flag; normal application code inspects rather than drives it. *) PROPERTY reqBusy : BOOL 13e3ae42-bdd9-49ee-b8c0-74b8339469cb_Decl_LineIds 1 48b508fd-2131-484c-ba4a-20e61e66a5b2 ModbusMaster RequestStats -1 False 80965ce1-9b6a-44d3-b272-a5c739ccbc70 48b508fd-2131-484c-ba4a-20e61e66a5b2 reqDone 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822569025054 (* On successful executing completion, increment saturated success counters, clear errors and execution, update display. Transport supplies duration. *) PROPERTY reqDone : BOOL 80965ce1-9b6a-44d3-b272-a5c739ccbc70_Decl_LineIds 1 48b508fd-2131-484c-ba4a-20e61e66a5b2 ModbusMaster RequestStats -1 False 30645d91-91c6-42eb-8399-c20f91ca0d3e 48b508fd-2131-484c-ba4a-20e61e66a5b2 reqError 5a3b8626-d3e9-4f37-98b5-66420063d91e a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822569070401 (* On failed executing completion, increment saturated error counters and clear execution. Timeout/exception classification is handled by finishRequest. *) PROPERTY reqError : BOOL 30645d91-91c6-42eb-8399-c20f91ca0d3e_Decl_LineIds 1 48b508fd-2131-484c-ba4a-20e61e66a5b2 ModbusMaster RequestStats -1 False fbb41e61-f245-4f4e-bcd0-218ede01fcda f6ee860b-0951-41d0-93d8-6436c681d8f1 processRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569210585 IF __ISVALIDREF(client) AND_THEN client.engineMode THEN IF stats.execute AND NOT engineInFlight AND client.engineSelected = THIS AND NOT out_parameterError THEN IF stats.reqLength = 0 OR stats.reqLength > 1968 OR UINT_TO_DINT(in_dataOffset) < LOWER_BOUND(data,1) OR UINT_TO_DINT(in_dataOffset) + UINT_TO_DINT(stats.reqLength) - 1 > UPPER_BOUND(data,1) THEN finishRequest(1); RETURN; END_IF; FOR engineDataIndex := 0 TO UINT_TO_DINT(stats.reqLength)-1 DO client.engineIO[engineDataIndex] := BOOL_TO_WORD(data[UINT_TO_DINT(in_dataOffset)+engineDataIndex]); END_FOR; END_IF; processTransaction(15); RETURN; END_IF; fbb41e61-f245-4f4e-bcd0-218ede01fcda_Impl_LineIds (* Concrete request adapter performs bounds validation and transfers its typed slice through processTransaction; abstract on RequestBase. Called by scheduler. *) METHOD processRequest fbb41e61-f245-4f4e-bcd0-218ede01fcda_Decl_LineIds f6ee860b-0951-41d0-93d8-6436c681d8f1 ModbusMaster ReqWriteCoil -1 False a861d6e2-2501-43dc-bb37-34509923450c f6ee860b-0951-41d0-93d8-6436c681d8f1 recreateRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569220578 IF __ISVALIDREF(client) AND_THEN client.engineActiveRequest = THIS THEN client.recreateClient(); END_IF; engineInFlight := FALSE; recreateRequest := TRUE; a861d6e2-2501-43dc-bb37-34509923450c_Impl_LineIds (* Clear request in-flight state; if it owns the active transaction, recreates the client connection. Returns TRUE. *) METHOD recreateRequest : BOOL a861d6e2-2501-43dc-bb37-34509923450c_Decl_LineIds f6ee860b-0951-41d0-93d8-6436c681d8f1 ModbusMaster ReqWriteCoil -1 False df9b4fd1-9d38-4a54-a7e5-264a94a756ac f6ee860b-0951-41d0-93d8-6436c681d8f1 writeNow f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569230565 engineWriteHold := FALSE; out_writeUncertain := FALSE; in_priorityCurrent := 0; writeNow := TRUE; df9b4fd1-9d38-4a54-a7e5-264a94a756ac_Impl_LineIds (* Release uncertain-write hold and set priority zero. Does not send synchronously or make the cyclic write block single-shot. *) METHOD writeNow : BOOL VAR_INPUT END_VAR df9b4fd1-9d38-4a54-a7e5-264a94a756ac_Decl_LineIds f6ee860b-0951-41d0-93d8-6436c681d8f1 ModbusMaster ReqWriteCoil -1 False 76621df2-a77c-4e0a-aba0-e3e4a53bd278 bb7e18ba-2018-4681-875e-de1f291019ef processRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569260585 IF __ISVALIDREF(client) AND_THEN client.engineMode THEN IF stats.execute AND NOT engineInFlight AND client.engineSelected = THIS AND NOT out_parameterError THEN IF stats.reqLength = 0 OR stats.reqLength > 123 OR UINT_TO_DINT(in_dataOffset) < LOWER_BOUND(data,1) OR UINT_TO_DINT(in_dataOffset) + UINT_TO_DINT(stats.reqLength) - 1 > UPPER_BOUND(data,1) THEN finishRequest(1); RETURN; END_IF; FOR engineDataIndex := 0 TO UINT_TO_DINT(stats.reqLength)-1 DO client.engineIO[engineDataIndex] := UINT_TO_WORD(data[UINT_TO_DINT(in_dataOffset)+engineDataIndex]); END_FOR; END_IF; processTransaction(16); RETURN; END_IF; 76621df2-a77c-4e0a-aba0-e3e4a53bd278_Impl_LineIds (* Concrete request adapter performs bounds validation and transfers its typed slice through processTransaction; abstract on RequestBase. Called by scheduler. *) METHOD processRequest 76621df2-a77c-4e0a-aba0-e3e4a53bd278_Decl_LineIds bb7e18ba-2018-4681-875e-de1f291019ef ModbusMaster ReqWriteHolding -1 False bd7ff184-1747-404c-9fa0-1b728376c927 bb7e18ba-2018-4681-875e-de1f291019ef recreateRequest f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569270584 IF __ISVALIDREF(client) AND_THEN client.engineActiveRequest = THIS THEN client.recreateClient(); END_IF; engineInFlight := FALSE; recreateRequest := TRUE; bd7ff184-1747-404c-9fa0-1b728376c927_Impl_LineIds (* Clear request in-flight state; if it owns the active transaction, recreates the client connection. Returns TRUE. *) METHOD recreateRequest : BOOL bd7ff184-1747-404c-9fa0-1b728376c927_Decl_LineIds bb7e18ba-2018-4681-875e-de1f291019ef ModbusMaster ReqWriteHolding -1 False 5f9160f9-c4a4-4f65-a74c-2838020397f3 bb7e18ba-2018-4681-875e-de1f291019ef writeNow f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569280585 engineWriteHold := FALSE; out_writeUncertain := FALSE; in_priorityCurrent := 0; writeNow := TRUE; 5f9160f9-c4a4-4f65-a74c-2838020397f3_Impl_LineIds (* Release uncertain-write hold and set priority zero. Does not send synchronously or make the cyclic write block single-shot. *) METHOD writeNow : BOOL VAR_INPUT END_VAR 5f9160f9-c4a4-4f65-a74c-2838020397f3_Decl_LineIds bb7e18ba-2018-4681-875e-de1f291019ef ModbusMaster ReqWriteHolding -1 False c6461904-f824-589c-b350-d08f59cb69a4 bc332406-19bf-513a-a6ae-57ad0254c3d3 FB_exit f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569330591 IF serverHandle <> 0 THEN serverCall(31); END_IF; serverHandle := 0; FB_exit := TRUE; c6461904-f824-589c-b350-d08f59cb69a4_Impl_LineIds (* Lifecycle resource release. context hooks close their owned handle. Use public release for application shutdown. *) METHOD FB_exit : BOOL VAR_INPUT bInCopyCode : BOOL; END_VAR c6461904-f824-589c-b350-d08f59cb69a4_Decl_LineIds bc332406-19bf-513a-a6ae-57ad0254c3d3 ModbusSlave ModbusSlave -1 False fc7486f8-09e9-54e8-9c28-655c2e73db28 bc332406-19bf-513a-a6ae-57ad0254c3d3 FB_reinit f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569340673 IF serverHandle <> 0 THEN serverCall(31); END_IF; serverHandle := 0; FB_reinit := TRUE; fc7486f8-09e9-54e8-9c28-655c2e73db28_Impl_LineIds (* Clear handles/registry or request execution state after instance reinitialization. Does not guarantee online-change correctness. *) METHOD FB_reinit : BOOL fc7486f8-09e9-54e8-9c28-655c2e73db28_Decl_LineIds bc332406-19bf-513a-a6ae-57ad0254c3d3 ModbusSlave ModbusSlave -1 False c6a5aa1f-6c10-5d22-a714-41513a055e78 bc332406-19bf-513a-a6ae-57ad0254c3d3 serverCall f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569355902 serverCall := atMbCall_cext(command := command, handle := serverHandle, ipAddress := in_ipAddress, port := port, unitId := 0, functionCode := tableIndex, startAddress := tableStart, quantity := tableCount, pData := ADR(serverIO[0]), dataCapacity := 2000, pStatus := ADR(serverStatus[0]), statusCapacity := 24, nowMs := nowMs, connectTimeoutMs := 0, responseTimeoutMs := 0, retryDelayMs := MAX(UDINT#1,TIME_TO_UDINT(in_reconnectDelay))); c6a5aa1f-6c10-5d22-a714-41513a055e78_Impl_LineIds (* Private synchronous server/worker ABI adapter using server staging/status arrays. *) METHOD PRIVATE serverCall : UDINT VAR_INPUT command : UDINT; END_VAR c6a5aa1f-6c10-5d22-a714-41513a055e78_Decl_LineIds bc332406-19bf-513a-a6ae-57ad0254c3d3 ModbusSlave ModbusSlave -1 False 58e9f9b0-8937-5b18-828b-f52945a9b214 69cd625a-3b8c-4dca-bb1e-eaefa064964f FB_exit f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569396023 IF serverHandle <> 0 THEN serverCall(31); END_IF; serverHandle := 0; FB_exit := TRUE; 58e9f9b0-8937-5b18-828b-f52945a9b214_Impl_LineIds (* Lifecycle resource release. context hooks close their owned handle. Use public release for application shutdown. *) METHOD FB_exit : BOOL VAR_INPUT bInCopyCode : BOOL; END_VAR 58e9f9b0-8937-5b18-828b-f52945a9b214_Decl_LineIds 69cd625a-3b8c-4dca-bb1e-eaefa064964f ModbusSlave SlaveTCP -1 False 70f2e539-f071-5473-9a33-6bf01aa83cf7 69cd625a-3b8c-4dca-bb1e-eaefa064964f FB_reinit f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569426023 IF serverHandle <> 0 THEN serverCall(31); END_IF; serverHandle := 0; FB_reinit := TRUE; 70f2e539-f071-5473-9a33-6bf01aa83cf7_Impl_LineIds (* Clear handles/registry or request execution state after instance reinitialization. Does not guarantee online-change correctness. *) METHOD FB_reinit : BOOL 70f2e539-f071-5473-9a33-6bf01aa83cf7_Decl_LineIds 69cd625a-3b8c-4dca-bb1e-eaefa064964f ModbusSlave SlaveTCP -1 False 73f1f286-a31b-5870-9408-170d6963ccb3 69cd625a-3b8c-4dca-bb1e-eaefa064964f serverCall f8a58466-d7f6-439f-bbb8-d4600e41d099 a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569436031 serverCall := atMbCall_cext(command := command, handle := serverHandle, ipAddress := in_ipAddress, port := port, unitId := 0, functionCode := tableIndex, startAddress := tableStart, quantity := tableCount, pData := ADR(serverIO[0]), dataCapacity := 2000, pStatus := ADR(serverStatus[0]), statusCapacity := 24, nowMs := nowMs, connectTimeoutMs := 0, responseTimeoutMs := 0, retryDelayMs := MAX(UDINT#1,TIME_TO_UDINT(in_reconnectDelay))); 73f1f286-a31b-5870-9408-170d6963ccb3_Impl_LineIds (* Private synchronous server/worker ABI adapter using server staging/status arrays. *) METHOD PRIVATE serverCall : UDINT VAR_INPUT command : UDINT; END_VAR 73f1f286-a31b-5870-9408-170d6963ccb3_Decl_LineIds 69cd625a-3b8c-4dca-bb1e-eaefa064964f ModbusSlave SlaveTCP -1 False 0803920e-cc13-4b93-a08c-4d27afc1ff3c 5cc2fe1e-bdb2-429a-84e1-63e783ea3b32 Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822567958539 activeIndex := engineActiveIndex; 0803920e-cc13-4b93-a08c-4d27afc1ff3c_Impl_LineIds (* Get accessor for activeIndex; see the owning property description for semantics and side effects. *) VAR requestIndex: DINT; END_VAR 0803920e-cc13-4b93-a08c-4d27afc1ff3c_Decl_LineIds True 5cc2fe1e-bdb2-429a-84e1-63e783ea3b32 ModbusMaster ClientBase activeIndex -1 False 3b82f264-e41e-461d-9beb-263305a22a8d 5cc2fe1e-bdb2-429a-84e1-63e783ea3b32 Set 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822567978592 IF activeIndex >= 0 AND activeIndex < UINT_TO_DINT(requestCnt) THEN IF requests[activeIndex] <> 0 THEN requests[activeIndex]^.stats.execute := TRUE; END_IF; END_IF; 3b82f264-e41e-461d-9beb-263305a22a8d_Impl_LineIds (* Set accessor for activeIndex; see the owning property description for semantics and side effects. *) 3b82f264-e41e-461d-9beb-263305a22a8d_Decl_LineIds False 5cc2fe1e-bdb2-429a-84e1-63e783ea3b32 ModbusMaster ClientBase activeIndex -1 False cc024b23-e5fe-4958-ad80-513feea6aeab 456b4953-57c9-4f76-ab5b-0db456dd9b58 Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822567998529 cnt := 0; IF requestCnt = 0 THEN activeReqCnt := 0; RETURN; END_IF FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 AND_THEN (requests[requestIndex]^.stats.active) THEN cnt := cnt + 1; END_IF END_FOR; activeReqCnt := cnt; cc024b23-e5fe-4958-ad80-513feea6aeab_Impl_LineIds (* Get accessor for activeReqCnt; see the owning property description for semantics and side effects. *) VAR requestIndex : DINT; cnt: UINT; END_VAR cc024b23-e5fe-4958-ad80-513feea6aeab_Decl_LineIds True 456b4953-57c9-4f76-ab5b-0db456dd9b58 ModbusMaster ClientBase activeReqCnt -1 False d59f404d-315d-4ea4-b16b-c8f0e8342d2e 4d9d378a-f256-4f23-b835-539ee9e287c3 Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568048559 IF requestCnt = 0 THEN allRequestsComplete := 0; RETURN; END_IF FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 AND_THEN (requests[requestIndex]^.stats.execute OR requests[requestIndex]^.stats.reqDone OR requests[requestIndex]^.stats.reqBusy OR requests[requestIndex]^.stats.reqError) THEN allRequestsComplete := FALSE; RETURN; END_IF END_FOR; allRequestsComplete := TRUE; d59f404d-315d-4ea4-b16b-c8f0e8342d2e_Impl_LineIds (* Get accessor for allRequestsComplete; see the owning property description for semantics and side effects. *) VAR requestIndex : DINT; END_VAR d59f404d-315d-4ea4-b16b-c8f0e8342d2e_Decl_LineIds True 4d9d378a-f256-4f23-b835-539ee9e287c3 ModbusMaster ClientBase allRequestsComplete -1 False dceb6b17-86bf-4543-9652-2fd2b943953c 89742962-f9b6-46c2-b9a5-b7e298f8495d Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568243884 cnt := 0; IF requestCnt = 0 THEN onlineCnt := 0; RETURN; END_IF FOR requestIndex := 0 TO UINT_TO_DINT(requestCnt)-1 DO IF requests[requestIndex] <> 0 AND_THEN (requests[requestIndex]^.stats.online) THEN cnt := cnt + 1; END_IF END_FOR; onlineCnt := cnt; dceb6b17-86bf-4543-9652-2fd2b943953c_Impl_LineIds (* Get accessor for onlineCnt; see the owning property description for semantics and side effects. *) VAR requestIndex : DINT; cnt: UINT; END_VAR dceb6b17-86bf-4543-9652-2fd2b943953c_Decl_LineIds True 89742962-f9b6-46c2-b9a5-b7e298f8495d ModbusMaster ClientBase onlineCnt -1 False 0006696f-29e2-441e-a325-e3481d025cec 27292866-0bc0-4848-a965-64c51a0bf960 Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568324025 requestExecuting := activeIndex <> -1; 0006696f-29e2-441e-a325-e3481d025cec_Impl_LineIds (* Get accessor for requestExecuting; see the owning property description for semantics and side effects. *) 0006696f-29e2-441e-a325-e3481d025cec_Decl_LineIds True 27292866-0bc0-4848-a965-64c51a0bf960 ModbusMaster ClientBase requestExecuting -1 False 3d4da579-672d-4758-9b0f-e055a08e0da3 e8c6c80b-7bdb-4108-987e-4af107de4377 Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568429391 toString := stats.toString; 3d4da579-672d-4758-9b0f-e055a08e0da3_Impl_LineIds (* Get accessor for toString; see the owning property description for semantics and side effects. *) 3d4da579-672d-4758-9b0f-e055a08e0da3_Decl_LineIds True e8c6c80b-7bdb-4108-987e-4af107de4377 ModbusMaster ClientBase toString -1 False f54a4cd6-8540-4892-a914-4aac4f8d9018 4f361885-f95c-4244-84d6-8c3b6b9b8a18 Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568895070 VAR requestBytes : UDINT; responseBytes : UDINT; quantityBytes : UDINT; frameBits : UDINT; calculatedMicroseconds : REAL; END_VAR IF in_timeout > 0 THEN replyTimeout := ANY_TO_UDINT(in_timeout * 1000); ELSIF client.in_timeout <> T#0MS THEN replyTimeout := TIME_TO_UDINT(client.in_timeout) * 1000; ELSIF client.dataRate > 0 THEN requestBytes := 8; responseBytes := 8; quantityBytes := (UINT_TO_UDINT(stats.reqLength) + 7) / 8; CASE engineFunction OF 1, 2: responseBytes := 5 + quantityBytes; 3, 4: responseBytes := 5 + 2 * UINT_TO_UDINT(stats.reqLength); 15: requestBytes := 9 + quantityBytes; 16: requestBytes := 9 + 2 * UINT_TO_UDINT(stats.reqLength); END_CASE; frameBits := (requestBytes + responseBytes) * 11 + 39; calculatedMicroseconds := DINT_TO_REAL(UDINT_TO_DINT(frameBits)) / DINT_TO_REAL(client.dataRate) * 1000000.0; replyTimeout := MAX(UDINT#100000, REAL_TO_UDINT(calculatedMicroseconds * 2.0 + 50000.0)); ELSE replyTimeout := 1000000; END_IF f54a4cd6-8540-4892-a914-4aac4f8d9018_Impl_LineIds (* Get accessor for replyTimeout; see the owning property description for semantics and side effects. *) f54a4cd6-8540-4892-a914-4aac4f8d9018_Decl_LineIds True 4f361885-f95c-4244-84d6-8c3b6b9b8a18 ModbusMaster RequestBase replyTimeout -1 False 465bf80a-0d6e-4363-ba1e-dd04aef379f7 89434b6a-7e3b-4095-9220-0a6fc3789a25 Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568945093 execute := _execute; 465bf80a-0d6e-4363-ba1e-dd04aef379f7_Impl_LineIds (* Get accessor for execute; see the owning property description for semantics and side effects. *) 465bf80a-0d6e-4363-ba1e-dd04aef379f7_Decl_LineIds True 89434b6a-7e3b-4095-9220-0a6fc3789a25 ModbusMaster RequestStats execute -1 False 8ff5fbe7-c047-436d-923c-942d0d66494c 89434b6a-7e3b-4095-9220-0a6fc3789a25 Set 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568955065 IF reqDone OR reqError THEN _execute := FALSE; RETURN; END_IF _execute := execute; 8ff5fbe7-c047-436d-923c-942d0d66494c_Impl_LineIds (* Set accessor for execute; see the owning property description for semantics and side effects. *) 8ff5fbe7-c047-436d-923c-942d0d66494c_Decl_LineIds False 89434b6a-7e3b-4095-9220-0a6fc3789a25 ModbusMaster RequestStats execute -1 False db10f23e-d96b-4fd5-aec0-8b530ad288e1 13e3ae42-bdd9-49ee-b8c0-74b8339469cb Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822568995677 reqBusy := _reqBusy; db10f23e-d96b-4fd5-aec0-8b530ad288e1_Impl_LineIds (* Get accessor for reqBusy; see the owning property description for semantics and side effects. *) db10f23e-d96b-4fd5-aec0-8b530ad288e1_Decl_LineIds True 13e3ae42-bdd9-49ee-b8c0-74b8339469cb ModbusMaster RequestStats reqBusy -1 False a239da3a-8f75-41da-a264-f06ca07143f4 13e3ae42-bdd9-49ee-b8c0-74b8339469cb Set 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569005073 _reqBusy := reqBusy; a239da3a-8f75-41da-a264-f06ca07143f4_Impl_LineIds (* Set accessor for reqBusy; see the owning property description for semantics and side effects. *) a239da3a-8f75-41da-a264-f06ca07143f4_Decl_LineIds False 13e3ae42-bdd9-49ee-b8c0-74b8339469cb ModbusMaster RequestStats reqBusy -1 False 61db378f-6029-4712-b562-fea707e5698b 80965ce1-9b6a-44d3-b272-a5c739ccbc70 Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569040256 reqDone := _reqDone; 61db378f-6029-4712-b562-fea707e5698b_Impl_LineIds (* Get accessor for reqDone; see the owning property description for semantics and side effects. *) 61db378f-6029-4712-b562-fea707e5698b_Decl_LineIds True 80965ce1-9b6a-44d3-b272-a5c739ccbc70 ModbusMaster RequestStats reqDone -1 False 858ae7ab-7bd2-4c3e-9c4b-69064e0620a3 80965ce1-9b6a-44d3-b272-a5c739ccbc70 Set 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569050437 _reqDone := reqDone; IF (execute AND reqDone) THEN IF doneCnt < UDINT#4294967295 THEN doneCnt := doneCnt + 1; END_IF; IF doneCntRst < UDINT#4294967295 THEN doneCntRst := doneCntRst + 1; END_IF; errorCntRst := 0; lastErrorId := Error.OK; lastExceptionCode := ExceptionCodes.RESPONSE_SUCCESS; execute := FALSE; setToString(); END_IF 858ae7ab-7bd2-4c3e-9c4b-69064e0620a3_Impl_LineIds (* Set accessor for reqDone; see the owning property description for semantics and side effects. *) 858ae7ab-7bd2-4c3e-9c4b-69064e0620a3_Decl_LineIds False 80965ce1-9b6a-44d3-b272-a5c739ccbc70 ModbusMaster RequestStats reqDone -1 False e44e83bd-8f84-4202-9ab4-784d09cf5506 30645d91-91c6-42eb-8399-c20f91ca0d3e Get 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569090433 reqError := _reqError; e44e83bd-8f84-4202-9ab4-784d09cf5506_Impl_LineIds (* Get accessor for reqError; see the owning property description for semantics and side effects. *) e44e83bd-8f84-4202-9ab4-784d09cf5506_Decl_LineIds True 30645d91-91c6-42eb-8399-c20f91ca0d3e ModbusMaster RequestStats reqError -1 False 89b5f7bc-0c37-43f3-8984-14034b000d89 30645d91-91c6-42eb-8399-c20f91ca0d3e Set 792f2eb6-721e-4e64-ba20-bc98351056db a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc 639263822569100412 _reqError := reqError; IF (execute AND reqError) THEN IF errorCnt < UDINT#4294967295 THEN errorCnt := errorCnt + 1; END_IF; IF errorCntRst < UDINT#4294967295 THEN errorCntRst := errorCntRst + 1; END_IF; doneCntRst := 0; execute := FALSE; setToString(); END_IF 89b5f7bc-0c37-43f3-8984-14034b000d89_Impl_LineIds (* Set accessor for reqError; see the owning property description for semantics and side effects. *) 89b5f7bc-0c37-43f3-8984-14034b000d89_Decl_LineIds False 30645d91-91c6-42eb-8399-c20f91ca0d3e ModbusMaster RequestStats reqError -1 False 91efc359-e411-5bfc-bee3-74e902b561e5 00000000-0000-0000-0000-000000000000 ClientStats 829a18f2-c514-4f6e-9634-1df173429203 21af5390-2942-461a-bf89-951aaf6999f1 8fc52b24-7436-4d4a-8b03-aa43d42302d0 2db5746d-d284-4425-9f7f-2663a34b0ebc a9ed5b7e-75c5-4651-af16-d2c27e98cb94 639263822568509412 (* Aggregate data structure: sums all registered request history, counts active communication states and calculates a weighted successful-duration mean. See USER-GUIDE.md for exact semantics. *) TYPE ClientStats : STRUCT doneCnt : ULINT; // Sum over every registered request, including inactive requests. errorCnt : ULINT; sentCnt : ULINT; replyCnt : ULINT; exceptionCnt : ULINT; timeoutCnt : ULINT; offlineCnt : ULINT; // Sum of request online-to-offline transitions. requestCount : UINT; activeCount : UINT; onlineCount : UINT; offlineCount : UINT; unknownCount : UINT; // Active, neither online nor offline yet. busyCount : UINT; staleCount : UINT; // Active read requests only. heldWriteCount : UINT; totalValidDuration : ULINT; // Milliseconds, all successful requests. averageValidDuration : ULINT; // Weighted mean = totalValidDuration / doneCnt. longestValidDuration : UDINT; // Maximum request maximum, milliseconds. active : BOOL; online : BOOL; // At least one active request and all active requests online. offline : BOOL; // At least one active request and all active requests explicitly offline. toString : STRING(64); END_STRUCT END_TYPE 91efc359-e411-5bfc-bee3-74e902b561e5_Decl_LineIds 78 8fc52b24-7436-4d4a-8b03-aa43d42302d0 ModbusMaster -1 CODESYS V3.5 SP22 Patch 1