UnderAutomation
有问题吗?

[email protected]

联系我们
UnderAutomation
⌘Q
本页面仅提供英文版本。

RAPID variables & symbols

Read and write RAPID variables, persistents and constants, search symbols in the loaded program, and validate a value before writing it.

A RAPID symbol is anything the program declares: a variable, a persistent, a constant, a routine, a type, a module, a task. robot.Rws.Rapid reads and writes them by their path, with the same two methods for every RAPID type.

Reading a value needs nothing more than a connection. Writing one needs the Rapid mastership.

The path of a symbol

AVAILABLE ON
RWS 1.0
RWS 2.0
The paths, the methods and the text of the values are the same on an IRC5 and on an OmniCore.

Every symbol has a path. It starts with RAPID, then the task, then the module, then the name. This path is what GetSymbolValue and SetSymbolValue take.

AbbController robot = new AbbController();
robot.Connect("192.168.0.1");
// A variable declared in the module MainModule of the task T_ROB1
robot.Rws.Rapid.GetSymbolValue("RAPID/T_ROB1/MainModule/myCounter");
// reg1 and the other predefined registers live in the built-in module "user"
robot.Rws.Rapid.GetSymbolValue("RAPID/T_ROB1/user/reg1");
// A leading slash is accepted, it is removed by the SDK
robot.Rws.Rapid.GetSymbolValue("/RAPID/T_ROB1/user/reg1");
// A module of the task, and the task itself, are symbols too
robot.Rws.Rapid.GetSymbolProperties("RAPID/T_ROB1/MainModule");
robot.Rws.Rapid.GetSymbolProperties("RAPID/T_ROB1");
// A RAPID type has a path of its own, without any task
robot.Rws.Rapid.GetSymbolProperties("RAPID/robtarget");
robot.Disconnect();
}
Click to see the full code
PathWhat it names
RAPID/T_ROB1/MainModule/myCounterA variable, a persistent or a constant of a module
RAPID/T_ROB1/user/reg1reg1 to reg5, which live in the built-in module user
RAPID/T_ROB1/MainModuleThe module itself
RAPID/T_ROB1The task itself
RAPID/robtargetA RAPID type, which belongs to no task

The path is case sensitive on the name of the module and on the name of the symbol. A leading slash is accepted, the SDK removes it. When no symbol has that path, the controller answers 404 and the SDK throws an RwsException.

If you do not know where a variable is declared, do not guess the path, search for it with SearchSymbols.

Read a value

GetSymbolValue returns the value as the text RAPID writes it with, plus where the declaration sits in the module. There is no typed overload, a num, a bool and a robtarget all come back as a string.

AbbController robot = new AbbController();
robot.Connect("192.168.0.1");
// A value always comes back as the text RAPID writes it with. Reading needs no mastership.
RapidSymbolValue value = robot.Rws.Rapid.GetSymbolValue("RAPID/T_ROB1/user/reg1");
Console.WriteLine(value.Value); // "42"
Console.WriteLine(value.DeclarationPosition); // where the declaration sits in the module
// num and dnum: parse with the invariant culture, RAPID uses a dot as decimal separator
double number = double.Parse(robot.Rws.Rapid.GetSymbolValue("RAPID/T_ROB1/user/reg1").Value,
CultureInfo.InvariantCulture);
// bool: the controller writes TRUE or FALSE
bool flag = robot.Rws.Rapid.GetSymbolValue("RAPID/T_ROB1/MainModule/myFlag")
.Value.Trim().Equals("TRUE", StringComparison.OrdinalIgnoreCase);
// string: the value carries the RAPID quotes, remove them
string text = robot.Rws.Rapid.GetSymbolValue("RAPID/T_ROB1/MainModule/myText").Value.Trim('"');
Console.WriteLine(number + " " + flag + " " + text);
robot.Disconnect();
}
Click to see the full code
RAPID typeWhat Value holds
num, dnum42, 1.5, 9E+09. Always a dot as decimal separator.
boolTRUE or FALSE, in capitals
stringThe RAPID quotes are part of the value, "hello"
robtarget, pos, any recordThe bracketed form, [[515,0,712],[1,0,0,0],[0,0,0,0],[9E+09,...]]
An arrayOne value too, [1,2,3]

