C#连接OPC SERVER KEPServerEx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OPCAutomation;
using System.Diagnostics;
using System.Threading;
using CommonDll;
using System.Data;

namespace AndonForm
{
    public class PLCThread
    {
        /// <summary>
        /// OPC SERVER Interface
        /// </summary>
        private static OPCServer opcServerKEP = null;
        private static OPCGroup opcGrpKEP_Run = null;
        private static OPCGroup opcGrpKEP_Run1 = null;
        public static DataTable dt = null;
        private static int runSeconds = 0;
        public static DoWorkThread _thread = null;//OPC监听线程
        /// <summary>
        /// 初始第一次读取标志位
        /// </summary>
        public static bool IsReadFirst = true;
        public static bool IsReadFirst1 = true;
        /// <summary>
        /// 数据源
        /// </summary>
        public static DBSourse SQL;
        /// <summary>
        /// 基础信息列表
        /// </summary>
        private static List<Andon_Interface> _listAndonInterface;
        public static List<Andon_Interface> ListAndonInterface
        {
            get { return _listAndonInterface; }
        }

        public static void Init()
        {
            try
            {
                SQL = new DBSourse();
                SQL.Open();
                runSeconds = CONFIG.GetInt("Run", "Times", 6);
                _thread = new DoWorkThread(RunThread);
                _thread.Start();
                LogUtils.WriteLogByMonth(DateTime.Now.ToString() + "数据库连接成功");
                _listAndonInterface = SQL.InitAndon_PLCAddress();
                if (!ConnectToOPCServer()) return;
            }
            catch (Exception e)
            {
                LogUtils.WriteLogByMonth(DateTime.Now.ToString() + "Init初始化失败;" + e.Message);
            }
        }

        public static bool ConnectToOPCServer()
        {
            bool result;
            try
            {

                opcServerKEP = new OPCServer();
                opcServerKEP.Connect("KEPware.KEPServerEx.V4", "127.0.0.1");
                InitOPC();
                CreateItems();
                result = true;
            }
            catch (Exception e)
            {
                LogUtils.WriteLogByMonth(DateTime.Now.ToString() + "OPCServer初始化失败" + e.Message);
                result = false;
            }
            return result;
        }

