diff --git a/src/components.cognex.vision/ctrl/src/AxoVisionPro/AxoVisionPro.st b/src/components.cognex.vision/ctrl/src/AxoVisionPro/AxoVisionPro.st index 00d720577..2d6680696 100644 --- a/src/components.cognex.vision/ctrl/src/AxoVisionPro/AxoVisionPro.st +++ b/src/components.cognex.vision/ctrl/src/AxoVisionPro/AxoVisionPro.st @@ -119,21 +119,13 @@ NAMESPACE AXOpen.Components.Cognex.Vision _initHwCheckDone : BOOL; _retval : WORD; _geoAddr : GeoAddr; - _startAddress : UDINT; - _bytesCount : UINT; _Clock_1Hz : AxoBlinker; _readResultsJobID : BYTE; _readResultsLength : UINT; - _data_ : ARRAY[0..1300] OF BYTE; - _data_out : ARRAY[0..1300] OF BYTE; _sendDataInspectionType : BYTE; _sendDataBufferID : BYTE; _sendDataJobID : BYTE; _sendDataLength : UINT; - _inputsAddress : UDINT; - _inputsCount : UINT; - _outputsAddress : UDINT; - _outputsCount : UINT; END_VAR /// @@ -147,19 +139,13 @@ NAMESPACE AXOpen.Components.Cognex.Vision CameraNo : BYTE; END_VAR VAR_TEMP - SeparatorPos : INT; - inputsAddress : UDINT; - inputsCount : UINT; - outputsAddress : UDINT; - outputsCount : UINT; - retValRdAddr : WORD; - i : Int; - BitOffset : Int; - LogGeoData_retval : WORD; - _tmpWord : WORD; - + _inputsAddress : UDINT; + _inputsCount : UINT; + _outputsAddress : UDINT; + _outputsCount : UINT; + _bitOffset : Int; + _maxindex : UINT; index : UINT; - END_VAR Progress := _progress; @@ -228,6 +214,10 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#716; RETURN; END_IF; + Config.HWIDs.SystemControl_InAddress := _inputsAddress; + Config.HWIDs.SystemControl_InLength := _inputsCount; + Config.HWIDs.SystemControl_OutAddress := _outputsAddress; + Config.HWIDs.SystemControl_OutLength := _outputsCount; //******************Slot 2*****************// _geoAddr.Slot := UINT#2; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -268,6 +258,10 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#726; RETURN; END_IF; + Config.HWIDs.EngineControl_1_InAddress := _inputsAddress; + Config.HWIDs.EngineControl_1_InLength := _inputsCount; + Config.HWIDs.EngineControl_1_OutAddress := _outputsAddress; + Config.HWIDs.EngineControl_1_OutLength := _outputsCount; //******************Slot 3*****************// _geoAddr.Slot := UINT#3; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -308,6 +302,10 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#736; RETURN; END_IF; + Config.HWIDs.EngineControl_2_InAddress := _inputsAddress; + Config.HWIDs.EngineControl_2_InLength := _inputsCount; + Config.HWIDs.EngineControl_2_OutAddress := _outputsAddress; + Config.HWIDs.EngineControl_2_OutLength := _outputsCount; //******************Slot 4*****************// _geoAddr.Slot := UINT#4; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -348,6 +346,10 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#746; RETURN; END_IF; + Config.HWIDs.EngineControl_3_InAddress := _inputsAddress; + Config.HWIDs.EngineControl_3_InLength := _inputsCount; + Config.HWIDs.EngineControl_3_OutAddress := _outputsAddress; + Config.HWIDs.EngineControl_3_OutLength := _outputsCount; //******************Slot 5*****************// _geoAddr.Slot := UINT#5; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -388,6 +390,10 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#756; RETURN; END_IF; + Config.HWIDs.EngineControl_4_InAddress := _inputsAddress; + Config.HWIDs.EngineControl_4_InLength := _inputsCount; + Config.HWIDs.EngineControl_4_OutAddress := _outputsAddress; + Config.HWIDs.EngineControl_4_OutLength := _outputsCount; //******************Slot 6*****************// _geoAddr.Slot := UINT#6; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -428,6 +434,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#766; RETURN; END_IF; + Config.HWIDs.UserData_240B_1_OutAddress := _outputsAddress; + Config.HWIDs.UserData_240B_1_OutLength := _outputsCount; //******************Slot 7*****************// _geoAddr.Slot := UINT#7; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -468,6 +476,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#776; RETURN; END_IF; + Config.HWIDs.UserData_240B_2_OutAddress := _outputsAddress; + Config.HWIDs.UserData_240B_2_OutLength := _outputsCount; //******************Slot 8*****************// _geoAddr.Slot := UINT#8; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -508,6 +518,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#786; RETURN; END_IF; + Config.HWIDs.UserData_240B_3_OutAddress := _outputsAddress; + Config.HWIDs.UserData_240B_3_OutLength := _outputsCount; //******************Slot 9*****************// _geoAddr.Slot := UINT#9; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -548,6 +560,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#796; RETURN; END_IF; + Config.HWIDs.UserData_240B_4_OutAddress := _outputsAddress; + Config.HWIDs.UserData_240B_4_OutLength := _outputsCount; //******************Slot 10*****************// _geoAddr.Slot := UINT#10; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -588,6 +602,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#806; RETURN; END_IF; + Config.HWIDs.UserData_240B_5_OutAddress := _outputsAddress; + Config.HWIDs.UserData_240B_5_OutLength := _outputsCount; //******************Slot 11*****************// _geoAddr.Slot := UINT#11; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -628,6 +644,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#816; RETURN; END_IF; + Config.HWIDs.UserData_64B_1_OutAddress := _outputsAddress; + Config.HWIDs.UserData_64B_1_OutLength := _outputsCount; //******************Slot 12*****************// _geoAddr.Slot := UINT#12; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -668,6 +686,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#826; RETURN; END_IF; + Config.HWIDs.Results_240B_1_InAddress := _inputsAddress; + Config.HWIDs.Results_240B_1_InLength := _inputsCount; //******************Slot 13*****************// _geoAddr.Slot := UINT#13; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -708,6 +728,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#836; RETURN; END_IF; + Config.HWIDs.Results_240B_2_InAddress := _inputsAddress; + Config.HWIDs.Results_240B_2_InLength := _inputsCount; //******************Slot 14*****************// _geoAddr.Slot := UINT#14; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -748,6 +770,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#846; RETURN; END_IF; + Config.HWIDs.Results_240B_3_InAddress := _inputsAddress; + Config.HWIDs.Results_240B_3_InLength := _inputsCount; //******************Slot 15*****************// _geoAddr.Slot := UINT#15; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -788,6 +812,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#856; RETURN; END_IF; + Config.HWIDs.Results_240B_4_InAddress := _inputsAddress; + Config.HWIDs.Results_240B_4_InLength := _inputsCount; //******************Slot 16*****************// _geoAddr.Slot := UINT#16; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -828,6 +854,8 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#866; RETURN; END_IF; + Config.HWIDs.Results_240B_5_InAddress := _inputsAddress; + Config.HWIDs.Results_240B_5_InLength := _inputsCount; //******************Slot 17*****************// _geoAddr.Slot := UINT#17; _geoAddr.HardwareType := UINT#4; // (4-Module) @@ -868,6 +896,10 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#876; RETURN; END_IF; + Config.HWIDs.Results_64B_1_InAddress := _inputsAddress; + Config.HWIDs.Results_64B_1_InLength := _inputsCount; + //******************************************// + IF inParent = NULL THEN Messenger.Activate(UINT#1130,eAxoMessageCategory#Error); @@ -1002,58 +1034,53 @@ NAMESPACE AXOpen.Components.Cognex.Vision RETURN; END_IF; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount);//(LADDR := Component.HW.HW_SystemControl, PIADDR => inputsAddress, PICount => inputsCount, PQADDR => outputsAddress, PQCount => outputsCount); - IF CameraNo = BYTE#1 THEN - inputsAddress := inputsAddress + UDINT#8; - BitOffset := 0; + _inputsAddress := Config.HWIDs.SystemControl_InAddress + UDINT#8; + _bitOffset := 0; ELSIF CameraNo = BYTE#2 THEN - inputsAddress := inputsAddress + UDINT#8; - BitOffset := 4; + _inputsAddress := Config.HWIDs.SystemControl_InAddress + UDINT#8; + _bitOffset := 4; ELSIF CameraNo = BYTE#3 THEN - inputsAddress := inputsAddress + UDINT#9; - BitOffset := 0; + _inputsAddress := Config.HWIDs.SystemControl_InAddress + UDINT#9; + _bitOffset := 0; ELSIF CameraNo = BYTE#4 THEN - inputsAddress := inputsAddress + UDINT#9; - BitOffset := 4; + _inputsAddress := Config.HWIDs.SystemControl_InAddress + UDINT#9; + _bitOffset := 4; ELSIF CameraNo = BYTE#5 THEN - inputsAddress := inputsAddress + UDINT#10; - BitOffset := 0; + _inputsAddress := Config.HWIDs.SystemControl_InAddress + UDINT#10; + _bitOffset := 0; ELSIF CameraNo = BYTE#6 THEN - inputsAddress := inputsAddress + UDINT#10; - BitOffset := 4; + _inputsAddress := Config.HWIDs.SystemControl_InAddress + UDINT#10; + _bitOffset := 4; ELSIF CameraNo = BYTE#7 THEN - inputsAddress := inputsAddress + UDINT#11; - BitOffset := 0; + _inputsAddress := Config.HWIDs.SystemControl_InAddress + UDINT#11; + _bitOffset := 0; ELSIF CameraNo = BYTE#8 THEN - inputsAddress := inputsAddress + UDINT#11; - BitOffset := 4; + _inputsAddress := Config.HWIDs.SystemControl_InAddress + UDINT#11; + _bitOffset := 4; END_IF; - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress), bitOffset := BitOffset, value => Inputs.Status.SoftEvent.ResetAck ); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress), bitOffset := (BitOffset + INT#1),value => Inputs.Status.SoftEvent.DataHandlerDone); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress), bitOffset := (BitOffset + INT#2),value => Inputs.Status.SoftEvent.TriggerAck); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress), bitOffset := (BitOffset + INT#3),value => Inputs.Status.SoftEvent.Reserve); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(_inputsAddress), bitOffset := _bitOffset, value => Inputs.Status.SoftEvent.ResetAck ); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(_inputsAddress), bitOffset := (_bitOffset + INT#1),value => Inputs.Status.SoftEvent.DataHandlerDone); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(_inputsAddress), bitOffset := (_bitOffset + INT#2),value => Inputs.Status.SoftEvent.TriggerAck); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(_inputsAddress), bitOffset := (_bitOffset + INT#3),value => Inputs.Status.SoftEvent.Reserve); - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress), bitOffset := INT#0, value => Inputs.Status.SystemReady); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress), bitOffset := INT#1, value => Inputs.Status.SystemBusy); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress), bitOffset := INT#7, value => Inputs.Status.Online); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress + UDINT#1), bitOffset := INT#5, value => Inputs.Status.JobLoadComplete); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.SystemControl_InAddress), bitOffset := INT#0, value => Inputs.Status.SystemReady); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.SystemControl_InAddress), bitOffset := INT#1, value => Inputs.Status.SystemBusy); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.SystemControl_InAddress), bitOffset := INT#7, value => Inputs.Status.Online); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.SystemControl_InAddress + UDINT#1), bitOffset := INT#5, value => Inputs.Status.JobLoadComplete); //nacitanie user dat pre kontrolu.. ci a ako to nastavili ine kamery. - ReadMemory(area := ReadArea#Input, byteOffset := TO_DINT(inputsAddress) + DINT#4, value => Inputs.Status.CurentJobID ); + ReadMemory(area := ReadArea#Input, byteOffset := TO_DINT(Config.HWIDs.SystemControl_InAddress) + DINT#4, value => Inputs.Status.CurentJobID ); Inputs.Status.ReadDataLockerJobID := TO_BYTE(TO_INT(Inputs.Status.CurentJobID) / INT#10); - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_EngineControl_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress), bitOffset := INT#5, value => Inputs.Status.ResultValid); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + DINT#4, value => Inputs.Status.ID_Inspection); - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + DINT#1, bitOffset := INT#0, value => Inputs.Status.SetUserDataAck); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.EngineControl_1_InAddress), bitOffset := INT#5, value => Inputs.Status.ResultValid); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.EngineControl_1_InAddress) + DINT#4, value => Inputs.Status.ID_Inspection); + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.EngineControl_1_InAddress) + DINT#1, bitOffset := INT#0, value => Inputs.Status.SetUserDataAck); //nacitanie user dat pre kontrolu.. ci a ako to nastavili ine kamery. - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - ReadMemory(area := ReadArea#Output,byteOffset := TO_DINT(outputsAddress), value => Inputs.Status.UserDataJobID); + ReadMemory(area := ReadArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress), value => Inputs.Status.UserDataJobID); Inputs.Status.UserDataLockerJobID := TO_BYTE(TO_UINT(Inputs.Status.UserDataJobID) / UINT#10); - ReadMemory(area := ReadArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#1, value => Inputs.Status.UserDataLockerIdOperation); + ReadMemory(area := ReadArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + DINT#1, value => Inputs.Status.UserDataLockerIdOperation); //*************INITIALIZATION************* RestoreTask.Run(THIS); @@ -1103,26 +1130,17 @@ NAMESPACE AXOpen.Components.Cognex.Vision Outputs.Control.InitiateJobLoad := FALSE; Outputs.Control.InspectionResultsAck := FALSE; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress),value:= BYTE#0); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#1,value:= BYTE#0); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#2,value:= BYTE#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress),value:= BYTE#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + DINT#1,value:= BYTE#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + DINT#2,value:= BYTE#0); Outputs.Control.JobLoadID := WORD#0; + Outputs.Control.WriteDataId := BYTE#0; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := INT#4, value:= FALSE); - - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#2,value:= WORD#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.EngineControl_1_OutAddress), bitOffset := INT#1, value:= FALSE); - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_EngineControl_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := INT#1, value:= FALSE); - + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress), bitOffset := INT#4, value:= FALSE); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress) + DINT#2,value:= WORD#0); + IF Inputs.Status.CurentJobID > WORD#0 THEN THIS.CallTimers(FALSE); _progress := 301; @@ -1138,10 +1156,13 @@ NAMESPACE AXOpen.Components.Cognex.Vision END_IF; _Clock_1Hz.Blink(THIS,TIME#500MS,TIME#500MS); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := INT#4, value:= _Clock_1Hz.output); + + Outputs.Control.InitiateJobLoad := _Clock_1Hz.output; + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress), bitOffset := INT#4, value:= _Clock_1Hz.output); IF Inputs.Status.CurentJobID = WORD#0 THEN - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := INT#4, value:= FALSE); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress), bitOffset := INT#4, value:= FALSE); + Outputs.Control.InitiateJobLoad := FALSE; THIS.CallTimers(FALSE); _progress := 302; END_IF; @@ -1221,12 +1242,11 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#511; END_IF; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress),value:= BYTE#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress),value:= BYTE#0); //zapisovanie dat pre kameru, ]: typ spracovania dat (0 = Undefined, 1 = Zmena jobu/referencie, 2=Nacitanie parametrov0, 3=Nacitanie paramterov1,…) - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#1,value:= BYTE#0); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#2,value:= BYTE#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + DINT#1,value:= BYTE#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + DINT#2,value:= BYTE#0); IF TRUE THEN THIS.CallTimers(FALSE); @@ -1258,12 +1278,10 @@ NAMESPACE AXOpen.Components.Cognex.Vision Inputs.Status.ReadDataLockerJobID := BYTE#0; Outputs.Control.JobLoadID := WORD#0; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress),bitOffset := INT#4,value:= FALSE); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#2,value:= WORD#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress),bitOffset := INT#4,value:= FALSE); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress) + DINT#2,value:= WORD#0); - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_EngineControl_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress),bitOffset := INT#1,value:= FALSE); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.EngineControl_1_OutAddress),bitOffset := INT#1,value:= FALSE); IF TRUE THEN THIS.CallTimers(FALSE); @@ -1492,8 +1510,7 @@ NAMESPACE AXOpen.Components.Cognex.Vision AND (NOT Inputs.Status.JobLoadComplete) THEN Outputs.Control.JobLoadID := TO_BYTE(TO_UINT(_readResultsJobID) + (TO_UINT(Config.CameraNo) * UINT#10)); //nastavenie ID podla jobuID 50-59 pre kameru 5 - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#2,value:= Outputs.Control.JobLoadID); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress) + DINT#2,value:= Outputs.Control.JobLoadID); _progress := 364; END_IF; END_IF; @@ -1516,13 +1533,14 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#565; END_IF; - Outputs.Control.InitiateJobLoad := TRUE; _Clock_1Hz.Blink(THIS,TIME#500MS,TIME#500MS); - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress),bitOffset := INT#4,value:= _Clock_1Hz.output); + Outputs.Control.InitiateJobLoad := _Clock_1Hz.output; + + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress),bitOffset := INT#4,value:= _Clock_1Hz.output); IF (Inputs.Status.CurentJobID = Outputs.Control.JobLoadID) AND Outputs.Control.JobLoadID > WORD#0 AND Inputs.Status.CurentJobID > BYTE#0 AND Inputs.Status.JobLoadComplete THEN - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress),bitOffset := INT#4,value:= FALSE); // ??? not in original code, but probably it should be reseted here + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress),bitOffset := INT#4,value:= FALSE); // ??? not in original code, but probably it should be reseted here + Outputs.Control.InitiateJobLoad := FALSE; THIS.CallTimers(FALSE); _progress := 366; END_IF; @@ -1563,147 +1581,59 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id:= UINT#1303; RETURN; END_IF; + //TODO implement error message on the .NET side + IF _readResultsLength > UINT#1264 THEN + TaskMessenger.Activate( UINT#1307, eAxoMessageCategory#Error); + Status.Error.Id:= UINT#1307; + RETURN; + END_IF; + // Clear the rest of the buffer after the valid data to avoid sending old data in case of smaller size of results in the next inspections. + FOR index := _readResultsLength TO UINT#1300 DO + _data_in_1301[index] := BYTE#0; + END_FOR; + // Read the results from the hardware from the Results_64B_1 'item' and store them to the buffer from index 1200. + IF _readResultsLength > UINT#1200 THEN + _maxindex := System.Math.Min(_readResultsLength - UINT#1, UINT#1263); + FOR index := UINT#1200 TO _maxindex DO //nacitavanie tolko dat kolko treba do buffra. + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.Results_64B_1_InAddress) + TO_DINT(index)-DINT#1200, value => _data_in_1301[index]); + END_FOR; + END_IF; + // Read the results from the hardware from the Results_240B_5 'item' and store them to the buffer from index 960, max up to 1199. + IF _readResultsLength > UINT#960 THEN + _maxindex := System.Math.Min(_readResultsLength - UINT#1, UINT#1199); + FOR index := UINT#960 TO _maxindex DO //nacitavanie tolko dat kolko treba do buffra. + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.Results_240B_5_InAddress) + TO_DINT(index)-DINT#960, value => _data_in_1301[index]); + END_FOR; + END_IF; + // Read the results from the hardware from the Results_240B_4 'item' and store them to the buffer from index 720, max up to 959. + IF _readResultsLength > UINT#720 THEN + _maxindex := System.Math.Min(_readResultsLength - UINT#1, UINT#959); + FOR index := UINT#720 TO _maxindex DO //nacitavanie tolko dat kolko treba do buffra. + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.Results_240B_4_InAddress) + TO_DINT(index)-DINT#720, value => _data_in_1301[index]); + END_FOR; + END_IF; + // Read the results from the hardware from the Results_240B_3 'item' and store them to the buffer from index 480, max up to 719. + IF _readResultsLength > UINT#480 THEN + _maxindex := System.Math.Min(_readResultsLength - UINT#1, UINT#719); + FOR index := UINT#480 TO _maxindex DO //nacitavanie tolko dat kolko treba do buffra. + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.Results_240B_3_InAddress) + TO_DINT(index)-DINT#480, value => _data_in_1301[index]); + END_FOR; + END_IF; + // Read the results from the hardware from the Results_240B_2 'item' and store them to the buffer from index 240, max up to 479. + IF _readResultsLength > UINT#240 THEN + _maxindex := System.Math.Min(_readResultsLength - UINT#1, UINT#479); + FOR index := UINT#240 TO _maxindex DO //nacitavanie tolko dat kolko treba do buffra. + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.Results_240B_2_InAddress) + TO_DINT(index)-DINT#240, value => _data_in_1301[index]); + END_FOR; + END_IF; + // Read the results from the hardware from the Results_240B_1 'item' and store them to the buffer from index 0, max up to 239. + IF _readResultsLength > UINT#0 THEN + _maxindex := System.Math.Min(_readResultsLength - UINT#1, UINT#239); + FOR index := UINT#0 TO _maxindex DO //nacitavanie tolko dat kolko treba do buffra. + ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(Config.HWIDs.Results_240B_1_InAddress) + TO_DINT(index), value => _data_in_1301[index]); + END_FOR; + END_IF; - CASE THIS._readResultsLength OF - UINT#1..UINT#240: // Statement section case 1 - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO _readResultsLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index]); - END_FOR; - - FOR index := _readResultsLength TO UINT#1300 DO - _data_in_1301[index] := BYTE#0; - END_FOR; - - UINT#241..UINT#480: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#239 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := 240 TO _readResultsLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#240]); - END_FOR; - - FOR index := _readResultsLength TO UINT#1300 DO - _data_in_1301[index] := BYTE#0; - END_FOR; - - UINT#481..UINT#720: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#239 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#240 TO UINT#479 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#240]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#480 TO _readResultsLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - FOR index := _readResultsLength TO UINT#1300 DO - _data_in_1301[index] := BYTE#0; - END_FOR; - - UINT#721..UINT#960: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#239 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#240 TO UINT#479 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#240]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#480 TO UINT#719 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#720 TO _readResultsLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - FOR index := _readResultsLength TO UINT#1300 DO - _data_in_1301[index] := BYTE#0; - END_FOR; - - UINT#961..UINT#1200: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#239 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#240 TO UINT#479 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#240]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#480 TO UINT#719 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#720 TO UINT#960 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_5),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#961 TO _readResultsLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - FOR index := _readResultsLength TO UINT#1300 DO - _data_in_1301[index] := BYTE#0; - END_FOR; - - UINT#1201..UINT#1264: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#239 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#240 TO UINT#479 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#240]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#480 TO UINT#719 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#720 TO UINT#960 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_240B_5),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#961 TO _readResultsLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_Results_64B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#1201 TO _readResultsLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - ReadMemory(area := ReadArea#Input,byteOffset := TO_DINT(inputsAddress) + TO_DINT(index), value => _data_in_1301[index - UINT#480]); - END_FOR; - - FOR index := _readResultsLength TO UINT#1300 DO - _data_in_1301[index] := BYTE#0; - END_FOR; - - ELSE - TaskMessenger.Activate( UINT#1304, eAxoMessageCategory#Error); - Status.Error.Id:= UINT#1304; - END_CASE; THIS.ResultData.Data := _data_in_1301; THIS.ResultData.ToggleDataChangedFlag(); IF TRUE THEN @@ -1749,12 +1679,12 @@ NAMESPACE AXOpen.Components.Cognex.Vision END_IF; Outputs.Control.JobLoadID := BYTE#0; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#2, value:= Outputs.Control.JobLoadID); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress) + DINT#2, value:= Outputs.Control.JobLoadID); IF TRUE THEN THIS.CallTimers(FALSE); _progress := 373; + _Clock_1Hz.Restore(); END_IF; END_IF; // ReadResultsTask running: loading the job. @@ -1764,14 +1694,14 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#573; END_IF; - Outputs.Control.InitiateJobLoad := TRUE; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := 4, value:= Outputs.Control.InitiateJobLoad); + _Clock_1Hz.Blink(THIS,TIME#300MS,TIME#50S); // generate pulse + Outputs.Control.InitiateJobLoad := _Clock_1Hz.output; + + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress), bitOffset := 4, value:= Outputs.Control.InitiateJobLoad); - IF (Inputs.Status.CurentJobID = WORD#0) AND Inputs.Status.JobLoadComplete THEN + IF (Inputs.Status.CurentJobID = WORD#0) AND NOT Inputs.Status.JobLoadComplete THEN Outputs.Control.InitiateJobLoad := FALSE; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := 4, value:= Outputs.Control.InitiateJobLoad); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress), bitOffset := 4, value:= Outputs.Control.InitiateJobLoad); THIS.CallTimers(FALSE); _progress := 374; END_IF; @@ -1872,10 +1802,9 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#583; END_IF; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress + UDINT#0), value:= Outputs.Control.WriteDataID); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress + UDINT#1),value:= _sendDataInspectionType); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress + UDINT#2),value:= _sendDataJobID); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress + UDINT#0), value:= Outputs.Control.WriteDataID); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress + UDINT#1),value:= _sendDataInspectionType); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress + UDINT#2),value:= _sendDataJobID); IF (Inputs.Status.UserDataLockerJobID = Config.CameraNo) THEN // IF (Inputs.Status.UserDataLockerJobID = Config.CameraNo) THEN THIS.CallTimers(FALSE); @@ -1906,221 +1835,115 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id:= UINT#1305; RETURN; END_IF; + //TODO implement error message on the .NET side + IF _sendDataLength > UINT#1260 THEN + TaskMessenger.Activate( UINT#1308, eAxoMessageCategory#Error); + Status.Error.Id:= UINT#1308; + RETURN; + END_IF; - CASE _sendDataLength OF - UINT#1..UINT#235: // Statement section case 1 - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO _sendDataLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#4 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - FOR index := _sendDataLength TO UINT#235 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#4 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#236 TO UINT#475 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#236 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#476 TO UINT#715 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#476 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#716 TO UINT#955 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#716 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_5),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#956 TO UINT#1195 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#956 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_64B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#1196 TO UINT#1263 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#1196 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - UINT#236..UINT#475: // Statement section case 1 - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#235 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#4 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#236 TO _sendDataLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#236 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - FOR index := _sendDataLength TO UINT#475 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#236 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#476 TO UINT#715 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#476 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#716 TO UINT#955 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#716 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_5),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#956 TO UINT#1195 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#956 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_64B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#1196 TO UINT#1263 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#1196 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - UINT#476..UINT#715: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#235 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#4 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#236 TO UINT#475 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#236 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#476 TO _sendDataLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#476 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - FOR index := _sendDataLength TO UINT#715 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#476 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#716 TO UINT#955 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#716 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_5),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#956 TO UINT#1195 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#956 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_64B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#1196 TO UINT#1263 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#1196 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - UINT#716..UINT#955: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#235 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#4 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#236 TO UINT#475 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#236 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#476 TO UINT#715 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#476 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#716 TO _sendDataLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#716 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - FOR index := _sendDataLength TO UINT#955 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#716 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_5),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#956 TO UINT#1195 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#956 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_64B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#1196 TO UINT#1263 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#1196 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - UINT#956..UINT#1195: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#235 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#4 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#236 TO UINT#475 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#236 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#476 TO UINT#715 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#476 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#716 TO UINT#955 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#716 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_5),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#956 TO _sendDataLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#956 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - FOR index := _sendDataLength TO UINT#1195 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#956 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_64B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#1196 TO UINT#1259 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#1196 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - UINT#1196..UINT#1260: - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#0 TO UINT#235 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#4 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_2),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#236 TO UINT#475 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#236 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_3),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#476 TO UINT#715 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#476 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_4),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#716 TO UINT#955 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#716 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_5),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#956 TO UINT#1195 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#956 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_64B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - FOR index := UINT#1196 TO _sendDataLength - UINT#1 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#1196 + TO_DINT(index),value:= _data_out_1301[index]); - END_FOR; - - FOR index := _sendDataLength TO UINT#1263 DO //nacitavanie tolko dat kolko treba do buffra. - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) - DINT#1196 + TO_DINT(index),value:= BYTE#0); - END_FOR; - - - ELSE - TaskMessenger.Activate( UINT#1306, eAxoMessageCategory#Error); - Status.Error.Id:= UINT#1306; - END_CASE; + // Write the user data to the hardware to the UserData_64B_1 'item' from the buffer starting from index 1196. + IF _sendDataLength > UINT#1196 THEN + _maxindex := System.Math.Min(_sendDataLength - UINT#1, UINT#1263); + // Write relevant data from the buffer to the hardware starting from index 1196 in the buffer to index 0 in the hardware. + FOR index := UINT#1196 TO _maxindex DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_64B_1_OutAddress) + TO_DINT(index) - DINT#1196 ,value:= _data_out_1301[index]); + END_FOR; + // Clear the rest of the hardware buffer after the valid data to avoid sending old data in case of smaller size of data in the next inspections. + FOR index := _sendDataLength TO UINT#1263 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_64B_1_OutAddress) + TO_DINT(index) - DINT#1196 ,value:= BYTE#0); + END_FOR; + ELSE + // If the data to send is smaller than 1196, clear completelly the hardware buffer. + FOR index := UINT#0 TO UINT#63 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_64B_1_OutAddress) + TO_DINT(index),value:= BYTE#0); + END_FOR; + END_IF; + // Write the user data to the hardware to the UserData_240B_5 'item' from the buffer starting from index 956. + IF _sendDataLength > UINT#956 THEN + _maxindex := System.Math.Min(_sendDataLength - UINT#1, UINT#1195); + // Write relevant data from the buffer to the hardware starting from index 956 in the buffer to index 0 in the hardware. + FOR index := UINT#956 TO _maxindex DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_5_OutAddress) + TO_DINT(index) - DINT#956 ,value:= _data_out_1301[index]); + END_FOR; + // Clear the rest of the hardware buffer after the valid data to avoid sending old data in case of smaller size of data in the next inspections. + FOR index := _sendDataLength TO UINT#1195 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_5_OutAddress) + TO_DINT(index) - DINT#956 ,value:= BYTE#0); + END_FOR; + ELSE + // If the data to send is smaller than 956, clear completelly the hardware buffer. + FOR index := UINT#0 TO UINT#239 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_5_OutAddress) + TO_DINT(index),value:= BYTE#0); + END_FOR; + END_IF; + // Write the user data to the hardware to the UserData_240B_4 'item' from the buffer starting from index 716. + IF _sendDataLength > UINT#716 THEN + _maxindex := System.Math.Min(_sendDataLength - UINT#1, UINT#955); + // Write relevant data from the buffer to the hardware starting from index 716 in the buffer to index 0 in the hardware. + FOR index := UINT#716 TO _maxindex DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_4_OutAddress) + TO_DINT(index) - DINT#716 ,value:= _data_out_1301[index]); + END_FOR; + // Clear the rest of the hardware buffer after the valid data to avoid sending old data in case of smaller size of data in the next inspections. + FOR index := _sendDataLength TO UINT#955 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_4_OutAddress) + TO_DINT(index) - DINT#716 ,value:= BYTE#0); + END_FOR; + ELSE + // If the data to send is smaller than 716, clear completelly the hardware buffer. + FOR index := UINT#0 TO UINT#239 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_4_OutAddress) + TO_DINT(index),value:= BYTE#0); + END_FOR; + END_IF; + // Write the user data to the hardware to the UserData_240B_3 'item' from the buffer starting from index 476. + IF _sendDataLength > UINT#476 THEN + _maxindex := System.Math.Min(_sendDataLength - UINT#1, UINT#715); + // Write relevant data from the buffer to the hardware starting from index 476 in the buffer to index 0 in the hardware. + FOR index := UINT#476 TO _maxindex DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_3_OutAddress) + TO_DINT(index) - DINT#476 ,value:= _data_out_1301[index]); + END_FOR; + // Clear the rest of the hardware buffer after the valid data to avoid sending old data in case of smaller size of data in the next inspections. + FOR index := _sendDataLength TO UINT#715 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_3_OutAddress) + TO_DINT(index) - DINT#476 ,value:= BYTE#0); + END_FOR; + ELSE + // If the data to send is smaller than 476, clear completelly the hardware buffer. + FOR index := UINT#0 TO UINT#239 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_3_OutAddress) + TO_DINT(index),value:= BYTE#0); + END_FOR; + END_IF; + // Write the user data to the hardware to the UserData_240B_2 'item' from the buffer starting from index 236. + IF _sendDataLength > UINT#236 THEN + _maxindex := System.Math.Min(_sendDataLength - UINT#1, UINT#475); + // Write relevant data from the buffer to the hardware starting from index 236 in the buffer to index 0 in the hardware. + FOR index := UINT#236 TO _maxindex DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_2_OutAddress) + TO_DINT(index) - DINT#236 ,value:= _data_out_1301[index]); + END_FOR; + // Clear the rest of the hardware buffer after the valid data to avoid sending old data in case of smaller size of data in the next inspections. + FOR index := _sendDataLength TO UINT#475 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_2_OutAddress) + TO_DINT(index) - DINT#236 ,value:= BYTE#0); + END_FOR; + ELSE + // If the data to send is smaller than 236, clear completelly the hardware buffer. + FOR index := UINT#0 TO UINT#239 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_2_OutAddress) + TO_DINT(index),value:= BYTE#0); + END_FOR; + END_IF; + // Write the user data to the hardware to the UserData_240B_1 'item' from the buffer starting from index 4. + IF _sendDataLength > UINT#0 THEN + _maxindex := System.Math.Min(_sendDataLength - UINT#1, UINT#235); + // Write relevant data from the buffer to the hardware starting from index 0 in the buffer to index 4 in the hardware. + FOR index := UINT#0 TO _maxindex DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + TO_DINT(index) + DINT#4 ,value:= _data_out_1301[index]); + END_FOR; + // Clear the rest of the hardware buffer after the valid data to avoid sending old data in case of smaller size of data in the next inspections. + FOR index := _sendDataLength TO UINT#235 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + TO_DINT(index) + DINT#4 ,value:= BYTE#0); + END_FOR; + ELSE + // If the data to send is smaller than 0, clear completelly the hardware buffer. + FOR index := UINT#0 TO UINT#235 DO + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + TO_DINT(index) + DINT#4 ,value:= BYTE#0); + END_FOR; + END_IF; IF TRUE THEN THIS.CallTimers(FALSE); @@ -2172,10 +1995,11 @@ NAMESPACE AXOpen.Components.Cognex.Vision Status.Error.Id := UINT#590; END_IF; - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_UserData_240B_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#0,value:= BYTE#0); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#1,value:= BYTE#0); - + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + DINT#0,value:= BYTE#0); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.UserData_240B_1_OutAddress) + DINT#1,value:= BYTE#0); + Outputs.Control.JobLoadID := WORD#0; + Outputs.Control.WriteDataId := BYTE#0; + IF TRUE THEN THIS.CallTimers(FALSE); _progress := 391; @@ -2252,53 +2076,48 @@ NAMESPACE AXOpen.Components.Cognex.Vision //***********Update outputs **************** - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - IF CameraNo = BYTE#1 THEN - outputsAddress := outputsAddress + UDINT#4; - BitOffset := 0; + _outputsAddress := Config.HWIDs.SystemControl_OutAddress + UDINT#4; + _bitOffset := 0; ELSIF CameraNo = BYTE#2 THEN - outputsAddress := outputsAddress + UDINT#4; - BitOffset := 4; + _outputsAddress := Config.HWIDs.SystemControl_OutAddress + UDINT#4; + _bitOffset := 4; ELSIF CameraNo = BYTE#3 THEN - outputsAddress := outputsAddress + UDINT#5; - BitOffset := 0; + _outputsAddress := Config.HWIDs.SystemControl_OutAddress + UDINT#5; + _bitOffset := 0; ELSIF CameraNo = BYTE#4 THEN - outputsAddress := outputsAddress + UDINT#5; - BitOffset := 4; + _outputsAddress := Config.HWIDs.SystemControl_OutAddress + UDINT#5; + _bitOffset := 4; ELSIF CameraNo = BYTE#5 THEN - outputsAddress := outputsAddress + UDINT#6; - BitOffset := 0; + _outputsAddress := Config.HWIDs.SystemControl_OutAddress + UDINT#6; + _bitOffset := 0; ELSIF CameraNo = BYTE#6 THEN - outputsAddress := outputsAddress + UDINT#6; - BitOffset := 4; + _outputsAddress := Config.HWIDs.SystemControl_OutAddress + UDINT#6; + _bitOffset := 4; ELSIF CameraNo = BYTE#7 THEN - outputsAddress := outputsAddress + UDINT#7; - BitOffset := 0; + _outputsAddress := Config.HWIDs.SystemControl_OutAddress + UDINT#7; + _bitOffset := 0; ELSIF CameraNo = BYTE#8 THEN - outputsAddress := outputsAddress + UDINT#8; - BitOffset := 4; + _outputsAddress := Config.HWIDs.SystemControl_OutAddress + UDINT#7; + _bitOffset := 4; END_IF; - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := BitOffset, value:= Outputs.Control.SoftEvent.Reset); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := BitOffset + INT#1, value:= Outputs.Control.SoftEvent.DataHandlerAck); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := BitOffset + INT#2, value:= Outputs.Control.SoftEvent.Trigger); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := BitOffset + INT#3, value:= Outputs.Control.SoftEvent.Reserve); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(_outputsAddress), bitOffset := _bitOffset, value:= Outputs.Control.SoftEvent.Reset); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(_outputsAddress), bitOffset := _bitOffset + INT#1, value:= Outputs.Control.SoftEvent.DataHandlerAck); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(_outputsAddress), bitOffset := _bitOffset + INT#2, value:= Outputs.Control.SoftEvent.Trigger); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(_outputsAddress), bitOffset := _bitOffset + INT#3, value:= Outputs.Control.SoftEvent.Reserve); IF (Inputs.Status.ReadDataLockerJobID = Config.CameraNo) THEN - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_SystemControl),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := INT#4, value:= Outputs.Control.InitiateJobLoad ); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress), bitOffset := INT#4, value:= Outputs.Control.InitiateJobLoad ); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress) + DINT#2, value:= Outputs.Control.JobLoadID); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.SystemControl_OutAddress) + DINT#2, value:= Outputs.Control.JobLoadID); - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_EngineControl_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := INT#1, value:= Outputs.Control.InspectionResultsAck); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.EngineControl_1_OutAddress), bitOffset := INT#1, value:= Outputs.Control.InspectionResultsAck); END_IF; IF (Inputs.Status.UserDataLockerJobID = Config.CameraNo) THEN - retValRdAddr := ReadHardwareIOAddress(hardwareID := (Config.HWIDs.HW_EngineControl_1),inputStartAddress=> inputsAddress,inputCount => inputsCount,outputStartAddress => outputsAddress,outputCount=> outputsCount); - WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(outputsAddress), bitOffset := INT#3, value:= Outputs.Control.SetUserdata); + WriteMemory(area := WriteArea#Output,byteOffset := TO_DINT(Config.HWIDs.EngineControl_1_OutAddress), bitOffset := INT#3, value:= Outputs.Control.SetUserdata); END_IF; // - User Data [20-1400]: Spolocny buffer pre user data. Vyuziva sa vzdy cely buffer (v jednom CASE moze pristupovat len jedna inspekcia). @@ -2334,7 +2153,7 @@ NAMESPACE AXOpen.Components.Cognex.Vision END_VAR _readResultsJobID := JobID; _readResultsLength := Length; - _data_in_1301 := Data; + Data := _data_in_1301; // copy data to target array ReadResults := ReadResultsTask.Invoke(THIS); END_METHOD diff --git a/src/components.cognex.vision/ctrl/src/AxoVisionPro/TypesStructuresAndEnums/AxoVisionProHWIDs.st b/src/components.cognex.vision/ctrl/src/AxoVisionPro/TypesStructuresAndEnums/AxoVisionProHWIDs.st index ad4619c12..8909e559d 100644 --- a/src/components.cognex.vision/ctrl/src/AxoVisionPro/TypesStructuresAndEnums/AxoVisionProHWIDs.st +++ b/src/components.cognex.vision/ctrl/src/AxoVisionPro/TypesStructuresAndEnums/AxoVisionProHWIDs.st @@ -6,38 +6,126 @@ NAMESPACE AXOpen.Components.Cognex.Vision HW_Device : UINT; {#ix-set:AttributeName = "<#Hardware ID 'SystemControl' submodule#>"} HW_SystemControl : UINT; + {#ix-set:AttributeName = "<#'SystemControl' submodule's input area start address#>"} + SystemControl_InAddress : UDINT; + {#ix-set:AttributeName = "<#'SystemControl' submodule's input area length#>"} + SystemControl_InLength : UINT; + {#ix-set:AttributeName = "<#'SystemControl' submodule's output area start address#>"} + SystemControl_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'SystemControl' submodule's output area length#>"} + SystemControl_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'EngineControl_1' submodule#>"} HW_EngineControl_1 : UINT; + {#ix-set:AttributeName = "<#'EngineControl_1' submodule's input area start address#>"} + EngineControl_1_InAddress : UDINT; + {#ix-set:AttributeName = "<#'EngineControl_1' submodule's input area length#>"} + EngineControl_1_InLength : UINT; + {#ix-set:AttributeName = "<#'EngineControl_1' submodule's output area start address#>"} + EngineControl_1_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'EngineControl_1' submodule's output area length#>"} + EngineControl_1_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'EngineControl_2' submodule#>"} HW_EngineControl_2 : UINT; + {#ix-set:AttributeName = "<#'EngineControl_2' submodule's input area start address#>"} + EngineControl_2_InAddress : UDINT; + {#ix-set:AttributeName = "<#'EngineControl_2' submodule's input area length#>"} + EngineControl_2_InLength : UINT; + {#ix-set:AttributeName = "<#'EngineControl_2' submodule's output area start address#>"} + EngineControl_2_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'EngineControl_2' submodule's output area length#>"} + EngineControl_2_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'EngineControl_3' submodule#>"} HW_EngineControl_3 : UINT; + {#ix-set:AttributeName = "<#'EngineControl_3' submodule's input area start address#>"} + EngineControl_3_InAddress : UDINT; + {#ix-set:AttributeName = "<#'EngineControl_3' submodule's input area length#>"} + EngineControl_3_InLength : UINT; + {#ix-set:AttributeName = "<#'EngineControl_3' submodule's output area start address#>"} + EngineControl_3_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'EngineControl_3' submodule's output area length#>"} + EngineControl_3_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'EngineControl_4' submodule#>"} HW_EngineControl_4 : UINT; + {#ix-set:AttributeName = "<#'EngineControl_4' submodule's input area start address#>"} + EngineControl_4_InAddress : UDINT; + {#ix-set:AttributeName = "<#'EngineControl_4' submodule's input area length#>"} + EngineControl_4_InLength : UINT; + {#ix-set:AttributeName = "<#'EngineControl_4' submodule's output area start address#>"} + EngineControl_4_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'EngineControl_4' submodule's output area length#>"} + EngineControl_4_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'UserData_240B_1' submodule#>"} HW_UserData_240B_1 : UINT; + {#ix-set:AttributeName = "<#'UserData_240B_1' submodule's output area start address#>"} + UserData_240B_1_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'UserData_240B_1' submodule's output area length#>"} + UserData_240B_1_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'UserData_240B_2' submodule#>"} HW_UserData_240B_2 : UINT; + {#ix-set:AttributeName = "<#'UserData_240B_2' submodule's output area start address#>"} + UserData_240B_2_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'UserData_240B_2' submodule's output area length#>"} + UserData_240B_2_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'UserData_240B_3' submodule#>"} HW_UserData_240B_3 : UINT; + {#ix-set:AttributeName = "<#'UserData_240B_3' submodule's output area start address#>"} + UserData_240B_3_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'UserData_240B_3' submodule's output area length#>"} + UserData_240B_3_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'UserData_240B_4' submodule#>"} HW_UserData_240B_4 : UINT; + {#ix-set:AttributeName = "<#'UserData_240B_4' submodule's output area start address#>"} + UserData_240B_4_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'UserData_240B_4' submodule's output area length#>"} + UserData_240B_4_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'UserData_240B_5' submodule#>"} HW_UserData_240B_5 : UINT; + {#ix-set:AttributeName = "<#'UserData_240B_5' submodule's output area start address#>"} + UserData_240B_5_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'UserData_240B_5' submodule's output area length#>"} + UserData_240B_5_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'UserData_64B_1' submodule#>"} HW_UserData_64B_1 : UINT; + {#ix-set:AttributeName = "<#'UserData_64B_1' submodule's output area start address#>"} + UserData_64B_1_OutAddress : UDINT; + {#ix-set:AttributeName = "<#'UserData_64B_1' submodule's output area length#>"} + UserData_64B_1_OutLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'Results_240B_1' submodule#>"} HW_Results_240B_1 : UINT; + {#ix-set:AttributeName = "<#'Results_240B_1' submodule's input area start address#>"} + Results_240B_1_InAddress : UDINT; + {#ix-set:AttributeName = "<#'Results_240B_1' submodule's input area length#>"} + Results_240B_1_InLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'Results_240B_2' submodule#>"} HW_Results_240B_2 : UINT; + {#ix-set:AttributeName = "<#'Results_240B_2' submodule's input area start address#>"} + Results_240B_2_InAddress : UDINT; + {#ix-set:AttributeName = "<#'Results_240B_2' submodule's input area length#>"} + Results_240B_2_InLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'Results_240B_3' submodule#>"} HW_Results_240B_3 : UINT; + {#ix-set:AttributeName = "<#'Results_240B_3' submodule's input area start address#>"} + Results_240B_3_InAddress : UDINT; + {#ix-set:AttributeName = "<#'Results_240B_3' submodule's input area length#>"} + Results_240B_3_InLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'Results_240B_4' submodule#>"} HW_Results_240B_4 : UINT; + {#ix-set:AttributeName = "<#'Results_240B_4' submodule's input area start address#>"} + Results_240B_4_InAddress : UDINT; + {#ix-set:AttributeName = "<#'Results_240B_4' submodule's input area length#>"} + Results_240B_4_InLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'Results_240B_5' submodule#>"} HW_Results_240B_5 : UINT; + {#ix-set:AttributeName = "<#'Results_240B_5' submodule's input area start address#>"} + Results_240B_5_InAddress : UDINT; + {#ix-set:AttributeName = "<#'Results_240B_5' submodule's input area length#>"} + Results_240B_5_InLength : UINT; {#ix-set:AttributeName = "<#Hardware ID 'Results_64B_1' submodule#>"} - HW_Results_64B_1 : UINT; + HW_Results_64B_1 : UINT; + {#ix-set:AttributeName = "<#'Results_64B_1' submodule's input area start address#>"} + Results_64B_1_InAddress : UDINT; + {#ix-set:AttributeName = "<#'Results_64B_1' submodule's input area length#>"} + Results_64B_1_InLength : UINT; END_VAR END_CLASS END_NAMESPACE diff --git a/src/showcase/app/hwc/hwc.gen/plc_line.SecurityConfiguration.json b/src/showcase/app/hwc/hwc.gen/plc_line.SecurityConfiguration.json index a30b7efd4..e23eca2d9 100644 --- a/src/showcase/app/hwc/hwc.gen/plc_line.SecurityConfiguration.json +++ b/src/showcase/app/hwc/hwc.gen/plc_line.SecurityConfiguration.json @@ -1,9 +1,9 @@ { - "PKIData": "AQAAAAAAAAAAAAAAAAAAAAEBAb4gAAACAAAAAAAAAAAAAwAAAN8ALS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkFMQXMwdHByNUxOK0l0clBrREtCUlNqdlJHVQp0L1pmR0paQ2NtVENJbmxJYXRjOS9zYXNRRE5XVExqYlkyTmZhQzhOSERCZForK2pkK0szc0ppUXBsY2ZMSGVzCmJLdFVlN1pra3ZpeHJKS3pubTNxUkNZQWVIbVl4SDhsWk9tMVF3PT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCnsBAQACAAAnEAAgqxMhqpsqdAFinL40z5+3mu7DSOpCCXbleIUW3jLQWFsBACAADAAQoXIq2qe7vNC7VguVo31DsAEAAAE2BZvUzIyLnM6KPvNDWEPdOT8tQLG+YXw95LIU0FrCi07G66JE4mAhSA3jEH1U3ecO4kMdJ2vSvN/NcefCjoZdLndjJxiMkWKR+BKFGhTk4V8pr89w0gbqLSBtVzWoovSqh51hPyiWi89KX2qflgOBYtZzGQPmsumqkHZIf97gXKZEx5jz3Ys5RDMNjirdFPbqzreYiWnImrNKG0lo86L9kvZj68TDWJTBLrYTh7qxMcOjrB+8g8twzJs8XNYoDuIusgWrlxlAauUMhE8J+yxg5lNY9wPpaQ5B9VPtpraFgZdu/BrYe3M0CO9Ia92Xztu5jPtdPZRBGG6EhvDuB9X84GpoPFJnytBwIfGP9mg8m6NgVwZYVwPv1B+RrjmhnBzTZKoplRqpCo2rX7W1F3cacpuJjMFtwgIACWxvY2FsaG9zdAEAAAAAAAAAAQAAAAIAAAAAAAAAFACPBUPNPx9HkH0ZxYZeBiTDSRAxxrQGAQAGsC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQ0KTUlJRXN6Q0NBNXVnQXdJQkFnSVVZQ21jV05lL1pGMDNZeG9EYjQ1M2JxbnJLdEl3RFFZSktvWklodmNOQVFFTEJRQXdlekVMTUFrRw0KQTFVRUJoTUNXRmd4RWpBUUJnTlZCQWdNQ1ZOMFlYUmxUbUZ0WlRFUk1BOEdBMVVFQnd3SVEybDBlVTVoYldVeEZEQVNCZ05WQkFvTQ0KQzBOdmJYQmhibmxPWVcxbE1Sc3dHUVlEVlFRTERCSkRiMjF3WVc1NVUyVmpkR2x2Yms1aGJXVXhFakFRQmdOVkJBTU1DV3h2WTJGcw0KYUc5emREQWVGdzB5TmpBMU1USXhNREEyTlRGYUZ3MHpOakExTURreE1EQTJOVEZhTUhzeEN6QUpCZ05WQkFZVEFsaFlNUkl3RUFZRA0KVlFRSURBbFRkR0YwWlU1aGJXVXhFVEFQQmdOVkJBY01DRU5wZEhsT1lXMWxNUlF3RWdZRFZRUUtEQXREYjIxd1lXNTVUbUZ0WlRFYg0KTUJrR0ExVUVDd3dTUTI5dGNHRnVlVk5sWTNScGIyNU9ZVzFsTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxRw0KU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ2RwV1pZYjZQWDBTRS9mQzY0REhMNjl4c1BNOEp3WldLUXJqOXhjVzBEWXZDTg0KNm10eUpFZnNGVXlnRzM5YXJHcTcvS3hXZTkwbW0raURKdEZRNWFKSW9WdjlLYTNDVTdxUlgxSVo5SU42UWFXeHIxTFVtY1p4WlpSUQ0KblFXMWp0LzIvSjlXMEtXUjB1b2R2OFZDUVNvZEovOGx6b1R0SitNdHdiWlgvRVI4V3E1VzNVVGh3NnFYUEZ5YWtPdHhHajFUZnFsdQ0KRUdPMXZaRzdMQ1JVejJKL1Z2SCtwMG5EOXNENFdzZDdvTFVwM05hcWRGbHVXdE83OFJoQW5vRld4eG55RnBKc09tNXptYThIZmVHbQ0KMW1PNGFvU3UyeU5iV0wwNEtOemIvcnFxNHZoSkhUeVd2Vno2TFovSWVQM211RWs3TFdJZHpOOVdOeVNXNG11QmEyVFZBZ01CQUFHag0KZ2dFdE1JSUJLVEFKQmdOVkhSTUVBakFBTUE0R0ExVWREd0VCL3dRRUF3SUM5REFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSQ0KS3dZQkJRVUhBd0l3RXdZRFZSMFJCQXd3Q29JQWh3VEFxR1FCaGdBd0hRWURWUjBPQkJZRUZOaXFTN2cyWGc4WTdYbWZtaWV3RHNNWQ0KQ0x5ak1JRzRCZ05WSFNNRWdiQXdnYTJBRk5pcVM3ZzJYZzhZN1htZm1pZXdEc01ZQ0x5am9YK2tmVEI3TVFzd0NRWURWUVFHRXdKWQ0KV0RFU01CQUdBMVVFQ0F3SlUzUmhkR1ZPWVcxbE1SRXdEd1lEVlFRSERBaERhWFI1VG1GdFpURVVNQklHQTFVRUNnd0xRMjl0Y0dGdQ0KZVU1aGJXVXhHekFaQmdOVkJBc01Fa052YlhCaGJubFRaV04wYVc5dVRtRnRaVEVTTUJBR0ExVUVBd3dKYkc5allXeG9iM04wZ2hSZw0KS1p4WTE3OWtYVGRqR2dOdmpuZHVxZXNxMGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVk0WWpGWkFQeVh1My8xWGF4YWdZVmpRQw0KK3pnSllOUGZ1ZU1ML3hVeTUvdEZFWDgvRmZheDhJUmp3Z05CUlRIb3hJcGdpYnlWRkdRU21UdlFkd1NFTVlMRndsOEhsQUdhUWd3eg0KY3dtS2x4TmM2Y3BzNkRXYmFQbTExSFFKRHZVRGh0ZVVnOGNEUjR0RGUvek5oQk9wbTJiNVZrc0VWWmNES1M4bGh3YW1CSzV5eWxSRg0KV3g0YW5GUFl2RlZ6MGhFdjcrbzI5b2xTMy83L0JNRXJtaVFqWlBoZlpqRTlPckw1S284WlpuWWtlc1NxbTRRcFoxOEtBSjlOT2gxVQ0KVllRQjIvZUhLN0NkcmRnOUNxS1ppeENTYW0wT1M3UVZVQ0M0YTN5RHh3UlVvTmI2Y1dXK0ovK1lrd1lGcjRSMGc2bnlydHJyeldvRA0KL0IzdjNkKzczeEpJdWc9PQ0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ0KFwgBAACzAQACAHwwejAUBgcqhkjOPQIBBgkrJAMDAggBAQsDYgAEF3V4dBOe3K7xRjbvm2jykteh81PJ4EyLoHyQUcgP71f+GC1fxKEL/k+a6NOqYiEHfhtRdCw5qL2BVYG8xDxlcEWrTr4cI8eM+yzTzs9LKWMbOQUp837AKck+oHq9Rp5DHE8FVLqIkSSbRsmrMBUABgAgoqii/JDU3Ocn8cuyiMFT1wmYr4chnNHglChf1yCsrwIHXi0tLS0tQkVHSU4gRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KTUlJRk5UQmZCZ2txaGtpRzl3MEJCUTB3VWpBeEJna3Foa2lHOXcwQkJRd3dKQVFRZVMwako1OUxMdG5TVnVWawpyUzBBV1FJQ0NBQXdEQVlJS29aSWh2Y05BZ2tGQURBZEJnbGdoa2dCWlFNRUFTb0VFUEpRejd5c1pweTBqWHFVCm9VcmFaaVlFZ2dUUUZ5d080WlBuajN6bUM2ZmtmZHhYRWhwMGQrb0lLaXA5VUNHb3BjekhCSzJjNDBhVTNsS3UKaDBhR1M3bVBjb2hzeE9yckRGV1M1T2V3T1VaMDhFNHhseDBpWGJzYTBXckw2ejJaa1lWK0ttcURCVWx5bHZxagpYWHBtTkJ3MDdaMmpzKzczdmJhM21obE1oSUdVTEtIb0VHTm1vYi9oUU40Q1pSNktjSHZsaVQwdVVYbUk0MG11CmdNMm5WbDNCeTBXWmQvaFg2b3JZVm1zcVVpR1BFMFFkeENwM0lYTTl0N0gxeXJXRXQrVkJpRDlsemsyWjFDdU4KUFhhUDk4T2pDOWovdkRiVWNqRGhFNjRQdEZiVEordnozQ093R01sSW90T2hkemgyaldYM1N5VHhObk9EdVdOeApWSHk0SmFIWUl5YURQSjZ3b1FlamZLcHovbDJGMnNBenZOZjVieHRnREpPMEtqbTYybzR3MFR4Yk82emZTQ1IwCjIzU1Jid0RObWk4bzBhWGdjSlV3ZElpSDZYSk5lUDE3UElDc092bVNLLzduKzJNVERrN280QWFOMStRUlJ5QkgKYUU1R2lPZUJsMU1ueStsN0FsY0lJVHZIaXFldDJhSmpWL3lsN2NFUGJINnhpaHBGMWNqcDJ2NFp4c1B4bHY0cwo3eWZ2aEhFaEV4SDBPRWlRdFlFSkVPeXFIMVU4b3BPRmhRMkFFKytMQXEyWDlJSVg4Y1lLTnM0RkdmMlBST1dHCmdjajBUakRpRktLL25LSEpxYkgwMkdXcWRXb1hrRUYwV0R1WlhoYnpmTlEwZzJVeDd4dXhJQWVlenFTWmFCK2sKMWpNOXpRdEh5aDUwU0lMcUxaUHdldm85eHBoSW9qMlNEc2ZjY3V4QVJTYzRZZ2tCSldrOEh2VmhkblRyakZYOQpKU3dqV25Va2JzN1VZSzdEWFJIZ3NyQzFjaG01NFFtSVliQVlIaXVQYjc1UWEyVkxmWjlQNS93ZTAxc2RFUTdTCm5hek5DaDBFT1BrdHo3Mlh0N0EzTXR3dGNiOGF2WHNJNGdWMjd5NktCZUxkM0dLbWRPQzc1SnR4UWsrdGMzOEoKMWVMVFFjVXk4S2RXRWhFU1JWQnN5aUx4SWtwTU1paGQzR0lRK1VEUittWno4azIxUElBTnhja013dlJLcWRzawptc1NlaUw1ZVNJckZqRWtkWFc5RkRVYkg3c09BNGQvWlIxR05yeU1qZlZheHU0K0VSZzd4alVFZmJ2NE9rM0x4CkphdEhhOVFUU3krYUwrUWVycXd5MTVqeENzYzkvQ3FLcmNTWWlHa2tTV29ObG5VQy9uWHEvWnNEK0lqTXYzZ0YKc2VDVHA0Mnp5Y29qd25weGNhYXo2Y2c0RjZrSG1LR3BoVVNpcStQa1VFUy9UV1lKYWZCQUdPOFlrNHZTOS9veApFaU52OWNZLytVSWcxanF6MTZnMFREODJuUkc1TmhrZmNUeWVOR0UzRnJPaFQ3WlYyWC9MK01KKzl6SGE4Ty9rCkhLQ0h2b1hZcWIwV0ticFllcUF5YVhiUUpCWlZGUFZDSy8zaCtrR2FNdlJJeFFKNXNEeUgweU5GTmdVTUlGNlkKR0YrNzZNVkFTYWMzSHNpL0pzUjh0UTVhZlhtbmhLN0tMZEQ3b3FvS25peXZrMTJ1VlRvWGluTnFZenhBbkJpRApoSWEzT3MyS1d1QS95VWRxTVFoaTdEYmJTZHZaOGpxazNSRlBwVXBmUGtUSmV4Q2NTVzRaT21VYmpRMml0TTNhCm5jbnFBa21RV3RMWkFaTndOVXYwUzBnQU9wdXdwNlg0YjFVU1o1M2RnSDZ5bjlQemh2d1NxemtPTDE4ZTArV1cKTFRINHdBSWNrYXJXdHAwUHp2L0hQRUFUMlpMTTVvenk3QXc1b2FlRng1REJKTzFCcXdrNjhPUnNDTTV6YW12YgpnTGtoZE5xZGJRaWVRNWNPNG9tYk9TR2FuYnRxbzhHNFppMDNaY2lKOHhtT2xoN05wODhGd3RMUXpxSXZBVDIvCldyY3N3NjZ1R3laa1dLSExNM2g5MTNXTC9EUmJtdDkvejlmSjhXN2tSNnd1RHRzdnNNaTFtSEhvMzJ0MkFUcXMKa2dhb0ROLzN4VUdUNmNVWDh3Y05ZS21HSXRUdHUzL2RTMzE0VFdBejZZa2tTaVEvOGhWWlBUcz0KLS0tLS1FTkQgRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KJEROUzosIElQIEFkZHJlc3M6MTkyLjE2OC4xMDAuMSwgVVJJOglsb2NhbGhvc3QCAAAAAAAAAAEAAAACAAAAAAAAABQAjwVDzT8fR5B9GcWGXgYkw0kQMca0BgEABrAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0NCk1JSUVzekNDQTV1Z0F3SUJBZ0lVWUNtY1dOZS9aRjAzWXhvRGI0NTNicW5yS3RJd0RRWUpLb1pJaHZjTkFRRUxCUUF3ZXpFTE1Ba0cNCkExVUVCaE1DV0ZneEVqQVFCZ05WQkFnTUNWTjBZWFJsVG1GdFpURVJNQThHQTFVRUJ3d0lRMmwwZVU1aGJXVXhGREFTQmdOVkJBb00NCkMwTnZiWEJoYm5sT1lXMWxNUnN3R1FZRFZRUUxEQkpEYjIxd1lXNTVVMlZqZEdsdmJrNWhiV1V4RWpBUUJnTlZCQU1NQ1d4dlkyRnMNCmFHOXpkREFlRncweU5qQTFNVEl4TURBMk5URmFGdzB6TmpBMU1Ea3hNREEyTlRGYU1Ic3hDekFKQmdOVkJBWVRBbGhZTVJJd0VBWUQNClZRUUlEQWxUZEdGMFpVNWhiV1V4RVRBUEJnTlZCQWNNQ0VOcGRIbE9ZVzFsTVJRd0VnWURWUVFLREF0RGIyMXdZVzU1VG1GdFpURWINCk1Ca0dBMVVFQ3d3U1EyOXRjR0Z1ZVZObFkzUnBiMjVPWVcxbE1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdnZ0VpTUEwR0NTcUcNClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNkcFdaWWI2UFgwU0UvZkM2NERITDY5eHNQTThKd1pXS1Fyajl4Y1cwRFl2Q04NCjZtdHlKRWZzRlV5Z0czOWFyR3E3L0t4V2U5MG1tK2lESnRGUTVhSklvVnY5S2EzQ1U3cVJYMUlaOUlONlFhV3hyMUxVbWNaeFpaUlENCm5RVzFqdC8yL0o5VzBLV1IwdW9kdjhWQ1FTb2RKLzhsem9UdEorTXR3YlpYL0VSOFdxNVczVVRodzZxWFBGeWFrT3R4R2oxVGZxbHUNCkVHTzF2Wkc3TENSVXoySi9WdkgrcDBuRDlzRDRXc2Q3b0xVcDNOYXFkRmx1V3RPNzhSaEFub0ZXeHhueUZwSnNPbTV6bWE4SGZlR20NCjFtTzRhb1N1MnlOYldMMDRLTnpiL3JxcTR2aEpIVHlXdlZ6NkxaL0llUDNtdUVrN0xXSWR6TjlXTnlTVzRtdUJhMlRWQWdNQkFBR2oNCmdnRXRNSUlCS1RBSkJnTlZIUk1FQWpBQU1BNEdBMVVkRHdFQi93UUVBd0lDOURBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUkNCkt3WUJCUVVIQXdJd0V3WURWUjBSQkF3d0NvSUFod1RBcUdRQmhnQXdIUVlEVlIwT0JCWUVGTmlxUzdnMlhnOFk3WG1mbWlld0RzTVkNCkNMeWpNSUc0QmdOVkhTTUVnYkF3Z2EyQUZOaXFTN2cyWGc4WTdYbWZtaWV3RHNNWUNMeWpvWCtrZlRCN01Rc3dDUVlEVlFRR0V3SlkNCldERVNNQkFHQTFVRUNBd0pVM1JoZEdWT1lXMWxNUkV3RHdZRFZRUUhEQWhEYVhSNVRtRnRaVEVVTUJJR0ExVUVDZ3dMUTI5dGNHRnUNCmVVNWhiV1V4R3pBWkJnTlZCQXNNRWtOdmJYQmhibmxUWldOMGFXOXVUbUZ0WlRFU01CQUdBMVVFQXd3SmJHOWpZV3hvYjNOMGdoUmcNCktaeFkxNzlrWFRkakdnTnZqbmR1cWVzcTBqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFZNFlqRlpBUHlYdTMvMVhheGFnWVZqUUMNCit6Z0pZTlBmdWVNTC94VXk1L3RGRVg4L0ZmYXg4SVJqd2dOQlJUSG94SXBnaWJ5VkZHUVNtVHZRZHdTRU1ZTEZ3bDhIbEFHYVFnd3oNCmN3bUtseE5jNmNwczZEV2JhUG0xMUhRSkR2VURodGVVZzhjRFI0dERlL3pOaEJPcG0yYjVWa3NFVlpjREtTOGxod2FtQks1eXlsUkYNCld4NGFuRlBZdkZWejBoRXY3K28yOW9sUzMvNy9CTUVybWlRalpQaGZaakU5T3JMNUtvOFpabllrZXNTcW00UXBaMThLQUo5Tk9oMVUNClZZUUIyL2VISzdDZHJkZzlDcUtaaXhDU2FtME9TN1FWVUNDNGEzeUR4d1JVb05iNmNXVytKLytZa3dZRnI0UjBnNm55cnRycnpXb0QNCi9CM3YzZCs3M3hKSXVnPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0NChcIAQAAswEAAgB8MHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDEpYfwJqrNjipvRBg1qafyL32SksQ6tPwL2Om+eD6nKRmvG4Ze5jHw7CiFyZGJFaTfiaQ4Db4tYAbONVd62c/NBKbS49zpP0/h41Z21dkEgPWdr3V5PBvV5FCcatQq4nRxdAzZ7CKec84eeKYA8OucAIPKIMK25fCRfBHkVFuMieEqMGnCow/YiV9ZFrPIJcGewB14tLS0tLUJFR0lOIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCk1JSUZOVEJmQmdrcWhraUc5dzBCQlEwd1VqQXhCZ2txaGtpRzl3MEJCUXd3SkFRUTVXdXZ2WlU1ZHh1cTNLOXUKK09vYSt3SUNDQUF3REFZSUtvWklodmNOQWdrRkFEQWRCZ2xnaGtnQlpRTUVBU29FRUgyOUlIemowUGFLRFFYZQo4cXdFWTZJRWdnVFE3U2JoNGVjbjlETDExV2NVeTdEelpZM2JvWUVwMTB0ZVJDcDFSb0E4S0xiNVQvYVRBUDFnCmVSZ0UxZ1RqbkVsZHBjZ2xNMHFtclhvRENsaHJablpNcTdHaUUzMThzcHRnaHFIelZvbWx0ZTdJQjNZdXNQbWQKa2J2WlpReHUveHdGS1R5S29zWnZmUDVBN1pLKzVRTjNnQ2lSZTRpZExxQ1d2dmc1K2JFMzg4VjlobEk3OERydAprQnNndFU5c1N1WFMyZEpvL1AyTVRoa2NCbmp0MW1GUFBFMklLTXR3Zklvd3o4NUUvODloMXJ1MGM1REQ2OU9oCjViMWpzRk05SHZhOFkzTWY5Q0ovNUM0VC84Um51ZkFiWHFSZ21CaVd5MThWVkk0MlVUb01scG92eDFQTnZCdXoKRU44ZDFhUzFYaE4xL29IaFhLK2JiK3huK1QrL1VnbmRydVoyckgzNThmc1RrSGFiYStDVi9jbDVhcWdwcUhtZAprZzlrc2hzZmVhK1pLWVFCZTI5QWxiNzU1U2pBL0hTS1JDckJOanFCMlV0TlBXSDlNMTUzd3JsaWxhK0c3YXo0ClZlcmNBb0hSY1IwbUt4dWVuaG9oZ2lHdDVEOUxwR3BvZjdIT1VrQTV2R0hoRkkyMk1QUHFoY0ZTL1o3b3JuSGIKelZXN0g2cXFQTVFqOTlaVU10d2RCYXVHcTFtaUV0RE1FVUJuTGdFNE55RkpsTlYrOUVHNjhzb0tOYTdnaDNacQpJSG5HRkpEWkQwUHJHZjNjbkRSb3cvaHR3ZldtUlRhVElZeUluTVdHOTRRN1BlVTNEcXRtTGVFRWxmcTJTQkF3CnA4emVCREhmUnRIQjhZVGpRMlNkd3hzaytBcGZEZGtGbEJjcGtzN1ZHQ0J6eFY0QUFMMElzV0p2OVF6c1cyYVUKeHBTcXZia1lTU2MyQWlXQ2VZSG9JNnBCM2t3YkNFTkwxOVFlY3M0QmVIcVQvU3NSMU5IaytCZUNRRU8xaXVOdgp2T1FLSWZaZU1UUENHeEMzUXFkNzQzODNaZ1hsRVJSREZXaktzMDhhcU9tblpLRTVxaS9jTkRXemowaDZQZ2ZWCnJ5OUpWV2lMTDRPdXpGZUI0ellPS0lJaGlwRkNhN0pyQXJKMkt0aWZHUVRnK01VOWovSjBmd1Nhc2E2MlBvRkwKNklzRkJDQ0REQlpVeGxHeEplN1hTVVBSZVZSM1ZBUEp6ZGtocjNuaENkSVRtVWN3Z2xwTkRPekIyTGJySThkNQpES1ZOQ3JJU0pVQ2t6K09vYmJabnNIMjNtS0lESkdDQTJFaCtaci9zRUJzQm4vYndRQm8rR25EcmNRZGE4cHBJCjNmSUlpYlcyZThzR2FEUWVSbzY2VGJpTDl4T0w3bmFsaHd3UjNiSDdiK0FjcGVVRXhzd1JQczNEVEo5V3R0T2QKUzU4QzJJRWRrZjMrdFVqUEd3VG1SOGVMRVNiUmV3d1hQMTVUQXlqc0daczJKeWU2WmlQRWl1dXh2R1NtM09mUQpRcGR6TjZyYnpFV3FoVFE3cEU5djdTMDNLalZVcnVvQUlpNjBpb3Z1Z2hLVHYvbUd1N2s3TzlaZWxtM2lyZk1kCnV4N0VPY0dxbVRpVndPVWpXbDlsN0xJV0prV2hGMjJ3Q1MrTENBMExDUE5FUkJBb29NUVVZSGdaSXVuUGMyVFcKalVSalRFTUpXWGxTRjVNd2NOTGNaNVl6cWh3K2ZOOWJuU0RVL1BDbFp6MlcrRk5seDIyRUJDZUdhUlhQTXdUWAp6U21CSUFSMW5wamhvYTdpRlFrOTJkSWo3NmN4UFN1eStUa1ExbFdTL0pSZitITWMyYlJGSFA1TnAvOTFXdnRQCjc1UnJYYmpISGpQem80ZnJLZDA3RUJUUUcxMVgrR05BUU5Cb2x1L3JWNWsrcFhIUTFzQTU4S0FxUjI4NndQTUQKWUk0RWFaMlNBTEYzcWtXNEpUT3RuTmNhdTgxVThPb0ZXK0tzSGJvRzEraStEeGpuWFZxSW1GWkpoREdPVkV5WApNK3ZhL3VhUWtpUGR3Mkx3a1pLUkc5c2MvclhORU0yQ2VEL1Nld1ppdGtDakNYRkRzSDNrWVJvZHZCaVhYNldkCmlJS1VjL21RQS94ZVZVTG9ITDgzWmFsZlpQeXA0QjlNQUNENk0vd1p1UC9UNktVZE9VSGVEVFk9Ci0tLS0tRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCiRETlM6LCBJUCBBZGRyZXNzOjE5Mi4xNjguMTAwLjEsIFVSSTo=", - "UserData": "AgAAAAAAAAAAAAAAAAAAAAEAAAAFAGFkbWludAAAAAEAAAEBAAEFAAAnEAAAACANKnrH83PvSJ4g3h8EX81PFMx1pK0SzHc5CK26yJz3GQAAAECqAWU7aXkJ7FOR6IZPaZ9sq1kog5Ik0lRD4nbZaxec/iXOWmklcAmK4MvTsXGRa2g4AMIeCBQqABTfeiGRURX9AA==", + "PKIData": "AQAAAAAAAAAAAAAAAAAAAAEBAb4gAAACAAAAAAAAAAAAAwAAAN8ALS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkM2U1gxdU5kQkM2QStpbDlueGI5UHlBT2pXZgpSNUtvRUJKYld6UGJWc0lpVTBaMTVoWWduWmgwNDViWnhqcWJ4UTNreW1KWUlNMVJIMlVWQ3hDemM4L01NVWhPCm1xeEN0eFhjUjJoUlI1QUZTNkxJSVZ3c3RMekhmVzlkQ3Y5cG5nPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCnsBAQACAAAnEAAgJVeKioTj6WeHcnk1IQE8kmOl/oBeXJWG9pc1pDGKSg4BACAADAAQi7fhxrK6Vj5G9qyayj7ZQwEAAAE2seSSsb49AUeL+cWg3j5lZzcIwRNKpoPRUQW06vrzWXRDBuxzxzrQAKkJwZF0aPrXy0uB2ZnFRhiyweq80Hw0Gbfl6zTFY4w23JMaUWilnpu33Dd21tzQ05/1uhVOax4wKRsvhna7ly8OBHN75DKra0m0tNAAy+mgl5bviHaj56UmxakrbeyR0GYa108kO34xYNADk7GwQ4S2v6gEbHbRy/Z8gMbTBYH1SEK+mWz/LDRI7K0JYdqp62+7/G4sCrBVFRwOWPu0FqzqqvoEdhpeKgmdkrDEppiOltuC1mxCHMBIuz0EDapCtgaFqRb5zc1+uAYy5Clr9ew7VAN7Gg5LtTX+Uy2awUJjLnBLzci83nS9y8iEvELlfi50LZxiiO84jcMhKfCXcx+4o89rd3UY8cPu0VoTrAIACWxvY2FsaG9zdAEAAAAAAAAAAQAAAAIAAAAAAAAAFABjHTP1kKDoXGJ7tTwcSfhaeqVyALQGAQAGsC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQ0KTUlJRXN6Q0NBNXVnQXdJQkFnSVVGd2JjYUVKRDBZSmp3ckhQVCtNcW1RWXBxWWN3RFFZSktvWklodmNOQVFFTEJRQXdlekVMTUFrRw0KQTFVRUJoTUNXRmd4RWpBUUJnTlZCQWdNQ1ZOMFlYUmxUbUZ0WlRFUk1BOEdBMVVFQnd3SVEybDBlVTVoYldVeEZEQVNCZ05WQkFvTQ0KQzBOdmJYQmhibmxPWVcxbE1Sc3dHUVlEVlFRTERCSkRiMjF3WVc1NVUyVmpkR2x2Yms1aGJXVXhFakFRQmdOVkJBTU1DV3h2WTJGcw0KYUc5emREQWVGdzB5TmpBMU1UVXdOekl4TlROYUZ3MHpOakExTVRJd056SXhOVE5hTUhzeEN6QUpCZ05WQkFZVEFsaFlNUkl3RUFZRA0KVlFRSURBbFRkR0YwWlU1aGJXVXhFVEFQQmdOVkJBY01DRU5wZEhsT1lXMWxNUlF3RWdZRFZRUUtEQXREYjIxd1lXNTVUbUZ0WlRFYg0KTUJrR0ExVUVDd3dTUTI5dGNHRnVlVk5sWTNScGIyNU9ZVzFsTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNRd2dnRWlNQTBHQ1NxRw0KU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzkyb041akhDR2hpOENEcnUvOWZlaHR5ZEs4U2hUODA1cU1pSGdCVFdyTU11Uw0KUFJpbWY3dngvMzNNaXRQZi96ejd2eDNncGJKc1F2eXNXeWp5SFBFeXZXQk04cGlTbjl0RUNaS2NwK0xXdzZFbS9YWHl2bW1GZXRvRg0Kam9LanBWNXlBOUJOQ2lGK0JCUFZORW9qNC8zb3VWbjRtbHVodjZiKzVURzByMXU3ZDZyVEJsUEdIbUQ4OW1vbVptYUhXRUMrUkZkSw0KVm5wZ21ZU2hNRnhRbG5iQi9SSmRqTy9xd1Y1aEZCaktET1FJbTFYQklqNy90Z0dmZUljNWxKczRsSkdjNzFrU2pUci9Sd2VLQjBsQw0KbGxvSWNiWDJXQ1Axb0ZDRDJ0OTVsbU9lVmd1V3RlY0dESHBZZ2oxUkxmMDBCSVNJT0t1bkM0cUVpdTRjYlBUMjNFVXBBZ01CQUFHag0KZ2dFdE1JSUJLVEFKQmdOVkhSTUVBakFBTUE0R0ExVWREd0VCL3dRRUF3SUM5REFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSQ0KS3dZQkJRVUhBd0l3RXdZRFZSMFJCQXd3Q29JQWh3VEFxR1FCaGdBd0hRWURWUjBPQkJZRUZHaHdSdXh2cVI5MHNOS0xUTkRnMC8raw0KUC9PWU1JRzRCZ05WSFNNRWdiQXdnYTJBRkdod1J1eHZxUjkwc05LTFRORGcwLytrUC9PWW9YK2tmVEI3TVFzd0NRWURWUVFHRXdKWQ0KV0RFU01CQUdBMVVFQ0F3SlUzUmhkR1ZPWVcxbE1SRXdEd1lEVlFRSERBaERhWFI1VG1GdFpURVVNQklHQTFVRUNnd0xRMjl0Y0dGdQ0KZVU1aGJXVXhHekFaQmdOVkJBc01Fa052YlhCaGJubFRaV04wYVc5dVRtRnRaVEVTTUJBR0ExVUVBd3dKYkc5allXeG9iM04wZ2hRWA0KQnR4b1FrUFJnbVBDc2M5UDR5cVpCaW1waHpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVpTVXZ6VFA1TERIL1luVTI2a0hDV3puWA0KYjJYOEtHR1BvaDJxdDh0YmMwOHJzaDJ3dVZFMGpkVU1rVHpKbU84YTNYZVdCcjhWWTU1ZEVUQ21KTm03RFRDM3ZIeVdsMkZtbEVqYQ0KQWlpakJYS3QrRTZpRjNFamVHZ3lJUUpLTWdkK3pYdFN5Vm9jRmdIRmVzVlF1UHZ5ejBTR1lXZ0crQ040NU5PV2tjT1dOUmJla3Q3VQ0Kbm9aRmV6VWJ6cHlWTXAzOHE0T0RSakdwTVpaZUNLZDgwUHhpMkplM25jTmo5RVR5azVCU3hEU3VnOFJlZytiZmN5K3FSdXdpQWdsMA0KU1p6cmRpTEVzVXgzQnVVN24zbjgvaFROeU5mYi9CQnE5S084M0lPMmxnbGpxR2dmdjVOS1MrRGtXSkMxdjhjNURqZmxuelZhY3FGTg0KR0JCcGxvSWhmTGczTkE9PQ0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ0KFwgBAACzAQACAHwwejAUBgcqhkjOPQIBBgkrJAMDAggBAQsDYgAELvz9Pztp3RNA3DIGsgWF0O4PBIBRk874fJxccQ8QP60oJs3TepCsSm47TVW23nN4d79yPlElIIdL8qkLhl6Lo2VYW5KRwLJiG+hbyfUIVl55jfqNLEguMo4hFSnGlDfdR9q+SL9FswnO94kbfCSj9AAgxNblc4UISRfEy1c0jzYH0dECnwJTtBwN1NmIrZ234jcHXi0tLS0tQkVHSU4gRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KTUlJRk5UQmZCZ2txaGtpRzl3MEJCUTB3VWpBeEJna3Foa2lHOXcwQkJRd3dKQVFRU202VEEvMmxmaVpwamhUMApoVndNWlFJQ0NBQXdEQVlJS29aSWh2Y05BZ2tGQURBZEJnbGdoa2dCWlFNRUFTb0VFSWgxU1NVTzBwNW5nK3pxCjUxNnFneVFFZ2dUUU44YlNZWFAwQmJ4aDRaNWcraFREejFPS2hoSDUzWE1XS1VDQkJHWi9rU3FWUDIvcitvd3EKZkZMd0xYdGhkM3lMTFhuR2NmVFJPNlZxTmFtT05TSE5WdlM0ZC9WQmE3MVBzL3dESXpYUWZLaExHekt2WXlnUApmOUpRQi9xWVlUbG52TWNkd2FYM25hck9hUi9YYTRmZUE5TlNrUU9Wd1hVVWdtNmhSaEV0TkhRMmh2Z0xOdi81Ck1wUDRuUGVzdVpVM1ZnbXRNYzBVblg3Y0k4MzVrWERza1Z4b0Q1bFJEMFhrL3lJaWNRWk9ndTMwelphVk5tbDEKVjZTc0lEcG8wNEtaSS9WOXhUNldka2tEYjJhUCt6dUVuNGY0OW9rY2xMRStOTVZTWmdNOWtVOWdjZXJxYjAvOApVNldHZm85MHJEUFNTUXFUZWdKTWUzVnA4UkFXVkVXSktRMGJqWTJ2Y3lnM2ovSzYyWTRUUHRIWTFaNW5wMlZSCnhGQW04K2s5TTlpWXA1TlNNcGhvdXF4TTdkMCtoeUhLSnF3NmlVejBQTG1IZ09GemVpTWgxRmcyOUVMbVkyVVUKdkV2emp3L2Z4WUFRanJMZUdENzhXbExra2M3R0VzUS9aem50WEZjUkpBN0tEM0FxQmNqKzZqZEk3dW5aV1JFMwpQY1ZJWXhqbXVBRkZUZm5sNVN3QzdQYTZmbEFyNmt4V0krVEtLWU9RUm52Y3lNcy9jdDIveTZ5TzNvd1dGL3pzCmc4dklJT3hrVFlZRWwyWGhIMW50Mlo4OWZROEhZUXFwYi9pQjcrZ3pLdUxUTkdmRFlLUGh2UkZZeHAwNTNCWnIKb085Mk5XR0JWakM2ODFUZWRwRzI2Rk1nUXZuRlAyV2JWRU9wRlZQd2xkYXloWnkxTUZxc1hnSU1MTjJVTFpWSwpzWXZmNXNJVVh6ZkhsNUo2ZTRMOHovVmxxRlZmTmtEb3hZT2QrSUNjYlFnZmtNdmpjRExuRzd1NGQ5MFMxUngvCnp1RjNjbEFMbnRUcGJneFNMcnplcmpZbHllMUlWMlJEajVodGJGM1pqQWhNVUJBcGRIcDJtR25uUllRaVNtVVUKTFFQUUpnamM3WVJQSm5xVGoxVWtkWDBUd3Zpalo5OE1hY0pNQzBhbGlRVkVjTzEvMzdUY2l2UUpTRFZoOUdtVApVT210WUd4K3Z5OFJZWXYyTVpIVFM2SW1jbXpxWU8yYndFQU05UTFzWE5TZjZDV25lcjFldFBuT1VFVVdtVnd1CmpzMmM1MHp0MXhZTFlnKzVmUEliZDJmTWZ0anZvN0VERlg0N2QrZU5rK3kwMFQxZCtWVUdYb3RMUytkeXNleW8KQi9JdVh0M09zTFp4VUliTlI5NXFsWG92dGpKUE00Y0hGdXYwcVY5eG1QczRhZW9WbXZyd1gvV2IvM2FhaE9TUwpVaXhYU3d2UC90bFF3YlU2d3VoUUNVMlBsemRXa2szMzVFYWVvWUQzWk02ZFBiaktOSmpxYk81dU5FcXZSN0lXCjYzQkFKT3JPMTFEK1c1bmRMc2J0c3lVTnd2a2dmeVMrL1dCVkhRSDJBaTQzZFo1c3dicjBzS2R3NGhyVWNsVy8KS2hIaytUU0V1RWNEZEhBNnRmNk9jL25qRWZIeGhUaEhIODVaQmt1K0FiVWovNGFSeDRPNTJtckxIWDRmRWJjSwpMSUp5UlpzaExqU1JTTGdkWnQxR1JrM2srL05SY2l6Qm1XODdSaXYzdE82Y0tLQU42WFh3QmcxbHlOTG1GRlpqCnl0Y0tYZGkxaThGUU9Sbm05VHdQSzJRNVFybnNWbitqSk5xYUMxREtXRC80TDQrWG1Qa3ZHODROSXJmT2s5K2sKNStJVFJ4ellnR2p5T1VIUWRmK1pNUDl0VHBBNlRZQ3ZGVFB5UlQveVRRK3lBeTFmM1ZZc09MRWRQWU40MW5ZdApBL0l1Ukpmc2V6N0RCazN3UDZkcXVTWGUxSVcvY1hFTWdWOFpxcEJ5NFJuRUhneStDYUtncGZMRFJKZFpucWlECjdKQXpEOXpNMksrVkRLRE9SdU45akRyME9QV3h2WWVsa0xqNEhzT0pka1V5OE5DeVNtVGJDNlRQdFF1ZzR5ajAKQmJPSzVCWHdud3ZKRFltaGlUdWd2TkYvOEZNN2E1VUtJenFuMjd5RGtUakNsYXFlTFE3Q3lhST0KLS0tLS1FTkQgRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KJEROUzosIElQIEFkZHJlc3M6MTkyLjE2OC4xMDAuMSwgVVJJOglsb2NhbGhvc3QCAAAAAAAAAAEAAAACAAAAAAAAABQAYx0z9ZCg6Fxie7U8HEn4WnqlcgC0BgEABrAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0NCk1JSUVzekNDQTV1Z0F3SUJBZ0lVRndiY2FFSkQwWUpqd3JIUFQrTXFtUVlwcVljd0RRWUpLb1pJaHZjTkFRRUxCUUF3ZXpFTE1Ba0cNCkExVUVCaE1DV0ZneEVqQVFCZ05WQkFnTUNWTjBZWFJsVG1GdFpURVJNQThHQTFVRUJ3d0lRMmwwZVU1aGJXVXhGREFTQmdOVkJBb00NCkMwTnZiWEJoYm5sT1lXMWxNUnN3R1FZRFZRUUxEQkpEYjIxd1lXNTVVMlZqZEdsdmJrNWhiV1V4RWpBUUJnTlZCQU1NQ1d4dlkyRnMNCmFHOXpkREFlRncweU5qQTFNVFV3TnpJeE5UTmFGdzB6TmpBMU1USXdOekl4TlROYU1Ic3hDekFKQmdOVkJBWVRBbGhZTVJJd0VBWUQNClZRUUlEQWxUZEdGMFpVNWhiV1V4RVRBUEJnTlZCQWNNQ0VOcGRIbE9ZVzFsTVJRd0VnWURWUVFLREF0RGIyMXdZVzU1VG1GdFpURWINCk1Ca0dBMVVFQ3d3U1EyOXRjR0Z1ZVZObFkzUnBiMjVPWVcxbE1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXdnZ0VpTUEwR0NTcUcNClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM5Mm9ONWpIQ0doaThDRHJ1LzlmZWh0eWRLOFNoVDgwNXFNaUhnQlRXck1NdVMNClBSaW1mN3Z4LzMzTWl0UGYveno3dngzZ3BiSnNRdnlzV3lqeUhQRXl2V0JNOHBpU245dEVDWktjcCtMV3c2RW0vWFh5dm1tRmV0b0YNCmpvS2pwVjV5QTlCTkNpRitCQlBWTkVvajQvM291Vm40bWx1aHY2Yis1VEcwcjF1N2Q2clRCbFBHSG1EODltb21abWFIV0VDK1JGZEsNClZucGdtWVNoTUZ4UWxuYkIvUkpkak8vcXdWNWhGQmpLRE9RSW0xWEJJajcvdGdHZmVJYzVsSnM0bEpHYzcxa1NqVHIvUndlS0IwbEMNCmxsb0ljYlgyV0NQMW9GQ0QydDk1bG1PZVZndVd0ZWNHREhwWWdqMVJMZjAwQklTSU9LdW5DNHFFaXU0Y2JQVDIzRVVwQWdNQkFBR2oNCmdnRXRNSUlCS1RBSkJnTlZIUk1FQWpBQU1BNEdBMVVkRHdFQi93UUVBd0lDOURBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUkNCkt3WUJCUVVIQXdJd0V3WURWUjBSQkF3d0NvSUFod1RBcUdRQmhnQXdIUVlEVlIwT0JCWUVGR2h3UnV4dnFSOTBzTktMVE5EZzAvK2sNClAvT1lNSUc0QmdOVkhTTUVnYkF3Z2EyQUZHaHdSdXh2cVI5MHNOS0xUTkRnMC8ra1AvT1lvWCtrZlRCN01Rc3dDUVlEVlFRR0V3SlkNCldERVNNQkFHQTFVRUNBd0pVM1JoZEdWT1lXMWxNUkV3RHdZRFZRUUhEQWhEYVhSNVRtRnRaVEVVTUJJR0ExVUVDZ3dMUTI5dGNHRnUNCmVVNWhiV1V4R3pBWkJnTlZCQXNNRWtOdmJYQmhibmxUWldOMGFXOXVUbUZ0WlRFU01CQUdBMVVFQXd3SmJHOWpZV3hvYjNOMGdoUVgNCkJ0eG9Ra1BSZ21QQ3NjOVA0eXFaQmltcGh6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFaU1V2elRQNUxESC9ZblUyNmtIQ1d6blgNCmIyWDhLR0dQb2gycXQ4dGJjMDhyc2gyd3VWRTBqZFVNa1R6Sm1POGEzWGVXQnI4Vlk1NWRFVENtSk5tN0RUQzN2SHlXbDJGbWxFamENCkFpaWpCWEt0K0U2aUYzRWplR2d5SVFKS01nZCt6WHRTeVZvY0ZnSEZlc1ZRdVB2eXowU0dZV2dHK0NONDVOT1drY09XTlJiZWt0N1UNCm5vWkZlelVienB5Vk1wMzhxNE9EUmpHcE1aWmVDS2Q4MFB4aTJKZTNuY05qOUVUeWs1QlN4RFN1ZzhSZWcrYmZjeStxUnV3aUFnbDANClNaenJkaUxFc1V4M0J1VTduM244L2hUTnlOZmIvQkJxOUtPODNJTzJsZ2xqcUdnZnY1TktTK0RrV0pDMXY4YzVEamZsbnpWYWNxRk4NCkdCQnBsb0loZkxnM05BPT0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0NChcIAQAAswEAAgB8MHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBH2Ns1iAsGLe1tc4AEEzYW9NPOejDkRrdaYv2WmxsrVVfyE2x54gxf+fT/ZogpPqG5SLisG5dzRS2jYB1LxfvxRh1OL9ch7916bKcSYNfZn/+dtEDUBpA+0+MJylOvaX6JPhWO9bGkCvjHhkDXyO9wAII8Zxm0ew9IP3zi1A0+NttHDQttesg6/WeP6BjlR1UH8B14tLS0tLUJFR0lOIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCk1JSUZOVEJmQmdrcWhraUc5dzBCQlEwd1VqQXhCZ2txaGtpRzl3MEJCUXd3SkFRUVNBei9rWER3SzF1UEtvUkEKeG9mdXRnSUNDQUF3REFZSUtvWklodmNOQWdrRkFEQWRCZ2xnaGtnQlpRTUVBU29FRUZBNHZ6OTdJZ0xuUUZaVgpvNWRNS3BZRWdnVFF3ZDh2NlF0ZGU1amFtdzNJTVJNUFowVWpFTTN6TGpMN3JINi91a1dXbzBIMFp3c3BKaHBtCjNvRzR2am5xSHRkRGN5Wmg1b0JreXBlQWlaMUhOZWRzZUdsQWxZZFZSRUJES1N6Q1hUMStmbkFWRmZxVjd1cEIKdyt2UmRIQ0Q1WDBpNjBrVnppZlNaY2tJUkpwYm51V25pczZMOGp1RDhFdHNSNHlEbnNERUJsaGpTbWxtWHl1NwpHRFliOVBDWlE2bWdVQlRLQTRDeVdveHpwM0tIakVPRERXUG4wdG5pYzdDUVFKdjRNNEJxMFdBQWx0UlA2OTlRClVtLzUyQ3BjeE1XQXhHSndDY09jRENFelBvZ21DUllnUHM4RElyNEtxb3l4Wm95QU9VWkFjLzRIRGFFMkdkUncKRldqcnQ0Z2FYeEZRTDFPb3UvRWcxNUF0K2tnVkxGTktJcFY1OHl4empHYUVpVnpPQWQ1V3FYYURGRmpMSTErcAp1R2twUzE0cFVoK3IwUGZYRU4vR3R3bkJRNzdSZHVRbHk4a3Y3MnA0WUVmUzd3K0JhQnorc3JTYXo0U3JwOFpoClVlQXVMcXMzaG04Q0xwMnlxcUxxMS9PWUJtWUZMSlRXdTZwZlBkL0lGMEF6cG9mNVVtWFdiN1VGT1NGWkVoK0IKR21iS2JHYlFzcW1QWlNzMm16eUVPS2R3M2ZxSjBkdEQrYkhYYzBDdXd1MU51STh2TWNadlhnbnpsb1R5UkJFNgpPblh3dUdTNlhWUFgxeVRGeW93S2JIUy9TWXl0RkU0VFRUV012QjlzNEl6R0lsTHNuNDNUSThQS2hnUEtWUkJECmZHMzF0WU1NQS95WWRnb3dxZ01vMFJhMnlnRnRwM2hCOWsyNHQ0bW9WR21ibU5manZrZDJ3cnBqcmo5YnAxYTcKcFBtaXFubWNLYmtINVhrbGpab2pqTENUaHlNbStFdUd0c1VseGNEKzNqaW5tb0Q4YjZEdTlDUjBtU2VOS2dkQgpZQVFEN1RyM0VlSGh1UWVKWFU5RkFFUVp5S3FJaDdrc0R2VUtzRUxaeFRhcWF4aHlwZFhVV3l3L3dJd0Y2bHlyCjZPODF1bHRNMTQvQXpQdXVGRXBFbjYzRzM1TEN5ZWU4MXVod3NHR01TSXZPaUxxa2FsZStZNEZocHJiMG5sMmIKaVJwTnQzalp1U0w3UG5DUmQ0RGUvZWhKZzNZSitvdEM0Qld6aEI2MkxvdlRNZWpYazY3a1RNQU03Y0lHMVlBYgp1T3E4OG9hRXJ3L29xY0hrYkJ5allOanBldDZxSko5MVM0bStycmc0ZFJheXVNNDNLYmhUbWphTzBQQ0luNEFECmdHOFB1Nm16OEFKRWhQU2diV0ZmNnJOcy94Tzcwck9Hc2dUbWJzVEUxL09OR3hkU3BaZUZ6LzNIeVpVNTkzQzUKV0NmOXlvL0VWUk05cUdQRm1PREpYcUFGYUwwc0lBWGlYTzRBRzNNL1c3VGtHekFlSXkzOXFNOHh6VTFnOHZ0VApwanVONk1FR2Q1cG1MY3pzRmpXeUxTbWVrbjI3K0xSSGNJRnErQmFsNzVYb2NER1dudlFZWjNuVjBOVE9lK0l4CjFScE55RzVDcko4cjgvOEhjN085cHBRTFh3ZURVSGVDLzIvbkdXSERtNXZxMmdlbHlxS2pJa1ZkeHI4QnZrS08KaUFQQWVsckF2dUF4UWs4MmhDZ3VmanNsZ2pnWFVDeXlXaWdLc09vN1lRTTVHaXZySlRFc3p6dVdCMmJyYUlsTwozdkZHaXNaQ2ZJbXVKUEdYeTlRZmhEandJbnJ0WEVCbnE2cDNnalJlSDU5Y3ZiVHFtN29Sb0VYOUtpZndEc3JQCkRLR3AvakU4dnJkeXlLZ2MxU3BldDVFYURyclNieFZCQWZOM2RyMTNGUytVeG1qQ244dFhNcnI2OVdRN1pINDEKRUZpdVZESm1XYjJaOCt5ckhXdHFOTStjN2w4dUh4cmlsNVl6QTI1SG5HU2kwSkFzWGZsaVU0TUtoSkg1WmE0RgpPUFJTNGZqVjRXN3lhbC9Hb0Jxcy9xL0toN2NxeEFLanlFZ1Bua2llc3B4KzVxZVl4MFllZXpnejYwYzI2c3Z2CkJqamRMRnBIcXV5T3ZGQlZxMHRISzZnUUhQeXZPbHNPdmZ5cmYvVE45SGo5QTdSSkMyQUtHTjg9Ci0tLS0tRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCiRETlM6LCBJUCBBZGRyZXNzOjE5Mi4xNjguMTAwLjEsIFVSSTo=", + "UserData": "AgAAAAAAAAAAAAAAAAAAAAEAAAAFAGFkbWludAAAAAEAAAEBAAEFAAAnEAAAACCHJEBvHYviYWzeHAudFtirIfVLXmnbZtii4VVgO0rFWgAAAEBKRZwnxY4Bfxy++GiPhGSNcx9l60iPzvj+w2xVkNu3Y4I32/zuoscB7R54D7uESlcQ0zqsWedZdOfe1fZmvt03AA==", "CertificateAssignments": { "TLS": 1, "WebServer": 2 }, - "AccessProtectionData": "AQAAAAAAAAAAAAAAAAAAAAABAABQAAAAAAEBAAAAAgDQBwAAIAD4TwVw4BGHeicAmfiEpIkr2CXsr07nzppvPsG8K1pmSSAAhZU6NYsmC72Ir7DKlVvmQpdp8DRqr88jX2MwAMJUCA1QAAAAAAEBAAAAAgDQBwAAIAD4TwVw4BGHeicAmfiEpIkr2CXsr07nzppvPsG8K1pmSSAA2OBNTqmeUNk/OVoaxiLy0vji5kg1glRYM0IRnIZhx0ZQAAAAAAEBAAAAAgDQBwAAIAD4TwVw4BGHeicAmfiEpIkr2CXsr07nzppvPsG8K1pmSSAAhZU6NYsmC72Ir7DKlVvmQpdp8DRqr88jX2MwAMJUCA1QAAAAAAEBAAAAAgDQBwAAIAD4TwVw4BGHeicAmfiEpIkr2CXsr07nzppvPsG8K1pmSSAAhZU6NYsmC72Ir7DKlVvmQpdp8DRqr88jX2MwAMJUCA0gAAAA+E8FcOARh3onAJn4hKSJK9gl7K9O586abz7BvCtaZkk=" + "AccessProtectionData": "AQAAAAAAAAAAAAAAAAAAAAABAABQAAAAAAEBAAAAAgDQBwAAIACDmcpW9l2KbKelN6FvcwaLAndUujD+RirRfC5n3hyAByAAk8sLUPu9xFk3Qdse0j9rzoWMkmPkatYswDi7QmJ6VPVQAAAAAAEBAAAAAgDQBwAAIACDmcpW9l2KbKelN6FvcwaLAndUujD+RirRfC5n3hyAByAAEcSJWeZMDmrZvkYFOygiehG/01uxiCv5LVhHYzwo3ZVQAAAAAAEBAAAAAgDQBwAAIACDmcpW9l2KbKelN6FvcwaLAndUujD+RirRfC5n3hyAByAAk8sLUPu9xFk3Qdse0j9rzoWMkmPkatYswDi7QmJ6VPVQAAAAAAEBAAAAAgDQBwAAIACDmcpW9l2KbKelN6FvcwaLAndUujD+RirRfC5n3hyAByAAk8sLUPu9xFk3Qdse0j9rzoWMkmPkatYswDi7QmJ6VPUgAAAAg5nKVvZdimynpTehb3MGiwJ3VLow/kYq0XwuZ94cgAc=" } \ No newline at end of file diff --git a/src/timers/ctrl/src/AxoBlinker.st b/src/timers/ctrl/src/AxoBlinker.st index efa84f366..f53886750 100644 --- a/src/timers/ctrl/src/AxoBlinker.st +++ b/src/timers/ctrl/src/AxoBlinker.st @@ -87,6 +87,7 @@ NAMESPACE AXOpen.Timers output := TRUE; IF(_onTimer.OnDelay(Context := Context ,inSignal := TRUE, TimeDelay:=inOnTime)) THEN _state := 2; + Execute := output; RETURN; END_IF; END_IF; @@ -97,6 +98,8 @@ NAMESPACE AXOpen.Timers _state := 0; END_IF; END_IF; + + Execute := output; END_METHOD METHOD PRIVATE Execute : BOOL @@ -122,6 +125,7 @@ NAMESPACE AXOpen.Timers output := TRUE; IF(_onTimer.OnDelay(Parent:= Parent ,inSignal := TRUE, TimeDelay:=inOnTime)) THEN _state := 2; + Execute := output; RETURN; END_IF; END_IF; @@ -132,6 +136,8 @@ NAMESPACE AXOpen.Timers _state := 0; END_IF; END_IF; + + Execute := output; END_METHOD