private void ImportOPCChannels(IOPCBrowseServerAddressSpace srv, TreeNodeCollection root) { srv.QueryOrganization(out OPCNAMESPACETYPE nsType); OpcRcw.Da.IEnumString es; if (nsType == OPCNAMESPACETYPE.OPC_NS_HIERARCHIAL) { try { srv.BrowseOPCItemIDs(OPCBROWSETYPE.OPC_BRANCH, string.Empty, 0, 0, out es); } catch (COMException) { return; } int fetched; do { string[] tmp = new string[100]; es.RemoteNext(tmp.Length, tmp, out fetched); for (int i = 0; i < fetched; i++) { try { srv.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_DOWN, tmp[i]); } catch (Exception e) { EventscadaException?.Invoke(GetType().Name, string.Format("OPC server failed to handle OPC_BROWSE_DOWN request for item '{0}' ({1})", tmp[i], e.Message)); continue; }; TreeNode node = root.Add(tmp[i]); ImportOPCChannels(srv, node.Nodes); try { srv.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_UP, string.Empty); } catch (Exception e) { EventscadaException?.Invoke(GetType().Name, string.Format("OPC server failed to handle OPC_BROWSE_UP request for item '{0}' ({1})", tmp[i], e.Message)); continue; }; } } while (fetched > 0); try { srv.BrowseOPCItemIDs(OPCBROWSETYPE.OPC_LEAF, string.Empty, 0, 0, out es); } catch (COMException) { return; } IterateOPCItems(srv, root, es); } else if (nsType == OPCNAMESPACETYPE.OPC_NS_FLAT) { try { srv.BrowseOPCItemIDs(OPCBROWSETYPE.OPC_FLAT, string.Empty, 0, 0, out es); } catch (COMException) { return; } IterateOPCItems(srv, root, es); } es = null; }
public void Connect(string clsidOPCserver) { this.Disconnect(); Type typeFromProgID = Type.GetTypeFromProgID(clsidOPCserver); if (typeFromProgID == null) { Marshal.ThrowExceptionForHR(-1073479663); } this.OPCserverObj = Activator.CreateInstance(typeFromProgID); this.ifServer = (IOPCServer)this.OPCserverObj; if (this.ifServer == null) { Marshal.ThrowExceptionForHR(-2147220992); } this.ifCommon = (IOPCCommon)this.OPCserverObj; this.ifBrowse = (IOPCBrowseServerAddressSpace)this.ifServer; this.ifItmProps = (IOPCItemProperties)this.ifServer; this.cpointcontainer = (IConnectionPointContainer)this.OPCserverObj; this.AdviseIOPCShutdown(); }
private void OnConnect(object sender, EventArgs e) { string serverName = serversComboBox.Text; Type t; if (localServerButton.Checked) { t = Type.GetTypeFromProgID(serverName); } else { t = Type.GetTypeFromProgID(serverName, serverTextBox.Text); } object obj = Activator.CreateInstance(t); IOPCBrowseServerAddressSpace srv = (IOPCBrowseServerAddressSpace)obj; //IntPtr statusPtr; //server.GetStatus(out statusPtr); //OPCSERVERSTATUS status = (OPCSERVERSTATUS)Marshal.PtrToStructure(statusPtr, typeof(OPCSERVERSTATUS)); //statusPtr = IntPtr.Zero; if (srv != null) { try { for (; ;) { srv.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_UP, ""); } } catch (COMException) { }; channelsTree.Nodes.Clear(); ImportOPCChannels(srv, channelsTree.Nodes); } channelsTree.AfterCheck += new TreeViewEventHandler(channelsTree_AfterCheck); groupBox1.Enabled = false; connectButton.Enabled = false; }
public bool Connect() { if (_opcServerObj != null) { Dispose(); } if (string.IsNullOrEmpty(_serverIP)) { _serverIP = null; } Guid cid; Type svrComponenttype = Guid.TryParse(_clsidOPCserver, out cid) ? Type.GetTypeFromCLSID(cid, _serverIP, false) : Type.GetTypeFromProgID(_clsidOPCserver, _serverIP, false); if (svrComponenttype == null) { return(false); } try { _opcServerObj = Activator.CreateInstance(svrComponenttype); } catch (Exception err) { if (err.Message != null) { } return(false); } _opcServer = (IOPCServer)_opcServerObj; _opcProp = (IOPCItemProperties)_opcServerObj; _opcBrowser = (IOPCBrowseServerAddressSpace)_opcServerObj; Guid sinkguid = typeof(IOPCShutdown).GUID; ((IConnectionPointContainer)_opcServerObj).FindConnectionPoint(ref sinkguid, out _shutDownPoint); if (_shutDownPoint == null) { return(false); } try { _shutDownPoint.Advise(this, out _shutDownCookie); } catch (COMException err) { _opcServerObj = null; _opcServer = null; _shutDownPoint = null; return(false); } if (_metaGroups.Count > 0 && _groups.Count == 0) { foreach (var metagrp in _metaGroups) { var grp = AddGroup(metagrp.Name, metagrp.ID, metagrp.UpdateRate, metagrp.DeadBand, metagrp.Active); if (grp != null) { grp.AddItems(_dataServer.MetaDataList); } } } return(true); }
/// <summary> /// Получает дерево тегов OPC DA сервера /// </summary> /// <param name="parentDirectory">При первом вызове передать null - /// будеть создана корневая директория</param> /// <param name="server"></param> void BuildTreeTags(ref OpcDaDirectory parentDirectory, IOPCBrowseServerAddressSpace server) { opcproxy.IEnumString ptrEnum; uint cnt; string strName; string szItemID; if (parentDirectory == null) { parentDirectory = new OpcDaDirectory(); // Создаём корневую директорию } // Получаем все теги server.BrowseOPCItemIDs(tagOPCBROWSETYPE.OPC_LEAF, "", (ushort)VarEnum.VT_EMPTY, 0, out ptrEnum); ptrEnum.RemoteNext(1, out strName, out cnt); while (cnt != 0) { // получаем полный идентификатор тега server.GetItemID(strName, out szItemID); parentDirectory.Items.Add(new OpcDaTag(szItemID, strName, parentDirectory)); ptrEnum.RemoteNext(1, out strName, out cnt); } // Получем директории server.BrowseOPCItemIDs(tagOPCBROWSETYPE.OPC_BRANCH, "", 1, 0, out ptrEnum); ptrEnum.RemoteNext(1, out strName, out cnt); while (cnt != 0) { server.ChangeBrowsePosition(tagOPCBROWSEDIRECTION.OPC_BROWSE_DOWN, strName); var childDirectory = new OpcDaDirectory(strName, parentDirectory); parentDirectory.Items.Add(childDirectory); BuildTreeTags(ref childDirectory, server); server.ChangeBrowsePosition(tagOPCBROWSEDIRECTION.OPC_BROWSE_UP, strName); ptrEnum.RemoteNext(1, out strName, out cnt); } }
public void Disconnect() { if( ! (shutdowncpoint == null) ) { if( shutdowncookie != 0 ) { shutdowncpoint.Unadvise( shutdowncookie ); shutdowncookie = 0; } int rc = Marshal.ReleaseComObject( shutdowncpoint ); shutdowncpoint = null; } cpointcontainer = null; ifBrowse = null; ifItmProps = null; ifCommon = null; ifServer = null; if( ! (OPCserverObj == null) ) { int rc = Marshal.ReleaseComObject( OPCserverObj ); OPCserverObj = null; } }
public void Connect( string clsidOPCserver ) { Disconnect(); Type typeofOPCserver = Type.GetTypeFromProgID( clsidOPCserver ); if( typeofOPCserver == null ) Marshal.ThrowExceptionForHR( HRESULTS.OPC_E_NOTFOUND ); OPCserverObj = Activator.CreateInstance( typeofOPCserver ); ifServer = (IOPCServer) OPCserverObj; if( ifServer == null ) Marshal.ThrowExceptionForHR( HRESULTS.CONNECT_E_NOCONNECTION ); // connect all interfaces ifCommon = (IOPCCommon) OPCserverObj; ifBrowse = (IOPCBrowseServerAddressSpace) ifServer; ifItmProps = (IOPCItemProperties) ifServer; cpointcontainer = (UCOMIConnectionPointContainer) OPCserverObj; AdviseIOPCShutdown(); }
private BrowseElement[] GetElements(int elementsFound, ItemIdentifier itemID, BrowseFilters filters, bool branches, ref BrowsePosition position) { EnumString enumString = null; if (position == null) { IOPCBrowseServerAddressSpace iOPCBrowseServerAddressSpace = (IOPCBrowseServerAddressSpace)m_server; OPCNAMESPACETYPE pNameSpaceType = OPCNAMESPACETYPE.OPC_NS_HIERARCHIAL; try { iOPCBrowseServerAddressSpace.QueryOrganization(out pNameSpaceType); } catch (Exception e) { throw Interop.CreateException("IOPCBrowseServerAddressSpace.QueryOrganization", e); } if (pNameSpaceType == OPCNAMESPACETYPE.OPC_NS_FLAT) { if (branches) { return(new BrowseElement[0]); } if (itemID != null && itemID.ItemName != null && itemID.ItemName.Length > 0) { throw new ResultIDException(ResultID.Da.E_UNKNOWN_ITEM_NAME); } } enumString = GetEnumerator(itemID?.ItemName, filters, branches, pNameSpaceType == OPCNAMESPACETYPE.OPC_NS_FLAT); } else { enumString = position.Enumerator; } ArrayList arrayList = new ArrayList(); BrowseElement browseElement = null; int num = 0; string[] array = null; if (position != null) { num = position.Index; array = position.Names; position = null; } do { if (array != null) { for (int i = num; i < array.Length; i++) { if (filters.MaxElementsReturned != 0 && filters.MaxElementsReturned == arrayList.Count + elementsFound) { position = new BrowsePosition(itemID, filters, enumString, branches); position.Names = array; position.Index = i; break; } browseElement = GetElement(itemID, array[i], filters, branches); if (browseElement == null) { break; } arrayList.Add(browseElement); } } if (position != null) { break; } array = enumString.Next(10); num = 0; }while (array != null && array.Length > 0); if (position == null) { enumString.Dispose(); } return((BrowseElement[])arrayList.ToArray(typeof(BrowseElement))); }
private EnumString GetEnumerator(string itemID, BrowseFilters filters, bool branches, bool flat) { IOPCBrowseServerAddressSpace iOPCBrowseServerAddressSpace = (IOPCBrowseServerAddressSpace)m_server; if (!flat) { string text = (itemID != null) ? itemID : ""; try { iOPCBrowseServerAddressSpace.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_TO, text); } catch { try { iOPCBrowseServerAddressSpace.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_DOWN, text); } catch { try { while (true) { iOPCBrowseServerAddressSpace.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_UP, string.Empty); } } catch { } string[] array = null; lock (m_separatorsLock) { array = ((m_separators == null) ? text.Split(m_separators) : text.Split(m_separators)); } for (int i = 0; i < array.Length; i++) { if (array[i] != null && array[i].Length != 0) { try { iOPCBrowseServerAddressSpace.ChangeBrowsePosition(OPCBROWSEDIRECTION.OPC_BROWSE_DOWN, array[i]); } catch { throw new ResultIDException(ResultID.Da.E_UNKNOWN_ITEM_NAME, "Cannot browse because the server is not compliant because it does not support the BROWSE_TO function."); } } } } } } try { IEnumString ppIEnumString = null; OPCBROWSETYPE dwBrowseFilterType = branches ? OPCBROWSETYPE.OPC_BRANCH : OPCBROWSETYPE.OPC_LEAF; if (flat) { dwBrowseFilterType = OPCBROWSETYPE.OPC_FLAT; } iOPCBrowseServerAddressSpace.BrowseOPCItemIDs(dwBrowseFilterType, (filters.ElementNameFilter != null) ? filters.ElementNameFilter : "", 0, 0, out ppIEnumString); return(new EnumString(ppIEnumString)); } catch { throw new ResultIDException(ResultID.Da.E_UNKNOWN_ITEM_NAME); } }
private BrowseElement[] GetElements(int elementsFound, ItemIdentifier itemID, BrowseFilters filters, bool branches, ref OpcCom.Da20.BrowsePosition position) { EnumString enumerator = null; if (position == null) { IOPCBrowseServerAddressSpace server = (IOPCBrowseServerAddressSpace)base.m_server; OPCNAMESPACETYPE pNameSpaceType = OPCNAMESPACETYPE.OPC_NS_HIERARCHIAL; try { server.QueryOrganization(out pNameSpaceType); } catch (Exception exception) { throw OpcCom.Interop.CreateException("IOPCBrowseServerAddressSpace.QueryOrganization", exception); } if ((pNameSpaceType == OPCNAMESPACETYPE.OPC_NS_FLAT) && branches) { return(new BrowseElement[0]); } enumerator = this.GetEnumerator((itemID != null) ? itemID.ItemName : null, filters, branches); } else { enumerator = position.Enumerator; } ArrayList list = new ArrayList(); BrowseElement element = null; int index = 0; string[] names = null; if (position != null) { index = position.Index; names = position.Names; position = null; } Label_0089: if (names != null) { for (int i = index; i < names.Length; i++) { if ((filters.MaxElementsReturned != 0) && (filters.MaxElementsReturned == (list.Count + elementsFound))) { position = new OpcCom.Da20.BrowsePosition(itemID, filters, enumerator, branches); position.Names = names; position.Index = i; break; } element = this.GetElement(names[i], filters, branches); if (element == null) { break; } list.Add(element); } } if (position == null) { names = enumerator.Next(10); index = 0; if ((names != null) && (names.Length > 0)) { goto Label_0089; } } if (position == null) { enumerator.Dispose(); } return((BrowseElement[])list.ToArray(typeof(BrowseElement))); }