OPC客户端抓数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using REF.ISS.ElectricPower.BLL;
using REF.ISS.ElectricPower.BLL.Models;
using OPCAutomation;
using System.Diagnostics;

namespace REF.ISS.ElectricPower.DataCrawl
{
    class Program
    {
        static ElectricPowerDBEntities db = new ElectricPowerDBEntities();
        static void Main(string[] args)
        {
            ThreadStart _readData = new ThreadStart(readData);
            Thread ConstrolreadData = new Thread(_readData);
            ThreadStart _CpuMonitor = new ThreadStart(CpuMonitor);
            Thread ConstrolCpuMonitor = new Thread(_CpuMonitor);
            //Stopwatch watch = new Stopwatch();
            //watch.Start(); 
            ConstrolreadData.Start();
            ConstrolCpuMonitor.Start(); 

           // GetCurrentProcessInfo(); 


        }  

        static private void readData()
        {
            Console.WriteLine("测试OPC数据");
            Start();
            Console.Read();
         }

        static OPCServer KepServer;
        static OPCGroups KepGroups;
        static OPCGroup KepGroup;
        static OPCItems KepItems;
        static DateTime time;
        static System.Timers.Timer myTimer;
        static List<int> Items = new List<int>();
        
        /// <summary>
        /// OPC服务器
        /// 开始抓取OPC数据
        /// </summary>
        static public void Start()
        {
            try
            {
                KepServer = new OPCServer();
                string serverId = System.Configuration.ConfigurationManager.AppSettings["serverId"];
                string serverName = System.Configuration.ConfigurationManager.AppSettings["serverName"];

                KepServer.Connect(serverName, serverId);

                //判断连接状态
                if (KepServer.ServerState == (int)OPCServerState.OPCRunning)
                {
                    SendMsg("已连接到-" + KepServer.ServerName);
                }
                else
                {
                    SendMsg("状态" + KepServer.ServerState.ToString());
                    return;
                }
                KepGroups = KepServer.OPCGroups;
                Task.Factory.StartNew(CreateGroup);

            }
            catch (Exception e)
            {
                System.IO.File.AppendAllText("D:\\connect.txt", "------------连接出错 " + DateTime.Now + "--------------" + "\r\n", System.Text.Encoding.Default);
                System.IO.File.AppendAllText("D:\\connect.txt", e + "\r\n", System.Text.Encoding.Default);
                throw e;
            }

        }

        /// <summary>
        /// 公共函数
        /// </summary>
        /// <param name="m"></param>
        static private void SendMsg(string m)
        {
            Console.Write("\n");
            Console.WriteLine(m);
        }

        /// <summary>
        /// 创建组
        /// </summary>
        static private void CreateGroup()
        {
            try
            {
                KepGroups = KepServer.OPCGroups;
                KepGroup = KepGroups.Add("OpcGroup");
                SetGroupProperty();
                //KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
                KepGroup.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);  //隔个几秒就读到所有的数据 

                KepItems = KepGroup.OPCItems;
                AddOpcItem();

                //异步读所有数据 
                myTimer = new System.Timers.Timer(3000); //周期3秒
                myTimer.Elapsed += myTimer_Elapsed; //到了3秒时做的事情
                myTimer.AutoReset = true; //是否不断重复定时器操作
                myTimer.Enabled = true;

            }
            catch (Exception e)
            {

                System.IO.File.AppendAllText("D:\\group.txt", "------------创建组出错 " + DateTime.Now + "--------------" + "\r\n", System.Text.Encoding.Default);
                System.IO.File.AppendAllText("D:\\group.txt", e + "\r\n", System.Text.Encoding.Default);

                SendMsg("OPC创建组出现错误:" + e.Message);
            }
        }

        /// <summary>
        /// Timer 到了时间3秒后执行的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            Array serverHandles = Items.ToArray();
            Array Errors;
            int cancelID;
            KepGroup.AsyncRead(Items.Count - 1, ref serverHandles, out Errors, 1, out cancelID);//第一参数为item数量 
        }   


        /// <summary>
        /// 设置采集属性
        /// 设置组属性
        /// </summary>
        static private void SetGroupProperty()
        {
            KepServer.OPCGroups.DefaultGroupIsActive = true; //激活组
            KepServer.OPCGroups.DefaultGroupDeadband = 0; //死区值,设为0时,服务器端该组内任何数据变化都通知组。
            KepGroup.UpdateRate = 3000; //刷新频率为3秒。
            KepGroup.IsActive = true;
            KepGroup.IsSubscribed = true; //使用订阅功能,即可以异步,默认false
        }

        /// <summary>
        /// 把需要采集数据的点加进去
        /// </summary>
        static private void AddOpcItem()
        {
            try  //大小写出错时
            {
                var tags = db.BaseInfo.Where(t => (t.FloorNum == 1)).ToList(); //1号楼要读的电表
                //var tags= db.BaseInfo.Where(t => (t.FloorNum == 2)).ToList(); //2号楼要读的电表

                Items.Add(0);
                for (int i = 0; i < tags.Count; i++)
                {
                    KepItems.AddItem(tags[i].Tag, tags[i].ID);
                    Items.Add(KepItems.AddItem(tags[i].Tag, tags[i].ID).ServerHandle);
                }  

            } 
            catch (Exception e)
            {
                System.IO.File.AppendAllText("D:\\item.txt", "------------添加item时出错 " + DateTime.Now + "--------------" + "\r\n", System.Text.Encoding.Default);
                System.IO.File.AppendAllText("D:\\item.txt", e + "\r\n", System.Text.Encoding.Default);

                SendMsg("添加item时出现错误:" + e.Message);
            }

        }

        #region 数据发生变化时 执行的方法 
        /// <summary>
        /// 点数据发送变化的事件
        /// 每当项数据有变化时执行的事件
        /// </summary>
        /// <param name="TransactionID">处理ID</param>
        /// <param name="NumItems">项个数</param>
        /// <param name="ClientHandles">项客户端句柄&l
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OPC客户端C是一种与OPC服务器通信的软件。OPC(OLE for Process Control)是一种用于实时数据通信的开放标准,它允许不同供应商的软件和硬件设备在同一个网络上进行数据交换。 OPC客户端C是一种OPC客户端的具体实现。它通过与OPC服务器建立连接,可以读取和写入OPC服务器中的实时数据OPC客户端C可以是独立的软件应用程序,也可以是集成在其他系统中的模块。 使用OPC客户端C可以实现以下功能: 1. 读取实时数据OPC服务器中存储有各种实时数据,如温度、压力、流量等。OPC客户端C可以向OPC服务器发送读取数据的请求,获取最新的实时数据。 2. 写入实时数据:除了读取,OPC客户端C还可以向OPC服务器发送写入数据的请求,更新OPC服务器中的实时数据。 3. 监控报警信息:OPC服务器会监控各种参数,当某个参数超出设定的阈值时,会生成报警信息。OPC客户端C可以接收并显示这些报警信息,供操作员及时处理。 4. 历史数据查询:OPC服务器会保存历史数据OPC客户端C可以向OPC服务器发送历史数据查询的请求,获取指定时间范围内的数据记录。 5. 数据分析与报表生成:OPC客户端C可以将获取到的数据进行分析处理,并生成统计报表,以帮助用户更好地监控和管理实时数据。 总之,OPC客户端C是一种用于与OPC服务器通信的软件,通过与OPC服务器建立连接,可以读取和写入实时数据,监控报警信息,查询历史数据并进行数据分析和报表生成。它在工业自动化系统和监控系统中发挥着重要的作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值