Пример #1
0
        // connect to OPC server via ProgID
        public bool DoConnect(string progid)
        {
            try
            {
                theSrv.Connect(progid);
                Thread.Sleep(100);
                theSrv.SetClientName("DirectOPC " + thisprocess.Id);    // set my client name (exe+process no)

                SERVERSTATUS sts;
                theSrv.GetStatus(out sts);

                // get infos about OPC server
                StringBuilder sb = new StringBuilder(sts.szVendorInfo, 200);
                sb.AppendFormat(" ver:{0}.{1}.{2}", sts.wMajorVersion, sts.wMinorVersion, sts.wBuildNumber);
                //txtServerInfo.Text = sb.ToString();

                // set status bar text to show server state
                //sbpTimeStart.Text = DateTime.FromFileTime(sts.ftStartTime).ToString();
                //sbpStatus.Text = sts.eServerState.ToString();
            }
            catch (COMException)
            {
                //MessageBox.Show(this, "connect error!", "Exception", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(false);
            }
            return(true);
        }
Пример #2
0
        static void Main(string[] args)
        {
            string progID = args.Length > 0 ? args[0] : "Kepware.KEPServerEX.V5";

            OpcServer opcServer = new OpcServer();

            opcServer.Connect(progID);
            System.Threading.Thread.Sleep(500); // we are faster than some servers!
            SERVERSTATUS serverStatus = opcServer.GetStatus();

            Console.WriteLine("'{0}' vendor '{1}' version {2}.{3}.{4}",
                              progID,
                              serverStatus.szVendorInfo,
                              serverStatus.wMajorVersion, serverStatus.wMinorVersion, serverStatus.wBuildNumber);
            Console.WriteLine("State       : {0}", serverStatus.eServerState);
            Console.WriteLine("Start time  : {0}", DateTime.FromFileTime(serverStatus.ftStartTime));
            Console.WriteLine("Last update : {0}", DateTime.FromFileTime(serverStatus.ftLastUpdateTime));
            Console.WriteLine("Current time: {0}", DateTime.FromFileTime(serverStatus.ftCurrentTime));
            // Bandwith and group count valid only for this connection
            Console.WriteLine("Bandwidth   : {0}", serverStatus.dwBandWidth);
            Console.WriteLine("Group count : {0}", serverStatus.dwGroupCount);
            opcServer.GetLocaleID(out int lcid);
            Console.WriteLine("Locale ID: {0}", lcid);
            opcServer.Disconnect();
        }
Пример #3
0
        private OpcServerConnectResult DoConnect(string progid)
        {
            OpcServerConnectResult result = new OpcServerConnectResult {
                IsSuccess = false
            };

            try
            {
                _theSrv.Connect(progid);
                Thread.Sleep(100);
                _theSrv.SetClientName("DirectOPC " + Process.GetCurrentProcess().Id);   // set my client name (exe+process no)

                SERVERSTATUS sts;
                _theSrv.GetStatus(out sts);

                // get infos about OPC server
                StringBuilder sb = new StringBuilder(sts.szVendorInfo, 200);
                sb.AppendFormat(" ver:{0}.{1}.{2}", sts.wMajorVersion, sts.wMinorVersion, sts.wBuildNumber);
                result.ServerInfo = sb.ToString();

                // set status to show server state
                result.SbpTimeStart = DateTime.FromFileTime(sts.ftStartTime);
                result.SbpStatus    = sts.eServerState.ToString();
                result.IsSuccess    = true;
                return(result);
            }
            catch (COMException ex)
            {
                result.ErrorText = ex.Message;
                return(result);
            }
        }
Пример #4
0
        public void TestGetStatus01()
        {
            //testing --
            OpcServer opcServer         = new OpcServer();
            Accessor  opcServerAccessor = ReflectionAccessor.Wrap(opcServer);

            opcServerAccessor.SetField("ifServer", new OPCServerComClass());
            SERVERSTATUS serverStatus;

            //Test Procedure Call
            opcServer.GetStatus(out serverStatus);
            //Post Condition Check
        }
