在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例Windows系统编程 → opc C#实例 源代码

opc C#实例 源代码

Windows系统编程

下载此实例
  • 开发语言:C#
  • 实例大小:0.02M
  • 下载次数:102
  • 浏览次数:779
  • 发布时间:2019-07-08
  • 实例类别:Windows系统编程
  • 发 布 人:ewei1811
  • 文件格式:.rar
  • 所需积分:5
 相关标签: 源代码 源代码 opc C# 代码

实例介绍

【实例简介】

OPC服务器通常支持两种类型的访问接口,它们分别为不同的编程语言环境提供访问机制。这两种接口是:自动化接口(Automation interface);自定义接口(Custom interface)。

【实例截图】

from clipboard

【核心代码】

      OPCAutomation.OPCItems MyOPCItems;
      OPCAutomation.OPCItem MyOPCItem;
        int[] cH_temp;
        int[] sH_temp;
        Array sH;
        object[] oVal;
        object[] dTime;
        object[] wQuality;

        //OPCServer的名称。
        string strOPCServerName = "";

        //装有OPCServer的计算机名称或IP地址。
        string strOPCServerNodeName = "";

        //设备的连接状态。
        private byte blState = 0;

        //OPCServer的数据变化事件的最小时间。
        private int MyUpdateRate = 50;

        //OPCServer的数据变化死区,范围0-100。
        private float MyDeadBand = 0;

        //OPCServer的数据变化事件是否有效。
        private bool MyIsActive = true;

        //需要读取或写入数据的变量数组。
        private string[] sTagName = null;

        //OPC组名称
        private string OPCGroupName = "";
        public enum OPCServerState : int
        {
            Open = 1,
            Close = 6
        }

        ///// <summary>
        ///// OPCServer强制关闭事件。
        ///// </summary>
        ///// <remarks></remarks>
        ////public event ShutDownEventHandler interfaceDevice.ShutDown
        ////public delegate void ShutDownEventHandler();
        //private void MyOPCServer_ServerShutDown(string Reason)
        //{
        //    DisConnect();
        //    blState = 2;
        //    if (ShutDown != null) 
        //    {
        //        ShutDown();
        //    }
        //}

        /////// <summary>
        /////// 信息事件。
        /////// </summary>
        /////// <param name="Message">详细信息。</param>
        /////// <param name="EventType">信息类型。</param>
        /////// <remarks></remarks>
        //////public event InfoEventHandler interfaceDevice.Info;
        ////public delegate void InfoEventHandler(string Message, Events EventType);

        /// <summary>
        /// 异步写入所有变量,自动返回写入成功或失败。
        /// </summary>
        ///  <param name="Value">输出结果,True:写入成功;False:写入失败。</param>
        /// <remarks></remarks>
        public event AsyncWriteCompleteEventHandler AsyncWriteComplete;
        public delegate void AsyncWriteCompleteEventHandler(ref bool Value);

        /// <summary>
        /// 异步读取所有变量,自动返回变量值。
        /// </summary>
        /// <param name="Value">所有变量值。</param>
        /// <remarks></remarks>
        public event AsyncReadCompleteEventHandler AsyncReadComplete;
        public delegate void AsyncReadCompleteEventHandler(ref object[] Value);

        /// <summary>
        /// 只读属性,设备的连接状态,值 0:连接失败; 1:连接成功; 2:OPCServer强制关闭; 3:连接的OPCServer不存在。
        /// </summary>
        /// <value></value>
        /// <returns></returns>
        /// <remarks></remarks>
        public byte State
        {
            get { return blState; }
        }
        byte interfaceDevice1.Status
        {
            get { return State; }
        }

        /// <summary>
        /// OPCServer的数据变化事件的最小时间。
        /// </summary>
        /// <value></value>
        /// <returns></returns>
        /// <remarks></remarks>
        public int UpdateRate
        {
            get { return MyUpdateRate; }
            set { MyUpdateRate = value; }
        }

        /// <summary>
        /// OPCServer的数据变化死区,范围0-100。
        /// </summary>
        /// <value></value>
        /// <returns></returns>
        /// <remarks></remarks>
        public float DeadBand
        {
            get { return MyDeadBand; }
            set
            {
                if (value < 0)
                {
                    value = 0;
                }
                else if (value > 100)
                {
                    value = 100;
                }
                MyDeadBand = value;
            }
        }

        /// <summary>
        /// OPCGroup事件是否有效,True:有效;False:无效。
        /// </summary>
        /// <value></value>
        /// <returns></returns>
        /// <remarks></remarks>
        public bool IsActive
        {
            get { return MyIsActive; }
            set { MyIsActive = value; }
        }

        /// <summary>
        /// 只读属性,设备的变量数组。
        /// </summary>
        /// <value></value>
        /// <returns></returns>
        /// <remarks></remarks>
        public string[] TagNames
        {
            get { return sTagName; }
        }

        /// <summary>
        /// 初始化。
        /// </summary>
        /// <param name="OPCServerName">OPCServer的名称。</param>
        /// <param name="OPCGroupName">设备名称,不能重复。</param>
        /// <param name="OPCServerNodeName">装有OPCServer的计算机名称或IP地址,默认为本机。</param>
        /// <remarks></remarks>
        public void clsOPC(string OPCServerName, string OPCGroupName, string OPCServerNodeName)
        {
            //OPCServerNodeName="";
            strOPCServerName = OPCServerName;
            strOPCServerNodeName = OPCServerNodeName;
            this.OPCGroupName = OPCGroupName;
        }

        ///// <summary>
        ///// 返回服务器内的所有OPCServer的名称,返回值为一维数组。
        ///// </summary>
        ///// <returns></returns>
        ///// <remarks></remarks>
        //public string[] GetOPCServerName()
        //{
        //    return _GetOPCServerName();
        //}
        //private string[] _GetOPCServerName()
        //{

        //    OPCAutomation.OPCServer OPCServer = default(OPCAutomation.OPCServer);
        //    object Servers = null;
        //    OPCServer = new OPCAutomation.OPCServer();
        //    Servers = OPCServer.GetOPCServers;
        //    return Convert.ToString(Servers);

        //}

        /// <summary>
        /// 连接设备,返回值为布尔类型,True:连接成功; False:连接失败。
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public bool Connect()
        {
            return _Connect();
        }
        private bool _Connect()
        {

            try
            {
                if (blState != 1)
                {
                    MyOPCServer = new OPCAutomation.OPCServer();
                    System.Threading.Thread.Sleep(1000);
                    if (MyOPCServer == null)
                        return false;
                    if (MyOPCServer.ServerState == Convert.ToInt32(OPCServerState.Close))
                    {
                        MyOPCServer.Connect(strOPCServerName, strOPCServerNodeName);
                        int a = Convert.ToInt32(OPCServerState.Open);
                        if (MyOPCServer.ServerState == Convert.ToInt32(OPCServerState.Open))
                        {
                            blState = 1;
                        }
                        else
                        {
                            blState = 0;
                        }
                    }
                    else
                    {
                        blState = 1;
                    }
                }
            }
            catch (Exception)
            {
                blState = 3;
                //MessageBox("设备【" DeviceName "】连接'" strOPCServerName "'失败:" Environment.NewLine ex.Message, Events.Err);
                //MessageBox.Show("设备连接失败:" Environment.NewLine ex.Message);
            }

            switch (blState)
            {
                case 0:
                    return false;
                case 1:
                    return true;
                case 2:
                    return true;
                case 3:
                    return false;
                default:
                    return true;
            }

        }
        bool interfaceDevice1.Connect()
        {
            return _Connect();
        }

        /// <summary>
        /// 断开设备,返回值为布尔类型,True:断开成功; False:断开失败。
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public bool DisConnect()
        {
            return _DisConnect();
        }
        private bool _DisConnect()
        {

            try
            {
                if ((MyOPCGroup != null))
                {
                    MyOPCGroup.IsActive = false;
                }
                if ((MyOPCGroups != null))
                {
                    if (MyOPCGroups.Count != 0)
                    {
                        MyOPCGroups.RemoveAll();
                    }
                }
                MyOPCItems = null;
                MyOPCItem = null;
                MyOPCGroups = null;
                MyOPCGroup = null;
                if ((MyOPCServer != null))
                {
                    if (MyOPCServer.ServerState != Convert.ToInt32(OPCServerState.Close))
                    {
                        MyOPCServer.Disconnect();
                    }
                    MyOPCServer = null;
                }
                blState = 0;
            }
            catch (Exception)
            {
                //MessageBox("设备【" DeviceName "】断开:" Environment.NewLine ex.Message, Events.Err);
            }

            System.GC.Collect();

            return true;

        }
        bool interfaceDevice1.DisConnect()
        {
            return _DisConnect();
        }

        /// <summary>
        /// 为设备注册变量。
        /// </summary>
        /// <param name="TagNames">变量名,一维数组。</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public bool TagRegister(string[] TagNames)
        {
            return _TagRegister(TagNames);
        }
        private bool _TagRegister(string[] TagNames)
        {

            Array ServerHandles = null;
            Array Errors = null;
            Array RequestedDataTypes = null;
            Array AccessPaths = null;
            UInt16 Index = 0;
            try
            {
                sTagName = TagNames;
                if (sTagName == null)
                    return false;
                if (sTagName.Length == 0)
                    return true;
                sH_temp = new int[sTagName.Length 1];
                oVal = new object[sTagName.Length 1];
                cH_temp = new int[sTagName.Length 1];
                MyOPCGroups = MyOPCServer.OPCGroups;
                MyOPCGroup = MyOPCGroups.Add(OPCGroupName);
                MyOPCGroup.UpdateRate = MyUpdateRate;
                MyOPCGroup.IsActive = MyIsActive;
                MyOPCGroup.DeadBand = MyDeadBand;
                MyOPCGroup.IsSubscribed = MyOPCGroup.IsActive;
                MyOPCItems = MyOPCGroup.OPCItems;

                string[] sItemName_temp = new string[sTagName.Length 1];

                for (Index = 1; Index <= Convert.ToUInt16(sTagName.Length); Index )
                {
                    sItemName_temp[Index] = sTagName[Index - 1];
                    cH_temp[Index] = Index;
                }

                Array sItemName = sItemName_temp;
                Array cH = cH_temp;
                MyOPCItems.AddItems(sTagName.Length, ref  sItemName, ref   cH, out ServerHandles, out Errors, RequestedDataTypes, AccessPaths);

                for (Index = 1; Index <= Convert.ToUInt16(sTagName.Length); Index )
                {
                    if (Convert.ToInt32(Errors.GetValue(Index)) == 0)
                    {
                        sH_temp[Index] = Convert.ToInt32(ServerHandles.GetValue(Index));
                    }
                    else
                    {
                        //log.Info(GetCurrentTime() "  " "OPC变量【" sTagName[Index] "】注册失败!");
                        //TXT_LOG.AppendText(GetCurrentTime() "  " "OPC变量【" sTagName[Index] "】注册失败!" "\r\n");

                        return false;
                    }
                }
                sH = (Array)sH_temp;

            }
            catch (Exception)
            {
                //MessageBox("设备【" DeviceName "】的变量注册失败:" Environment.NewLine ex.Message, Events.Err);
                //log.Fatal("OPC组【" OPCGroupName "】的变量注册失败!", new Exception("发生了一个致命错误"));
                return false;
            }

            return true;

        }
        bool interfaceDevice1.TagRegister(string[] TagNames)
        {
            return _TagRegister(TagNames);
        }

        /// <summary>
        /// 同步读取指定变量的值,类型为object。
        /// </summary>
        /// <param name="TagName">变量名称。</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public object Read(string TagName)
        {
            return _Read(TagName);
        }
        private object _Read(string TagName)
        {
            object Value = null;
            object Quality = null;
            object TimeStamp = null;

            try
            {
                if (sTagName == null)
                    return null;
                if (MyIsActive == true)
                {
                    return oVal[Array.IndexOf(sTagName, TagName) 1];
                }
                else
                {
                    OPCAutomation.OPCItem anItem = default(OPCAutomation.OPCItem);
                    anItem = MyOPCGroup.OPCItems.Item(Array.IndexOf(sTagName, TagName) 1);
                    anItem.Read(Convert.ToInt16(OPCAutomation.OPCDataSource.OPCDevice), out Value, out Quality, out TimeStamp);
                    return anItem.Value;
                }
            }
            catch (Exception)
            {
                //MessageBox("设备【" DeviceName "】的变量'" TagName "'读取值失败:" Environment.NewLine ex.Message, Events.Err);
                return null;
            }

        }
        object interfaceDevice1.Read(string TagName)
        {
            return _Read(TagName);
        }

        /// <summary>
        /// 同步读取所有变量的值,类型为object。
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public object SyncRead()
        {
            return _SyncRead();
        }
        private object _SyncRead()
        {
            object Quality = null;
            object TimeStamp = null;

            try
            {
                Array Errors = null;
                Array oVal_temp = oVal;
                MyOPCGroup.SyncRead(Convert.ToInt16(OPCAutomation.OPCDataSource.OPCDevice), sTagName.Length, ref sH, out  oVal_temp, out  Errors, out  Quality, out TimeStamp);
                return oVal_temp;
            }
            catch (Exception)
            {
                //MessageBox("设备【" DeviceName "】的所有变量值读取失败:" Environment.NewLine ex.Message, Events.Err);
                return null;
            }

        }

        /// <summary>
        /// 异步读取所有变量的值,调用AsyncReadComplete事件返回所有变量值。
        /// </summary>
        /// <remarks></remarks>
        public void AsyncRead()
        {
            _AsyncRead();
        }

        private void _AsyncRead()
        {
            try
            {
                int wTransID = 1;
                int wCancelID = 0;
                Array Errors = null;
                MyOPCGroup.AsyncRead(sTagName.Length, ref  sH, out  Errors, wTransID, out wCancelID);
            }
            catch (Exception)
            {
                //MessageBox("设备【" DeviceName "】的所有变量值读取失败:" Environment.NewLine ex.Message, Events.Err);
            }

        }
        private void MyOPCGroup_AsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors)
        {
            Array.Copy(ItemValues, 1, oVal, 1, ItemValues.Length);
            if (AsyncReadComplete != null)
            {
                AsyncReadComplete(ref oVal);
            }
        }

        /// <summary>
        /// 同步写入指定变量的值,返回值为布尔类型,True:写入成功; False:写入失败。
        /// </summary>
        /// <param name="TagName">变量名称。</param>
        /// <param name="Value">写入值,类型为object。</param>
        /// <returns></returns>
        /// <remarks></remarks>
        public bool Write(string TagName, object Value)
        {
            return _Write(TagName, Value);
        }
        private bool _Write(string TagName, object Value)
        {

            try
            {
                OPCAutomation.OPCItem anItem = default(OPCAutomation.OPCItem);
                anItem = MyOPCGroup.OPCItems.Item(Array.IndexOf(sTagName, TagName) 1);
                anItem.Write(Value);
                return true;
            }
            catch (Exception)
            {
                //MessageBox("设备【" DeviceName "】的变量'" TagName "'写入值失败:" Environment.NewLine ex.Message, Events.Err);
                return false;
            }

        }
        bool interfaceDevice1.Write(string TagName, object Value)
        {
            return _Write(TagName, Value);
        }

        /// <summary>
        /// 同步写入所有变量的值,返回值为布尔类型,True:写入成功; False:写入失败。
        /// </summary>
        /// <param name="Value">所有变量的值,类型为Array,不能为空.格式如下:
        ///         object[] valueTemp = new object[] { "", "aa", "cc" };
        ///         Array Value = (Array)valueTemp;
        /// </param>
        /// <returns></returns>
        /// <remarks></remarks>
        public bool SyncWrite(Array Value)
        {
            return _SyncWrite(Value);
        }
        private bool _SyncWrite(Array Value)
        {

            try
            {
                Array Errors = null;
                MyOPCGroup.SyncWrite(Convert.ToInt32(sTagName.Length), ref sH, ref Value, out Errors);
                return true;
            }
            catch (Exception)
            {
                //MessageBox("设备【" DeviceName "】的所有变量值写入失败:" Environment.NewLine ex.Message, Events.Err);
                return false;
            }

        }

        /// <summary>
        /// 异步写入所有变量的值,返回值为布尔类型, False:写入失败,调用AsyncWriteComplete事件判断写入是否成功。
        /// </summary>
        /// <param name="Value">所有变量的值,类型为Array,不能为空。</param>
        /// <remarks></remarks>
        public bool AsyncWrite(Array Value)
        {
            return _AsyncWrite(Value);
        }
        private bool _AsyncWrite(Array Value)
        {

            try
            {

                int wTransID = 1;
                int wCancelID = 0;
                Array Errors = null;
                MyOPCGroup.AsyncWrite(sTagName.Length, ref  sH, ref Value, out  Errors, wTransID, out wCancelID);
                return true;
            }
            catch (Exception)
            {
                //MessageBox("设备【" DeviceName "】的所有变量值写入失败:" Environment.NewLine ex.Message, Events.Err);
                return false;
            }

        }

        private void MyOPCGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array Errors)
        {
            //object i = null;
            bool sTrue = true;
            bool sFalse = false;
            for (int i = 1; i <= NumItems; i )
            {
                if (Convert.ToInt32(Errors.GetValue(i)) != 0)
                {
                    if (AsyncWriteComplete != null)
                    {
                        AsyncWriteComplete(ref  sFalse);
                    }
                    return;
                }
            }
            if (AsyncWriteComplete != null)
            {
                AsyncWriteComplete(ref sTrue);
            }

        }


        /// <summary>
        /// 数据变化事件。
        /// </summary>
        /// <param name="TransactionID"></param>
        /// <param name="NumItems"></param>
        /// <param name="ClientHandles"></param>
        /// <param name="ItemValues"></param>
        /// <param name="Qualities"></param>
        /// <param name="TimeStamps"></param>
        /// <remarks></remarks>

        private void OPCMyGroup_DataChange(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps)
        {


            try
            {
                for (int i = 1; i <= NumItems; i )
                {
                    oVal[Convert.ToInt32(ClientHandles.GetValue(i))] = ItemValues.GetValue(i);
                }



            }
            catch (Exception)
            {
            }
            System.GC.Collect();

        }





    }
}

实例下载地址

opc C#实例 源代码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警