Skip to content
88 changes: 76 additions & 12 deletions src/components.keyence.vision/ctrl/src/Axo_IV3/Axo_IV3.st
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -6351,14 +6410,19 @@ 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

METHOD PROTECTED OVERRIDE ManualControl
THIS._isManuallyControllable := true;
_programNumber := RequiredProgramNumber;

END_METHOD

///<summary>
Expand Down
Loading