| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632 |
- using Newtonsoft.Json.Linq;
- using Opc.Ua;
- using Opc.Ua.Client;
- using Opc.Ua.Export;
- using Org.BouncyCastle.Asn1.Ocsp;
- using Org.BouncyCastle.Asn1.X509;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using static System.Windows.Forms.VisualStyles.VisualStyleElement;
- namespace OpcUaHelper.Forms
- {
- /// <summary>
- /// 一个浏览OPC服务器节点的窗口类
- /// </summary>
- public partial class FormBrowseServer : Form
- {
- #region Constructor
- /// <summary>
- /// 允许自己输入服务器地址的实例化
- /// </summary>
- public FormBrowseServer()
- {
- InitializeComponent();
-
- Icon = ClientUtils.GetAppIcon();
- m_typeImageMapping = new Dictionary<NodeId, string>( );
- }
- /// <summary>
- /// 固定地址且不允许更改的实例化
- /// </summary>
- public FormBrowseServer(string server)
- {
- InitializeComponent();
-
- Icon = ClientUtils.GetAppIcon();
- textBox1.Text = server;
- }
- #endregion
- #region Load Show Close
- private void FormBrowseServer_Load(object sender, EventArgs e)
- {
- BrowseNodesTV.Enabled = false;
- BrowseNodesTV.ImageList = new ImageList();
- BrowseNodesTV.ImageList.Images.Add("Class_489", Properties.Resources.Class_489);
- BrowseNodesTV.ImageList.Images.Add("ClassIcon", Properties.Resources.ClassIcon);
- BrowseNodesTV.ImageList.Images.Add("brackets", Properties.Resources.brackets_Square_16xMD);
- BrowseNodesTV.ImageList.Images.Add("VirtualMachine", Properties.Resources.VirtualMachine);
- BrowseNodesTV.ImageList.Images.Add("Enum_582", Properties.Resources.Enum_582);
- BrowseNodesTV.ImageList.Images.Add("Method_636", Properties.Resources.Method_636);
- BrowseNodesTV.ImageList.Images.Add("Module_648", Properties.Resources.Module_648);
- BrowseNodesTV.ImageList.Images.Add("Loading", Properties.Resources.loading);
- // 判断是否允许更改
- if (!string.IsNullOrEmpty(textBox1.Text)) textBox1.ReadOnly = true;
- // Opc Ua 服务的初始化
- OpcUaClientInitialization();
- }
- private string GetImageKeyFromDescription(ReferenceDescription target, NodeId sourceId)
- {
- if (target.NodeClass == NodeClass.Variable)
- {
- DataValue dataValue = m_OpcUaClient.ReadNode((NodeId)target.NodeId);
- if (dataValue.WrappedValue.TypeInfo != null)
- {
- if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.Scalar)
- {
- return "Enum_582";
- }
- else if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.OneDimension)
- {
- return "brackets";
- }
- else if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.TwoDimensions)
- {
- return "Module_648";
- }
- else
- {
- return "ClassIcon";
- }
- }
- else
- {
- return "ClassIcon";
- }
- }
- else if (target.NodeClass == NodeClass.Object)
- {
- if (sourceId == ObjectIds.ObjectsFolder)
- {
- return "VirtualMachine";
- }
- else
- {
- return "ClassIcon";
- }
- }
- else if (target.NodeClass == NodeClass.Method)
- {
- return "Method_636";
- }
- else
- {
- return "ClassIcon";
- }
- }
- private string GetImageIndex( DataValue dataValue )
- {
- if (dataValue == null) return "ClassIcon";
- if (dataValue.WrappedValue.TypeInfo != null)
- {
- if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.Scalar)
- {
- return "Enum_582";
- }
- else if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.OneDimension)
- {
- return "brackets";
- }
- else if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.TwoDimensions)
- {
- return "Module_648";
- }
- else if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.OneOrMoreDimensions)
- {
- return "Module_648";
- }
- else
- {
- return "ClassIcon";
- }
- }
- return "ClassIcon";
- }
- /// <summary>
- /// Returns an image index for the specified attribute.
- /// </summary>
- public string GetImageIndex( Session session, NodeClass nodeClass, ExpandedNodeId typeDefinitionId, bool selected, NodeId valueId = null )
- {
- if (nodeClass == NodeClass.Variable)
- {
- //if (session.NodeCache.IsTypeOf( typeDefinitionId, Opc.Ua.VariableTypeIds.PropertyType ))
- //{
- // return "ClassIcon";
- //}
- if (valueId != null) return GetImageIndex( m_OpcUaClient.ReadNode( valueId ) );
- return "ClassIcon";
- }
- if (nodeClass == NodeClass.Object)
- {
- if (typeDefinitionId == ObjectIds.ObjectsFolder)
- {
- return "VirtualMachine";
- }
- else if (session.NodeCache.IsTypeOf( typeDefinitionId, Opc.Ua.ObjectTypeIds.FolderType ))
- {
- if (selected)
- {
- return "ClassIcon";
- }
- else
- {
- return "ClassIcon";
- }
- }
- return "ClassIcon";
- }
- if (nodeClass == NodeClass.Method)
- {
- return "Method_636";
- }
- if (nodeClass == NodeClass.View)
- {
- return "Method_636";
- }
- return "ClassIcon";
- }
- private void FormBrowseServer_FormClosing(object sender, FormClosingEventArgs e)
- {
- m_OpcUaClient.Disconnect();
- }
- #endregion
- #region OPC UA client
- /// <summary>
- /// Opc客户端的核心类
- /// </summary>
- private OpcUaClient m_OpcUaClient = null;
- /// <summary>
- /// 初始化
- /// </summary>
- private void OpcUaClientInitialization()
- {
- m_OpcUaClient = new OpcUaClient();
- m_OpcUaClient.OpcStatusChange += M_OpcUaClient_OpcStatusChange1; ;
- m_OpcUaClient.ConnectComplete += M_OpcUaClient_ConnectComplete;
- }
- /// <summary>
- /// 连接服务器结束后马上浏览根节点
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void M_OpcUaClient_ConnectComplete(object sender, EventArgs e)
- {
- //try
- //{
- // OpcUaClient client = (OpcUaClient)sender;
- // if (client.Connected)
- // {
- // // populate the browse view.
- // PopulateBranch(ObjectIds.ObjectsFolder, BrowseNodesTV.Nodes);
- // BrowseNodesTV.Enabled = true;
- // }
- //}
- //catch (Exception exception)
- //{
- // ClientUtils.HandleException(Text, exception);
- //}
- try
- {
- m_session = m_OpcUaClient.Session as Opc.Ua.Client.Session;
- // set a suitable initial state.
- if (m_session != null)
- {
- BrowseDescription nodeToBrowse = new BrowseDescription( );
- nodeToBrowse.NodeId = Opc.Ua.ObjectIds.ViewsFolder;
- nodeToBrowse.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HierarchicalReferences;
- nodeToBrowse.IncludeSubtypes = true;
- nodeToBrowse.BrowseDirection = BrowseDirection.Forward;
- nodeToBrowse.NodeClassMask = 0;
- nodeToBrowse.ResultMask = (uint)BrowseResultMask.All;
- ReferenceDescriptionCollection references = ClientUtils.Browse( m_session, nodeToBrowse, false );
- }
- // browse the instances in the server.
- Initialize( m_session, ObjectIds.ObjectsFolder, ReferenceTypeIds.Organizes, ReferenceTypeIds.Aggregates );
- BrowseNodesTV.Enabled = true;
- }
- catch (Exception exception)
- {
- ClientUtils.HandleException( this.Text, exception );
- }
- }
- /// <summary>
- /// OPC 客户端的状态变化后的消息提醒
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void M_OpcUaClient_OpcStatusChange1(object sender, OpcUaStatusEventArgs e)
- {
- if (InvokeRequired)
- {
- BeginInvoke(new Action(() =>
- {
- M_OpcUaClient_OpcStatusChange1(sender, e);
- }));
- return;
- }
- if (e.Error)
- {
- toolStripStatusLabel1.BackColor = Color.Red;
- }
- else
- {
- toolStripStatusLabel1.BackColor = SystemColors.Control;
- }
- toolStripStatusLabel_opc.Text = e.ToString();
- }
- private ReferenceDescriptionCollection GetReferenceDescriptionCollection(NodeId sourceId)
- {
- TaskCompletionSource<ReferenceDescriptionCollection> task = new TaskCompletionSource<ReferenceDescriptionCollection>();
- // find all of the components of the node.
- BrowseDescription nodeToBrowse1 = new BrowseDescription();
- nodeToBrowse1.NodeId = sourceId;
- nodeToBrowse1.BrowseDirection = BrowseDirection.Forward;
- nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.Aggregates;
- nodeToBrowse1.IncludeSubtypes = true;
- nodeToBrowse1.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method | NodeClass.ReferenceType | NodeClass.ObjectType | NodeClass.View | NodeClass.VariableType | NodeClass.DataType);
- nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All;
- // find all nodes organized by the node.
- BrowseDescription nodeToBrowse2 = new BrowseDescription();
- nodeToBrowse2.NodeId = sourceId;
- nodeToBrowse2.BrowseDirection = BrowseDirection.Forward;
- nodeToBrowse2.ReferenceTypeId = ReferenceTypeIds.Organizes;
- nodeToBrowse2.IncludeSubtypes = true;
- nodeToBrowse2.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method | NodeClass.View | NodeClass.ReferenceType | NodeClass.ObjectType | NodeClass.VariableType | NodeClass.DataType);
- nodeToBrowse2.ResultMask = (uint)BrowseResultMask.All;
- BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection();
- nodesToBrowse.Add(nodeToBrowse1);
- nodesToBrowse.Add(nodeToBrowse2);
- // fetch references from the server.
- ReferenceDescriptionCollection references = FormUtils.Browse(m_OpcUaClient.Session, nodesToBrowse, false);
- return references;
- }
- /// <summary>
- /// 0:NodeClass 1:Value 2:AccessLevel 3:DisplayName 4:Description
- /// </summary>
- /// <param name="nodeIds"></param>
- /// <returns></returns>
- private DataValue[] ReadOneNodeFiveAttributes(List<NodeId> nodeIds)
- {
- ReadValueIdCollection nodesToRead = new ReadValueIdCollection();
- foreach (var nodeId in nodeIds)
- {
- NodeId sourceId = nodeId;
- nodesToRead.Add(new ReadValueId()
- {
- NodeId = sourceId,
- AttributeId = Attributes.NodeClass
- });
- nodesToRead.Add(new ReadValueId()
- {
- NodeId = sourceId,
- AttributeId = Attributes.Value
- });
- nodesToRead.Add(new ReadValueId()
- {
- NodeId = sourceId,
- AttributeId = Attributes.AccessLevel
- });
- nodesToRead.Add(new ReadValueId()
- {
- NodeId = sourceId,
- AttributeId = Attributes.DisplayName
- });
- nodesToRead.Add(new ReadValueId()
- {
- NodeId = sourceId,
- AttributeId = Attributes.Description
- });
- }
- // read all values.
- m_OpcUaClient.Session.Read(
- null,
- 0,
- TimestampsToReturn.Neither,
- nodesToRead,
- out DataValueCollection results,
- out DiagnosticInfoCollection diagnosticInfos);
- ClientBase.ValidateResponse(results, nodesToRead);
- ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead);
- return results.ToArray();
- }
- /// <summary>
- /// 读取一个节点的指定属性
- /// </summary>
- /// <param name="nodeId"></param>
- /// <param name="attribute"></param>
- /// <returns></returns>
- private DataValue ReadNoteDataValueAttributes(NodeId nodeId, uint attribute)
- {
- NodeId sourceId = nodeId;
- ReadValueIdCollection nodesToRead = new ReadValueIdCollection();
- ReadValueId nodeToRead = new ReadValueId();
- nodeToRead.NodeId = sourceId;
- nodeToRead.AttributeId = attribute;
- nodesToRead.Add(nodeToRead);
- int startOfProperties = nodesToRead.Count;
- // find all of the pror of the node.
- BrowseDescription nodeToBrowse1 = new BrowseDescription();
- nodeToBrowse1.NodeId = sourceId;
- nodeToBrowse1.BrowseDirection = BrowseDirection.Forward;
- nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.HasProperty;
- nodeToBrowse1.IncludeSubtypes = true;
- nodeToBrowse1.NodeClassMask = 0;
- nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All;
- BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection();
- nodesToBrowse.Add(nodeToBrowse1);
- // fetch property references from the server.
- ReferenceDescriptionCollection references = FormUtils.Browse(m_OpcUaClient.Session, nodesToBrowse, false);
- if (references == null)
- {
- return null;
- }
- for (int ii = 0; ii < references.Count; ii++)
- {
- // ignore external references.
- if (references[ii].NodeId.IsAbsolute)
- {
- continue;
- }
- ReadValueId nodeToRead2 = new ReadValueId();
- nodeToRead2.NodeId = (NodeId)references[ii].NodeId;
- nodeToRead2.AttributeId = Attributes.Value;
- nodesToRead.Add(nodeToRead2);
- }
- // read all values.
- DataValueCollection results = null;
- DiagnosticInfoCollection diagnosticInfos = null;
- m_OpcUaClient.Session.Read(
- null,
- 0,
- TimestampsToReturn.Neither,
- nodesToRead,
- out results,
- out diagnosticInfos);
- ClientBase.ValidateResponse(results, nodesToRead);
- ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToRead);
- return results[0];
- }
- #endregion
- #region Menu Click Event
- private void exitToolStripMenuItem_Click(object sender, EventArgs e)
- {
- // press exit menu button
- Close();
- }
- private void discoverToolStripMenuItem_Click(object sender, EventArgs e)
- {
- string endpointUrl = new DiscoverServerDlg().ShowDialog(m_OpcUaClient.AppConfig, null);
- if (endpointUrl != null)
- {
- textBox1.Text = endpointUrl;
- }
- }
- #endregion
- #region Press Connect Click Button
- private async void button1_Click( object sender, EventArgs e )
- {
- // connect to server
- using (FormConnectSelect formConnectSelect = new FormConnectSelect( m_OpcUaClient ))
- {
- if (formConnectSelect.ShowDialog( ) == DialogResult.OK)
- {
- try
- {
- await m_OpcUaClient.ConnectServer( textBox1.Text );
- button1.Enabled = false;
- button3.Enabled = true;
- }
- catch (Exception ex)
- {
- ClientUtils.HandleException( Text, ex );
- }
- }
- }
- }
- private void button3_Click( object sender, EventArgs e )
- {
- // 关闭连接
- try
- {
- m_OpcUaClient?.Disconnect( );
- button1.Enabled = true;
- button3.Enabled = false;
- }
- catch (Exception ex)
- {
- ClientUtils.HandleException( Text, ex );
- }
- }
- #endregion
- #region 填入分支
- /// <summary>
- /// Populates the branch in the tree view.
- /// </summary>
- /// <param name="sourceId">The NodeId of the Node to browse.</param>
- /// <param name="nodes">The node collect to populate.</param>
- private async void PopulateBranch(NodeId sourceId, TreeNodeCollection nodes)
- {
- nodes.Clear();
- nodes.Add(new TreeNode("Browsering...", 7, 7));
- // fetch references from the server.
- TreeNode[] listNode = await Task.Run(() =>
- {
- ReferenceDescriptionCollection references = GetReferenceDescriptionCollection(sourceId);
- List<TreeNode> list = new List<TreeNode>();
- if (references != null)
- {
- // process results.
- for (int ii = 0; ii < references.Count; ii++)
- {
- ReferenceDescription target = references[ii];
- TreeNode child = new TreeNode(Utils.Format("{0}", target));
- child.Tag = target;
- string key = GetImageKeyFromDescription(target, sourceId);
- child.ImageKey = key;
- child.SelectedImageKey = key;
- // if (target.NodeClass == NodeClass.Object || target.NodeClass == NodeClass.Unspecified || expanded)
- // {
- // child.Nodes.Add(new TreeNode());
- // }
- if (!checkBox1.Checked)
- {
- if (GetReferenceDescriptionCollection( (NodeId)target.NodeId ).Count > 0)
- {
- child.Nodes.Add( new TreeNode( ) );
- }
- }
- else
- {
- child.Nodes.Add( new TreeNode( ) );
- }
-
- list.Add(child);
- }
- }
- return list.ToArray();
- });
-
- // update the attributes display.
- // DisplayAttributes(sourceId);
- nodes.Clear();
- nodes.AddRange(listNode.ToArray());
- }
-
- #endregion
- #region 节点打开的时候操作
- private void BrowseNodesTV_MouseClick(object sender, MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Right)
- {
- TreeNode tn = BrowseNodesTV.GetNodeAt(e.X, e.Y);
- if (tn != null)
- {
- BrowseNodesTV.SelectedNode = tn;
- }
- }
- }
- private async void BrowseNodesTV_BeforeExpand(object sender, TreeViewCancelEventArgs e)
- {
- //try
- //{
- // check if node has already been expanded once.
- if (e.Node.Nodes.Count != 1)
- {
- //return;
- }
- if (e.Node.Nodes.Count > 0)
- {
- if (e.Node.Nodes[0].Text != String.Empty)
- {
- return;
- }
- }
- // // populate children.
- // PopulateBranch((NodeId)reference.NodeId, e.Node.Nodes);
- //}
- //catch (Exception exception)
- //{
- // ClientUtils.HandleException(this.Text, exception);
- //}
- BrowseTV_BeforeExpand( sender, e );
- }
- private void BrowseNodesTV_AfterSelect(object sender, TreeViewEventArgs e)
- {
- try
- {
- RemoveAllSubscript( );
- // get the source for the node.
- ReferenceDescription reference = e.Node.Tag as ReferenceDescription;
- if (reference == null || reference.NodeId.IsAbsolute)
- {
- return;
- }
- // populate children.
- ShowMember((NodeId)reference.NodeId);
- }
- catch (Exception exception)
- {
- ClientUtils.HandleException(Text, exception);
- }
- }
- private void ClearDataGridViewRows(int index)
- {
- for (int i = dataGridView1.Rows.Count - 1; i >= index; i--)
- {
- if (i >= 0)
- {
- dataGridView1.Rows.RemoveAt(i);
- }
- }
- }
- #endregion
- #region 点击树节点后在数据表显示
- /// <summary>
- /// 点击了节点名称前的内容进行复制
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void label2_Click(object sender, EventArgs e)
- {
- if (!string.IsNullOrEmpty(textBox_nodeId.Text))
- {
- Clipboard.SetText(textBox_nodeId.Text);
- }
- }
- private async void ShowMember(NodeId sourceId)
- {
- textBox_nodeId.Text = sourceId.ToString();
- // dataGridView1.Rows.Clear();
- int index = 0;
- ReferenceDescriptionCollection references;
- try
- {
- references = await Task.Run(() =>
- {
- return GetReferenceDescriptionCollection(sourceId);
- });
- }
- catch(Exception exception)
- {
- ClientUtils.HandleException(Text, exception);
- return;
- }
- if (references?.Count > 0)
- {
- // 获取所有要读取的子节点
- List<NodeId> nodeIds = new List<NodeId>();
- for (int ii = 0; ii < references.Count; ii++)
- {
- ReferenceDescription target = references[ii];
- nodeIds.Add((NodeId)target.NodeId);
- }
- DateTime dateTimeStart = DateTime.Now;
- // 获取所有的值
- DataValue[] dataValues = await Task.Run(() =>
- {
- return ReadOneNodeFiveAttributes(nodeIds);
- });
-
- label_time_spend.Text = (int)(DateTime.Now - dateTimeStart).TotalMilliseconds + " ms";
-
- // 显示
- for (int jj = 0; jj < dataValues.Length; jj += 5)
- {
- AddDataGridViewNewRow(dataValues, jj, index++, nodeIds[jj / 5]);
- }
-
- }
- else
- {
- // 子节点没有数据的情况
- try
- {
- DateTime dateTimeStart = DateTime.Now;
- DataValue dataValue = m_OpcUaClient.ReadNode(sourceId);
- if (dataValue.WrappedValue.TypeInfo?.ValueRank == ValueRanks.OneDimension)
- {
- // 数组显示
- AddDataGridViewArrayRow(sourceId, out index);
- }
- else
- {
- // 显示单个数本身
- label_time_spend.Text = (int)(DateTime.Now - dateTimeStart).TotalMilliseconds + " ms";
- AddDataGridViewNewRow(ReadOneNodeFiveAttributes(new List<NodeId>() { sourceId }), 0, index++, sourceId);
- }
- }
- catch (Exception exception)
- {
- ClientUtils.HandleException(Text, exception);
- return;
- }
- }
- ClearDataGridViewRows(index);
- }
- private void AddDataGridViewNewRow(DataValue[] dataValues, int startIndex, int index, NodeId nodeId)
- {
- // int index = dataGridView1.Rows.Add();
- while (index >= dataGridView1.Rows.Count)
- {
- dataGridView1.Rows.Add();
- }
- DataGridViewRow dgvr = dataGridView1.Rows[index];
- dgvr.Tag = nodeId;
- if (dataValues[startIndex].WrappedValue.Value == null) return;
- NodeClass nodeclass = (NodeClass)dataValues[startIndex].WrappedValue.Value;
- dgvr.Cells[1].Value = dataValues[3 + startIndex].WrappedValue.Value;
- dgvr.Cells[5].Value = dataValues[4 + startIndex].WrappedValue.Value;
- dgvr.Cells[4].Value = GetDiscriptionFromAccessLevel(dataValues[2 + startIndex]);
- if (nodeclass == NodeClass.Object)
- {
- dgvr.Cells[0].Value = Properties.Resources.ClassIcon;
- dgvr.Cells[2].Value = "";
- dgvr.Cells[3].Value = nodeclass.ToString();
- }
- else if (nodeclass == NodeClass.Method)
- {
- dgvr.Cells[0].Value = Properties.Resources.Method_636;
- dgvr.Cells[2].Value = "";
- dgvr.Cells[3].Value = nodeclass.ToString();
- }
- else if (nodeclass == NodeClass.Variable)
- {
- DataValue dataValue = dataValues[1 + startIndex];
- if (dataValue.WrappedValue.TypeInfo != null)
- {
- dgvr.Cells[3].Value = dataValue.WrappedValue.TypeInfo.BuiltInType;
- dgvr.Cells[6].Value = dataValue.StatusCode.ToString();
- // dgvr.Cells[3].Value = dataValue.Value.GetType().ToString();
- if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.Scalar)
- {
- dgvr.Cells[2].Value = dataValue.WrappedValue.Value;
- dgvr.Cells[0].Value = Properties.Resources.Enum_582;
- }
- else if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.OneDimension)
- {
- dgvr.Cells[2].Value = dataValue.Value.GetType().ToString();
- dgvr.Cells[0].Value = Properties.Resources.brackets_Square_16xMD;
- }
- else if (dataValue.WrappedValue.TypeInfo.ValueRank == ValueRanks.TwoDimensions)
- {
- dgvr.Cells[2].Value = dataValue.Value.GetType().ToString();
- dgvr.Cells[0].Value = Properties.Resources.Module_648;
- }
- else
- {
- dgvr.Cells[2].Value = dataValue.Value.GetType().ToString();
- dgvr.Cells[0].Value = Properties.Resources.ClassIcon;
- }
- }
- else
- {
- dgvr.Cells[0].Value = Properties.Resources.ClassIcon;
- dgvr.Cells[2].Value = dataValue.Value;
- dgvr.Cells[3].Value = "null";
- }
- }
- else
- {
- dgvr.Cells[2].Value = "";
- dgvr.Cells[0].Value = Properties.Resources.ClassIcon;
- dgvr.Cells[3].Value = nodeclass.ToString();
- dgvr.Cells[6].Value = "";
- }
- }
- private void AddDataGridViewArrayRow(NodeId nodeId,out int index)
- {
-
- DateTime dateTimeStart = DateTime.Now;
- DataValue[] dataValues = ReadOneNodeFiveAttributes(new List<NodeId>() { nodeId });
- label_time_spend.Text = (int)(DateTime.Now - dateTimeStart).TotalMilliseconds + " ms";
- DataValue dataValue = dataValues[1];
- if (dataValue.WrappedValue.TypeInfo?.ValueRank == ValueRanks.OneDimension)
- {
- string access= GetDiscriptionFromAccessLevel(dataValues[2]);
- BuiltInType type = dataValue.WrappedValue.TypeInfo.BuiltInType;
- object des = dataValues[4].Value ?? "";
- object dis = dataValues[3].Value ?? type;
- Array array = dataValue.Value as Array;
- int i = 0;
- foreach(object obj in array)
- {
- while (i >= dataGridView1.Rows.Count)
- {
- dataGridView1.Rows.Add();
- }
-
- DataGridViewRow dgvr = dataGridView1.Rows[i];
- dgvr.Tag = null;
- dgvr.Cells[0].Value = Properties.Resources.Enum_582;
- dgvr.Cells[1].Value = $"{dis} [{i++}]";
- dgvr.Cells[2].Value = obj;
- dgvr.Cells[3].Value = type;
- dgvr.Cells[4].Value = access;
- dgvr.Cells[5].Value = des;
- }
- index = i;
- }
- else
- {
- index = 0;
- }
- }
- private string GetDiscriptionFromAccessLevel(DataValue value)
- {
- if (value.WrappedValue.Value != null)
- {
- switch ((byte)value.WrappedValue.Value)
- {
- case 0: return "None";
- case 1: return "CurrentRead";
- case 2: return "CurrentWrite";
- case 3: return "CurrentReadOrWrite";
- case 4: return "HistoryRead";
- case 8: return "HistoryWrite";
- case 12: return "HistoryReadOrWrite";
- case 16: return "SemanticChange";
- case 32: return "StatusWrite";
- case 64: return "TimestampWrite";
- default: return "None";
- }
- }
- else
- {
- return "null";
- }
- }
- #endregion
- #region 订阅刷新块
- private List<string> subNodeIds = new List<string>( );
- private bool isSingleValueSub = false;
- private void RemoveAllSubscript( )
- {
- m_OpcUaClient?.RemoveAllSubscription( );
- }
- private void SubCallBack( string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs eventArgs )
- {
- if (InvokeRequired)
- {
- Invoke( new Action<string, MonitoredItem, MonitoredItemNotificationEventArgs>( SubCallBack ), key, monitoredItem, eventArgs );
- return;
- }
- MonitoredItemNotification notification = eventArgs.NotificationValue as MonitoredItemNotification;
- string nodeId = monitoredItem.StartNodeId.ToString( );
- int index = subNodeIds.IndexOf( nodeId );
- if (index >= 0)
- {
- if (isSingleValueSub)
- {
- if (notification.Value.WrappedValue.TypeInfo?.ValueRank == ValueRanks.OneDimension)
- {
- Array array = notification.Value.WrappedValue.Value as Array;
- int i = 0;
- foreach (object obj in array)
- {
- DataGridViewRow dgvr = dataGridView1.Rows[i];
- dgvr.Cells[2].Value = obj;
- i++;
- }
- }
- else
- {
- dataGridView1.Rows[index].Cells[2].Value = notification.Value.WrappedValue.Value;
- }
- }
- else
- {
- dataGridView1.Rows[index].Cells[2].Value = notification.Value.WrappedValue.Value;
- }
- }
- }
- private async void button2_Click(object sender, EventArgs e)
- {
- if (m_OpcUaClient != null)
- {
- RemoveAllSubscript( );
- if (button2.BackColor != Color.LimeGreen)
- {
- button2.BackColor = Color.LimeGreen;
- // 判断当前的选择
- if (string.IsNullOrEmpty( textBox_nodeId.Text )) return;
-
- ReferenceDescriptionCollection references;
- try
- {
- references = await Task.Run( ( ) =>
- {
- return GetReferenceDescriptionCollection( new NodeId( textBox_nodeId.Text ) );
- } );
- }
- catch (Exception exception)
- {
- ClientUtils.HandleException( Text, exception );
- return;
- }
- subNodeIds = new List<string>( );
- if (references?.Count > 0)
- {
- isSingleValueSub = false;
- // 获取所有要订阅的子节点
- for (int ii = 0; ii < references.Count; ii++)
- {
- ReferenceDescription target = references[ii];
- subNodeIds.Add( ((NodeId)target.NodeId).ToString( ) );
- }
- }
- else
- {
- isSingleValueSub = true;
- // 子节点没有数据的情况
- subNodeIds.Add( textBox_nodeId.Text );
- }
- m_OpcUaClient.AddSubscription( "subTest", subNodeIds.ToArray( ), SubCallBack );
- }
- else
- {
- button2.BackColor = SystemColors.Control;
- }
- }
- }
- #endregion
- #region 点击了表格修改数据
- private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
- {
- if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value is BuiltInType builtInType)
- {
- dynamic value = null;
- if (dataGridView1.Rows[e.RowIndex].Tag is NodeId nodeId)
- {
- // 节点
- try
- {
- value = GetValueFromString(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(), builtInType);
- }
- catch
- {
- MessageBox.Show("Invalid Input Value");
- return;
- }
- if (!m_OpcUaClient.WriteNode(nodeId.ToString(), value))
- {
- MessageBox.Show("Failed to write value");
- }
- }
- else
- {
- // 点击了数组修改
- IList<string> list = new List<string>();
- for (int jj = 0; jj < dataGridView1.RowCount; jj++)
- {
- list.Add(dataGridView1.Rows[jj].Cells[e.ColumnIndex].Value.ToString());
- }
-
- try
- {
- value = GetArrayValueFromString(list, builtInType);
- }
- catch(Exception ex)
- {
- MessageBox.Show("Invalid Input Value: " + ex.Message);
- return;
- }
- if (!m_OpcUaClient.WriteNode(textBox_nodeId.Text, value))
- {
- MessageBox.Show("Failed to write value");
- }
- }
- }
- else
- {
- MessageBox.Show("Invalid data type");
- }
- //MessageBox.Show(
- // "Type:" + dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.GetType().ToString() + Environment.NewLine +
- // "Value:" + dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
- }
-
- private dynamic GetValueFromString(string value, BuiltInType builtInType)
- {
- switch(builtInType)
- {
- case BuiltInType.Boolean:
- {
- return bool.Parse(value);
- }
- case BuiltInType.Byte:
- {
- return byte.Parse(value);
- }
- case BuiltInType.DateTime:
- {
- return DateTime.Parse(value);
- }
- case BuiltInType.Double:
- {
- return double.Parse(value);
- }
- case BuiltInType.Float:
- {
- return float.Parse(value);
- }
- case BuiltInType.Guid:
- {
- return Guid.Parse(value);
- }
- case BuiltInType.Int16:
- {
- return short.Parse(value);
- }
- case BuiltInType.Int32:
- {
- return int.Parse(value);
- }
- case BuiltInType.Int64:
- {
- return long.Parse(value);
- }
- case BuiltInType.Integer:
- {
- return int.Parse(value);
- }
- case BuiltInType.LocalizedText:
- {
- return value;
- }
- case BuiltInType.SByte:
- {
- return sbyte.Parse(value);
- }
- case BuiltInType.String:
- {
- return value;
- }
- case BuiltInType.UInt16:
- {
- return ushort.Parse(value);
- }
- case BuiltInType.UInt32:
- {
- return uint.Parse(value);
- }
- case BuiltInType.UInt64:
- {
- return ulong.Parse(value);
- }
- case BuiltInType.UInteger:
- {
- return uint.Parse(value);
- }
- default:throw new Exception("Not supported data type");
- }
- }
-
- private dynamic GetArrayValueFromString(IList<string> values, BuiltInType builtInType)
- {
- switch (builtInType)
- {
- case BuiltInType.Boolean:
- {
- bool[] result = new bool[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = bool.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.Byte:
- {
- byte[] result = new byte[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = byte.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.DateTime:
- {
- DateTime[] result = new DateTime[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = DateTime.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.Double:
- {
- double[] result = new double[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = double.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.Float:
- {
- float[] result = new float[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = float.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.Guid:
- {
- Guid[] result = new Guid[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = Guid.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.Int16:
- {
- short[] result = new short[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = short.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.Int32:
- {
- int[] result = new int[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = int.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.Int64:
- {
- long[] result = new long[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = long.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.Integer:
- {
- int[] result = new int[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = int.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.LocalizedText:
- {
- return values.ToArray();
- }
- case BuiltInType.SByte:
- {
- sbyte[] result = new sbyte[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = sbyte.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.String:
- {
- return values.ToArray();
- }
- case BuiltInType.UInt16:
- {
- ushort[] result = new ushort[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = ushort.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.UInt32:
- {
- uint[] result = new uint[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = uint.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.UInt64:
- {
- ulong[] result = new ulong[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = ulong.Parse(values[i]);
- }
- return result;
- }
- case BuiltInType.UInteger:
- {
- uint[] result = new uint[values.Count];
- for (int i = 0; i < values.Count; i++)
- {
- result[i] = uint.Parse(values[i]);
- }
- return result;
- }
- default: throw new Exception("Not supported data type");
- }
- }
- private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
- {
- if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value is BuiltInType builtInType)
- {
- if (
- builtInType == BuiltInType.Boolean ||
- builtInType == BuiltInType.Byte ||
- builtInType == BuiltInType.DateTime ||
- builtInType == BuiltInType.Double ||
- builtInType == BuiltInType.Float ||
- builtInType == BuiltInType.Guid ||
- builtInType == BuiltInType.Int16 ||
- builtInType == BuiltInType.Int32 ||
- builtInType == BuiltInType.Int64 ||
- builtInType == BuiltInType.Integer ||
- builtInType == BuiltInType.LocalizedText ||
- builtInType == BuiltInType.SByte ||
- builtInType == BuiltInType.String ||
- builtInType == BuiltInType.UInt16 ||
- builtInType == BuiltInType.UInt32 ||
- builtInType == BuiltInType.UInt64 ||
- builtInType == BuiltInType.UInteger
- )
- {
- }
- else
- {
- e.Cancel = true;
- MessageBox.Show("Not support the Type of modify value!");
- return;
- }
- }
- else
- {
- e.Cancel = true;
- MessageBox.Show("Not support the Type of modify value!");
- return;
- }
- if (!dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 2].Value.ToString().Contains("Write"))
- {
- e.Cancel = true;
- MessageBox.Show("Not support the access of modify value!");
- }
- }
- #endregion
- #region Browser New Method
- private NodeId[] m_referenceTypeIds;
- private NodeId m_rootId;
- private Session m_session;
- private Dictionary<NodeId, string> m_typeImageMapping;
- private ViewDescription m_view;
- /// <summary>
- /// The view to use.
- /// </summary>
- public ViewDescription View
- {
- get
- {
- return m_view;
- }
- set
- {
- m_view = value;
- }
- }
- /// <summary>
- /// Initializes the control with a root and a set of hierarchial reference types to follow.
- /// </summary>
- /// <param name="session">The session.</param>
- /// <param name="rootId">The root of the hierarchy to browse.</param>
- /// <param name="referenceTypeIds">The reference types to follow.</param>
- public void Initialize(
- Session session,
- NodeId rootId,
- params NodeId[] referenceTypeIds )
- {
- // set default root.
- if (NodeId.IsNull( rootId ))
- {
- rootId = Opc.Ua.ObjectIds.ObjectsFolder;
- }
- // set default reference type.
- if (referenceTypeIds == null)
- {
- referenceTypeIds = new NodeId[] { Opc.Ua.ReferenceTypeIds.HierarchicalReferences };
- }
- m_rootId = rootId;
- m_referenceTypeIds = referenceTypeIds;
- // save session.
- ChangeSession( session, true );
- }
- /// <summary>
- /// Changes the session used by the control.
- /// </summary>
- private void ChangeSession( Session session, bool refresh )
- {
- m_session = session;
- BrowseNodesTV.Nodes.Clear( );
- if (m_session != null)
- {
- INode node = m_session.NodeCache.Find( m_rootId );
- if (node != null)
- {
- TreeNode root = new TreeNode( node.ToString( ) );
- root.ImageKey = GetImageIndex( m_session, node.NodeClass, node.TypeDefinitionId, false );
- root.SelectedImageKey = GetImageIndex( m_session, node.NodeClass, node.TypeDefinitionId, true );
- ReferenceDescription reference = new ReferenceDescription( );
- reference.NodeId = node.NodeId;
- reference.NodeClass = node.NodeClass;
- reference.BrowseName = node.BrowseName;
- reference.DisplayName = node.DisplayName;
- reference.TypeDefinition = node.TypeDefinitionId;
- root.Tag = reference;
- root.Nodes.Add( new TreeNode( ) );
- BrowseNodesTV.Nodes.Add( root );
- root.Expand( );
- BrowseNodesTV.SelectedNode = root;
- }
- }
- }
- /// <summary>
- /// Handles the BeforeExpand event of the BrowseTV control.
- /// </summary>
- private async Task BrowseTV_BeforeExpand( object sender, TreeViewCancelEventArgs e )
- {
- try
- {
- e.Node.Nodes.Clear( );
- e.Node.Nodes.Add( new TreeNode( "Browsering...", 7, 7 ) );
- TreeNode[] listNode = await Task.Run( ( ) =>
- {
- Console.WriteLine( "BrowseTV_BeforeExpand, m_referenceTypeIds length: " + m_referenceTypeIds.Length );
- ReferenceDescription reference = (ReferenceDescription)e.Node.Tag;
- // build list of references to browse.
- BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection( );
- for (int ii = 0; ii < m_referenceTypeIds.Length; ii++)
- {
- BrowseDescription nodeToBrowse = new BrowseDescription( );
- nodeToBrowse.NodeId = m_rootId;
- nodeToBrowse.BrowseDirection = BrowseDirection.Forward;
- nodeToBrowse.ReferenceTypeId = m_referenceTypeIds[ii];
- nodeToBrowse.IncludeSubtypes = true;
- nodeToBrowse.NodeClassMask = 0;
- nodeToBrowse.ResultMask = (uint)BrowseResultMask.All;
- if (reference != null)
- {
- nodeToBrowse.NodeId = (NodeId)reference.NodeId;
- }
- nodesToBrowse.Add( nodeToBrowse );
- }
- // add the childen to the control.
- SortedDictionary<ExpandedNodeId, TreeNode> dictionary = new SortedDictionary<ExpandedNodeId, TreeNode>( );
- Console.WriteLine( " ClientUtils.Browse... " );
- ReferenceDescriptionCollection references = ClientUtils.Browse( m_session, View, nodesToBrowse, false );
- Console.WriteLine( " ClientUtils.Browse: " + (references == null ? "NULL" : "Count:" + references.Count) );
- for (int ii = 0; references != null && ii < references.Count; ii++)
- {
- reference = references[ii];
- // ignore out of server references.
- if (reference.NodeId.IsAbsolute)
- {
- continue;
- }
- if (dictionary.ContainsKey( reference.NodeId ))
- {
- continue;
- }
- TreeNode child = new TreeNode( reference.ToString( ) );
- if (!checkBox1.Checked)
- {
- if (GetReferenceDescriptionCollection( (NodeId)reference.NodeId ).Count > 0)
- {
- child.Nodes.Add( new TreeNode( ) );
- }
- }
- else
- {
- child.Nodes.Add( new TreeNode( ) );
- }
- child.Tag = reference;
- if (!reference.TypeDefinition.IsAbsolute)
- {
- try
- {
- if (!m_typeImageMapping.ContainsKey( (NodeId)reference.TypeDefinition ))
- {
- DataValue value = m_session.ReadValue( (NodeId)reference.NodeId );
- m_typeImageMapping[(NodeId)reference.TypeDefinition] = GetImageIndex( value );
- }
- }
- catch (Exception exception)
- {
- Utils.LogError( exception, "Error loading image." );
- }
- }
- string index = "ClassIcon";
- if (!m_typeImageMapping.TryGetValue( (NodeId)reference.TypeDefinition, out index ))
- {
- child.ImageKey = GetImageIndex( m_session, reference.NodeClass, reference.TypeDefinition, false );
- child.SelectedImageKey = GetImageIndex( m_session, reference.NodeClass, reference.TypeDefinition, true );
- }
- else
- {
- child.ImageKey = index;
- child.SelectedImageKey = index;
- }
- dictionary[reference.NodeId] = child;
- }
- // add nodes to tree.
- List<TreeNode> list = new List<TreeNode>( );
- foreach (TreeNode node in dictionary.Values)
- {
- list.Add( node );
- }
- return list.ToArray( );
- } );
- e.Node.Nodes.Clear( );
- e.Node.Nodes.AddRange( listNode.ToArray( ) );
- }
- catch (Exception exception)
- {
- ClientUtils.HandleException( this.Text, exception );
- }
- if (checkBox2.Checked)
- {
- await Task.Run( ( ) =>
- {
- List<TreeNodeOpcValue> list = new List<TreeNodeOpcValue>( );
- foreach (TreeNode node in e.Node.Nodes)
- {
- if (node.Tag is ReferenceDescription reference)
- {
- list.Add( new TreeNodeOpcValue( ) { Node = node, NodeId = (NodeId)reference.NodeId } );
- }
- }
- try
- {
- m_session.ReadValues( list.Select( m => m.NodeId ).ToList( ), out DataValueCollection collections, out IList<ServiceResult> errors );
- Invoke( new Action( ( ) =>
- {
- for (int i = 0; i < list.Count; i++)
- {
- if (Opc.Ua.StatusCode.IsGood( errors[i].StatusCode ))
- {
- list[i].Value = collections[i];
- list[i].Node.ImageKey = GetImageIndex( collections[i] );
- list[i].Node.SelectedImageKey = GetImageIndex( collections[i] );
- }
- }
- } ) );
- }
- catch (Exception ex)
- {
- Utils.Trace( ex, "Error loading image." );
- }
- } );
- }
- }
- #endregion
- }
- public class TreeNodeOpcValue
- {
- public TreeNode Node { get; set; }
- public NodeId NodeId { get; set; }
- public DataValue Value { get; set; }
- }
- }
|