Пример #5
0
        // public OpcServer opcServer { get; set; }

        public static bool IsOpcServerConnectionAvailable()
        {
            if (opcServer == null)
            {
                opcServer = new OpcServer();
            }
            int          rtc             = 0;
            SERVERSTATUS objSERVERSTATUS = new SERVERSTATUS();
            bool         isConnected     = false;
            bool         isServerRunning = true;


            try
            {
                isConnected = opcServer.isConnectedDA;
                if (isConnected)
                {
                    opcServer.GetStatus(out objSERVERSTATUS);
                    isServerRunning = objSERVERSTATUS.eServerState == OpcServerState.Running;
                }


                if (!isConnected || !isServerRunning)
                {
                    opcMachineHost = GlobalValues.OPC_MACHINE_HOST;
                    opcServerName  = GlobalValues.OPC_SERVER_NAME;
                    rtc            = opcServer.Connect(opcMachineHost, opcServerName);
                }
            }
            catch (Exception errMsg)
            {
                Console.WriteLine("" + errMsg);
            }
            finally { }
            return(opcServer.isConnectedDA);
        }
Пример #6
0
        /// <summary>
        /// Returns whether Server is connected or not.
        /// </summary>
        /// <returns></returns>
        public bool IsOPCServerConnected()
        {
            string Function_Name = "IsOPCServerConnected";

            LogHelper.Trace(CLASS_NAME, Function_Name, "Function_Entered");
            bool ret = false;

            lock (m_opcDataDicObj)
            {
                if (m_opcSrvConnectFlag)
                {
                    SERVERSTATUS sts = new SERVERSTATUS();
                    sts.eServerState = OPCSERVERSTATE.OPC_STATUS_RUNNING;
                    try
                    {
                        m_OPCServer.GetStatus(out sts);

                        if (sts.eServerState != OPCSERVERSTATE.OPC_STATUS_RUNNING)
                        {
                            LogHelper.Info(CLASS_NAME, Function_Name, string.Format("status is {0}", sts.eServerState.ToString()));
                        }
                        //bool statusFlag = (sts.eServerState == OPCSERVERSTATE.OPC_STATUS_RUNNING) ? true : false;
                    }
                    catch (Exception localException)
                    {
                        LogHelper.Error(CLASS_NAME, Function_Name, localException);
                        //check is server is ok?
                        //if (localException.Message.Contains("The RPC server is unavailable."))
                        // Fixed issue - related to System Language, to avoid it used Error code
                        if (localException.Message.Contains("0x800706BA"))
                        {
                            m_opcSrvConnectFlag = false;
                        }
                    }
                }
                ret = m_opcSrvConnectFlag;
            }

            if (!ret)
            {
                LogHelper.Debug(CLASS_NAME, Function_Name, "OPC Server status is Down!");
            }
            LogHelper.Trace(CLASS_NAME, Function_Name, "Function_Exited");
            return(ret);
        }
Пример #7
0
        public static bool GetOPCServerStatus(OpcServer opcSer, out int opcSerStatus)
        {
            bool theGetServerStatusSucceed = false;

            opcSerStatus = -1;
            SERVERSTATUS theServerStatus;

            try
            {
                opcSerStatus = opcSer.GetStatus(out theServerStatus);

                if (HRESULTS.Succeeded(opcSerStatus))
                {
                    theGetServerStatusSucceed = true;
                }
            }
            catch (Exception err)
            {
                NLogHelper.ExceptionInfo(err, "GetOPCServerStatus error :{0}", err.Message);
            }

            return(theGetServerStatusSucceed);
        }
