From ce1d2ec3c6c226934752b607d56489d6703f632c Mon Sep 17 00:00:00 2001 From: BKX Date: Mon, 26 Jan 2026 13:58:29 +0100 Subject: [PATCH 1/7] make a space in _progress --- .../ctrl/src/Axo_IV3/Axo_IV3.st | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) 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..bd9ec4d4c 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 @@ -6244,14 +6244,15 @@ NAMESPACE AXOpen.Components.Keyence.Vision Outputs.CommandControl.ProgramNo := _programNumber; IF Outputs.CommandControl.ProgramNo = Inputs.DeviceStatusWords.CurrentProgramNo THEN THIS.CallTimers(FALSE); - _progress := 314; + _progress := 318; ELSE THIS.CallTimers(FALSE); _progress := 312; END_IF; END_IF; + // ChangeProgramTask running: waiting for the raising of the 'ProgramSwitchingResponse' signal. - IF _progress = 312 THEN + IF _progress = 316 THEN IF _infoTimer.output THEN TaskMessenger.Activate( UINT#512, eAxoMessageCategory#Warning); Status.Error.Id := UINT#512; @@ -6261,11 +6262,11 @@ NAMESPACE AXOpen.Components.Keyence.Vision IF Inputs.CommandStatusBits.ProgramSwitchingResponse THEN THIS.CallTimers(FALSE); - _progress := 313; + _progress := 317; END_IF; END_IF; // ChangeProgramTask running: waiting for the falling of the 'ProgramSwitchingResponse' signal. - IF _progress = 313 THEN + IF _progress = 317 THEN IF _infoTimer.output THEN TaskMessenger.Activate( UINT#513, eAxoMessageCategory#Warning); Status.Error.Id := UINT#513; @@ -6275,11 +6276,11 @@ NAMESPACE AXOpen.Components.Keyence.Vision IF NOT Inputs.CommandStatusBits.ProgramSwitchingResponse THEN THIS.CallTimers(FALSE); - _progress := 314; + _progress := 318; END_IF; END_IF; // ChangeProgramTask finished. - IF _progress = 314 THEN + IF _progress = 318 THEN ChangeProgramTask.DoneWhen(TRUE); _progress := 0; END_IF; From 73415c0e9ba6646931903daae469a03ea481fc6c Mon Sep 17 00:00:00 2001 From: BKX Date: Mon, 26 Jan 2026 14:31:48 +0100 Subject: [PATCH 2/7] due to issue simulation --- src/components.keyence.vision/ctrl/src/Axo_IV3/Axo_IV3.st | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 bd9ec4d4c..18a939168 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 @@ -63,7 +63,7 @@ NAMESPACE AXOpen.Components.Keyence.Vision {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[Group(GroupLayout.GroupBox)]} {#ix-set:AttributeName = "<#Outputs#>"} - {#ix-attr:[ReadOnly()]} + //{#ix-attr:[ReadOnly()]} Outputs : Axo_IV3_Out; END_VAR @@ -6247,7 +6247,7 @@ NAMESPACE AXOpen.Components.Keyence.Vision _progress := 318; ELSE THIS.CallTimers(FALSE); - _progress := 312; + _progress := 316; END_IF; END_IF; From 91c2a96aca0d378ccafcf3f7d4825a70300246a1 Mon Sep 17 00:00:00 2001 From: BKX Date: Mon, 26 Jan 2026 14:47:26 +0100 Subject: [PATCH 3/7] restore change program task when number has been chnaged --- src/components.keyence.vision/ctrl/src/Axo_IV3/Axo_IV3.st | 7 +++++++ 1 file changed, 7 insertions(+) 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 18a939168..dd6ed8ac8 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 @@ -6352,6 +6352,13 @@ NAMESPACE AXOpen.Components.Keyence.Vision VAR_INPUT inProgramNumber : UINT; END_VAR + + IF (inProgramNumber <> _programNumber ) // last requeste program number different + OR (inProgramNumber <> Inputs.DeviceStatusWords.CurrentProgramNo ) // different program loaded + THEN + ChangeProgramTask.Restore(); + END_IF; + _programNumber := inProgramNumber; ChangeProgram := ChangeProgramTask.Invoke(THIS); END_METHOD From abb9d317b875c684584ddca6baf0a15bf23f9ea8 Mon Sep 17 00:00:00 2001 From: BKX Date: Tue, 27 Jan 2026 06:26:45 +0100 Subject: [PATCH 4/7] wip --- .../ctrl/src/Axo_IV3/Axo_IV3.st | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 dd6ed8ac8..f452d88ef 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 @@ -6353,11 +6353,11 @@ NAMESPACE AXOpen.Components.Keyence.Vision inProgramNumber : UINT; END_VAR - IF (inProgramNumber <> _programNumber ) // last requeste program number different - OR (inProgramNumber <> Inputs.DeviceStatusWords.CurrentProgramNo ) // different program loaded - THEN - ChangeProgramTask.Restore(); - END_IF; + // different program loaded in HW - restore task to be able to run it again + IF ( inProgramNumber <> Inputs.DeviceStatusWords.CurrentProgramNo ) && ChangeProgramTask.IsDone() THEN // not works - unknown reason + //IF ChangeProgramTask.IsDone() && ( inProgramNumber <> _programNumber ) THEN + // ChangeProgramTask.Restore(); + // END_IF; _programNumber := inProgramNumber; ChangeProgram := ChangeProgramTask.Invoke(THIS); From 99d14c0b60604798707ba32385fab645aa0caceb Mon Sep 17 00:00:00 2001 From: BKX Date: Tue, 27 Jan 2026 12:37:06 +0100 Subject: [PATCH 5/7] tested on hw --- .../ctrl/src/Axo_IV3/Axo_IV3.st | 84 +++++++++++++++---- 1 file changed, 69 insertions(+), 15 deletions(-) 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 f452d88ef..7eb5b3b9b 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,49 @@ 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; + // 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 Outputs.CommandControl.ProgramNo = Inputs.DeviceStatusWords.CurrentProgramNo THEN + THIS.CallTimers(FALSE); + _progress := 313; + END_IF; + END_IF; + // 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.ProgramSwitchingResponse THEN + THIS.CallTimers(FALSE); + _progress := 311; + 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,41 +6285,56 @@ NAMESPACE AXOpen.Components.Keyence.Vision Outputs.CommandControl.ProgramNo := _programNumber; IF Outputs.CommandControl.ProgramNo = Inputs.DeviceStatusWords.CurrentProgramNo THEN THIS.CallTimers(FALSE); - _progress := 318; + _progress := 317; ELSE THIS.CallTimers(FALSE); - _progress := 316; + _progress := 315; END_IF; END_IF; - // ChangeProgramTask running: waiting for the raising of the 'ProgramSwitchingResponse' signal. - IF _progress = 316 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 := 317; + _progress := 316; END_IF; END_IF; // ChangeProgramTask running: waiting for the falling of the 'ProgramSwitchingResponse' signal. - IF _progress = 317 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 := 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 = 318 THEN ChangeProgramTask.DoneWhen(TRUE); @@ -6354,10 +6410,9 @@ NAMESPACE AXOpen.Components.Keyence.Vision END_VAR // different program loaded in HW - restore task to be able to run it again - IF ( inProgramNumber <> Inputs.DeviceStatusWords.CurrentProgramNo ) && ChangeProgramTask.IsDone() THEN // not works - unknown reason - //IF ChangeProgramTask.IsDone() && ( inProgramNumber <> _programNumber ) THEN - // ChangeProgramTask.Restore(); - // END_IF; + IF ( inProgramNumber <> Inputs.DeviceStatusWords.CurrentProgramNo ) && ChangeProgramTask.IsDone() THEN + ChangeProgramTask.Restore(); + END_IF; _programNumber := inProgramNumber; ChangeProgram := ChangeProgramTask.Invoke(THIS); @@ -6366,7 +6421,6 @@ NAMESPACE AXOpen.Components.Keyence.Vision METHOD PROTECTED OVERRIDE ManualControl THIS._isManuallyControllable := true; _programNumber := RequiredProgramNumber; - END_METHOD /// From d41b23410194d27c76a545f524b5634f8b3b8976 Mon Sep 17 00:00:00 2001 From: BKX Date: Tue, 27 Jan 2026 12:55:49 +0100 Subject: [PATCH 6/7] do not equal programs when prograchange task is interrupted --- .../ctrl/src/Axo_IV3/Axo_IV3.st | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) 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 7eb5b3b9b..4bf8751e8 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 @@ -6249,32 +6249,34 @@ NAMESPACE AXOpen.Components.Keyence.Vision _progress := 314; // Continue to change program END_IF; END_IF; - // ChangeProgramTask running: wait for program numbers to be equal. - IF _progress = 312 THEN + // 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 := TRUE; - IF Outputs.CommandControl.ProgramNo = Inputs.DeviceStatusWords.CurrentProgramNo THEN + Outputs.CommandControl.ProgramSwitchingRequest := FALSE; + IF NOT Inputs.CommandStatusBits.BUSY THEN THIS.CallTimers(FALSE); - _progress := 313; + _progress := 311; // +1 plc cycle to check ProgramSwitchingResponse END_IF; END_IF; - // ChangeProgramTask running: wait for falling edge ProgramSwitchingResponse - IF _progress = 313 THEN + // 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 := FALSE; - IF NOT Inputs.CommandStatusBits.ProgramSwitchingResponse THEN + Outputs.CommandControl.ProgramSwitchingRequest := TRUE; + IF TRUE THEN THIS.CallTimers(FALSE); - _progress := 311; + _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 From 057e4192b0454810ccd423493393263cdfef1065 Mon Sep 17 00:00:00 2001 From: BKX Date: Tue, 27 Jan 2026 13:21:03 +0100 Subject: [PATCH 7/7] revert read only attribute --- src/components.keyence.vision/ctrl/src/Axo_IV3/Axo_IV3.st | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4bf8751e8..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 @@ -63,7 +63,7 @@ NAMESPACE AXOpen.Components.Keyence.Vision {#ix-attr:[Container(Layout.Wrap)]} {#ix-attr:[Group(GroupLayout.GroupBox)]} {#ix-set:AttributeName = "<#Outputs#>"} - //{#ix-attr:[ReadOnly()]} + {#ix-attr:[ReadOnly()]} Outputs : Axo_IV3_Out; END_VAR