OPC UA Server
This guide describes how to connect to the Spin Robotics OPC UA server and consume tightening results. Unified Automation UAExpert is used as the reference client throughout.
Prerequisites
UAExpert installed (available from unified-automation.com)
Network access to the device running the Spin Robotics OPC UA server
Default server endpoint:
opc.tcp://<host>:4840
Connecting to the Server
Open UAExpert.
In the Project panel (top-left), right-click Servers and select Add Server…
Enter the server endpoint URL, e.g.,
opc.tcp://spinbridge.local:4840.Click OK. The server appears under Servers in the project tree.
Double-click the server entry (or right-click → Connect) to establish the connection.
Once connected, the Address Space panel (bottom-left) populates with the server’s node tree:
Objects
└── TighteningSystem (ns=1;i=5003)
├── Identification
├── AssetManagement (ns=1;i=5005)
└── ResultManagement (ns=1;i=5011)
└── Results
└── LatestResult
Browsing Asset Information
The AssetManagement node exposes the controller and tool identities.
In the Address Space, expand TighteningSystem → AssetManagement.
You will find two device nodes: SpinBridge (controller) and SpinTool (tool).
Click a node to inspect its attributes in the Attributes panel on the right — manufacturer, serial number, firmware version, and hardware revision are all listed there.
Asset data is updated automatically when the device connects and reports its identity.
Subscribing to Result Events
The recommended way to receive results is to subscribe to events on the ResultManagement node. This ensures every result is delivered without risk of missing operations that complete within a polling interval.
Setting Up the Event View
In UAExpert, open the Event View document tab. If not already open, add it via Document → Add Document → Event View.
In the Address Space, navigate to TighteningSystem → ResultManagement (
ns=1;i=5011).Drag the ResultManagement node into the Configuration pane of the Event View.
UAExpert will display a list of available event types. Enable SimpleEvents > ResultReadyEventType and select the fields you want to monitor — at minimum Result, the complete
JoiningResultDataTypepayload.Click Apply (or the green play button in the toolbar).
The server will now push a notification each time a joining operation completes.
Reading Incoming Events
Each event appears as a new row in the Events View. Select a row to inspect the full result payload:
Metadata — result UUID, overall pass/fail evaluation, timestamps.
overallResultValues — final torque (Nm), final angle (°), and final insertion depth (mm), each with measured value, target, limits, and individual evaluation.
associatedEntities — traceability data: tool ID, program, and any external identifiers (serial number, joint ID, batch, etc.) attached by the robot program.
Trace data — time-series channels (torque, angle, speed, force, insertion depth) captured during the operation.
UAExpert with an active event subscription. The bottom pane displays an incoming
result with the associatedEntities array expanded, showing the entity fields
(entityId, isExternal, entityType, description).
Polling the Latest Result
If event subscriptions are not available in your client, you can poll the LatestResult variable instead.
In the Address Space, navigate to TighteningSystem → ResultManagement → Results → LatestResult.
Drag the node into the Data Access View.
The variable updates each time a new result is stored.
Hint
Polling risks missing results if two operations complete within a single poll interval. Event subscription is strongly preferred for production use.
Understanding the Result Structure
Metadata
Field |
Description |
|---|---|
|
Unique UUID for this result |
|
Overall outcome: OK or NOT_OK |
|
Start and end timestamps of the operation |
|
Traceability references — see below |
Measured Parameters (overallResultValues)
Parameter |
Unit |
Description |
|---|---|---|
Final Torque |
Nm |
Peak torque with target and min/max limits |
Final Angle |
° |
Rotation angle from snug torque to final torque, with limits |
Final Insertion Depth |
mm |
Measured insertion depth with target and limits |
Each entry carries measuredValue, targetValue, lowLimit, highLimit,
resultEvaluation, physicalQuantity, and engineeringUnits.
Process Curve (Trace Data)
Full time-series data is included in every result for detailed process analysis.
Channel |
Unit |
Description |
|---|---|---|
|
Nm |
Torque measured at the tool |
|
° |
Cumulative rotation angle |
|
RPM |
Rotational speed |
|
N |
Linear force applied by the robot |
|
mm/s |
Linear insertion speed |
|
mm |
Current insertion depth |
Traceability — Associated Entities
Every result embeds an associatedEntities array that links the result to the
physical assets and contextual identifiers that were present during the operation.
Always-present entities, populated automatically:
Entity |
entityType |
Description |
|---|---|---|
Tool ID |
1 (TighteningUnit) |
Identifies which tool performed the operation |
Program |
27 (JoiningProcess) |
The program or recipe that was executed |
External entities are populated by the robot program. Any additional identifiers relevant to the application can be attached — for example a product serial number, a joint location, a batch number, or a work order. These are provided by the UR robot program and the schema imposes no constraints on what is included.
Note
Attaching external identifiers is a URCap feature. See Adding Traceability.
EntityDataType Fields
Field |
Type |
Required |
Description |
|---|---|---|---|
|
String |
Yes |
Unique identifier (serial number URI, UUID, or application key) |
|
Int16 |
Yes |
Type code per IJT Table 226. Common: 1 = TighteningUnit, 27 = JoiningProcess |
|
String |
No |
Human-readable label (e.g., “tool”, “program”, “VIN”) |
|
String |
No |
Additional free-text information |
|
String |
No |
Identifier of the system that assigned |
|
Boolean |
No |
|
Example Payload
[
{
"name": "tool",
"description": "SN-10042",
"entityId": "spin-robotics.com/SN-10042",
"entityOriginId": null,
"isExternal": false,
"entityType": 1
},
{
"name": "program",
"description": "M5 Screw Standard",
"entityId": "a3f7c2d1-4b8e-4f3a-9c1d-2e5b7a0f4c6e",
"entityOriginId": null,
"isExternal": false,
"entityType": 27
},
{
"name": "serial number",
"description": "Body panel assembly — station 3",
"entityId": "BP-2024-00471",
"entityOriginId": "MES-LINE-3",
"isExternal": true,
"entityType": 21
},
{
"name": "joint id",
"description": "Front-left door hinge, upper bolt",
"entityId": "JOINT-FL-HINGE-TOP",
"entityOriginId": null,
"isExternal": true,
"entityType": 10
}
]
Because all entities are embedded directly in the result event, a consumer receives everything needed to file the result into a traceability or MES system immediately — no secondary lookups required.
Namespace Reference
Index |
URI |
Purpose |
|---|---|---|
0 |
OPC UA core |
Built-in OPC UA types |
1 |
|
Spin custom address space |
2 |
OPC UA DI |
Device Integration base types |
4 |
OPC UA Machinery |
Machinery base types |
5 |
OPC UA Machinery/Result |
Result management types |
6 |
OPC UA AMB |
Asset Management Base |
7 |
OPC UA IJT/Base |
Joining Technologies base types |
8 |
OPC UA IJT/Tightening |
Tightening-specific extensions |