Пример #8
0
        static void Main(string[] args)
        {
            /*create array of readable Tags*/
            var Tags = new List <OPCClientItem>();

            Tags.Add(new OPCClientItem()
            {
                Name        = ".test",
                ClientHanle = 1
            });

            OpcServer server = new OpcServer();

            try
            {
                int transactionID = new Random().Next(1024, 65535);
                int cancelID      = 0;
                int updateRate    = 1000;

                /*connect to the OPC Server and check it's state*/
                server.Connect("Matrikon.OPC.Simulation.1");
                var serverStatus = new SERVERSTATUS();
                server.GetStatus(out serverStatus);
                if (serverStatus.eServerState == OPCSERVERSTATE.OPC_STATUS_RUNNING)
                {
                    /*create group of items*/
                    OpcGroup group = server.AddGroup("Group1", true, updateRate);
                    group.ReadCompleted += group_ReadCompleted;
                    List <OPCItemDef> items = new List <OPCItemDef>();
                    Tags.ToList()
                    .ForEach(x => items.Add(new OPCItemDef(x.Name, true, x.ClientHanle, VarEnum.VT_EMPTY)));

                    /* add items and collect their attributes*/
                    OPCItemResult[] itemAddResults = null;
                    group.AddItems(items.ToArray(), out itemAddResults);
                    for (int i = 0; i < itemAddResults.Length; i++)
                    {
                        OPCItemResult itemResult = itemAddResults[i];
                        OPCClientItem tag        = Tags[i];
                        tag.ServerHandle = itemResult.HandleServer;
                        tag.AccessRight  = (itemResult.AccessRights == OPCACCESSRIGHTS.OPC_READABLE) ? OPCClientItem.EAccessRight.ReadOnly : OPCClientItem.EAccessRight.ReadAndWrite;
                    }
                    ;

                    /*Refresh items in group*/
                    // group.Refresh2(OPCDATASOURCE.OPC_DS_DEVICE, transactionID, out cancelID);

                    /*Async read data for the group items*/
                    int[] serverHandles = new int[Tags.Count];
                    for (int i = 0; i < Tags.Count; i++)
                    {
                        serverHandles[i] = Tags[i].ServerHandle;
                    }
                    ;
                    OPCItemState[] itemsStateResult = null;
                    /*sync read*/
                    group.Read(OPCDATASOURCE.OPC_DS_DEVICE, serverHandles, out itemsStateResult);
                    Console.WriteLine("Sync read:");
                    for (int i = 0; i < itemsStateResult.Length; i++)
                    {
                        OPCItemState itemResult = itemsStateResult[i];
                        Console.WriteLine(" -> item:{0}; value:{1}; timestamp{2}; qualituy:{3}", Tags[i].Name, itemResult.DataValue.ToString(), itemResult.TimeStamp, itemResult.Quality);
                    }
                    ;

                    /*sync write*/
                    object[] values       = new object[Tags.Count];
                    int[]    resultErrors = new int[Tags.Count];
                    values[0] = (object)256;
                    group.Write(serverHandles, values, out resultErrors);

                    /*async read*/
                    group.Read(serverHandles, transactionID, out cancelID, out resultErrors);

                    /*wait for a while befor remove group to process async event*/
                    System.Threading.Thread.Sleep(3000);

                    /*the group must be removed !!! */
                    group.Remove(true);
                }
                ;
            }
            finally
            {
                server.Disconnect();
                server = null;
                GC.Collect();
            };
            Console.ReadKey();
        }
Пример #9
0
        /// <summary>
        /// initialize OPC server and group
        /// </summary>
        /// <param name="serverName">OPC Server Name</param>
        /// <param name="groupName">OPC Group name under the OPC server.
        /// Here groupName is trendViewer Process ID in string</param>
        ///
        public void InitializeServer(string serverName, string groupName)
        {
            string Function_Name = "InitializeServer";

            LogHelper.Trace(CLASS_NAME, Function_Name, "Function_Entered");
            lock (m_opcDataDicObj)
            {
                try
                {
                    m_OPCSrvName   = serverName;
                    m_OPCGroupName = groupName;

                    //Fix - Remove opcGroup and Disconnect server to avoid GC Fianlizer thread call these methods
                    try
                    {
                        if (m_OPCGroup != null)
                        {
                            m_OPCGroup.Remove(false);
                            m_OPCGroup = null;
                        }

                        if (m_OPCServer != null)
                        {
                            m_OPCServer.Disconnect();
                            m_OPCServer = null;
                        }
                    }
                    catch (Exception localException)
                    {
                        LogHelper.Error(CLASS_NAME, Function_Name, localException);
                    }

                    m_OPCServer = new OpcServer();

                    LogHelper.Trace(CLASS_NAME, Function_Name, "Before Connect");
                    m_OPCServer.Connect(serverName);
                    LogHelper.Trace(CLASS_NAME, Function_Name, "After Connect");

                    Thread.Sleep(200);
                    m_OPCServer.SetClientName("DirectOPC " + groupName + serverName);   // set my client name (exe+process no)

                    SERVERSTATUS sts;
                    m_OPCServer.GetStatus(out sts);
                    LogHelper.Info(CLASS_NAME, Function_Name, serverName + ": " + DateTime.FromFileTime(sts.ftStartTime).ToString());
                    LogHelper.Info(CLASS_NAME, Function_Name, serverName + ": " + sts.eServerState.ToString());

                    // add event handler for server shutdown
                    m_OPCServer.ShutdownRequested += new ShutdownRequestEventHandler(this.OPCSrv_ServerShutDown);

                    //Setup opc group
                    m_OPCGroup              = m_OPCServer.AddGroup("MFTOPC-Group-" + serverName, true, UPDATEGROUPRATE);
                    m_OPCGroup.DataChanged += new DataChangeEventHandler(this.OPCGrp_DataChange);
                    m_opcSrvConnectFlag     = true;
                }
                catch (COMException localException)
                {
                    LogHelper.Error(CLASS_NAME, Function_Name, localException);
                    LogHelper.Info(CLASS_NAME, Function_Name, "Initialize of the OPC Server is not successful");
                }
                catch (Exception localException)
                {
                    LogHelper.Error(CLASS_NAME, Function_Name, localException);
                }
            }
            LogHelper.Trace(CLASS_NAME, Function_Name, "Function_Exited");
        }
Пример #10
0
        /// <summary>
        /// This is our layout update routine, that keeps refreshing the screen on each cycle of our thread monitor
        /// </summary>
        /// <param name="_curStatus"></param>
        private void UpdateStatus(eOPCMonitoringStatus _curStatus)
        {
            int       cResult;
            OpcServer theOPCServer = new OpcServer();

            try
            {
                OPCDA.SERVERSTATUS curOPCSrvStatus;
                cResult = theOPCServer.Connect(theOPCServerTopic);

                if (theKeepAliveMonitorIsEnabled)
                {
                    tbKeepAliveConfigStatus.BackColor = Color.DarkGreen;
                    tbKeepAliveConfigStatus.ForeColor = Color.White;
                    tbKeepAliveConfigStatus.Text      = "Enabled";
                }
                else
                {
                    tbKeepAliveConfigStatus.BackColor = Color.LightGray;
                    tbKeepAliveConfigStatus.ForeColor = Color.DarkGray;
                    tbKeepAliveConfigStatus.Text      = "Disabled";
                }

                if (theSchedulerIsEnabled)
                {
                    tbSchedulerConfigStatus.BackColor = Color.DarkGreen;
                    tbSchedulerConfigStatus.ForeColor = Color.White;
                    tbSchedulerConfigStatus.Text      = "Enabled";
                    tbSchedulerTimeConfigured.Text    = theSchedulerTime.TimeOfDay.ToString();
                }
                else
                {
                    tbSchedulerConfigStatus.BackColor = Color.LightGray;
                    tbSchedulerConfigStatus.ForeColor = Color.DarkGray;
                    tbSchedulerConfigStatus.Text      = "Disabled";
                    tbSchedulerTimeConfigured.Text    = "";
                }

                switch (cResult)
                {
                case HRESULTS.E_FAIL:
                    theOPCMonitorStatus = eOPCMonitoringStatus.Failed;
                    break;

                case HRESULTS.OPC_E_NOTFOUND:
                    theOPCMonitorStatus = eOPCMonitoringStatus.Failed;
                    break;

                case HRESULTS.CONNECT_E_ADVISELIMIT:
                    theOPCMonitorStatus = eOPCMonitoringStatus.Expired;
                    break;

                case HRESULTS.CONNECT_E_NOCONNECTION:
                    theOPCMonitorStatus = eOPCMonitoringStatus.NoConnection;
                    break;

                case HRESULTS.S_OK:
                    theOPCMonitorStatus = eOPCMonitoringStatus.Connected;
                    break;

                case HRESULTS.S_FALSE:
                    theOPCMonitorStatus = eOPCMonitoringStatus.Failed;
                    break;

                default:
                    theOPCMonitorStatus    = eOPCMonitoringStatus.Undefined;
                    theOPCServerDiagnostic = "";
                    break;
                }

                switch (theOPCMonitorStatus)
                {
                case eOPCMonitoringStatus.Inactive:
                    tbOpcSrvMonitoringStatus.BackColor = Color.LightGray;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.DarkGray;
                    break;

                case eOPCMonitoringStatus.Undefined:
                    tbOpcSrvMonitoringStatus.BackColor = Color.LightGray;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.DarkGray;
                    break;

                case eOPCMonitoringStatus.Connecting:
                    tbOpcSrvMonitoringStatus.BackColor = Color.LightGreen;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.Black;
                    break;

                case eOPCMonitoringStatus.Connected:
                    tbOpcSrvMonitoringStatus.BackColor = Color.DarkGreen;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.White;
                    break;

                case eOPCMonitoringStatus.Expired:
                    tbOpcSrvMonitoringStatus.BackColor = Color.Yellow;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.Black;
                    break;

                case eOPCMonitoringStatus.Disconnected:
                    tbOpcSrvMonitoringStatus.BackColor = Color.LightCoral;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.Black;
                    break;

                case eOPCMonitoringStatus.Failed:
                    tbOpcSrvMonitoringStatus.BackColor = Color.Red;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.White;
                    break;

                case eOPCMonitoringStatus.Restarting:
                    tbOpcSrvMonitoringStatus.BackColor = Color.LightBlue;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.Black;
                    break;

                default:
                    tbOpcSrvMonitoringStatus.BackColor = Color.LightGray;
                    tbOpcSrvMonitoringStatus.ForeColor = Color.Black;
                    break;
                }

                if (theSchedulerIsEnabled == true &&
                    DateTime.Now.TimeOfDay >= theSchedulerTime.TimeOfDay &&
                    DateTime.Now.Day > theLastRestartTime.Day)
                {
                    while (OPCServerProcessIsRunning())
                    {
                        KillWindowsProcess();
                        Thread.Sleep(1000);
                    }
                    theLastRestartTime = DateTime.Now;
                }


                if (theOPCServer != null && theOPCServer.isConnectedDA)
                {
                    theOPCServer.GetStatus(out curOPCSrvStatus);
                    if (curOPCSrvStatus.eServerState.ToString() == "0")
                    {
                        theOPCServerDiagnostic = "License Expired";
                    }
                    else
                    {
                        theOPCServerDiagnostic = curOPCSrvStatus.eServerState.ToString();
                    }
                    switch (curOPCSrvStatus.eServerState)
                    {
                    case OPCDA.OpcServerState.Failed:
                        tbOpcSrvDiagnostic.BackColor = Color.Red;
                        tbOpcSrvDiagnostic.ForeColor = Color.White;
                        if (theKeepAliveMonitorIsEnabled)
                        {
                            while (OPCServerProcessIsRunning())
                            {
                                KillWindowsProcess();
                                Thread.Sleep(1000);
                            }
                        }
                        break;

                    case OPCDA.OpcServerState.Suspended:
                        tbOpcSrvDiagnostic.BackColor = Color.Yellow;
                        tbOpcSrvDiagnostic.ForeColor = Color.Black;

                        if (theKeepAliveMonitorIsEnabled)
                        {
                            while (OPCServerProcessIsRunning())
                            {
                                KillWindowsProcess();
                                Thread.Sleep(1000);
                            }
                        }
                        break;

                    case OPCDA.OpcServerState.NoConfig:
                        tbOpcSrvDiagnostic.BackColor = Color.White;
                        tbOpcSrvDiagnostic.ForeColor = Color.Black;
                        break;

                    case OPCDA.OpcServerState.Running:
                        tbOpcSrvDiagnostic.BackColor = Color.DarkGreen;
                        tbOpcSrvDiagnostic.ForeColor = Color.White;
                        break;

                    case OPCDA.OpcServerState.Test:
                        tbOpcSrvDiagnostic.BackColor = Color.LightBlue;
                        tbOpcSrvDiagnostic.ForeColor = Color.Black;
                        break;

                    default:
                        tbOpcSrvDiagnostic.BackColor = Color.Yellow;
                        tbOpcSrvDiagnostic.ForeColor = Color.Black;

                        if (theKeepAliveMonitorIsEnabled)
                        {
                            while (OPCServerProcessIsRunning())
                            {
                                KillWindowsProcess();
                                Thread.Sleep(1000);
                            }
                        }

                        break;
                    }
                }
                else
                {
                    tbOpcSrvDiagnostic.BackColor = Color.Gainsboro;
                    tbOpcSrvDiagnostic.ForeColor = Color.DarkGray;
                }
            }
            catch
            {
                theOPCMonitorStatus    = eOPCMonitoringStatus.Exception;
                theOPCServerDiagnostic = "";

                tbOpcSrvMonitoringStatus.BackColor = Color.Red;
                tbOpcSrvMonitoringStatus.ForeColor = Color.White;
            }
            finally
            {
                tbOpcSrvMonitoringStatus.Text = theOPCMonitorStatus.ToString();
                tbOpcSrvDiagnostic.Text       = theOPCServerDiagnostic;
            }
        }
