Created
July 13, 2021 15:44
-
-
Save sandervandevelde/f3352a9836d1eaf3f3d5bfbb3ef42674 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.