Parse the numbers with CultureInfo.InvariantCulture. On a machine configured with a French or a German locale, double.Parse("1.5") without it gives 15.

Write a value

SetSymbolValue takes the same text form. The controller checks the value against the type of the symbol and answers 400 when it does not match.

AbbController robot = new AbbController();
robot.Connect("192.168.0.1");
// Writing needs the RAPID mastership. Take it, write, give it back.
robot.Rws.Mastership.Request(MastershipDomain.Rapid);
try
{
// num: format with the invariant culture, "1,5" is refused, "1.5" is accepted
double speed = 1.5;
robot.Rws.Rapid.SetSymbolValue("RAPID/T_ROB1/user/reg1",
speed.ToString(CultureInfo.InvariantCulture));
// bool: TRUE or FALSE, in capitals
robot.Rws.Rapid.SetSymbolValue("RAPID/T_ROB1/MainModule/myFlag", "TRUE");
// string: the RAPID quotes are part of the value
robot.Rws.Rapid.SetSymbolValue("RAPID/T_ROB1/MainModule/myText", "\"hello\"");
}
finally
{
robot.Rws.Mastership.Release(MastershipDomain.Rapid);
}
robot.Disconnect();
}
Click to see the full code

What readers get wrong, in order:

  • The mastership. Without the Rapid mastership the controller answers 403. In manual mode it also wants the write access an operator grants from the FlexPendant.
  • The culture. speed.ToString() on a French machine writes 1,5, which the controller refuses. Always format with CultureInfo.InvariantCulture.
  • The quotes of a string. The value of a RAPID string carries them, "\"hello\"" and not "hello".
  • A constant. A CONST cannot be written while the program runs. GetSymbolProperties reports it, its ReadOnly property is true.
  • A local variable. A variable declared inside a routine only exists while the routine runs.

Writing a variable does not change the declaration. After a program reset the symbol goes back to the value written in its source, see below.

Methods of RapidService :
C#
// Gets the value of a RAPID symbol and where it is declared (synchronous)
RapidSymbolValue GetSymbolValue(string symbolUrl);
// Sets the value a RAPID symbol is declared with, which is the one it goes back to when the program is reset (synchronous)
void SetSymbolInitialValue(string symbolUrl, string value);
// Sets the value a RAPID symbol currently holds (synchronous)
void SetSymbolValue(string symbolUrl, string value);

Every method also exists in an asynchronous version, with the same name followed by Async and an optional CancellationToken.

Class
RapidSymbolValue
C#Python

The value of a RAPID symbol and where it is declared. Returned by RapidService.GetSymbolValue(). The value is the text the controller wrote it as, which for a record is the bracketed form RAPID itself uses, for example [[515,0,712],[0.707107,0,0.707107,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]].

MemberTypeDescription
RapidSymbolValue()
Constructor
Initializes a new instance of the RapidSymbolValue class
DeclarationPosition
Property
RapidTextRange
Where the symbol is declared, null when the controller did not report it
InitialValuePosition
Property
RapidTextRange
Where the initial value of the symbol is written, null when the controller did not report it. The controller reports zeros when the declaration carries no initial value.
Value
Property
string
Value of the symbol, written the way RAPID writes it
ToString()
Method
string
Returns a string representation of this value
Class
RapidTextRange
C#Python

A span of source between two positions, counted from 1. Used wherever the controller reports where something is declared or where a statement sits.

MemberTypeDescription
RapidTextRange()
Constructor
Initializes a new instance of the RapidTextRange class
BeginColumn
Property
int?
Column the range begins at, null when the controller did not report it
BeginRow
Property
int?
Line the range begins at, null when the controller did not report it
EndColumn
Property
int?
Column the range ends at, null when the controller did not report it
EndRow
Property
int?
Line the range ends at, null when the controller did not report it
ToString()
Method
string
Returns a string representation of this range

Records, arrays and the initial value

A record is not taken apart by the SDK. You get the bracketed text, in the same order as the components of the type, and you write it back the same way.

