public cacheDBTest() { string json_config = @"{ nodesDatabase:{ isInMemory:true, filename:'pollo.dat', juno:'bul' }, nodesLoader:{ filename:'nodeset.xml' } }"; j = JObject.Parse(json_config); cDB = new cacheDB(j); Opc.Ua.NamespaceTable nt = new Opc.Ua.NamespaceTable(); nt.Append("http://www.siemens.com/simatic-s7-opcua"); UANodeConverter ua = new UANodeConverter(j, nt); ua.fillCacheDB(cDB); }
/// <summary> /// Updates the namespace table with URI used in the relative path. /// </summary> /// <param name="currentTable">The current table.</param> /// <param name="targetTable">The target table.</param> public void UpdateNamespaceTable(NamespaceTable currentTable, NamespaceTable targetTable) { // build mapping table. int[] mappings = new int[currentTable.Count]; mappings[0] = 0; if (mappings.Length > 0) { mappings[1] = 1; } // ensure a placeholder for the local namespace. if (targetTable.Count <= 1) { targetTable.Append("---"); } string[] uris = new string[mappings.Length]; for (int ii = 2; ii < mappings.Length; ii++) { uris[ii] = currentTable.GetString((uint)ii); if (uris[ii] != null) { mappings[ii] = targetTable.GetIndex(uris[ii]); } } // update each element. foreach (Element element in m_elements) { // check reference type name. QualifiedName qname = element.ReferenceTypeName; if (qname != null && qname.NamespaceIndex > 1) { if (qname.NamespaceIndex < mappings.Length) { if (mappings[qname.NamespaceIndex] == -1) { mappings[qname.NamespaceIndex] = targetTable.GetIndexOrAppend(uris[qname.NamespaceIndex]); } } } // check target name. qname = element.TargetName; if (qname != null && qname.NamespaceIndex > 1) { if (qname.NamespaceIndex < mappings.Length) { if (mappings[qname.NamespaceIndex] == -1) { mappings[qname.NamespaceIndex] = targetTable.GetIndexOrAppend(uris[qname.NamespaceIndex]); } } } } }
/// <summary> /// Returns a namespace table with all of the URIs defined. /// </summary> /// <remarks> /// This table is was used to create any relative paths in the model design. /// </remarks> public static NamespaceTable GetNamespaceTable() { FieldInfo[] fields = typeof(Namespaces).GetFields(BindingFlags.Public | BindingFlags.Static); NamespaceTable namespaceTable = new NamespaceTable(); foreach (FieldInfo field in fields) { string namespaceUri = (string)field.GetValue(typeof(Namespaces)); if (namespaceTable.GetIndex(namespaceUri) == -1) { namespaceTable.Append(namespaceUri); } } return namespaceTable; }
/// <summary> /// Updates the nodeset string tables and returns a NodeId that references those tables. /// </summary> /// <param name="nodeId">The node identifier.</param> /// <param name="targetNamespaceUris">The target namespace URIs.</param> /// <param name="targetServerUris">The target server URIs.</param> /// <param name="sourceNamespaceUris">The source namespace URIs.</param> /// <param name="sourceServerUris">The source server URIs.</param> /// <returns>A NodeId that references those tables.</returns> private static ExpandedNodeId Translate( ExpandedNodeId nodeId, NamespaceTable targetNamespaceUris, StringTable targetServerUris, NamespaceTable sourceNamespaceUris, StringTable sourceServerUris) { if (targetNamespaceUris == null) { throw new ArgumentNullException("targetNamespaceUris"); } if (sourceNamespaceUris == null) { throw new ArgumentNullException("sourceNamespaceUris"); } if (nodeId.ServerIndex > 0) { if (targetServerUris == null) { throw new ArgumentNullException("targetServerUris"); } if (sourceServerUris == null) { throw new ArgumentNullException("sourceServerUris"); } } if (NodeId.IsNull(nodeId)) { return(nodeId); } if (!nodeId.IsAbsolute) { return(Translate((NodeId)nodeId, targetNamespaceUris, sourceNamespaceUris)); } string namespaceUri = nodeId.NamespaceUri; if (nodeId.ServerIndex > 0) { if (String.IsNullOrEmpty(namespaceUri)) { namespaceUri = sourceNamespaceUris.GetString(nodeId.NamespaceIndex); } string serverUri = sourceServerUris.GetString(nodeId.ServerIndex); int index = targetServerUris.GetIndex(serverUri); if (index == -1) { index = targetServerUris.Append(serverUri); } return(new ExpandedNodeId(new NodeId(nodeId.Identifier, 0), namespaceUri, (uint)index)); } ushort namespaceIndex = 0; if (!String.IsNullOrEmpty(namespaceUri)) { int index = targetNamespaceUris.GetIndex(namespaceUri); if (index == -1) { index = targetNamespaceUris.Append(namespaceUri); } namespaceIndex = (ushort)index; } return(new NodeId(nodeId.Identifier, namespaceIndex)); }
/// <summary> /// Creates an decoder to restore Variant values. /// </summary> private XmlDecoder CreateDecoder(ISystemContext context, XmlElement source) { ServiceMessageContext messageContext = new ServiceMessageContext(); messageContext.NamespaceUris = context.NamespaceUris; messageContext.ServerUris = context.ServerUris; messageContext.Factory = context.EncodeableFactory; XmlDecoder decoder = new XmlDecoder(source, messageContext); NamespaceTable namespaceUris = new NamespaceTable(); if (NamespaceUris != null) { for (int ii = 0; ii < NamespaceUris.Length; ii++) { namespaceUris.Append(NamespaceUris[ii]); } } StringTable serverUris = new StringTable(); if (ServerUris != null) { serverUris.Append(context.ServerUris.GetString(0)); for (int ii = 0; ii < ServerUris.Length; ii++) { serverUris.Append(ServerUris[ii]); } } decoder.SetMappingTables(namespaceUris, serverUris); return decoder; }
/// <summary> /// Updates the application after connecting to or disconnecting from the server. /// </summary> private void Server_ConnectComplete(object sender, EventArgs e) { try { m_session = ConnectServerCTRL.Session; if (m_session == null) { StartBTN.Enabled = false; return; } // set a suitable initial state. if (m_session != null && !m_connectedOnce) { m_connectedOnce = true; } // this client has built-in knowledge of the information model used by the server. NamespaceTable wellKnownNamespaceUris = new NamespaceTable(); wellKnownNamespaceUris.Append(Namespaces.Methods); string[] browsePaths = new string[] { "1:My Process/1:State", "1:My Process", "1:My Process/1:Start" }; List<NodeId> nodes = ClientUtils.TranslateBrowsePaths( m_session, ObjectIds.ObjectsFolder, wellKnownNamespaceUris, browsePaths); // subscribe to the state if available. if (nodes.Count > 0 && !NodeId.IsNull(nodes[0])) { m_subscription = new Subscription(); m_subscription.PublishingEnabled = true; m_subscription.PublishingInterval = 1000; m_subscription.Priority = 1; m_subscription.KeepAliveCount = 10; m_subscription.LifetimeCount = 20; m_subscription.MaxNotificationsPerPublish = 1000; m_session.AddSubscription(m_subscription); m_subscription.Create(); MonitoredItem monitoredItem = new MonitoredItem(); monitoredItem.StartNodeId = nodes[0]; monitoredItem.AttributeId = Attributes.Value; monitoredItem.Notification += new MonitoredItemNotificationEventHandler(MonitoredItem_Notification); m_subscription.AddItem(monitoredItem); m_subscription.ApplyChanges(); } // save the object/method if (nodes.Count > 2) { m_objectNode = nodes[1]; m_methodNode = nodes[2]; } InitialStateTB.Text = "1"; FinalStateTB.Text = "100"; StartBTN.Enabled = true; } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
private void BoilerCB_SelectedIndexChanged(object sender, EventArgs e) { try { if (m_session == null) { return; } if (m_subscription != null) { m_session.RemoveSubscription(m_subscription); m_subscription = null; } ReferenceDescription boiler = (ReferenceDescription)BoilerCB.SelectedItem; if (boiler == null) { return; } m_subscription = new Subscription(); m_subscription.PublishingEnabled = true; m_subscription.PublishingInterval = 1000; m_subscription.Priority = 1; m_subscription.KeepAliveCount = 10; m_subscription.LifetimeCount = 20; m_subscription.MaxNotificationsPerPublish = 1000; m_session.AddSubscription(m_subscription); m_subscription.Create(); NamespaceTable wellKnownNamespaceUris = new NamespaceTable(); wellKnownNamespaceUris.Append(Namespaces.Boiler); string[] browsePaths = new string[] { "1:PipeX001/1:FTX001/1:Output", "1:DrumX001/1:LIX001/1:Output", "1:PipeX002/1:FTX002/1:Output", "1:LCX001/1:SetPoint", }; List<NodeId> nodes = ClientUtils.TranslateBrowsePaths( m_session, (NodeId)boiler.NodeId, wellKnownNamespaceUris, browsePaths); Control[] controls = new Control[] { InputPipeFlowTB, DrumLevelTB, OutputPipeFlowTB, DrumLevelSetPointTB }; for (int ii = 0; ii < nodes.Count; ii++) { controls[ii].Text = "---"; if (nodes[ii] != null) { MonitoredItem monitoredItem = new MonitoredItem(); monitoredItem.StartNodeId = nodes[ii]; monitoredItem.AttributeId = Attributes.Value; monitoredItem.Handle = controls[ii]; monitoredItem.Notification += new MonitoredItemNotificationEventHandler(MonitoredItem_Notification); m_subscription.AddItem(monitoredItem); } } m_subscription.ApplyChanges(); } catch (Exception exception) { ClientUtils.HandleException(this.Text, exception); } }
/// <summary> /// Connects to a server. /// </summary> private void Server_ConnectMI_Click(object sender, EventArgs e) { try { // disconnect any existing session. Server_DisconnectMI_Click(sender, e); InitialStateTB.Text = "1"; FinalStateTB.Text = "100"; // create the session. EndpointDescription endpointDescription = SelectEndpoint(); EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(m_configuration); ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration); m_session = Session.Create( m_configuration, endpoint, true, m_configuration.ApplicationName, 60000, null, null); // set up keep alive callback. m_session.KeepAliveInterval = 2000; m_session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive); // this client has built-in knowledge of the information model used by the server. NamespaceTable wellKnownNamespaceUris = new NamespaceTable(); wellKnownNamespaceUris.Append(Namespaces.Methods); string[] browsePaths = new string[] { "1:My Process/1:State", "1:My Process", "1:My Process/1:Start" }; List<NodeId> nodes = FormUtils.TranslateBrowsePaths( m_session, ObjectIds.ObjectsFolder, wellKnownNamespaceUris, browsePaths); // subscribe to the state if available. if (nodes.Count > 0 && !NodeId.IsNull(nodes[0])) { m_subscription = new Subscription(); m_subscription.PublishingEnabled = true; m_subscription.PublishingInterval = 1000; m_subscription.Priority = 1; m_subscription.KeepAliveCount = 10; m_subscription.LifetimeCount = 20; m_subscription.MaxNotificationsPerPublish = 1000; m_session.AddSubscription(m_subscription); m_subscription.Create(); MonitoredItem monitoredItem = new MonitoredItem(); monitoredItem.StartNodeId = nodes[0]; monitoredItem.AttributeId = Attributes.Value; monitoredItem.Notification += new MonitoredItemNotificationEventHandler(MonitoredItem_Notification); m_subscription.AddItem(monitoredItem); m_subscription.ApplyChanges(); } // save the object/method if (nodes.Count > 2) { m_objectNode = nodes[1]; m_methodNode = nodes[2]; } ConnectedLB.Text = "Connected"; ServerUrlLB.Text = endpointDescription.EndpointUrl; LastKeepAliveTimeLB.Text = "---"; } catch (Exception exception) { MessageBox.Show(exception.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } }