diff --git a/src/components.keyence.vision/ctrl/src/Axo_IV3/Axo_IV3.st b/src/components.keyence.vision/ctrl/src/Axo_IV3/Axo_IV3.st index 34311ecc1..689e66803 100644 --- a/src/components.keyence.vision/ctrl/src/Axo_IV3/Axo_IV3.st +++ b/src/components.keyence.vision/ctrl/src/Axo_IV3/Axo_IV3.st @@ -6234,8 +6234,51 @@ NAMESPACE AXOpen.Components.Keyence.Vision Status.Error.Id := UINT#510; END_IF; END_IF; - // ChangeProgramTask running: setting the program number. - IF _progress = 311 THEN + // ChangeProgramTask running: if 'ProgramSwitchingResponse' signal is true finish previous change. + IF _progress = 311 THEN + IF _infoTimer.output THEN + TaskMessenger.Activate( UINT#511, eAxoMessageCategory#Warning); + Status.Error.Id := UINT#511; + END_IF; + + IF Inputs.CommandStatusBits.ProgramSwitchingResponse THEN + THIS.CallTimers(FALSE); + _progress := 312; // ACK PREVIOUS CHANGE + ELSE + THIS.CallTimers(FALSE); + _progress := 314; // Continue to change program + END_IF; + END_IF; + // evaluated before 312 => +1 plc cycle + // ChangeProgramTask running: wait for falling edge ProgramSwitchingResponse + IF _progress = 313 THEN + IF _infoTimer.output THEN + TaskMessenger.Activate( UINT#513, eAxoMessageCategory#Warning); + Status.Error.Id := UINT#513; + END_IF; + + Outputs.CommandControl.ProgramSwitchingRequest := FALSE; + IF NOT Inputs.CommandStatusBits.BUSY THEN + THIS.CallTimers(FALSE); + _progress := 311; // +1 plc cycle to check ProgramSwitchingResponse + END_IF; + END_IF; + // ChangeProgramTask running: wait for program numbers to be equal. + IF _progress = 312 THEN + IF _infoTimer.output THEN + TaskMessenger.Activate( UINT#513, eAxoMessageCategory#Warning); + Status.Error.Id := UINT#513; + END_IF; + + Outputs.CommandControl.ProgramSwitchingRequest := TRUE; + IF TRUE THEN + THIS.CallTimers(FALSE); + _progress := 313; //+1 plc cycle to wait for falling edge + END_IF; + END_IF; + + // ChangeProgramTask running: setting the new program number. + IF _progress = 314 THEN IF _infoTimer.output THEN TaskMessenger.Activate( UINT#511, eAxoMessageCategory#Warning); Status.Error.Id := UINT#511; @@ -6244,42 +6287,58 @@ NAMESPACE AXOpen.Components.Keyence.Vision Outputs.CommandControl.ProgramNo := _programNumber; IF Outputs.CommandControl.ProgramNo = Inputs.DeviceStatusWords.CurrentProgramNo THEN THIS.CallTimers(FALSE); - _progress := 314; + _progress := 317; ELSE THIS.CallTimers(FALSE); - _progress := 312; + _progress := 315; END_IF; END_IF; // ChangeProgramTask running: waiting for the raising of the 'ProgramSwitchingResponse' signal. - IF _progress = 312 THEN + IF _progress = 315 THEN IF _infoTimer.output THEN TaskMessenger.Activate( UINT#512, eAxoMessageCategory#Warning); Status.Error.Id := UINT#512; END_IF; - Outputs.CommandControl.ProgramSwitchingRequest := TRUE; + Outputs.CommandControl.ProgramSwitchingRequest := TRUE; IF Inputs.CommandStatusBits.ProgramSwitchingResponse THEN THIS.CallTimers(FALSE); - _progress := 313; + _progress := 316; END_IF; END_IF; // ChangeProgramTask running: waiting for the falling of the 'ProgramSwitchingResponse' signal. - IF _progress = 313 THEN + IF _progress = 316 THEN IF _infoTimer.output THEN TaskMessenger.Activate( UINT#513, eAxoMessageCategory#Warning); Status.Error.Id := UINT#513; END_IF; - Outputs.CommandControl.ProgramSwitchingRequest := FALSE; + Outputs.CommandControl.ProgramSwitchingRequest := FALSE; IF NOT Inputs.CommandStatusBits.ProgramSwitchingResponse THEN THIS.CallTimers(FALSE); - _progress := 314; + _progress := 317; + END_IF; + END_IF; + + // ChangeProgramTask running: waiting for equals program change. + IF _progress = 317 THEN + IF _infoTimer.output THEN + TaskMessenger.Activate( UINT#513, eAxoMessageCategory#Warning); + Status.Error.Id := UINT#513; + END_IF; + + IF (_programNumber = Inputs.DeviceStatusWords.CurrentProgramNo) + AND (Outputs.CommandControl.ProgramNo = Inputs.DeviceStatusWords.CurrentProgramNo) + THEN + THIS.CallTimers(FALSE); + _progress := 318; END_IF; END_IF; + // ChangeProgramTask finished. - IF _progress = 314 THEN + IF _progress = 318 THEN ChangeProgramTask.DoneWhen(TRUE); _progress := 0; END_IF; @@ -6351,6 +6410,12 @@ NAMESPACE AXOpen.Components.Keyence.Vision VAR_INPUT inProgramNumber : UINT; END_VAR + + // different program loaded in HW - restore task to be able to run it again + IF ( inProgramNumber <> Inputs.DeviceStatusWords.CurrentProgramNo ) && ChangeProgramTask.IsDone() THEN + ChangeProgramTask.Restore(); + END_IF; + _programNumber := inProgramNumber; ChangeProgram := ChangeProgramTask.Invoke(THIS); END_METHOD @@ -6358,7 +6423,6 @@ NAMESPACE AXOpen.Components.Keyence.Vision METHOD PROTECTED OVERRIDE ManualControl THIS._isManuallyControllable := true; _programNumber := RequiredProgramNumber; - END_METHOD ///