Opc.UaFx.Advanced 2.8.1.1

NEW!
• Complex Data Types
• Structured Data Types
• Custom Data Types

These can be consumed using:
• Name-Value pairs
• .NET dynamic
• .NET user defined Types

User defined Types can be auto-generated using our "OPC Watch" utility.
Download: https://docs.traeger.de/de/software/sdk/opc-ua/opc-ua.framework.advanced/start#download

Features:
• DA: Data Access
• HDA: Historical Data Access
• AE: Alarm & Events + Conditions
• IO: FileAccess
• API: Methods and Enumerations
• OPC Classic Support
• Others: Units of Measurements

Characteristics:
• Simple and fast Client Development
• Minimum number of lines of code
• Uses OPC Foundation Stack V1.03.351.0
• Significantly reduced lines of code compared to OPC Foundation Stack

Framework Features:
• Linq to Objects support to browse nodes
• Simplified automatic certificate management
• Advanced node identifier formats like compound, URI or Foundation
• Database Cursor like historical data access
• Event driven programming model for certificates and subscriptions

Tested with:
• SIMATIC S7-1500, SIMOTION, SINUMERIC, ...
• and many more other vendors

Works on:
• Windows
• Ubuntu
• Debian
• macOS

Optimized for:
• SIMATIC S7-1500 / S7-1200
• SIMOTION
• SINUMERIC
• all OPC UA Servers from Siemens and other providers

There is a newer version of this package available.
See the version list below for details.
Install-Package Opc.UaFx.Advanced -Version 2.8.1.1
dotnet add package Opc.UaFx.Advanced --version 2.8.1.1
<PackageReference Include="Opc.UaFx.Advanced" Version="2.8.1.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Opc.UaFx.Advanced --version 2.8.1.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

Getting Started

The whole client development guides can be found here:

The whole server development guides can be found here:

A snippet to dig into your server:

using Opc.UaFx.Server;
...
var machineNode = new OpcObjectNode("Machine");
var messageNode = new OpcDataVariableNode<string>("Message","Hello World!");

using (var server = new OpcServer(
        "opc.tcp://localhost:4840/", machineNode, messageNode)) {
    server.Start();
    Console.ReadLine();

    // Your further code to interact with the clients.
}

A snippet to dig into your client:

using Opc.UaFx.Client;
...
using (var client = new OpcClient("opc.tcp://localhost:4840/")) {
    client.Connect();
    Console.WriteLine(client.ReadNode("ns=2;s=Message"));

    // Your further code to interact with the server.
}

Let's Define a Node + Read the Node

// ----- Server -----

OpcDataVariableNode<bool> isRunningNode = new OpcDataVariableNode<bool>(
        machineNode,
        "IsRunning",
        value: true);

// ----- Client -----

OpcValue isRunning = client.ReadNode("ns=2;s=Machine/IsRunning");

More: Node Management
More: Read Values of Node(s)

Let's Define a Node Tree + Write some Nodes

// ----- Server -----

OpcObjectNode jobNode = new OpcObjectNode(
        machineNode,
        "Job",
        new OpcDataVariableNode<bool>("Cancel", false),
        new OpcDataVariableNode<int>("State", -1));

// ----- Client -----

OpcStatusCollection results = client.WriteNodes(
        new OpcWriteNode("ns=2;s=Machine/Job/Cancel", true),
        new OpcWriteNode("ns=2;s=Machine/Job/State", 0));

More: Node Management
More: Write Values of Node(s)

Let's Define + Read a File Node

// ----- Server -----

System.IO.File.WriteAllText("Report.txt", "This is my report.");
OpcFileNode reportNode = new OpcFileNode(machineNode, "Report", "Report.txt");


// ----- Client -----

// All at once
string reportText = OpcFile.ReadAllText(client, "ns=2;s=Machine/Report");

// All via a stream
using (var stream = OpcFile.OpenRead(client, "ns=2;s=Machine/Report")) {
    var reader = new StreamReader(stream);

    while (!reader.EndOfStream)
        Console.WriteLine(reader.ReadLine());
}

More: Providing File Nodes
More: Working with File Nodes

Report and Observe some Alarm's and Event's

// ----- Client -----

client.SubscribeEvent(OpcObjectTypes.Server, HandleGlobalEvents);
...

private static void HandleGlobalEvents(object sender, OpcEventReceivedEventArgs e)
{
    Console.WriteLine(e.Event.Message);
}


// ----- Server -----

server.ReportEvent(OpcEventSeverity.Low, "Finished JOB-4711");

More: Providing Events
More: Working with Events

Report and Observe only Alarm's and Event's from interest

// ----- Server -----

OpcAlarmConditionNode temperatureAlarmNode = new OpcAlarmConditionNode(
        machineNode,
        "Temperature");

temperatureAlarmNode.Severity = OpcEventSeverity.High;
temperatureAlarmNode.Message = "Overheating use cases!";


// ----- Client -----

var severity = new OpcSimpleAttributeOperand(
        OpcEventTypes.Event,
        "Severity");

var conditionName = new OpcSimpleAttributeOperand(
        OpcEventTypes.Condition,
        "ConditionName");

var filter = OpcFilter.Using(client)
        .FromEvents(OpcEventTypes.AlarmCondition)
        .Where(severity > OpcEventSeverity.Medium & conditionName.Like("Temperature"))
        .Select();

client.SubscribeEvent(OpcObjectTypes.Server, filter, HandleGlobalEvents);


