基于OPC协议,使用Kepserver5.2 进行设备间的数据交换

OPC通讯协议的机制很容易了解,也是一个非常好用的工具型服务器。由于时间原因简单介绍,具体使用还得自己在objItems、objGroups、tmpCHandles等地方根据自己的配置和需要进行调整,在Array ClientHandles, Array ItemValues变量中进行取值获取机器的工作状态。由于这块儿是我以前调试的,全凭印象简单介绍,有问题可以指出。

OPC服务器的功能就是与下位机进行数据的交换,其中包含了大量的通讯程序和数据存贮程序。然后提供标准的OPC接口,供其它软件使用。程序标准化以后,其他的软件商只需开发面对服务器的程序即可,不用对不同的硬件设备开发不同的硬件驱动程序。减小了工作量,也方便了使用。

Kepserver5.2是工业用的一个很不错的服务器,它不需要上位机程序一直对设备端口进行监控而白白浪费资源,而是通过Datachange的思想,使得数据交换更及时,更轻便,更准确。支持与不同种类的PLC等OPC通讯协议的设备,也支持安卓App的开发。

程序思想在下列函数注释中,

   private void connectOPCServer()
        {
            // (1)创建opc server对象
            objServer = new OPCServer();
            string strHostIP, strHostName;
            //获取本地计算机IP,计算机名称
            IPHostEntry IPHost = Dns.GetHostEntry(Environment.MachineName);
            if (IPHost.AddressList.Length > 0)
            {
                strHostIP = IPHost.AddressList[0].ToString();//////如果工控机和笔记本网关发生变化,更改AddressList[1]数值即可              
            }
            else
            {
                return;
            }
            //通过IP来获取计算机名称,可用在局域网内
            //IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);
            //IPHostEntry ipHostEntry = Dns.GetHostByAddress("192.100.10.124");////本IP地址为工控机或者笔记本的所分配IP
            //IPHostEntry ipHostEntry = Dns.GetHostByAddress(ip.Text.Trim());////本IP地址为工控机或者笔记本的所分配IP 
            try
            {
                IPHostEntry ipHostEntry = Dns.GetHostByAddress(ip.Text.Trim());////本IP地址为工控机或者笔记本的所分配IP 
                strHostName = ipHostEntry.HostName.ToString();
                CPublic.WriteMsg("成功", ip.Text.Trim());
            }
            catch (Exception ex)
            {
                CPublic.WriteMsg("出错", ex.ToString());
            }
            //strHostName = ipHostEntry.HostName.ToString();
            //连接opc server
            objServer.Connect("Kepware.KEPServerEX.V5", null);
            //textBox6.Text = objServer.GetErrorString;
            //(2)建立一个opc组集合
            objGroups = objServer.OPCGroups;
            //(3)建立一个opc组
            objGroup = objGroups.Add(null); //Group组名字可有可无
            //(4)添加opc标签设置OPC数据组objGroup的属性
            objGroup.IsActive = true; //设置该组为活动状态,连接PLC时,设置为非活动状态也一样
            objGroup.IsSubscribed = true; //设置异步通知
            objGroup.UpdateRate = 250;
            objServer.OPCGroups.DefaultGroupDeadband = 0;
            objGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);//在数据有变化时候触发事件,完成操作
            // objGroup.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(AsyncReadComplete);
            objGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(AsyncWriteComplete);
            objItems = objGroup.OPCItems; //建立opc标签集合

            string[] tmpIDs = new string[60];
            int[] tmpCHandles = new int[60];/////与所监控PLC地址的数量有关系
            for (int i = 1; i < 60; i++)
            {
                tmpCHandles[i] = i;
                tmpIDs[i] = "V253.ANDON_V253.ANDON_V253.m" + (i).ToString().PadLeft(2, '0');///获取kepserver 服务器的数值变化,其中162是自定义数目,随着kepserver需要的值而变化
            
            }
            strItemIDs = (Array)tmpIDs;//必须转成Array型,否则不能调用AddItems方法
            lClientHandles = (Array)tmpCHandles;
            // 添加opc标签
            objItems.AddItems(55, ref strItemIDs, ref lClientHandles, out lserverhandles, out lErrors, RequestedDataTypes, AccessPaths);//修改值为结构体的前两位数据,第一位是监控地址的个数                                                                                                                               //RefreshData();
        }

猜你喜欢

转载自blog.csdn.net/NcepuKZH/article/details/89292997