Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
		/// <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);
			}
		}
Ejemplo n.º 6
0
        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;
            }
        }
Ejemplo n.º 7
0
        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();
        }
Ejemplo n.º 8
0
        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)));
        }
Ejemplo n.º 9
0
        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);
            }
        }
Ejemplo n.º 10
0
        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)));
        }