AbbController robot = new AbbController();
robot.Connect("192.168.0.1");
// A record comes back in the bracketed form RAPID writes it with. The SDK does not
// take it apart, you get the text and parse what you need.
RapidSymbolValue target = robot.Rws.Rapid.GetSymbolValue("RAPID/T_ROB1/MainModule/pHome");
Console.WriteLine(target.Value);
// [[515,0,712],[0,0,1,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]
// An array is one value too, its elements separated by commas
Console.WriteLine(robot.Rws.Rapid.GetSymbolValue("RAPID/T_ROB1/MainModule/myArray").Value); // [1,2,3]
// Build the text with the invariant culture, a comma as decimal separator is refused
double x = 515.5, y = 0, z = 712;
string pose = string.Format(CultureInfo.InvariantCulture,
"[[{0},{1},{2}],[0,0,1,0],[0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]]",
x, y, z);
robot.Rws.Mastership.Request(MastershipDomain.Rapid);
try
{
// The value has to carry every component the type declares
robot.Rws.Rapid.SetSymbolValue("RAPID/T_ROB1/MainModule/pHome", pose);
}
finally
{
robot.Rws.Mastership.Release(MastershipDomain.Rapid);
}
robot.Disconnect();
}
Click to see the full code

SetSymbolInitialValue writes the value the declaration carries, the one the symbol goes back to when the program is reset. It rewrites the source of the module, so the module counts as changed afterwards. SetSymbolValue only changes what the symbol holds right now.

InitialValuePosition of RapidSymbolValue says where that initial value sits in the source. The controller reports zeros when the declaration carries none.

Check a value before writing it

ValidateSymbolValue asks the controller whether it would accept a value for a given type, without writing it anywhere. It returns false for a refused value instead of throwing, so it is what an editor uses to tell an operator that what they typed is wrong.

AbbController robot = new AbbController();
robot.Connect("192.168.0.1");
// Ask the controller whether it would take the value, without writing it anywhere
Console.WriteLine(robot.Rws.Rapid.ValidateSymbolValue("T_ROB1", "num", "1.5")); // true
// A value that does not fit the type gives false, it does not throw
Console.WriteLine(robot.Rws.Rapid.ValidateSymbolValue("T_ROB1", "num", "hello")); // false
robot.Rws.Mastership.Request(MastershipDomain.Rapid);
try
{
if (robot.Rws.Rapid.ValidateSymbolValue("T_ROB1", "num", "1.5"))
robot.Rws.Rapid.SetSymbolValue("RAPID/T_ROB1/user/reg1", "1.5");
// The value written in the declaration, the one the symbol goes back to when the
// program is reset. This rewrites the source of the module.
robot.Rws.Rapid.SetSymbolInitialValue("RAPID/T_ROB1/MainModule/myCounter", "0");
}
finally
{
robot.Rws.Mastership.Release(MastershipDomain.Rapid);
}
robot.Disconnect();
}
Click to see the full code

Any other failure, a type that does not exist for example, is still reported as an RwsException.

Methods of RapidService :
C#
// Asks the controller whether a value would be accepted for a given RAPID type, without writing it anywhere (synchronous) This is what an editor uses to tell an operator that what they typed is wrong before the write is attempted.
bool ValidateSymbolValue(string task, string dataType, string value);

Every method also exists in an asynchronous version, with the same name followed by Async and an optional CancellationToken.

Search symbols

SearchSymbols walks the program and returns the symbols matching a set of criteria. It is the way to list the robtarget of a module, to find every persistent of a task, or to check that a variable exists before writing it.

AbbController robot = new AbbController();
robot.Connect("192.168.0.1");
// Always give a starting point, a search without any criterion walks the whole system
RapidSymbolSearchCriteria criteria = new RapidSymbolSearchCriteria();
criteria.View = RapidSymbolSearchView.Block;
criteria.BlockUrl = "RAPID/T_ROB1";
criteria.Recursive = true;
criteria.NamePattern = "^p[0-9]+$"; // regular expression on the name
criteria.DataType = "robtarget";
// Only the first entry is sent, search again for another kind
criteria.SymbolTypes = new RapidSymbolType[] { RapidSymbolType.Persistent };
foreach (RapidSymbolProperties symbol in robot.Rws.Rapid.SearchSymbols(criteria))
{
Console.WriteLine(symbol.Name + " (" + symbol.DataType + ")");
// SymbolUrl is the path the other symbol methods take
Console.WriteLine(robot.Rws.Rapid.GetSymbolValue(symbol.SymbolUrl).Value);
}
// What one symbol is declared as, without reading its value
RapidSymbolProperties properties = robot.Rws.Rapid.GetSymbolProperties("RAPID/T_ROB1/user/reg1");
Console.WriteLine(properties.SymbolType); // Variable, Persistent, Constant, ...
Console.WriteLine(properties.DataType); // num
Console.WriteLine(properties.ReadOnly); // null when the controller did not report it
robot.Disconnect();
}
Click to see the full code

