首页 > 编程语言 >C#通过KEPServer对PLC进行读写(二):读取

C#通过KEPServer对PLC进行读写(二):读取

时间:2022-09-28 20:23:47浏览次数:42  
标签:KEPServer KepGroup C# Items Add PLC Array ref KepSever

在通过OPCAutomation我们先了解下这个类下的三个对象

1.OPCServer:创建OPC的连接

2.OPCBrowser:创建OPC浏览对象

3.OPCGroups:OPC通信组对象

4.OPCItem:单个代操作(读取的对象)

 

具体的读取流程如下:

1.获取当前程序下的所有IP地址/计算机名,将得到的对象存入控件

 IPHostEntry  IPHost = Dns.GetHostEntry(Environment.MachineName);
            if (IPHost.AddressList.Length>0)
            {
                for (int i = 0; i < IPHost.AddressList.Length; i++)
                {
                    string host = Dns.GetHostEntry(IPHost.AddressList[i].ToString()).HostName;

                    if (!this.cmb_ServerNode.Items.Contains(host))
                    {
                        this.cmb_ServerNode.Items.Add(host);
                    }
                }
            }                     

2.根据选择的IP地址/计算机名得到OPC服务名称列表,并加载进控件

 KepSever = new OPCServer();
            object serverList = KepSever.GetOPCServers(this.cmb_ServerNode.Text);

            foreach (var item in (Array) serverList)
            {
                if (!this.cmb_ServerName.Items.Contains(item) )
                {
                    this.cmb_ServerName.Items.Add(item);
                } 
            }

3.连接OPC服务器,其中KepBrowser记录的就是服务器内所有的标签变量,接下来就是创建组并激活,开启订阅功能,并且绑定读的操作

 //建立连接 
                if (KepSever == null)
                {
                   KepSever = new OPCServer(); 
                }

                try
                {
                    KepSever.Connect(this.cmb_ServerName.Text, this.cmb_ServerNode.Text);
                }
                catch (Exception ex)
                {

                    MessageBox.Show("连接失败:" + ex.Message);
                    return;
                }
                this.btn_Connect.Text = "disConn";

                //获取OPC所有的变量
                KepBrowser = KepSever.CreateBrowser();
                KepBrowser.ShowBranches();
                KepBrowser.ShowLeafs(true);

                this.lst_Items.Items.Clear();
                foreach (var item in KepBrowser)
                {
                    this.lst_Items.Items.Add(item);   //将获取到的变量标签存入控件
                }

                //初始化OPCGroup
                KepGroups = KepSever.OPCGroups;
                KepGroups.DefaultGroupDeadband = 0;   //死区值,设为0时,服务器端该组内任何数据变化都通知组
                KepGroups.DefaultGroupIsActive = true;   

                KepGroup = KepGroups.Add("测试通讯组");
                KepGroup.IsActive = true;    //激活组
                KepGroup.IsSubscribed = true;   //开启订阅功能
                KepGroup.UpdateRate = 250;

                //增加一个事件
                KepGroup.AsyncReadComplete +=KepGroup_AsyncReadComplete;

4.添加需要读取的标签到列表中

 this.OPCList.Add(new OPCItem()
                {
                    ItemID = this.lst_Items.SelectedItem.ToString()
                });

                int count = this.OPCList.Count;
                List<string> ItemIDs = new List<string>();
                List<int> ClientHandles  = new List<int>();
                ItemIDs.Add("0");
                ClientHandles.Add(0);

                for (int i = 0; i < count; i++)
            {
                ItemIDs.Add(this.OPCList[i].ItemID);
                ClientHandles.Add(i);
             
            }
                //集合转换成array
                Array ItemID = ItemIDs.ToArray();
                Array ClientHandle = ClientHandles.ToArray();


                KepGroup.OPCItems.AddItems(count, ref ItemID, ref ClientHandle, out SeverHandles, out Errors);

5.开启定时器,定时读取

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (KepSever != null)
            {
                if (this.OPCList.Count>0)
                {
                    KepGroup.AsyncRead(this.OPCList.Count, ref SeverHandles, out Errors, TransactionID, out CancelID);
                }
            }
        }

 

6.读取数据并解析

        private void KepGroup_AsyncReadComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors)
        {
            //解析数据
           
            for (int i = 1; i <= NumItems; i++)
            {
                object value = ItemValues.GetValue(i);
                if (value != null)
                {
                   int  ClientHandle=Convert.ToInt32(ClientHandles.GetValue(i));
                   for (int j = 0; j < this.OPCList.Count; j++)
                   {
                       if (j == ClientHandle)
                       {
                           this.OPCList[j].Value = value.ToString();
                           this.OPCList[j].UpdateTime = TimeStamps.GetValue(i).ToString();
                           this.OPCList[j].Quanlity = Qualities.GetValue(i).ToString();

                       }
                   }
                }
            }

            this.dataGridView1.DataSource = null;
            this.dataGridView1.DataSource = this.OPCList;

        }

 参考文档:https://blog.csdn.net/guorui_java/article/details/104247734

标签:KEPServer,KepGroup,C#,Items,Add,PLC,Array,ref,KepSever
From: https://www.cnblogs.com/M-MAKI/p/16739440.html

相关文章

  • JavaDoc
    packagebase;publicclassDoc{Stringname;/****@paramname;*@return;*@throwsException;*///由/**回车打出......
  • vue 入口文件使用 Element 的 confirm
    引入ElementUI,单独引入文件的都能使用importElementUIfrom'element-ui';Element.MessageBox.confirm('是否要跳转段落?','提示',{confirmButtonText:'是',......
  • Multi electron atomic structure
    函数#预定义ifTrue:r=RIGHT;l=LEFT;d=DOWN;u=UP;du=DEGREES;rr=RED;bb=BLUE;gg=GREEN;gg2=GOLD;pp=PINK;tt=TE......
  • AcWing 算法提高课 treap平衡树
    1、基本性质tree+heap=treap平衡树包含treap红黑树splaysbtAVL等等splay比较常用treap=①BST二叉搜索树+②heap2、set不能做的操作  ⑤和⑥这种与排名相......
  • APICloud可视化编程(二)
    上一期我们为大家讲解低代码在国内市场的当前现状以及APICloud可视化开发工具的组件类型和特点。相信大家对可视化编程有了一个整体的了解,那么今天带大家更进一步的使用组......
  • mmdetection使用wandb查看训练日志
    mmdetection查看日志之前一直是在用TextLoggerHook,已经觉得挺方便的了,自从用了wandb之后,发现wandb真不错,看log更方便了,回不去了。wandb的简单配置:wandb官网:https://wandb......
  • react forEach 里面 异步更新 setState
    如题要是等数组处理好,再setState中间就会卡一段时间const[list,setList]=useState([]);letarr=[]for(constitemofsourceList){letdd=await......
  • CF1693F
    首先可以假定整个序列\(c_0\gec_1\),否则我们把\(0\)变成\(1\),\(1\)变成\(0\),并翻转序列。新序列答案与原序列相同。结论:仅操作\(c_0=c_1\)的区间的最小答案和原......
  • HCIA链路聚合
    modemanualload-balance 手工负载分担模式下所有活动接口都参与数据的转发,分担负载流量。    LACP模式支持链路备份。捆绑建议248链路带宽较均衡一个eth-trunk......
  • APICloud可视化编程(二)
    上一期我们为大家讲解低代码在国内市场的当前现状以及APICloud可视化开发工具的组件类型和特点。相信大家对可视化编程有了一个整体的了解,那么今天带大家更进一步的使用组......