Пример #11
0
        //[MethodImplAttribute(MethodImplOptions.Synchronized)]//Синхронизировать метод
        private bool Connect()
        {
            lock (lockConn)
            {
                DateTime dt1 = DateTime.Now;
                try
                {
                    bool result;
                    //создадим соединение с БД
                    SERVERSTATUS status;
                    _opcsrv.GetStatus(out status);
                    if (_cntconn == 0 || status == null || status.eServerState != OPCSERVERSTATE.OPC_STATUS_RUNNING)
                    {
                        _opcsrv.Connect(_progid, _host);
                        _opcsrv.GetStatus(out status);
                        if (status != null && status.eServerState == OPCSERVERSTATE.OPC_STATUS_RUNNING)
                        {
                            try
                            {
                                _opcgrp = _opcsrv.AddGroup(_grpname, false, _interval);
                                _opcgrp.HandleClient = 0;
                                int _cnt = _maps.GetLength(0);
                                _serverhandles = new int[_cnt];
                                _vals          = new object[_cnt];
                                _errs          = new object[_cnt];
                                OPCItemDef[] _opcitmsdef = new OPCItemDef[_cnt];

                                for (int i = 0; i < _cnt; i++)
                                {
                                    _opcitmsdef[i] = new OPCItemDef(_maps[i, 1], true, i, VarEnum.VT_EMPTY);
                                }
                                _opcgrp.AddItems(_opcitmsdef, out _opcitms);
                                for (int i = 0; i < _cnt; i++)
                                {
                                    _serverhandles[i] = _opcitms[i].HandleServer;
                                }
                                _opcgrp.SetEnable(true);
                                _opcgrp.Active = true;
                                _server.LogWrite(LogType.DEBUG, "[" + this._name + "] : T(сек)=" + (DateTime.Now - dt1).Seconds + ", нап. груп. - " + _maps.GetLength(0));
                                _cntconn++;     //Увеличим счётчик активных соединений
                                _server.LogWrite(LogType.DEBUG, "[" + this._name + "] : Connect - Активных соединений: " + _cntconn);
                                result = true;
                            }
                            catch (Exception e)
                            {
                                _server.LogWrite(LogType.ERROR, e.Message);
                                result = false;
                            }
                        }
                        else
                        {
                            result = false;
                        }
                    }
                    else
                    {
                        _cntconn++;     //Увеличим счётчик активных соединений
                        result = true;
                    }
                    return(result);
                }
                finally
                {
                    _server.LogWrite(LogType.DEBUG, "[" + this._name + "] : T(сек)=" + (DateTime.Now - dt1).Seconds + ", время на откытие соединения");
                }
            }
        }