Gets values of multiple OPC properties, specifying an array of property arguments objects.
Syntax
'Declaration
<NotNullAttribute()>
Function GetMultiplePropertyValues( _
ByVal As Object _
) As Object()
'Usage
Dim instance As _EasyDAClient
Dim argumentsArray As Object
Dim value() As Object
value = instance.GetMultiplePropertyValues(argumentsArray)
Parameters
- argumentsArray
- Array of arguments, one element per each OPC property involved in the operation.
The value of this parameter cannot be null
(Nothing
in Visual Basic).
The individual elements of the parameter value cannot be null
(Nothing
in Visual Basic).
Return Value
The function returns an array of
OpcLabs.BaseLib.OperationModel.ValueResult objects. The indices of elements in the output array are the same as those in the input array.
This method never returns null
(Nothing
in Visual Basic).
The individual elements of the returned value are never null
(Nothing
in Visual Basic).
Exceptions
Exception | Description |
System.ArgumentNullException |
A null reference (Nothing in Visual Basic) is passed to a method that does not accept it as a valid argument.
This is a usage error, i.e. it will never occur (the exception will not be thrown) in a correctly written program. Your code should not catch this exception. |
Example
COM
COM
COM
// This example shows how to get value of multiple OPC properties.
//
// Note that some properties may not have a useful value initially (e.g. until the item is activated in a group), which also the
// case with Timestamp property as implemented by the demo server. This behavior is server-dependent, and normal. You can run
// IEasyDAClient.ReadMultipleItemValues.Main.vbs shortly before this example, in order to obtain better property values. Your
// code may also subscribe to the items in order to assure that they remain active.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in Object Pascal (Delphi) on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-OP .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.
class procedure GetMultiplePropertyValues.Main;
var
Arguments: OleVariant;
Client: OpcLabs_EasyOpcClassic_TLB._EasyDAClient;
I: Cardinal;
PropertyArguments1: _DAPropertyArguments;
PropertyArguments2: _DAPropertyArguments;
PropertyArguments3: _DAPropertyArguments;
PropertyArguments4: _DAPropertyArguments;
ValueResult: _ValueResult;
Results: OleVariant;
begin
// Get the values of Timestamp and AccessRights properties of two items.
PropertyArguments1 := CoDAPropertyArguments.Create;
PropertyArguments1.ServerDescriptor.ServerClass := 'OPCLabs.KitServer.2';
PropertyArguments1.NodeDescriptor.ItemID := 'Simulation.Random';
PropertyArguments1.PropertyDescriptor.PropertyId.NumericalValue := DAPropertyIds_Timestamp;
PropertyArguments2 := CoDAPropertyArguments.Create;
PropertyArguments2.ServerDescriptor.ServerClass := 'OPCLabs.KitServer.2';
PropertyArguments2.NodeDescriptor.ItemID := 'Simulation.Random';
PropertyArguments2.PropertyDescriptor.PropertyId.NumericalValue := DAPropertyIds_AccessRights;
PropertyArguments3 := CoDAPropertyArguments.Create;
PropertyArguments3.ServerDescriptor.ServerClass := 'OPCLabs.KitServer.2';
PropertyArguments3.NodeDescriptor.ItemID := 'Trends.Ramp (1 min)';
PropertyArguments3.PropertyDescriptor.PropertyId.NumericalValue := DAPropertyIds_Timestamp;
PropertyArguments4 := CoDAPropertyArguments.Create;
PropertyArguments4.ServerDescriptor.ServerClass := 'OPCLabs.KitServer.2';
PropertyArguments4.NodeDescriptor.ItemID := 'Trends.Ramp (1 min)';
PropertyArguments4.PropertyDescriptor.PropertyId.NumericalValue := DAPropertyIds_AccessRights;
Arguments := VarArrayCreate([0, 3], varVariant);
Arguments[0] := PropertyArguments1;
Arguments[1] := PropertyArguments2;
Arguments[2] := PropertyArguments3;
Arguments[3] := PropertyArguments4;
// Instantiate the client object
Client := CoEasyDAClient.Create;
TVarData(Results).VType := varArray or varVariant;
TVarData(Results).VArray := PVarArray(
Client.GetMultiplePropertyValues(Arguments));
// Display results
for I := VarArrayLowBound(Results, 1) to VarArrayHighBound(Results, 1) do
begin
ValueResult := IInterface(Results[I]) as _ValueResult;
// Check if there has been an error getting the property value
if ValueResult.Exception <> nil then
begin
WriteLn(Format('s *** Failures', [Arguments[I].NodeDescriptor.NodeId, ValueResult.Exception.Message]));
Continue;
end;
WriteLn('results(', i, ').Value: ', ValueResult.Value);
end;
VarClear(Results);
VarClear(Arguments);
end;
// This example shows how to get value of multiple OPC properties, and handle errors.
//
// Note that some properties may not have a useful value initially (e.g. until the item is activated in a group), which also the
// case with Timestamp property as implemented by the demo server. This behavior is server-dependent, and normal. You can run
// IEasyDAClient.ReadMultipleItemValues.Main.vbs shortly before this example, in order to obtain better property values. Your
// code may also subscribe to the items in order to assure that they remain active.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in PHP on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-PHP .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.
const Timestamp = 4;
const AccessRights = 5;
// Get the values of Timestamp and AccessRights properties of two items.
$PropertyArguments1 = new COM("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments");
$PropertyArguments1->ServerDescriptor->ServerClass = "OPCLabs.KitServer.2";
$PropertyArguments1->NodeDescriptor->ItemID = "Simulation.Random";
$PropertyArguments1->PropertyDescriptor->PropertyID->NumericalValue = Timestamp;
$PropertyArguments2 = new COM("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments");
$PropertyArguments2->ServerDescriptor->ServerClass = "OPCLabs.KitServer.2";
$PropertyArguments2->NodeDescriptor->ItemID = "Simulation.Random";
$PropertyArguments2->PropertyDescriptor->PropertyID->NumericalValue = AccessRights;
$PropertyArguments3 = new COM("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments");
$PropertyArguments3->ServerDescriptor->ServerClass = "OPCLabs.KitServer.2";
$PropertyArguments3->NodeDescriptor->ItemID = "Trends.Ramp (1 min)";
$PropertyArguments3->PropertyDescriptor->PropertyID->NumericalValue = Timestamp;
$PropertyArguments4 = new COM("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments");
$PropertyArguments4->ServerDescriptor->ServerClass = "OPCLabs.KitServer.2";
$PropertyArguments4->NodeDescriptor->ItemID = "Trends.Ramp (1 min)";
$PropertyArguments4->PropertyDescriptor->PropertyID->NumericalValue = AccessRights;
$arguments[0] = $PropertyArguments1;
$arguments[1] = $PropertyArguments2;
$arguments[2] = $PropertyArguments3;
$arguments[3] = $PropertyArguments4;
$Client = new COM("OpcLabs.EasyOpc.DataAccess.EasyDAClient");
$results = $Client->GetMultiplePropertyValues($arguments);
for ($i = 0; $i < count($results); $i++)
{
$attributeDataResult = $results[$i];
if ($results[$i]->Succeeded)
printf("results[d].Values\n", $i, $results[$i]->Value);
else
printf("results[d]: *** Failures\n", $i, $results[$i]->ErrorMessageBrief);
}
REM This example shows how to get value of multiple OPC properties.
REM
REM Note that some properties may not have a useful value initially (e.g. until the item is activated in a group), which also the
REM case with Timestamp property as implemented by the demo server. This behavior is server-dependent, and normal. You can run
REM IEasyDAClient.ReadMultipleItemValues.Main.vbs shortly before this example, in order to obtain better property values. Your
REM code may also subscribe to the items in order to assure that they remain active.
REM
REM Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
REM OPC client and subscriber examples in Visual Basic on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VB .
REM Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
REM a commercial license in order to use Online Forums, and we reply to every post.
Private Sub GetMultiplePropertyValues_Main_Command_Click()
OutputText = ""
' Get the values of Timestamp and AccessRights properties of two items.
Dim propertyArguments1 As New DAPropertyArguments
propertyArguments1.serverDescriptor.ServerClass = "OPCLabs.KitServer.2"
propertyArguments1.nodeDescriptor.itemId = "Simulation.Random"
propertyArguments1.PropertyDescriptor.propertyId.NumericalValue = DAPropertyIds_Timestamp
Dim propertyArguments2 As New DAPropertyArguments
propertyArguments2.serverDescriptor.ServerClass = "OPCLabs.KitServer.2"
propertyArguments2.nodeDescriptor.itemId = "Simulation.Random"
propertyArguments2.PropertyDescriptor.propertyId.NumericalValue = DAPropertyIds_AccessRights
Dim propertyArguments3 As New DAPropertyArguments
propertyArguments3.serverDescriptor.ServerClass = "OPCLabs.KitServer.2"
propertyArguments3.nodeDescriptor.itemId = "Trends.Ramp (1 min)"
propertyArguments3.PropertyDescriptor.propertyId.NumericalValue = DAPropertyIds_Timestamp
Dim propertyArguments4 As New DAPropertyArguments
propertyArguments4.serverDescriptor.ServerClass = "OPCLabs.KitServer.2"
propertyArguments4.nodeDescriptor.itemId = "Trends.Ramp (1 min)"
propertyArguments4.PropertyDescriptor.propertyId.NumericalValue = DAPropertyIds_AccessRights
Dim arguments(3) As Variant
Set arguments(0) = propertyArguments1
Set arguments(1) = propertyArguments2
Set arguments(2) = propertyArguments3
Set arguments(3) = propertyArguments4
' Instantiate the client object
Dim client As New EasyDAClient
' Obtain values. By default, the Value attributes of the nodes will be read.
Dim results() As Variant
results = client.GetMultiplePropertyValues(arguments)
' Display results
Dim i: For i = LBound(results) To UBound(results)
Dim valueResult As valueResult: Set valueResult = results(i)
' Check if there has been an error getting the property value
If Not valueResult.Exception Is Nothing Then
OutputText = OutputText & arguments(i).nodeDescriptor.NodeId & " *** Failure: " & valueResult.Exception.Message & vbCrLf
Else
OutputText = OutputText & "results(" & i & ").Value: " & valueResult.value & vbCrLf
End If
Next
End Sub
Rem This example shows how to get value of multiple OPC properties, and handle errors.
Rem
Rem Note that some properties may not have a useful value initially (e.g. until the item is activated in a group), which also the
Rem case with Timestamp property as implemented by the demo server. This behavior is server-dependent, and normal. You can run
Rem IEasyDAClient.ReadMultipleItemValues.Main.vbs shortly before this example, in order to obtain better property values. Your
Rem code may also subscribe to the items in order to assure that they remain active.
Rem
Rem Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
Rem OPC client and subscriber examples in VBScript on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBScript .
Rem Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
Rem a commercial license in order to use Online Forums, and we reply to every post.
Option Explicit
Const Timestamp = 4
Const AccessRights = 5
' Get the values of Timestamp and AccessRights properties of two items.
Dim PropertyArguments1: Set PropertyArguments1 = CreateObject("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments")
PropertyArguments1.ServerDescriptor.ServerClass = "OPCLabs.KitServer.2"
PropertyArguments1.NodeDescriptor.ItemID = "Simulation.Random"
PropertyArguments1.PropertyDescriptor.PropertyID.NumericalValue = Timestamp
Dim PropertyArguments2: Set PropertyArguments2 = CreateObject("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments")
PropertyArguments2.ServerDescriptor.ServerClass = "OPCLabs.KitServer.2"
PropertyArguments2.NodeDescriptor.ItemID = "Simulation.Random"
PropertyArguments2.PropertyDescriptor.PropertyID.NumericalValue = AccessRights
Dim PropertyArguments3: Set PropertyArguments3 = CreateObject("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments")
PropertyArguments3.ServerDescriptor.ServerClass = "OPCLabs.KitServer.2"
PropertyArguments3.NodeDescriptor.ItemID = "Trends.Ramp (1 min)"
PropertyArguments3.PropertyDescriptor.PropertyID.NumericalValue = Timestamp
Dim PropertyArguments4: Set PropertyArguments4 = CreateObject("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments")
PropertyArguments4.ServerDescriptor.ServerClass = "OPCLabs.KitServer.2"
PropertyArguments4.NodeDescriptor.ItemID = "Trends.Ramp (1 min)"
PropertyArguments4.PropertyDescriptor.PropertyID.NumericalValue = AccessRights
Dim arguments(3)
Set arguments(0) = PropertyArguments1
Set arguments(1) = PropertyArguments2
Set arguments(2) = PropertyArguments3
Set arguments(3) = PropertyArguments4
Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.DataAccess.EasyDAClient")
Dim results: results = Client.GetMultiplePropertyValues(arguments)
Dim i: For i = LBound(results) To UBound(results)
If results(i).Exception Is Nothing Then
WScript.Echo "results(" & i & ").Value: " & results(i).Value
Else
WScript.Echo "results(" & i & ").Exception.Message: " & results(i).Exception.Message
End If
Next
Rem This example measures the time needed to get values of all OPC properties of a single OPC item all at once.
Rem This example shows how to get value of multiple OPC properties.
Rem
Rem Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
Rem OPC client and subscriber examples in VBScript on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBScript .
Rem Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
Rem a commercial license in order to use Online Forums, and we reply to every post.
Option Explicit
Dim ServerDescriptor: Set ServerDescriptor = CreateObject("OpcLabs.EasyOpc.ServerDescriptor")
ServerDescriptor.ServerClass = "OPCLabs.KitServer.2"
Dim NodeDescriptor: Set NodeDescriptor = CreateObject("OpcLabs.EasyOpc.DataAccess.DANodeDescriptor")
NodeDescriptor.ItemID = "Simulation.ReadValue_I4"
Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.DataAccess.EasyDAClient")
Dim PropertyElementCollection
On Error Resume Next
Set PropertyElementCollection = Client.BrowseProperties(ServerDescriptor, NodeDescriptor)
If Err.Number <> 0 Then
WScript.Echo "*** Failure: " & Err.Source & ": " & Err.Description
WScript.Quit
End If
On Error Goto 0
Dim count: count = PropertyElementCollection.Count
Dim arguments(): Redim arguments(count - 1)
Dim i: i = 0
Dim PropertyElement: For Each PropertyElement In PropertyElementCollection
Dim PropertyArguments: Set PropertyArguments = CreateObject("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments")
PropertyArguments.ServerDescriptor = ServerDescriptor
PropertyArguments.NodeDescriptor = NodeDescriptor
PropertyArguments.PropertyDescriptor.PropertyID = PropertyElement.PropertyId
Set arguments(i) = PropertyArguments
i = i + 1
Next
'EasyDAClient.ReadItemValue "", "OPCLabs.KitServer.2", "Simulation.ReadValue_I4"
Dim startTime: startTime = Timer
Dim results: results = Client.GetMultiplePropertyValues(arguments)
WScript.Echo "Time taken (milliseconds): " & (Timer - startTime)*1000
'For i = LBound(results) To UBound(results)
' If results(i).Exception Is Nothing Then
' WScript.Echo "results(" & i & ").Value: " & results(i).Value
' Else
' WScript.Echo "results(" & i & ").Exception.Message: " & results(i).Exception.Message
' End If
''Next
// This example shows how to obtain a data type of all OPC XML-DA items under a branch.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in Object Pascal (Delphi) on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-OP .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.
class procedure GetMultiplePropertyValues.DataTypeXml;
var
Arguments: OleVariant;
BrowseParameters: _DABrowseParameters;
Client: OpcLabs_EasyOpcClassic_TLB._EasyDAClient;
Count: Cardinal;
Element: OleVariant;
I: Cardinal;
PropertyArguments: _DAPropertyArguments;
ServerDescriptor: _ServerDescriptor;
NodeDescriptor: _DANodeDescriptor;
// NodeDescriptorArray: Array of DANodeDescriptor;
NodeElement: _DANodeElement;
NodeElementCollection: _DANodeElementCollection;
NodeElementEnumerator: IEnumVariant;
ValueResult: _ValueResult;
ValueResultArray: OleVariant;
VarType: _VarType;
begin
ServerDescriptor := CoServerDescriptor.Create;
ServerDescriptor.UrlString := 'http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx';
NodeDescriptor := CoDANodeDescriptor.Create;
NodeDescriptor.ItemId := 'Static/Analog Types';
BrowseParameters := CoDABrowseParameters.Create;
BrowseParameters.BrowseFilter := DABrowseFilter_Leaves;
// Instantiate the client object
Client := CoEasyDAClient.Create;
// Browse for all leaves under the "Static/Analog Types" branch
NodeElementCollection := Client.BrowseNodes(
ServerDescriptor,
NodeDescriptor,
BrowseParameters);
// Create list of node descriptors, one for aeach leaf obtained
I := 0;
Arguments := VarArrayCreate([0, NodeElementCollection.Count - 1], varVariant);
NodeElementEnumerator := NodeElementCollection.GetEnumerator;
while (NodeElementEnumerator.Next(1, Element, Count) = S_OK) do
begin
NodeElement := IUnknown(Element) as _DANodeElement;
// filter out hint leafs that do not represent real OPC XML-DA items (rare)
if Not NodeElement.IsHint then
begin
PropertyArguments := CoDAPropertyArguments.Create;
PropertyArguments.ServerDescriptor := ServerDescriptor;
PropertyArguments.NodeDescriptor := NodeElement.ToDANodeDescriptor;
PropertyArguments.PropertyDescriptor.PropertyId.InternalValue := DAPropertyIds_DataType;
Arguments[I] := PropertyArguments;
I := I + 1;
end;
end;
// SetLength(Arguments, I);
// Get the value of DataType property; it is a 16-bit signed integer
TVarData(ValueResultArray).VType := varArray or varVariant;
TVarData(ValueResultArray).VArray := PVarArray(
Client.GetMultiplePropertyValues(Arguments));
// Display results
for I := VarArrayLowBound(ValueResultArray, 1) to VarArrayHighBound(ValueResultArray, 1) do
begin
ValueResult := IInterface(ValueResultArray[I]) as _ValueResult;
// Check if there has been an error getting the property value
if ValueResult.Exception <> nil then
begin
WriteLn(Format('s *** Failures', [Arguments[I].NodeDescriptor.NodeId, ValueResult.Exception.Message]));
Continue;
end;
// Convert the data type to VarType
VarType := CoVarType.Create;
VarType.InternalValue := ValueResult.Value;
// Display the obtained data type
WriteLn(Format(' s', [Arguments[I].NodeDescriptor.NodeId, VarType.ToString]));
end;
VarClear(ValueResultArray);
VarClear(Arguments);
end;
// This example shows how to obtain a data type of all OPC XML-DA items under a branch.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in PHP on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-PHP .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.
const DABrowseFilter_Leaves = 3;
const DAPropertyIds_DataType = 1;
$ServerDescriptor = new COM("OpcLabs.EasyOpc.ServerDescriptor");
$ServerDescriptor->UrlString = "http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx";
$NodeDescriptor = new COM("OpcLabs.EasyOpc.DataAccess.DANodeDescriptor");
$NodeDescriptor->ItemID = "Static/Analog Types";
$BrowseParameters = new COM("OpcLabs.EasyOpc.DataAccess.DABrowseParameters");
$BrowseParameters->BrowseFilter = DABrowseFilter_Leaves;
$Client = new COM("OpcLabs.EasyOpc.DataAccess.EasyDAClient");
// Browse for all leaves under the "Static/Analog Types" branch
$NodeElementCollection = $Client->BrowseNodes($ServerDescriptor, $NodeDescriptor, $BrowseParameters)->ToList();
$PropertyArgumentArray = array();
for ($i = 0; $i < $NodeElementCollection->Count(); $i++)
{
if (!($NodeElementCollection[$i]->IsHint)) // filter out hint leafs that do not represent real OPC items (rare)
{
$PropertyArguments = new COM("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments");
$PropertyArguments->ServerDescriptor = $ServerDescriptor;
$PropertyArguments->NodeDescriptor = $NodeElementCollection[$i]->ToDANodeDescriptor();
$PropertyArguments->PropertyDescriptor->PropertyId->InternalValue = DAPropertyIds_DataType;
$PropertyArgumentArray[] = $PropertyArguments;
}
}
// Get the value of DataType property; it is a 16-bit signed integer
$valueResultArray = $Client->GetMultiplePropertyValues($PropertyArgumentArray);
for ($i = 0; $i < count($valueResultArray); $i++)
{
// Check if there has been an error getting the property value
$valueResult = $valueResultArray[$i];
if (!is_null($valueResult->Exception))
{
printf("[s]: *** Failures\n", $PropertyArgumentArray[$i]->NodeDescriptor->NodeId, $valueResults->Exception->Message);
continue;
}
// Convert the data type to VarType
$VarType = new COM("OpcLabs.BaseLib.ComInterop.VarType");
$VarType->InternalValue = $valueResult->Value;
// Display the obtained data type
printf("[s]s\n", $PropertyArgumentArray[$i]->NodeDescriptor->NodeId, $VarType);
}
Rem This example shows how to obtain a data type of all OPC XML-DA items under a branch.
Rem
REM Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
REM OPC client and subscriber examples in Visual Basic on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VB .
REM Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
REM a commercial license in order to use Online Forums, and we reply to every post.
Private Sub GetMultiplePropertyValues_DataTypeXml_Command_Click()
OutputText = ""
Dim serverDescriptor As New serverDescriptor
serverDescriptor.UrlString = "http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx"
Dim NodeDescriptor As New DANodeDescriptor
NodeDescriptor.ItemId = "Static/Analog Types"
Dim BrowseParameters As New DABrowseParameters
BrowseParameters.BrowseFilter = DABrowseFilter_Leaves
' Instantiate the client object
Dim client As New EasyDAClient
' Browse for all leaves under the "Static/Analog Types" branch
Dim NodeElementCollection As DANodeElementCollection
Set NodeElementCollection = client.BrowseNodes(serverDescriptor, NodeDescriptor, BrowseParameters)
' Create list of node descriptors, one for each leaf obtained
Dim arguments()
ReDim arguments(NodeElementCollection.Count)
Dim i: i = 0
Dim NodeElement: For Each NodeElement In NodeElementCollection
' filter out hint leafs that do not represent real OPC XML-DA items (rare)
If Not NodeElement.IsHint Then
Dim PropertyArguments As New DAPropertyArguments
Set PropertyArguments.serverDescriptor = serverDescriptor
Set PropertyArguments.NodeDescriptor = NodeElement.ToDANodeDescriptor
PropertyArguments.PropertyDescriptor.PropertyId.NumericalValue = DAPropertyIds_DataType
Set arguments(i) = PropertyArguments
Set PropertyArguments = Nothing
i = i + 1
End If
Next
Dim propertyArgumentArray()
ReDim propertyArgumentArray(i - 1)
Dim j: For j = 0 To i - 1
Set propertyArgumentArray(j) = arguments(j)
Next
' Get the value of DataType property; it is a 16-bit signed integer
Dim valueResultArray() As Variant
valueResultArray = client.GetMultiplePropertyValues(propertyArgumentArray)
' Display results
For j = 0 To i - 1
Dim NodeDescriptor2 As DANodeDescriptor
Set NodeDescriptor2 = propertyArgumentArray(j).NodeDescriptor
Dim ValueResult As ValueResult: Set ValueResult = valueResultArray(j)
' Check if there has been an error getting the property value
If Not ValueResult.Exception Is Nothing Then
OutputText = OutputText & NodeDescriptor2.NodeId & " *** Failure: " & ValueResult.Exception.Message & vbCrLf
Else
' Display the obtained data type
Dim VarType As New VarType
VarType.InternalValue = ValueResult.value
OutputText = OutputText & NodeDescriptor2.NodeId & ": " & VarType & vbCrLf
End If
Next
End Sub
Rem This example shows how to obtain a data type of all OPC XML-DA items under a branch.
Rem
Rem Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
Rem OPC client and subscriber examples in VBScript on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBScript .
Rem Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
Rem a commercial license in order to use Online Forums, and we reply to every post.
Option Explicit
Const DABrowseFilter_Leaves = 3
Const DAPropertyIds_DataType = 1
Dim ServerDescriptor: Set ServerDescriptor = CreateObject("OpcLabs.EasyOpc.ServerDescriptor")
ServerDescriptor.UrlString = "http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx"
Dim NodeDescriptor: Set NodeDescriptor = CreateObject("OpcLabs.EasyOpc.DataAccess.DANodeDescriptor")
NodeDescriptor.ItemID = "Static/Analog Types"
Dim BrowseParameters: Set BrowseParameters = CreateObject("OpcLabs.EasyOpc.DataAccess.DABrowseParameters")
BrowseParameters.BrowseFilter = DABrowseFilter_Leaves
Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.DataAccess.EasyDAClient")
' Browse for all leaves under the "Static/Analog Types" branch
Dim NodeElementCollection: Set NodeElementCollection = client.BrowseNodes(serverDescriptor, nodeDescriptor, browseParameters)
' Create list of node descriptors, one for each leaf obtained
Dim arguments()
Redim arguments(nodeElementCollection.Count)
Dim i: i = 0
Dim NodeElement: For Each NodeElement In NodeElementCollection
' filter out hint leafs that do not represent real OPC XML-DA items (rare)
If Not NodeElement.IsHint Then
Dim PropertyArguments: Set PropertyArguments = CreateObject("OpcLabs.EasyOpc.DataAccess.OperationModel.DAPropertyArguments")
PropertyArguments.ServerDescriptor = ServerDescriptor
PropertyArguments.NodeDescriptor = NodeElement.ToDANodeDescriptor
PropertyArguments.PropertyDescriptor.PropertyId.InternalValue = DAPropertyIds_DataType
Set arguments(i) = PropertyArguments
i = i + 1
End If
Next
Dim propertyArgumentArray()
ReDim propertyArgumentArray(i - 1)
Dim j: For j = 0 To i - 1
Set propertyArgumentArray(j) = arguments(j)
Next
' Get the value of DataType property; it is a 16-bit signed integer
Dim valueResultArray: valueResultArray = client.GetMultiplePropertyValues(propertyArgumentArray)
For j = 0 To i - 1
Dim NodeDescriptor2: Set NodeDescriptor2 = propertyArgumentArray(j).NodeDescriptor
' Check if there has been an error getting the property value
If Not (valueResultArray(j).Exception Is Nothing) Then
WScript.Echo NodeDescriptor2.NodeId & " *** Failure: " & valueResultArray(j).Exception.Message
Else
' Display the obtained data type
Dim VarType: Set VarType = CreateObject("OpcLabs.BaseLib.ComInterop.VarType")
VarType.InternalValue = valueResultArray(j).Value
WScript.Echo nodeDescriptor2.NodeId & ": " & VarType
End If
Next
Requirements
Target Platforms: .NET Framework: Windows 10 (selected versions), Windows 11 (selected versions), Windows Server 2016, Windows Server 2022; .NET: Linux, macOS, Microsoft Windows
See Also