        public static void InitOPC()
        {
            try
            {
                opcGrpKEP_Run = opcServerKEP.OPCGroups.Add("KEP_Run");
                opcGrpKEP_Run.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGrpKEP_Run_DataChange);

                opcGrpKEP_Run1 = opcServerKEP.OPCGroups.Add("KEP_Run1");
                opcGrpKEP_Run1.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGrpKEP_Run1_DataChange);
            }
            catch (Exception e)
            {
                LogUtils.WriteLogByMonth(DateTime.Now.ToString() + "初始化OPC事件失败" + e.Message);
            }

        }

        static void opcGrpKEP_Run1_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {
            try
            {
                int i = 1;
                while (i <= ClientHandles.Length)
                {
                    long ReadID = (long)Convert.ToInt32(ClientHandles.GetValue(i));//哪个Item触发了DataChange事件,读取到对应的ID
                    string ReadValue = Convert.ToInt16(ItemValues.GetValue(i)).ToString();//触发点读取到的值为多少
                    int IsBad = Convert.ToInt32(Qualities.GetValue(i));
                    checked
                    {
                        if (!IsReadFirst1)
                        {
                            Andon_Interface _Single = ListAndonInterface.Find(e => e.RunId == ReadID);
                            if (_Single != null)
                            {
                                if (ReadValue != "0")
                                {
                                    dt.Rows[_Single.Id - 1]["Arrive"] = 0;
                                    dt.Rows[_Single.Id - 1]["ISActive"] = 0;
                                    dt.Rows[_Single.Id - 1]["RunTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                                    SQL.UpdateRunTime(_Single.RFIDSTEP);
                                }
                            }
                        }
                    }
                    i++;
                }
                IsReadFirst1 = false;
            }
            catch
            {
            }
        }

        public static void CreateItems()
        {
            try
            {
              
                foreach (Andon_Interface item in ListAndonInterface)
                {
                    opcGrpKEP_Run.OPCItems.AddItem(item.TagNameArrive, item.Id);
                }
                foreach (Andon_Interface item in ListAndonInterface)
                {
                    opcGrpKEP_Run1.OPCItems.AddItem(item.TagNameRun, item.RunId);
                }
                opcGrpKEP_Run.IsActive = true;
                opcGrpKEP_Run.IsSubscribed = true;
                opcGrpKEP_Run.UpdateRate = 500;

                opcGrpKEP_Run1.IsActive = true;
                opcGrpKEP_Run1.IsSubscribed = true;
                opcGrpKEP_Run1.UpdateRate = 500;

                dt = new DataTable("Rundt");
                DataColumn dc1 = new DataColumn("ID", Type.GetType("System.String"));
                DataColumn dc2 = new DataColumn("Arrive", Type.GetType("System.Int32"));
                DataColumn dc3 = new DataColumn("ISActive", Type.GetType("System.Int32"));
                DataColumn dc4 = new DataColumn("FRIDSTEP", Type.GetType("System.String"));
                DataColumn dc5 = new DataColumn("ArriveTime", Type.GetType("System.String"));
                DataColumn dc6 = new DataColumn("RunTime", Type.GetType("System.String"));

                dt.Columns.Add(dc1);
                dt.Columns.Add(dc2);
                dt.Columns.Add(dc3);
                dt.Columns.Add(dc4);
                dt.Columns.Add(dc5);
                dt.Columns.Add(dc6);


                foreach (Andon_Interface item in ListAndonInterface)
                {
                    DataRow dr = dt.NewRow();
                    dr["ID"] = item.Id;
                    dr["Arrive"] = 0;
                    dr["ISActive"] = 0;
                    dr["FRIDSTEP"] = item.RFIDSTEP;
                    dr["ArriveTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                    dr["RunTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");

                    dt.Rows.Add(dr);
                }
            }
            catch (Exception e)
            {
                LogUtils.WriteLogByMonth(DateTime.Now.ToString() + "OPC CreateItems创建失败" + e.Message);
            }
        }

        public static void opcGrpKEP_Run_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {
            try
            {
                int i = 1;
                while (i <= ClientHandles.Length)
                {
                    long ReadID = (long)Convert.ToInt32(ClientHandles.GetValue(i));//哪个Item触发了DataChange事件,读取到对应的ID
                    string ReadValue = Convert.ToInt16(ItemValues.GetValue(i)).ToString();//触发点读取到的值为多少
                    int IsBad = Convert.ToInt32(Qualities.GetValue(i));
                    checked
                    {
                        if (!IsReadFirst)
                        {
                            Andon_Interface _Single = ListAndonInterface.Find(e => e.Id == ReadID);
                            if (_Single != null)
                            {
                                if (ReadValue == "1")
                                {
                                    dt.Rows[_Single.Id - 1]["Arrive"] = 1;
                                    dt.Rows[_Single.Id - 1]["ISActive"] = 1;
                                    dt.Rows[_Single.Id - 1]["ArriveTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                                    SQL.InsertIntoArriverTime(_Single.RFIDSTEP);
                                }
                            }
                        }
                    }
                    i++;
                }
                IsReadFirst = false;
            }
            catch
            {
            }
        }

        static void RunThread()
        {
            Thread.Sleep(200);
            if (dt != null && dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Select("ISActive=1"))
                {
                    if ((DateTime.Now - Convert.ToDateTime(item["ArriveTime"])).TotalSeconds > runSeconds)
                    {
                        Andon_Interface _Single = ListAndonInterface.Find(e => e.Id == Convert.ToInt32(item["ID"]));
                        if (_Single != null)
                        {
                            if (_Single.IsControl == "0")
                            {
                                opcGrpKEP_Run1.OPCItems.Item(_Single.TagNameRun).Write(_Single.RunValue);
                                LogUtils.WriteLogByMonth(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " 大于" + runSeconds + "秒强制放行," + "点位:" + _Single.TagNameRun);
                            }
                        }
                    }
                }
            }
        }

        public static bool DisConnecOPCServer()
        {
            bool result;
            try
            {
                opcServerKEP.OPCGroups.RemoveAll();
                opcGrpKEP_Run = null;
                opcServerKEP.Disconnect();
                opcServerKEP = null;
                result = true;
            }
            catch
            {
                result = false;
            }
            return result;
        }
    }
}
 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