// ----- Server -----
server.ReportEvent(temperatureAlarmNode);

More: Providing Event Nodes
More: Working with Events

Getting Started

The whole client development guides can be found here:

The whole server development guides can be found here:

A snippet to dig into your server:

using Opc.UaFx.Server;
...
var machineNode = new OpcObjectNode("Machine");
var messageNode = new OpcDataVariableNode<string>("Message","Hello World!");

using (var server = new OpcServer(
        "opc.tcp://localhost:4840/", machineNode, messageNode)) {
    server.Start();
    Console.ReadLine();

    // Your further code to interact with the clients.
}

A snippet to dig into your client:

using Opc.UaFx.Client;
...
using (var client = new OpcClient("opc.tcp://localhost:4840/")) {
    client.Connect();
    Console.WriteLine(client.ReadNode("ns=2;s=Message"));

    // Your further code to interact with the server.
}

Let's Define a Node + Read the Node

// ----- Server -----

OpcDataVariableNode<bool> isRunningNode = new OpcDataVariableNode<bool>(
        machineNode,
        "IsRunning",
        value: true);

// ----- Client -----

OpcValue isRunning = client.ReadNode("ns=2;s=Machine/IsRunning");

More: Node Management
More: Read Values of Node(s)

Let's Define a Node Tree + Write some Nodes

// ----- Server -----

OpcObjectNode jobNode = new OpcObjectNode(
        machineNode,
        "Job",
        new OpcDataVariableNode<bool>("Cancel", false),
        new OpcDataVariableNode<int>("State", -1));

// ----- Client -----

OpcStatusCollection results = client.WriteNodes(
        new OpcWriteNode("ns=2;s=Machine/Job/Cancel", true),
        new OpcWriteNode("ns=2;s=Machine/Job/State", 0));

More: Node Management
More: Write Values of Node(s)

Let's Define + Read a File Node

// ----- Server -----

System.IO.File.WriteAllText("Report.txt", "This is my report.");
OpcFileNode reportNode = new OpcFileNode(machineNode, "Report", "Report.txt");


// ----- Client -----

// All at once
string reportText = OpcFile.ReadAllText(client, "ns=2;s=Machine/Report");

// All via a stream
using (var stream = OpcFile.OpenRead(client, "ns=2;s=Machine/Report")) {
    var reader = new StreamReader(stream);

    while (!reader.EndOfStream)
        Console.WriteLine(reader.ReadLine());
}

More: Providing File Nodes
More: Working with File Nodes

Report and Observe some Alarm's and Event's

// ----- Client -----

client.SubscribeEvent(OpcObjectTypes.Server, HandleGlobalEvents);
...

private static void HandleGlobalEvents(object sender, OpcEventReceivedEventArgs e)
{
    Console.WriteLine(e.Event.Message);
}


// ----- Server -----

server.ReportEvent(OpcEventSeverity.Low, "Finished JOB-4711");

More: Providing Events
More: Working with Events

Report and Observe only Alarm's and Event's from interest

// ----- Server -----

OpcAlarmConditionNode temperatureAlarmNode = new OpcAlarmConditionNode(
        machineNode,
        "Temperature");

temperatureAlarmNode.Severity = OpcEventSeverity.High;
temperatureAlarmNode.Message = "Overheating use cases!";


// ----- Client -----

var severity = new OpcSimpleAttributeOperand(
        OpcEventTypes.Event,
        "Severity");

var conditionName = new OpcSimpleAttributeOperand(
        OpcEventTypes.Condition,
        "ConditionName");

var filter = OpcFilter.Using(client)
        .FromEvents(OpcEventTypes.AlarmCondition)
        .Where(severity > OpcEventSeverity.Medium & conditionName.Like("Temperature"))
        .Select();

client.SubscribeEvent(OpcObjectTypes.Server, filter, HandleGlobalEvents);


// ----- Server -----
server.ReportEvent(temperatureAlarmNode);

More: Providing Event Nodes
More: Working with Events

Release Notes

https://wiki.traeger.de/en/software/sdk/opc-ua/opc-ua.framework.advanced/version.history

This package is not used by any popular GitHub repositories.

Version History

Version Downloads Last updated
2.8.2 82 11/6/2019
2.8.1.3 58 10/24/2019
2.8.1.2 82 10/23/2019
2.8.1.1 101 10/11/2019
2.8.1 77 9/25/2019
2.8.0 72 9/18/2019
2.7.5.1 157 8/15/2019
2.7.5 65 8/13/2019
2.7.4 300 6/7/2019
2.7.3.1 130 5/23/2019
2.7.3 128 5/17/2019
2.7.2 135 5/10/2019
2.7.1.1 132 4/29/2019
2.7.1 274 3/25/2019
2.7.0.2 153 3/18/2019
2.7.0.1 123 3/15/2019
2.7.0 99 3/14/2019
2.6.0 360 2/20/2019
2.5.7 168 2/6/2019
2.5.4 959 8/27/2018
2.5.3 258 8/21/2018
2.5.2.5 262 8/7/2018
2.5.2.3 291 7/25/2018
2.5.2.2 210 7/24/2018
2.2.1 1,027 9/7/2017
1.5.11.5 1,653 6/14/2016
1.5.11.3 537 5/2/2016
1.5.11.2 552 4/29/2016
1.5.10 558 2/9/2016
1.5.6.1 824 9/8/2015