Always set BlockUrl. A search with no criterion at all walks the whole system and takes seconds.

RapidSymbolSearchViewWhere the search looks
BlockIn the block named by BlockUrl, and in what it contains when Recursive is true
ScopeIn what is visible from a position of the source, which needs PositionRow and PositionColumn
StackIn what is visible from a frame of the call stack, which needs the program pointer to be set
UndefinedLet the controller decide

SymbolTypes filters on the kind of symbol: Variable, Persistent, Constant, Function, Procedure, Trap, Module, and the others of RapidSymbolType. The controller keeps only one kind per search, so only the first entry of the array is sent. Search once per kind when you need several.

NamePattern is a regular expression, not a wildcard. DataType takes the name of a RAPID type, for example robtarget.

GetSymbolProperties returns the same information for one symbol: its kind, its type, whether it is local to its module, whether it is read only. A property the controller did not report comes back as null, so test the nullable properties before using them.

Methods of RapidService :
C#
// Gets what a RAPID symbol is declared as (synchronous)
RapidSymbolProperties GetSymbolProperties(string symbolUrl);
// Finds the RAPID symbols matching a set of criteria (synchronous)
RapidSymbolProperties[] SearchSymbols(RapidSymbolSearchCriteria criteria);

Every method also exists in an asynchronous version, with the same name followed by Async and an optional CancellationToken.

Class
RapidSymbolProperties
C#Python

What a RAPID symbol is declared as. Returned by RapidService.GetSymbolProperties() and RapidService.SearchSymbols(). A search fills in Name and leaves Storage alone, a direct read does the opposite on some controllers, so treat both as optional.

MemberTypeDescription
RapidSymbolProperties()
Constructor
Initializes a new instance of the RapidSymbolProperties class
DataType
Property
string
Name of the type of the symbol, for example "num"
Dimension
Property
string
Size of each array dimension as the controller worded it, empty when the symbol is not an array
Dimensions
Property
int?
Number of array dimensions of the symbol, null when the controller did not report it
Heap
Property
bool?
Whether the symbol is allocated on the heap, null when the controller did not report it
Linked
Property
bool?
Whether the declaration is complete, null when the controller did not report it
Local
Property
bool?
Whether the symbol is local to its module, null when the controller did not report it
Name
Property
string
Name of the symbol, for example "reg1"
Named
Property
bool?
Whether the symbol is named, null when the controller did not report it
ReadOnly
Property
bool?
Whether the symbol may not be written, null when the controller did not report it
Storage
Property
string
How the controller stores the symbol, for example "loaded"
SymbolType
Property
RapidSymbolType
What kind of symbol this is
SymbolUrl
Property
string
Path of the symbol, which the other symbol methods take
TaskVariable
Property
bool?
Whether the symbol is global within its task, null when the controller did not report it
TypeUrl
Property
string
Path of the type of the symbol, for example "RAPID/num"
ToString()
Method
string
Returns a string representation of this symbol
Class
RapidSymbolSearchCriteria
C#Python

What a symbol search looks for. Passed to RapidService.SearchSymbols(). Every property is optional; leaving one alone means the search does not filter on it. A search with no criterion at all walks the whole system, which is slow, so at least set BlockUrl.

MemberTypeDescription
RapidSymbolSearchCriteria()
Constructor
Initializes a new instance of the RapidSymbolSearchCriteria class
BlockUrl
Property
string
Path the search starts from, for example "RAPID/T_ROB1"
DataType
Property
string
Name of the type a symbol has to have to be kept, for example "robtarget"
NamePattern
Property
string
Regular expression the name of a symbol has to match to be kept
OnlyUsed
Property
bool?
Whether only the symbols the program actually refers to are kept, null to leave it to the controller
PositionColumn
Property
int?
Column the search starts from, used together with Scope
PositionRow
Property
int?
Line the search starts from, used together with Scope
Recursive
Property
bool?
Whether the search also walks what the starting point contains, null to leave it to the controller
SkipShared
Property
bool?
Whether the symbols shared between tasks are skipped, null to leave it to the controller
StackFrame
Property
int?
Frame of the call stack the search starts from, used together with Stack
SymbolTypes
Property
RapidSymbolType[]
Kinds of symbol the search keeps, empty to keep every kind
VariableType
Property
RapidSymbolVariableType
Which variables the search keeps, by what may be done with them
View
Property
RapidSymbolSearchView
Which part of the system the search walks
Enum
RapidSymbolType
C#Python