原创:这几天一直在研究OPCSERVER的开发.在网上找了好久,都没有C#成型的说明和源码.于是,自己拼凑,终于被我搞成功了.写了一个例子,不含PLC和组态通讯,只有opcserver和客户端之间通讯.客户端的代码大家可以再网上找找,有好多.OpcTools.exe是opc客户端工具.本压缩包中的所有资源均是免费的,可无限制使用.这个例子只写了opcserver的基础部分.大家可以自己修改和完善(重要的部分已经写在例子中了). 一、32位操作系统,执行 OPCdist 库文件\opcdist\ 目录下的setupxp.bat 如果是64位的系统,请自己修改setupxp.bat批处理文件,我的操作系统是win7X64,是可以成功的. 二、建立自己的C#工程.并将Wtopcsvr9.0\Wtopcsvr9.0\WtOPCSvr.dll拷贝到执行目录中. 经过以上两步骤,准备工作 已经完成. 三、打开压缩包中opcservertest工程.工程使用VS2005编写.支持VS更高版本. UpdateRegistry函数是注册服务,UnregisterServer函数是取消注册.多的就不说了,请大家参考文档 WTOPCSvr+使用手册.doc和WTOPCSVRDLL使用说明中文.doc 值得注意的地方是,C#生成的可执行文件必须是32位,否则无法正常加载DLL文件. 经常使用的函数在工程中已经定义并使用.WTOPCSVRDLL使用说明中文.doc中,介绍的是VB中WtOPCSvr的使用方法.大家可以把VB的转变成C#的.我的工程中,已经给大家做了示例. 所有的文件:源码,dll文件,说明文件,都包含在压缩包中.大部分都在CSDN网站上下的. WtOPCSvr.dll应该是注册版的,在SerialNumber.txt中有注册码.我不知道怎么注册,大家可以上网搜搜.
C#连接OPC Server可以通过使用OPC DA自动化库(OPCDAAuto.dll)来实现。这个库可以帮助我们与OPC Server进行通信,实现与PLC和仪表等硬件的数据交互。可以按照以下步骤进行操作: 1. 首先,确保你已经安装了KEPServer软件,并且已经配置好了OPC Server。 2. 在C#项目中添加对OPCDAAuto.dll的引用。你可以在百度上搜索相关教程来了解如何添加引用。 3. 在代码中创建一个OPCServer对象,并使用Connect方法连接OPC Server。你可以使用OPCServer对象的GetOPCServers方法获取本机上所有的OPC服务器。 4. 通过OPCServer对象的AddGroup方法创建一个OPCGroup对象,并设置相关的属性,比如采样率、更新速率等。 5. 使用OPCGroup对象的AddItems方法添加需要读写的变量。 6. 使用OPCGroup对象的SyncRead和SyncWrite方法来读取和写入变量的值。 7. 最后,使用OPCServer对象的Disconnect方法断开与OPC Server连接。 这样,你就可以在C#连接OPC Server,并实现与PLC和仪表等硬件的通信了。请注意,具体的代码实现可能会因为使用的OPC Server和库的不同而有所差异,建议你参考相关的文档和教程来进行具体的操作。 #### 引用[.reference_title] - *1* [C#winform OPCServer操作——KEPServerEX-6.4.321安装篇](https://blog.csdn.net/weixin_39829336/article/details/126633610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C#连接Kepserver OPCPLC通讯程序源码教程](https://blog.csdn.net/u014780302/article/details/115623146)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [PLC通讯实现-C#访问OpcServer实现读写PLC(九)](https://blog.csdn.net/zlbdmm/article/details/88032228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

!chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值