Reading and Writing Data
Reading Attributes
Reading attributes is done with the read method. This method exists for both the client and the server.
Read parameters
- NodeId | NodeID[]:
 (NodeId) A signle identifier of a node or an array of node identifiers. it will try to read all attributes of a node. For existing attributes will be returned value, for absent attrubutes of a noe will be returned status code BadAttributeIdInvalid.
- NodesToRead[]:
 An array of tables with the following fields:
NodeID (NodeId) The identifier of a node
AttributeId (uint32) Node Attribute Attribute of node to read
With these parameters you can read exact attributes of a node, for example, the value of a variable. values of several variable nodes.
Read Attributes Of One Node
local ObjectsFolder = "i=85"
local TypesFolder = "i=86"
-- Read all possible attributes of the any node
-- For part of attributes will be returned a valus
-- and for part of attributes will be returned a status code BadAttributeIdInvalid
resp,err = client:read(ObjectsFolder)
for i,result in ipairs(resp.Results) do
  if result.StatusCode == 0 then
    ua.Tools.printTable("result", result.Value)
  else
    trace(string.format("Read attributes error: 0x%X", result.StatusCode))
  end
end
Read Attributes Of Several Nodes
local ObjectsFolder = "i=85"
local TypesFolder = "i=86"
-- Read all possible attributes of several nodes
-- For part of attributes will be returned a valus
-- and for part of attributes will be returned a status code BadAttributeIdInvalid
resp,err = client:read({ObjectsFolder, TypesFolder})
for i,result in ipairs(resp.Results) do
  if result.StatusCode == 0 then
    ua.Tools.printTable("result", result.Value)
  else
    trace(string.format("Read value error: 0x%X", result.StatusCode))
  end
end
Read Variables Values
Variables in the OPCUA holds valuable data in the attribute Value. It is possible to read several values at once.
local Server_ServerStatus_BuildInfo_SoftwareVersion = "i=2260"
local readParams = {
  NodesToRead = {
    {
      NodeId = Server_ServerStatus_CurrentTime,
      AttributeId = ua.AttributeId.Value
    },
    {
      NodeId = Server_ServerStatus_BuildInfo_SoftwareVersion,
      AttributeId = ua.AttributeId.Value
    },
  }
}
resp,err = client:read(readParams)
for i,result in ipairs(resp.Results) do
  if result.StatusCode == 0 then
    ua.Tools.printTable("result", result.Value)
  else
    trace(string.format("Read value '%s' error: 0x%X", nodes.NodesToRead[i].NodeId, result.StatusCode))
  end
end
Writing Attributes
Changing the values of attributes is done with the Write method.
Write Parameters
NodesToWrite  | 
Array of nodes and attributes to write  | 
||
NodeId  | 
The identifier of a node  | 
||
AttributeId  | 
uint32  | 
||
Value  | 
New value of the attribute  | 
||
Write example
local Server_ServerStatus_StartTime = "i=2257"
local nodes = {
    NodesToWrite = {
      {
        NodeId = ua.NodeIds.Server_ServerStatus_StartTime,
        AttributeId = AttributeId.Value,
        Value = {   -- DataValue
          Type = ua.VariantType.DateTime,
          Value = 0.0,
          StatusCode = ua.StatusCode.Good
        }
      }
    }
  }
local response = svc:write(nodes)
if response.Results[1] ~= ua.StatusCode.Good then
  print(string.format("Changing attribute value failed: 0x%X", response.Results[1]))
  return
end
Node Attribute
Every node in the address space is represented by a set of attributes.
Base node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
1  | 
NodeId  | 
nodeID  | 
2  | 
NodeClass  | 
uint32  | 
3  | 
BrowseName  | 
qualifiedName  | 
4  | 
DisplayName  | 
localizedText  | 
5  | 
Description  | 
localizedText  | 
6  | 
WriteMask  | 
uint32  | 
7  | 
UserWriteMask  | 
uint32  | 
24  | 
RolePermissions  | 
structure (TBD)  | 
25  | 
UserRolePermissions  | 
structure (TBD)  | 
26  | 
AccessRestrictions  | 
uint16  | 
Object node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
Base attributes  | 
||
12  | 
EventNotifier  | 
byte  | 
Object Type node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
Base attributes  | 
||
8  | 
IsAbstract  | 
boolean  | 
Variable node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
Base attributes  | 
||
13  | 
Value  | 
DataValue  | 
14  | 
DataType  | 
NodeID  | 
15  | 
Rank  | 
int32  | 
16  | 
ArrayDimensions  | 
int32[]  | 
17  | 
AccessLevel  | 
byte  | 
18  | 
UserAccessLevel  | 
byte  | 
19  | 
MinimumSamplingInterval  | 
double  | 
20  | 
Historizing  | 
boolean  | 
27  | 
AccessLevelEx  | 
uint32  | 
Variable Type node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
Base attributes  | 
||
8  | 
IsAbstract  | 
boolean  | 
13  | 
Value  | 
DataValue  | 
14  | 
DataType  | 
NodeID  | 
15  | 
Rank  | 
int32  | 
16  | 
ArrayDimensions  | 
int32[]  | 
Reference Type node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
Base attributes  | 
||
8  | 
IsAbstract  | 
boolean  | 
9  | 
Symmetric  | 
boolean  | 
10  | 
InverseName  | 
localizedText  | 
Data Type node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
Base attributes  | 
||
8  | 
IsAbstract  | 
boolean  | 
23  | 
DataTypeDefinition  | 
nodeID  | 
Method node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
Base attributes  | 
||
21  | 
Executable  | 
boolean  | 
22  | 
UserExecutable  | 
boolean  | 
View node attribute numbers
Number  | 
Attribute name  | 
Data type  | 
Base attributes  | 
||
11  | 
ContainsNoLoops  | 
boolean  | 
12  | 
EventNotifier  | 
byte  | 
List of all attribute numbers
Number  | 
Attribute name  | 
Data type  | 
1  | 
NodeId  | 
nodeID  | 
2  | 
NodeClass  | 
uint32  | 
3  | 
BrowseName  | 
qualifiedName  | 
4  | 
DisplayName  | 
localizedText  | 
5  | 
Description  | 
localizedText  | 
6  | 
WriteMask  | 
uint32  | 
7  | 
UserWriteMask  | 
uint32  | 
8  | 
IsAbstract  | 
boolean  | 
9  | 
Symmetric  | 
boolean  | 
10  | 
InverseName  | 
localizedText  | 
11  | 
ContainsNoLoops  | 
boolean  | 
12  | 
EventNotifier  | 
byte  | 
13  | 
Value  | 
DataValue  | 
14  | 
DataType  | 
NodeID  | 
15  | 
Rank  | 
int32  | 
16  | 
ArrayDimensions  | 
int32[]  | 
17  | 
AccessLevel  | 
byte  | 
18  | 
UserAccessLevel  | 
byte  | 
19  | 
MinimumSamplingInterval  | 
double  | 
20  | 
Historizing  | 
boolean  | 
21  | 
Executable  | 
boolean  | 
22  | 
UserExecutable  | 
boolean  | 
23  | 
DataTypeDefinition  | 
nodeID  | 
24  | 
RolePermissions  | 
structure (TBD)  | 
25  | 
UserRolePermissions  | 
structure (TBD)  | 
26  | 
AccessRestrictions  | 
uint16  | 
27  | 
AccessLevelEx  | 
uint32  |