Forum Migration Notice
We're transitioning to a more modern community platform by the end of this year. Learn about the upcoming changes and what to expect.

How to use Task.CallRoutine()?

jeroen
jeroen
edited March 2016 in Developer Tools
I have developed a FlexPendant GUI application. I can get/set persistent values, inputs and outputs. But I cannot get Task.CallRoutine() to work however. Every time I call it, I get the error "SYS_E_EXEC_LEVEL: Operation is illegal at current execution level" or "[SDK.Rapid.CallRoutine] a task is executing".
I tried it in the foreground task, in a background task, in auto mode and manual mode but I cannot get it to work.
How do I use the Task.CallRoutine() function (if possible in a background task)?

Thanks.

Comments

  • John_Verheij
    John_Verheij ✭✭✭
    edited April 2016
    The task which contains the routine, must be in "STOP" state, meaning that the program-pointer is set and the task is not executing.

    If the program-pointer is not set, the error "SYS_E_EXEC_LEVEL: Operation is illegal at current execution level" will be thrown.

    If the task is running, the error 
     "[SDK.Rapid.CallRoutine] a task is executing" will be thrown.

    So means you have to check in your FP-application what the state is of the task, for example this:

      PROC TestRoutine()
        ! Write message to TP
        TPWrite "TestRoutine executed...";
        
        ! Terminate program -> loose program-poiner
        Exit;
      ENDPROC
    private void button2_Click(object sender, EventArgs e)
    {
        //Declare Variables
        Task tRob1 = null;
        Controller RobotController = null;
        StartResult sRes;
    
        try
        {
            //Get RobotController
            RobotController = new Controller();
    
            //Get Task
            tRob1 = RobotController.Rapid.GetTask("T_ROB1");
    
            //Check task-state
            if (tRob1.ExecutionState == ExecutionState.Started)
            {
                // Cannot call routine, because task already running
                GTPUMessageBox.Show(this, null, "Task running...\n Stop execution and try again...", null);
            }
            else
            {
                //When state is ready, the PP is not set -> reset PP
                if (tRob1.ExecutionState == ExecutionState.Ready)
                {
                    tRob1.ResetProgramPointer();
                }
    
                // Call the TestRoutine
                sRes = tRob1.CallRoutine("TestRoutine");
                GTPUMessageBox.Show(this, null, "Call result...\n" + sRes.ToString(), null);
            }
        }
        catch (Exception ex)
        {
            // Exception handling
            GTPUMessageBox.Show(this, null, "Error...\n" + ex.Message, null);
        }
        finally
        {
            // clean-up task
            if (tRob1 != null)
            {
                tRob1.Dispose();
                tRob1 = null;
            }
    
            // clean-up controller
            if (RobotController != null)
            {
                RobotController.Dispose();
                RobotController = null;
            }
        }
    }