Problem getting RapidData out of routine
Hey I thought I'd better start a new thread for this.
I have a rapid variable(VAR num nStickOut) declared inside a routine named "rWerkstuk01". Problem is that when I try to get the value of the variable I get the volowing error:
"System.Exception ee: SYS_CTRL_E_UNEXPECTED: An error message that has not been successfully been converted to a common return code.
Error Code:(0xc004ffff)
SYS_CTRL_E_UNEXPECTED: An error message that has not been successfully been converted to a common return code.
ERROR:rapid.c[6279]:org_code:-1089 new_code:0xc004ffff; AdaptCmdd.cpp[231];
'Url:/{controllername}/RAPID/T_ROB1/CURSUSV01/rWerkstuk01/nStickOutRAB Prop: Valie Arg:';
When I put the same value globaly (declared outside the routine) I can access it fine. What's wrong?
My code:
private void button1_Click(object sender, EventArgs e)
{
this.textBox1.Text = string.Empty;
Controller c = new Controller();
ABB.Robotics.Controllers.RapidDomain.RapidData rd;
Task t;
Module m;
string strRetVal = string.Empty;
try
{
t = c.Rapid.GetTask("T_ROB1");
m = t.GetModule("CURSUSV01");
rd = m.GetRapidData("rWerkstuk01", "nStickOutRAB");
strRetVal = rd.Value.ToString();
this.textBox1.Text = this.textBox1.Text + "strRetVal= " + strRetVal;
if (rd != null)
{
rd.Dispose();
rd = null;
}
if (c != null)
{
c.Dispose();
c = null;
}
}
catch (ArgumentNullException ANe)
{
this.textBox1.Text = this.textBox1.Text + "ArgumentNullException ee" + ANe;
}
catch (System.Exception ee)
{
this.textBox1.Text = this.textBox1.Text + System.Exception ee" + ee;
}
}
Anny help/info/pointing in right direction would be much appreciated,
Qrius
Comments
-
I was mistaken with what I said earlier about PERS, if you want to subscribe to DataChanged events the value must be PERS.
But for your immediate problem, it looks correct, but if you declare data in a routine, I think you must run the routine at least once before you can read it, otherwise its state is indeterminate and you get the error you described.
You should be able to see this in the RAPID Data viewer on the FP, for the following snippet its value will be listed as N/A before the code is executed, and 1 after it is executed.
MODULE MainModule
PROC main()
VAR num myNum;
myNum:=1;
ENDPROC
ENDMODULEYou can read it as follows:
rd = ctrl.Rapid.GetRapidData("T_ROB1", "MainModule", "main", "myNum")
Russell Drown0 -
Thanks that helps me out alot! Weird though that the routine has to be run first... o well something for the people working on 5.10 to think about0
-
I think it has to do with the way with RAPID code is linked and made ready to run, so I think this is by design.
It would be pretty inefficient (and radically change the scope rules defined for the RAPID kernel) to allocate memory for every local variable whose scope is only valid within a routine. One might want to have dozens of modules with hundreds of procedures.
In the sample routine I made above, if you move the program pointer out of the main routine, then myNum is no longer in scope, its value in the Data Viewer returns to N/A, and you are back to the same problem.
In summary, if you need to access an item repeatedly, you should probably declare it at the module level to ensure that it is allocated when RAPID is being initialized.
Russell Drown0 -
Thnx,
Yes you're right I tried it myself and the data inside a routine is only available when the PP is in the routine. Now I just use the module level variables. Or when I really wan't them inside a routine I use PERS data wich is directly available.
But thnx for all your effort, you really helpt me out here.
0
Categories
- All Categories
- 5.5K RobotStudio
- 396 UpFeed
- 18 Tutorials
- 13 RobotApps
- 297 PowerPacs
- 405 RobotStudio S4
- 1.8K Developer Tools
- 250 ScreenMaker
- 2.8K Robot Controller
- 314 IRC5
- 59 OmniCore
- 7 RCS (Realistic Controller Simulation)
- 794 RAPID Programming
- AppStudio
- 3 RobotStudio AR Viewer
- 18 Wizard Easy Programming
- 105 Collaborative Robots
- 5 Job listings