What a RAPID symbol is: a value, a routine, a type or one of the structural elements of the language

NameValueDescription
Alias
4
An alias of another type
Any
17
Any of the other types, which a search uses to mean that it does not filter on the type
Atomic
2
A built-in type such as num or string
Constant
6
A constant
ForVariable
11
The loop variable of a FOR statement
Function
12
A function
Label
10
A label
Module
15
A module
Parameter
9
A parameter of a routine
Persistent
8
A persistent variable, whose value survives a restart
Procedure
13
A procedure
Record
3
A record type
RecordComponent
5
One component of a record
Task
16
A task
Trap
14
A trap routine
Undefined
1
The type is not defined
Unknown
0
The controller reported a type this library does not know
Variable
7
A variable
Enum
RapidSymbolSearchView
C#Python

Which part of the system a symbol search walks

NameValueDescription
Block
1
Search the block the search path names, and optionally what it contains
Scope
2
Search what is visible from a position of the source, which the search path and the position both have to be given for
Stack
3
Search what is visible from a frame of the call stack, which needs the program pointer to be set
Undefined
0
Let the controller decide
Enum
RapidSymbolVariableType
C#Python

Which variables a symbol search keeps, by what may be done with them

NameValueDescription
Any
4
Any of them
Loop
3
Only the loop variables
ReadOnly
2
Only the variables that can be read but not written
ReadWrite
1
Only the variables that can be read and written
Undefined
0
Let the controller decide

Persistent variables shared between tasks

A PERS declared in several tasks holds the same value in all of them, as long as the module is synchronized with the others. GetSyncPersStatus reports it, SyncPersistentVariables does the synchronization.

AbbController robot = new AbbController();
robot.Connect("192.168.0.1");
// A persistent declared in several tasks holds the same value everywhere, as long as
// the module is synchronized with the other tasks declaring it
Console.WriteLine(robot.Rws.Rapid.GetSyncPersStatus("T_ROB1", "MainModule"));
robot.Rws.Mastership.Request(MastershipDomain.Rapid);
try
{
robot.Rws.Rapid.SyncPersistentVariables("T_ROB1", "MainModule");
}
finally
{
robot.Rws.Mastership.Release(MastershipDomain.Rapid);
}
robot.Disconnect();
}
Click to see the full code
Methods of RapidService :
C#
// Gets whether the persistent variables of a module are kept synchronized with the other tasks declaring them (synchronous)
bool GetSyncPersStatus(string task, string module);
// Synchronizes the persistent variables of a module with the other tasks declaring them (synchronous)
void SyncPersistentVariables(string task, string module);

Every method also exists in an asynchronous version, with the same name followed by Async and an optional CancellationToken.

Errors you can expect

StatusWhat happened
400The value does not match the type of the symbol, or the number was formatted with a comma
403Your connection does not hold the Rapid mastership, or the user account lacks the UAS grant
404No symbol has that path. Check the case of the module and of the name.
500The controller cannot do it in its current state, for example writing a local variable of a routine that is not running

A complete example, with a num, a bool, a string and a robtarget, is given in Read & write RAPID variables.

The values of the RAPID symbols are the same on the two controller generations. The starting and stopping of the program that uses them is on RAPID tasks & program execution, and the source of the modules declaring them on RAPID modules & program files.

Try it in the demo application

The RAPID (RWS) page of the demo application exercises these calls against a live controller, without writing any code. It is shown in RAPID tasks & program execution.


轻松将 Universal Robots、Fanuc、Yaskawa、ABB 或 Staubli 机器人集成到您的 .NET、Python、LabVIEW 或 Matlab 应用程序中

UnderAutomation
联系我们Legal

© All rights reserved.