Skip to content

Instantly share code, notes, and snippets.

@sandervandevelde
Created July 13, 2021 15:44
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sandervandevelde/f3352a9836d1eaf3f3d5bfbb3ef42674 to your computer and use it in GitHub Desktop.
Save sandervandevelde/f3352a9836d1eaf3f3d5bfbb3ef42674 to your computer and use it in GitHub Desktop.
using System;
using Opc.UaFx;
using Opc.UaFx.Client;
namespace TraegerDiscoveryApp
{
/// <summary>
/// Traeger Nuget package needed: <PackageReference Include="Opc.UaFx.Advanced" Version="2.18.3" />
/// </summary>
/// <remarks>
/// See also https://docs.traeger.de/en/software/sdk/opc-ua/net/client.development.guide
/// </remarks>
internal class Program
{
private static OpcClient client;
private static void Main(string[] args)
{
Console.WriteLine("Hello OPC-UA Discovery World!");
client = new OpcClient("opc.tcp://192.168.1.82:4840/");
client.Connect();
var node = client.BrowseNode(OpcObjectTypes.ObjectsFolder);
Browse(node);
Console.WriteLine("Press a key to exit");
Console.ReadKey();
}
private static void Browse(OpcNodeInfo node, int level = 0)
{
// ns=2;s=Wise4012E:Potentio01
if (node.Attribute(OpcAttribute.DisplayName).Value.ToString().ToLower().Contains("wise"))
{
try
{
OpcNodeInfo opcNodeInfo = client.BrowseNode(node.NodeId);
var dataType = "SUBNODE";
var opcVariableNodeInfo = (opcNodeInfo as OpcVariableNodeInfo);
if (opcVariableNodeInfo != null)
{
// https://reference.opcfoundation.org/v104/PLCopen/v102/docs/9.2.1/
// datatypeid looks like 'i=1'; (Compare with number in 'OPC UA built-in data types' column)
var value = opcVariableNodeInfo.DataTypeId.ToString().Split('=')[1];
switch (value)
{
case "1":
dataType = "BOOLEAN";
break;
case "2":
dataType = "SBYTE";
break;
case "3":
dataType = "BYTE";
break;
case "4":
dataType = "INT16";
break;
case "5":
dataType = "UINT16";
break;
case "6":
dataType = "INT32";
break;
case "7":
dataType = "UINT32";
break;
case "8":
dataType = "INT64";
break;
case "9":
dataType = "UINT64";
break;
case "10":
dataType = "FLOAT";
break;
case "11":
dataType = "DOUBLE";
break;
case "12":
dataType = "STRING";
break;
case "13":
dataType = "DATETIME";
break;
default:
dataType = "TBD";
break;
}
dataType = $"{ dataType} ({ opcVariableNodeInfo.DataTypeId})";
}
Console.WriteLine($"{node.NodeId.ToString(OpcNodeIdFormat.Foundation)} - {dataType}");
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
}
level++;
foreach (var childNode in node.Children())
{
Browse(childNode, level);
}
}
}
}
@sandervandevelde
Copy link
Author

Add the correct OPC-UA Nuget package and fill in the OPC-UA Server address. This code is executed with no server-side security set up in mind.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment